Команда exec в Kubernetes

KubernetesBeginner
Практиковаться сейчас

Введение

В этом лабораторном занятии (lab) вы узнаете, как использовать команду Kubernetes exec для выполнения команд внутри контейнера, запущенного в поде (pod) Kubernetes. Вы начнете с простых примеров и постепенно перейдете к более сложным сценариям.

Запустите кластер Minikube

Перед созданием ресурсов вам нужен работающий кластер Kubernetes. Minikube - это легковесная среда Kubernetes, которая запускается на вашем локальном компьютере.

  1. Перейдите в рабочую директорию:

    Откройте терминал и перейдите в папку проекта по умолчанию:

    cd /home/labex/project
    
  2. Запустите Minikube:

    Запустите Minikube для инициализации кластера Kubernetes:

    minikube start
    
    • Эта команда настраивает однодневный кластер Kubernetes на вашем локальном компьютере.
    • В зависимости от производительности вашей системы Minikube может потребовать несколько минут для запуска.
  3. Проверьте, что Minikube запущен:

    Проверьте статус кластера Minikube:

    minikube status
    
    • Ищите компоненты, такие как kubelet и apiserver, перечисленные как Running (работающие).
    • Если кластер не запущен, запустите команду minikube start снова.

Если у вас возникли проблемы при запуске Minikube, используйте minikube delete для сброса среды при необходимости.

Исследуйте команду kubectl exec

Команда kubectl exec используется для выполнения команд непосредственно внутри контейнера в поде (pod). Она особенно полезна для отладки и проверки контейнерных сред.

Выполните следующую команду, чтобы просмотреть доступные параметры для kubectl exec:

kubectl exec -h

Вы увидите следующий вывод:

Execute a command in a container.

Examples:
  ## Get output from running the 'date' command from pod mypod, using the first container by default
  kubectl exec mypod -- date

  ## Get output from running the 'date' command in ruby-container from pod mypod
  kubectl exec mypod -c ruby-container -- date

  ## Switch to raw terminal mode; sends stdin to 'bash' in ruby-container from pod mypod
  ## and sends stdout/stderr from 'bash' back to the client
  kubectl exec mypod -c ruby-container -i -t -- bash -il

  ## List contents of /usr from the first container of pod mypod and sort by modification time
  ## If the command you want to execute in the pod has any flags in common (e.g. -i),
  ## you must use two dashes (--) to separate your command's flags/arguments
  ## Also note, do not surround your command and its flags/arguments with quotes
  ## unless that is how you would execute it normally (i.e., do ls -t /usr, not "ls -t /usr")
  kubectl exec mypod -i -t -- ls -t /usr

  ## Get output from running 'date' command from the first pod of the deployment mydeployment, using the first container by default
  kubectl exec deploy/mydeployment -- date

  ## Get output from running 'date' command from the first pod of the service myservice, using the first container by default
  kubectl exec svc/myservice -- date

Выполнение команды в контейнере

На этом шаге вы узнаете, как выполнять команды в контейнере, запущенном в поде (pod).

  1. Сначала создайте развертывание (deployment) с одним репликой и контейнером Nginx:

    kubectl create deployment nginx --image=nginx --replicas=1
    
  2. Подождите, пока под (pod) перейдет в готовое состояние:

    kubectl wait --for=condition=Ready pod -l app=nginx
    
  3. Используйте команду kubectl exec для выполнения команды внутри контейнера Nginx:

    kubectl exec -it POD_NAME -- /bin/bash
    

    Замените POD_NAME именем пода, созданного на шаге 1. Вы можете получить POD_NAME с помощью команды kubectl get pod -l app=nginx.

Выполнение команды в конкретном контейнере

На этом шаге вы узнаете, как выполнять команду в конкретном контейнере, запущенном в поде (pod), содержащем несколько контейнеров.

  1. Создайте под с двумя контейнерами: Nginx и BusyBox:

    cat << EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-busybox
    spec:
      containers:
      - name: nginx
        image: nginx
      - name: busybox
        image: busybox
        command:
          - sleep
          - "3600"
    EOF
    
  2. Подождите, пока под перейдет в готовое состояние:

    kubectl wait --for=condition=Ready pod nginx-busybox
    
  3. Используйте команду kubectl exec для выполнения команды внутри контейнера BusyBox:

    kubectl exec nginx-busybox -c busybox -- ls /bin
    

Выполнение команды с использованием TTY

На этом шаге вы узнаете, как выполнять команду с использованием терминалного интерфейса (tty) в контейнере.

  1. Используйте команду kubectl exec с параметрами -it для выполнения команды с использованием tty:

    kubectl exec -it nginx-busybox -- /bin/sh
    
  2. После входа в оболочку контейнера выполните команду:

    echo "Hello, world!"
    
  3. Выйдите из оболочки контейнера:

    exit
    

Выполнение команды с использованием переменных окружения

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

  1. Создайте развертывание (deployment) с одним репликой и контейнером Nginx с переменной окружения:

    kubectl run nginx-env --image=nginx --env="MY_VAR=my-value"
    
  2. Подождите, пока под (pod) перейдет в готовое состояние:

    kubectl wait --for=condition=Ready pod -l run=nginx-env
    
  3. Используйте команду kubectl exec для выполнения команды внутри контейнера Nginx, которая выводит значение переменной окружения:

    kubectl exec nginx-env -- sh -c 'echo $MY_VAR'
    

    Замените nginx-env именем пода, созданного на шаге 1.

Резюме

Поздравляем! Вы успешно завершили лабораторную работу по использованию команды exec в Kubernetes! В рамках этой лабораторной работы вы научились использовать команду kubectl exec для выполнения команд внутри контейнеров, запущенных в подах (pods) Kubernetes. Вы также узнали, как выполнять команды в конкретных контейнерах, выполнять команды с использованием терминалного интерфейса (tty) и выполнять команды с переменными окружения. Эти навыки являются важными для отладки проблем в кластере Kubernetes.