Шпаргалка по Kubectl для администраторов Kubernetes и подготовка к экзамену CKA

Если у вас есть команда kubectl для экономии времени, которую мы пропустили в этом посте, не стесняйтесь оставлять ее в разделе комментариев. Мы будем рады обновить документ в любое время.

1. Установите kubectl

Вот как установить kubectl в Linux и macOS:

Linux

curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl

macOS:

curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl

Подтвердите установку, проверив версию:

$ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.3", GitCommit:"1e11e4a2108024935ecfcb2912226cedeafd99df", GitTreeState:"clean", BuildDate:"2020-10-14T12:50:19Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"darwin/amd64"}

2. Включите завершение Bash

По умолчанию завершение Bash не включено после установки команды kubectl. Включите его с помощью команд ниже.

Bash:

echo 'source <(kubectl completion bash)' >>~/.bashrc
source ~/.bashrc

zsh:

echo 'source <(kubectl completion zsh) >> ~/.zshrc
source ~/.zshrc

3. Список и переключение контекста

Контекст — это группа параметров доступа. Каждый контекст содержит кластер Kubernetes, пользователя и пространство имен.

Контексты листинга:

kubectl config get-contexts

Переключайтесь между кластерами, установив текущий контекст в файле kubeconfig :

$ kubectl config use-context <context-name>

Установите контекстную запись в kubeconfig:

kubectl config set-context <context-name>

Если вы хотите изменить предпочтение пространства имен, используйте:

kubectl config set-context <context-name> --namespace=<ns-name>

Текущий контекст:

 kubectl config current-context

4. Проверьте синтаксис файла yaml манифеста.

Если вы создали yaml-файл развертывания и хотите проверить синтаксис, используйте команду:

 kubectl create --dry-run --validate -f <file>.yaml

Пример:

$ kubectl create --dry-run=client --validate -f hello-world.yml
pod/hello-world created (dry run)

Если есть синтаксические ошибки, вы получите из вывода:

error: error parsing hello-world.yml: error converting YAML to JSON: yaml: line 12: did not find expected '-' indicator

5. Осушите узел при удалении локальных данных.

Узел может быть очищен, а локальные данные, используемые запущенными контейнерами, также могут быть очищены. Для этого используется синтаксис команды:

kubectl drain <node-name> --ignore-daemonsets=true --delete-local-data=true

Для принудительного слива вы можете добавить флаг –force, хотя это не рекомендуется.

6. Примените файлы и папки yaml.

Вы можете использовать аргумент apply, чтобы применить конфигурацию к ресурсу по имени файла или стандартному вводу. Синтаксис команды:

kubectl apply -f <file-name>.yaml
# Or for json:
kubectl apply -f <file-name>.json

Для папки с несколькими ямл-филами используйте:

kubectl apply -R -f . # If files are in current working directory

С абсолютным путем:

kubectl apply -R -f /path/to/yaml/files

7. Создавайте псевдонимы для экономии времени.

Вы также можете создать несколько псевдонимов, которые значительно ускорят использование командной строки.

$ vim ~/.bashrc
# kubectl alias
alias k='kubectl'

# Create resources
alias kcf='kubectl create -f'
alias kaf='kubectl apply -f'

# List resources
alias kgp='kubectl get pods'
alias kgpa='kubectl get pods --all-namespaces'
alias kgd='kubectl get deployments'
alias kgs='kubectl get service'
alias kgh='kubectl get hpa'

# Delete resources
alias kd='kubectl delete'
alias kdp='kubectl delete pods'
alias kdd='kubectl delete deployments'
alias kgs='kubectl delete service'

8. Запустите временный модуль, который умирает при выходе.

Вы можете быстро создать временный модуль с сеансом оболочки для целей тестирования, который будет уничтожен при выходе.

kubectl run --rm -it --image=<image> <podname> -- sh

Пример:

$ kubectl run --rm -it --image=alpine alpine -- sh
If you don't see a command prompt, try pressing enter.
/ # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/community/x86_64/APKINDEX.tar.gz
v3.12.1-82-g0e1cfdcae4 [http://dl-cdn.alpinelinux.org/alpine/v3.12/main]
v3.12.1-85-gd70a46ae6d [http://dl-cdn.alpinelinux.org/alpine/v3.12/community]
OK: 12747 distinct packages available

/ # apk add wget curl vim
(1/12) Installing ca-certificates (20191127-r4)
(2/12) Installing nghttp2-libs (1.41.0-r0)
(3/12) Installing libcurl (7.69.1-r2)
(4/12) Installing curl (7.69.1-r2)
(5/12) Installing xxd (8.2.0735-r0)
(6/12) Installing lua5.3-libs (5.3.5-r6)
(7/12) Installing ncurses-terminfo-base (6.2_p20200523-r0)
(8/12) Installing ncurses-libs (6.2_p20200523-r0)
(9/12) Installing vim (8.2.0735-r0)
(10/12) Installing libunistring (0.9.10-r0)
(11/12) Installing libidn2 (2.3.0-r0)
(12/12) Installing wget (1.20.3-r1)
Executing busybox-1.31.1-r19.trigger
Executing ca-certificates-20191127-r4.trigger
OK: 39 MiB in 26 packages

/ # curl google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

/ # exit
Session ended, resume using 'kubectl attach alpine -c alpine -i -t' command when the pod is running
pod "alpine" deleted

$ kubectl get pods
NAME     READY   STATUS        RESTARTS   AGE
alpine   0/1     Terminating   0          80s

9. Создайте пространство имен.

Пространство имен создается с помощью команды:

kubectl create namespace <namespace-name>

Или

kubectl create ns <namespace-name>

Чтобы переключиться в пространство имен для всех операций, используйте:

$ kubectl config get-contexts
$ kubectl config set-context <context-name> --namespace=<namespace-name>

Примеры:

$ kubectl create ns dev
namespace/dev created

$ kubectl get ns dev -o yaml
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: "2020-12-10T08:19:10Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:status:
        f:phase: {}
    manager: kubectl-create
    operation: Update
    time: "2020-12-10T08:19:10Z"
  name: dev
  resourceVersion: "592755"
  selfLink: /api/v1/namespaces/dev
  uid: 8cd5639a-85db-4c84-927d-344bdec9acba
spec:
  finalizers:
  - kubernetes
status:
  phase: Active

10. Запустите команду оболочки в Pod без tty.

Давайте создадим модуль, работающий в фоновом режиме.

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
  labels:
    app: ubuntu
spec:
  containers:
  - name: ubuntu
    image: ubuntu:latest
    command: ["/bin/sleep", "3650d"]
    imagePullPolicy: IfNotPresent
  restartPolicy: Always
EOF

Подтвердите, что Pod запущен:

$ kubectl get pods ubuntu
NAME     READY   STATUS    RESTARTS   AGE
ubuntu   1/1     Running   0          14s

Запуск сеанса оболочки с модулем:

$ kubectl exec --stdin --tty ubuntu -- sh
# exit

$ kubectl exec --stdin --tty ubuntu -- /bin/bash
[email protected]:/# exit
exit

Запуск команды прямо в контейнере без tty.

$ kubectl exec -it ubuntu -- ls -l /etc/hosts
-rw-r--r-- 1 root root 205 Dec 10 08:25 /etc/hosts

$ kubectl exec -it ubuntu -- apt update
kubectl exec -ti busybox -- nslookup <Pod-ip>
$ kubectl exec -it ubuntu -- cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.1 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

Убить Pod.

$ kubectl delete pod ubuntu
pod "ubuntu" deleted

11. Проверьте переменные среды в модуле.

Чтобы перечислить все переменные среды в модуле, используйте команду:

$ kubectl exec <pod> -- env

Пример

$ kubectl exec ubuntu -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=ubuntu
KUBERNETES_PORT_443_TCP_ADDR=172.20.0.1
KUBERNETES_SERVICE_HOST=172.20.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://172.20.0.1:443
KUBERNETES_PORT_443_TCP=tcp://172.20.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
HOME=/root

12. Получите объяснение использования ресурсов.

Синтаксис команды:

$ kubectl explain <resource>

Примеры:

kubectl explain pods
kubectl explain deploy
kubectl explain service

Объясните поля.

kubectl explain deploy.spec
kubectl explain deploy.spec.replicas
kubectl explain pod.metadata.namespace

13. Сортировка ресурсов по названию.

Чтобы перечислить ресурсы, отсортированные по имени, вы будете использовать.

kubectl get <resource> --sort-by=.metadata.name

Примеры.

$ kubectl get pods --sort-by=.metadata.name
NAME     READY   STATUS    RESTARTS   AGE
ubuntu   1/1     Running   0          10m

$ kubectl get svc --sort-by=.metadata.name --all-namespaces
NAMESPACE     NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)         AGE
kube-system   kube-dns     ClusterIP   172.20.0.10   <none>        53/UDP,53/TCP   2d11h
default       kubernetes   ClusterIP   172.20.0.1    <none>        443/TCP         2d11h

14. Создайте YAML-файл манифеста модуля.

Вы можете использовать kubectl run для создания файла манифеста yaml для развертывания Pods.

Страница справки по командам.

kubectl run pod --help

Следующая команда печатает соответствующие объекты API, не создавая их:

$  kubectl run nginx --image=nginx --restart=Never --dry-run=client -o yaml

С ограничениями памяти и ЦП:

kubectl run nginx --image=nginx --restart=Never --limits='cpu=300m,memory=512Mi' --dry-run=client -o yaml

С запросами и ограничениями ЦП и памяти.

kubectl run nginx --image=nginx --restart=Never --requests='cpu=100m,memory=256Mi' --limits='cpu=300m,memory=512Mi' --dry-run=client -o yaml

Вы можете направить вывод в файл.

kubectl run nginx --image=nginx --restart=Never --dry-run=client -o yaml >nginx-pod.yaml

Затем вы можете создать модуль, применив файл.

$ kubectl apply -f ./nginx-pod.yaml
pod/nginx created

Подтвердите, что Pod запущен:

$ kubectl get pod nginx
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          31s

Удалить Pod.

$ kubectl delete pod nginx
pod "nginx" deleted

15. Создайте файл YAML для развертывания.

Аналогичные команды генерации применимы к типам ресурсов развертывания. Только то, что мы не пройдем –restart=Never.

kubectl create deploy nginx --image=nginx  --replicas=3 --dry-run=client -o yaml

Записать в файл

kubectl create deploy nginx --image=nginx  --replicas=3 --dry-run=client -o yaml >nginx-deployment.yml

Вы можете изменить файл и применить создание ресурсов.

$ kubectl apply -f nginx-deployment.yml
deployment.apps/nginx created

Проверить развертывание.

$ kubectl get deploy nginx
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           37s

Список модулей, соответствующих Nginx.

$  kubectl get pods -l app=nginx
NAME                    READY   STATUS    RESTARTS   AGE
nginx-f89759699-6hcng   1/1     Running   0          70s
nginx-f89759699-dvqhf   1/1     Running   0          70s
nginx-f89759699-hgbtq   1/1     Running   0          70s

Удалить развертывание.

$ kubectl delete deploy nginx
deployment.apps "nginx" deleted

16. Раскрытие модуля или развертывания в службе

Используйте команду kubectl expose, чтобы сделать развертывание или Pod доступными на ClusterIP или NodePort.

$ kubectl expose -h

Пример ниже.

$ kubectl expose deployment nginx --port=80 --type=ClusterIP
service/nginx exposed

$ kubectl get svc nginx
NAME    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
nginx   ClusterIP   172.20.29.63   <none>        80/TCP    17s

Поддерживаемые типы для службы: ClusterIP , NodePort , LoadBalancer или ExternalName .

$ kubectl expose deployment nginx --port=80 --type=NodePort
$ kubectl get svc nginx
NAME    TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
nginx   NodePort   172.20.32.97   <none>        80:30292/TCP   3s

В этом другом примере создается служба для модуля redis , который обслуживает порт 6379 с именем «redis».

 $ kubectl expose pod redis --port=6379 --name=redis

Вы также можете вручную указать порт, предоставляемый контейнером (порт приложения).

$ kubectl expose pod redis  --type=ClusterIP --port=6379 --target-port=6379

17. Увеличение масштаба модулей в развертывании.

Вы можете увеличить количество модулей в развертывании без редактирования файла.

$ kubectl get deploy
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           7h

$ kubectl scale --replicas=4 deployment nginx
deployment.apps/nginx scaled

$ kubectl get deploy
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   4/4     4            4           7h3m

$ kubectl get pods -l app=nginx
NAME                    READY   STATUS    RESTARTS   AGE
nginx-f89759699-7x7q7   1/1     Running   0          2m21s
nginx-f89759699-jz9cj   1/1     Running   0          7h3m
nginx-f89759699-nm2nk   1/1     Running   0          7h3m
nginx-f89759699-ppdzr   1/1     Running   0          7h3m

$ kubectl scale --replicas=3 deployment nginx
deployment.apps/nginx scaled

$ kubectl get deploy
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           7h4m

18. Перенесите все модули в узел и сделайте его недоступным для планирования.

Определите узел, над которым нужно действовать:

$ kubectl get nodes

Затем скажите Kubernetes, чтобы он опустошил узел:

$ kubectl drain <node-name>

Возможно, вам придется игнорировать наборы демонов и удалить данные локального контейнера.

$ kubectl drain  <node-name> --delete-local-data --ignore-daemonsets

Скажите Kubernetes, чтобы он прекратил планировать новые поды на узле:

$ kubectl cordon <node-name>

Чтобы возобновить планирование на узле, используйте команду:

$ kubectl uncordon <node-name>

19. Создание нескольких контейнеров в модуле

Сначала сгенерируйте файл манифеста Pod. Мы создадим модуль под названием mypod с изображением Ubuntu .

kubectl run mypod --image=nginx --restart=Never --dry-run=client -o yaml >mypod.yaml

Отредактируйте файл и добавьте другие контейнеры в названный модуль.

$ vim mypod.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: mypod
  name: mypod
spec:
  containers:
  - image: nginx
    name: nginx
  - image: redis
    name: redis
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

Мы добавили два контейнера — nginx и redis. Чтобы применить конфигурации, выполните команду:

$ kubectl apply -f mypod.yaml
pod/mypod created

Убедитесь, что в капсуле есть два контейнера.

$ kubectl get pod mypod
NAME    READY   STATUS    RESTARTS   AGE
mypod   2/2     Running   0          39s

Очистить:

$ kubectl delete -f mypod.yaml
pod "mypod" deleted

20. Создание учетной записи службы, роли и привязки ролей

Создайте сервис под названием demo.

$ kubectl create sa demo
serviceaccount/demo created

Создайте роль с именем demo, которая позволяет пользователю выполнять «получение», «просмотр» и «список» для модулей, развертывания, ds, rs, sts:

$ kubectl create role demo --verb=get,list,watch --resource=pods,deploy,ds,rs,sts
role.rbac.authorization.k8s.io/demo created

# All verbs
$ kubectl create clusterrole demo --verb='*' --resource=pods,deploy,ds,rs,sts

# For cluster role
$ kubectl create clusterrole demo --verb=get,list,watch --resource=pods,deploy,ds,rs,sts
clusterrole.rbac.authorization.k8s.io/demo created

Создайте RoleBinding для демонстрационной роли.

$ kubectl create rolebinding demo --role=demo --user=demo
rolebinding.rbac.authorization.k8s.io/demo created

# For Cluster role
$ kubectl create rolebinding demo --clusterrole==demo --user=demo

# Clusterrole binding
$ kubectl create clusterrolebinding demo-admin --clusterrole=demo --user=demo

Подтвердите:

$ kubectl get sa,role,rolebinding
NAME                      SECRETS   AGE
serviceaccount/default    1         2d21h
serviceaccount/demo       1         4m48s
serviceaccount/newrelic   1         3h51m

NAME                                  CREATED AT
role.rbac.authorization.k8s.io/demo   2020-12-10T19:09:01Z

NAME                                         ROLE        AGE
rolebinding.rbac.authorization.k8s.io/demo   Role/demo   21s

Подтвердить:

kubectl auth can-i create deployment --as demo # yes
kubectl auth can-i '*' ds --as demo # yes

Очистить:

kubectl delete sa demo
kubectl delete role demo
kubectl delete clusterrole demo
kubectl delete rolebinding demo

21. Получение журналов на пакетах

Получить последние журналы на названном поде:

$ kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
newrelic-infra-hp8dt    1/1     Running   0          3h57m
newrelic-infra-r4bpg    1/1     Running   0          3h57m
nginx-f89759699-jz9cj   1/1     Running   0          8h
nginx-f89759699-nm2nk   1/1     Running   0          8h
nginx-f89759699-ppdzr   1/1     Running   0          8h
ubuntu                  1/1     Running   0          10h

$ kubectl logs newrelic-infra-r4bpg

Следите за потоком журналов в реальном времени.

$ kubectl logs newrelic-infra-r4bpg -f

Получите последние журналы из всех модулей в развертывании:

$ kubectl get deployments
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           8h

$ kubectl logs deploy/nginx
$ kubectl logs deploy/nginx -f

Используйте регулярное выражение для извлечения журналов.

$ kubectl logs newrelic-infra-r4bpg | grep 'connect got id'

time="2020-12-10T15:19:37Z" level=info msg="connect got id" agent-guid=MjU4Mjg0NXxJTkZSQXxOQXw0NDQ3ODMzNDM1Nzk0NDYyMjgx agent-id=4447833435794462281 component=IdentityConnectService

Записать вывод в файл:

$ kubectl logs newrelic-infra-r4bpg | grep 'connect got id' > logs.txt

22. Получите лучшие стручки

Получите лучшие модули использования ресурсов.

$ kubectl top pod

Получите лучшие модули с высокой загрузкой ЦП:

$ kubectl top pod --sort-by='cpu'

Фильтр с помощью ярлыков.

$ kubectl top pod -l 'app=nginx' --sort-by='cpu'
NAME                    CPU(cores)   MEMORY(bytes)
nginx-f89759699-jz9cj   0m           2Mi
nginx-f89759699-nm2nk   0m           2Mi
nginx-f89759699-ppdzr   0m           2Mi

Получите только один модуль с максимальной загрузкой ЦП и запишите вывод в файл.

$ kubectl top pod -l 'app=nginx' --sort-by='cpu' | awk 'NR==2{print $1}'
$ kubectl top pod -l 'app=nginx' --sort-by='cpu' | awk 'NR==2{print $1}' >top_cpu.txt

23. Развернуть и откатить развертывание

Разверните контейнер Nginx.

$ kubectl create deploy web --replicas=2 --image=nginx:1.13.2
deployment.apps/web created

$ kubectl get deploy web
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
web    2/2     2            2           16s

Обновление развертывания для использования образа nginx версии 1.14.2

# Syntax: $ kubectl set image CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N
$ kubectl set image deployment web nginx=nginx:1.14.2 --record
deployment.apps/web image updated

Проверить статус внедрения

$ kubectl rollout status deployment/web
deployment "web" successfully rolled out

Просмотрите историю развертывания развертывания:

$ kubectl rollout history deployment/web
deployment.apps/web
REVISION  CHANGE-CAUSE
1         kubectl set image deployment web nginx=nginx:1.14.2 --record=true

Откат к предыдущему развертыванию:

$ kubectl rollout undo deployment web
deployment.apps/web rolled back

Развертывание до конкретной версии

$ kubectl rollout undo deployment/web --to-revision=3

24. Обозначьте узел и назначьте модули для узлов

Синтаксис команды:

$ kubectl label nodes <node-name> <label-key>=<label-value>

Пример:

kubectl label nodes k8snode01 disktype=ssd

Затем вы можете назначить модули для узлов.

spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    disktype: ssd

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

одиннадцать + восемнадцать =