├── ServiceAccount-kubernetes-dashboard-admin-user.yaml ├── ClusterRoleBinding-dashboard-admin-user.yaml ├── LICENSE ├── kubesave.sh └── README.md /ServiceAccount-kubernetes-dashboard-admin-user.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ServiceAccount 3 | metadata: 4 | name: admin-user 5 | namespace: kubernetes-dashboard 6 | -------------------------------------------------------------------------------- /ClusterRoleBinding-dashboard-admin-user.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: rbac.authorization.k8s.io/v1 2 | kind: ClusterRoleBinding 3 | metadata: 4 | name: admin-user 5 | roleRef: 6 | apiGroup: rbac.authorization.k8s.io 7 | kind: ClusterRole 8 | name: cluster-admin 9 | subjects: 10 | - kind: ServiceAccount 11 | name: admin-user 12 | namespace: kubernetes-dashboard 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 2-Clause License 2 | 3 | Copyright (c) 2019, Eduardo Lisboa 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 20 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | -------------------------------------------------------------------------------- /kubesave.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ### 4 | # Project name: kubesave.sh 5 | # Description: this script is meant to save your kubernetes objects, separated in yaml files 6 | # Author: Eduardo Lisboa 7 | # Date: 30/05/2020 8 | 9 | # Variables 10 | export OBJECT 11 | export OBJECT_item 12 | export NAMESPACE 13 | export COMMAND 14 | 15 | # Checking environment tools 16 | for COMMAND in mkdir kubectl 17 | do 18 | echo -ne "Checking for command ${COMMAND}: " 19 | if command -v "${COMMAND}" >& /dev/null 20 | then 21 | echo "SUCCESS" 22 | else 23 | echo "FAILED! ${COMMAND} not found. Exitting now" 24 | exit 1 25 | fi 26 | done 27 | 28 | # Core part 29 | for OBJECT in deploy service secret configmap ingress HorizontalPodAutoscaler PersistentVolumeClaim 30 | do 31 | 32 | for NAMESPACE in $(kubectl get namespaces | grep -v ^NAME | awk '{print $1}') 33 | do 34 | echo -e "Checking namespace ${NAMESPACE}" 35 | if mkdir -pv "${NAMESPACE}" 36 | then 37 | echo "Directory ${PWD}/${NAMESPACE} created sucessfully" 38 | for OBJECT_item in $(kubectl -n "${NAMESPACE}" get "${OBJECT}" | grep -v ^NAME | awk '{print $1}') 39 | do 40 | echo -ne "Saving $OBJECT on ${PWD}/${NAMESPACE}/${OBJECT}-${OBJECT_item}.yaml file: " 41 | if kubectl -n "${NAMESPACE}" get "${OBJECT}" "${OBJECT_item}" -o yaml > "${NAMESPACE}/${OBJECT}-${OBJECT_item}.yaml" 42 | then 43 | echo SUCCESS 44 | else 45 | echo FAILED 46 | fi 47 | done 48 | else 49 | echo "Failed to create or access ${PWD}/${NAMESPACE} directory" 50 | exit 1 51 | fi 52 | done 53 | 54 | done 55 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # My Kubernetes basic toolkit 2 | 3 | Basically it's a quick start approach to new Kubernetes clusters 4 | 5 | --- 6 | 7 | #### Basic commands 8 | 9 | `kubectl get nodes -o wide # list all nodes` 10 | 11 | `kubectl get pods -o wide --all-namespaces # list all pods` 12 | 13 | `kubectl get deploys -o wide --all-namespaces # list all deploys` 14 | 15 | --- 16 | 17 | #### Dashboard 18 | 19 | 1. `kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml # deploy dashboard` 20 | 2. `kubectl apply -f ServiceAccount-kubernetes-dashboard-admin-user.yaml # create service account dashboard admin user` 21 | 3. `kubectl apply -f ClusterRoleBinding-dashboard-admin-user.yaml # create cluster role binding` 22 | 23 | --- 24 | 25 | #### Creating a deploy and a service without a yaml 26 | 27 | `kubectl run -n NAMESPACE DEPLOY-NAME --image=IMAGE_REGISTRY/IMAGE_NAME --port=9090 --expose=true` 28 | 29 | This will create a deploy and a service using `ClusterIP` 30 | 31 | You can edit it later by doing: 32 | 33 | `kubectl edit deploy DEPLOY-NAME -n NAMESPACE` to edit the deploy entry 34 | and 35 | `kubectl edit service DEPLOY-NAME -n NAMESPACE` to edit the service entry 36 | 37 | Note that in some cases the ClusterIP won't work, so you must use another one like NodePort if you want external access to your pod. 38 | 39 | --- 40 | 41 | #### Saving all deploys separated by namespace 42 | 43 | ``` 44 | for namespace in $(kubectl get namespaces | grep -v ^NAME | awk '{print $1}') 45 | do 46 | echo -e "Checking namespace $namespace" 47 | if mkdir -pv $namespace 48 | then 49 | for deploy in $(kubectl -n $namespace get deploy | grep -v ^NAME | awk '{print $1}') 50 | do 51 | echo -ne "Saving deploy $deploy on ${PWD}/${namespace}/deploy-${deploy}.yaml file: 52 | if kubectl -n $namespace get deploy $deploy -o yaml > ${namespace}/deploy-${deploy}.yaml 53 | then 54 | echo SUCCESS 55 | else 56 | echo FAILED 57 | done 58 | else 59 | echo "Failed to create or access ${PWD}/${namespace} directory 60 | exit 1 61 | fi 62 | done 63 | ``` 64 | 65 | 66 | If you rather do it in one line 67 | ``` 68 | for namespace in $(kubectl get namespaces | grep -v NAME | cut -d\ -f1) ; do echo Checking namespace $namespace ; mkdir -pv $namespace ; for deploy in $(kubectl -n $namespace get deploy | grep -v NAME | cut -d\ -f1) ; do echo Saving deploy $deploy on ${PWD}/${namespace}/deploy-${deploy}.yaml ; kubectl -n $namespace get deploy $deploy -o yaml > ${namespace}/${deploy}.yaml ; done ; done # save deploys separated by namespace 69 | ``` 70 | 71 | ... or you can [check this simple script](./kubesave.sh), which already saves deploys, services and secrets, all separated by namespace 72 | 73 | --- 74 | 75 | #### List all running pod images 76 | ``` 77 | kubectl get pods -o jsonpath=’{range .items[*]}{.spec.containers[*].image}{“ “}’ 78 | ``` 79 | 80 | --- 81 | 82 | #### Basic Deployments Inventory 83 | ``` 84 | kubectl get deployments.apps --sort-by=metadata.name -o custom-columns=DEPLOYMENT:.metadata.name,CONTAINER_IMAGE:.spec.template.spec.containers[0].image,READY_REPLICAS:.status.availableReplicas,NAMESPACE:.metadata.namespace 85 | ``` 86 | --------------------------------------------------------------------------------