Работа с контейнерами docker в корпоративной среде требует использования системы оркестрации контейнеров, обеспечения безопасности и мониторинга. Pivotal Container Service (PKS) – совместная разработка Pivotal и VMware, включающая в себя Kubernetes, BOSH, NSX-T, Harbor. Предлагаю краткое руководство для начала изучения PKS и работы с кластером kubernetes.
Подготовка к работе Kubectl CLI
Для работы с кластером Kubernetes на PKS Вам необходимо скачать Kubectl CLI. Это инструмент командной строки kubectl, который используется для развертывания и управления приложениями. Загрузка Kubectl CLI с сайта Pivotal: https://network.pivotal.io/products/pivotal-container-service
Подготовка kubectl к работе:
$ cp kubectl-linux-amd64-1.11.2 /usr/local/bin/kubectl $ chmod +x /usr/local/bin/kubectl $ kubectl version Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.2", GitCommit:"bb9ffb1654d4a729bb4cec18ff088eacc153c239", GitTreeState:"clean", BuildDate:"2018-08-07T23:17:28Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"} The connection to the server localhost:8080 was refused - did you specify the right host or port?
Последняя команда выводит две строки: версию установленного у Вас клиента и версию сервера. Если Вы ещё не установили конфигурационный файл, то во второй строке, скорее всего, будет такая же ошибка.
Полезная информация
Для удобства работы с kubectl выполните следующую команду:
$ source <(kubectl completion bash)
Она добавит в Вашу оболочку bash возможность автозавершения для команд kubectl. Ещё лучше добавить эту команду в ~/.bashrc
$ echo "source <(kubectl completion bash)" >> ~/.bashrc
Конфигурационный файл kubernetes
После создания администраторами PKS кластера kubernetes, Вашей команде предоставляется конфигурационный файл. Данный файл нужно разместить в своей домашней папке: ~/.kube/config и можно приступать к работе. Если файл должен храниться в другом месте, то укажите полный путь до него в переменной KUBECONFIG:
export KUBECONFIG=/pks/kubernetes/my-cluster.config
Основные команды для подготовки среды к работе:
$ kubectl version Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.2", GitCommit:"bb9ffb1654d4a729bb4cec18ff088eacc153c239", GitTreeState:"clean", BuildDate:"2018-08-07T23:17:28Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.2", GitCommit:"bb9ffb1654d4a729bb4cec18ff088eacc153c239", GitTreeState:"clean", BuildDate:"2018-08-07T23:08:19Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
- вторая строка содержит информацию о сервере, значит конфигурация правильная и есть соединение с мастер-нодой кластера;
$ kubectl config get-clusters NAME cluster01
- отображает кластеры, доступные Вам по конфигурационному файлу kubernetes;
$ kubectl get ns NAME STATUS AGE app01 Active 5d default Active 20d kube-public Active 20d kube-system Active 20d pks-system Active 20d
- отображает доступные пространства имен (Пространства имен обеспечивают возможность одновременной работы множества пользователей в разных командах и проектах. Имена ресурсов должны быть уникальными только в пределах одного пространства имен, это позволяет разграничить ресурсы и работу с ними внутри кластеров kubernetes);
$ kubectl config current-context cluster01
- выводит имя текущего контекста (контекст позволяет указать текущие параметры для работы: кластер, пользователь, пространство имен);
$ kubectl config set-context cluster01 --namespace app01 Context "cluster01" modified.
- создаёт новый контекст или изменяет старый; по умолчанию в файле config не указано используемое пространство имен;
$ kubectl config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE * cluster01 cluster01 3b5efcac-7ca1-448f-8942-0bd7a19a6207 app01
- выводит все контексты из config;
$ kubectl get nodes NAME STATUS ROLES AGE VERSION 4ad39b5d-7b3d-4af1-82e4-133374c55bae Ready20d v1.11.2 b9b587f7-1eb4-4b33-a305-78ec645a286b Ready 20d v1.11.2 e8381546-d404-495b-b992-5362a295356d Ready 20d v1.11.2
- список нод кластера;
$ kubectl get pods --namespace=app01 No resources found.
- вывод всех под в заданном пространстве имен;
$ kubectl config view apiVersion: v1 clusters: - cluster: certificate-authority-data: REDACTED server: https://pkscluster01:8443 name: cluster01 contexts: - context: cluster: cluster01 namespace: app01 user: 3b5efcac-7ca1-448f-8942-0bd7a19a6207 name: cluster01 current-context: cluster01 kind: Config preferences: {} users: - name: 3b5efcac-7ca1-448f-8942-0bd7a19a6207 user: token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJl........fsfe23423Fa
- просмотр текущего конфигурационного файла kubernetes
Репозиторий harbor
Harbor — корпоративное хранилище образов docker с поддержкой ролевой системы доступа, проверкой образов на наличие уязвимостей, возможностью подписи и репликации образов.
Пример подключения:
$ docker login harbor.zabedu.ru -u developer@zabedu.ru Password: Login Succeeded
Если docker ругается на сертификат, то нужно скачать сертификат реестра, поместить его в /etc/docker/certs.d/harbor.zabedu.ru/ и перезапустить службу docker:
$ service docker restart
# подключение и загрузка образа из нашего реестра $ docker pull harbor.zabedu.ru/pks-vra-01/nginx # загрузка образа в реестр своего проекта $ docker tag nginx harbor.zabedu.ru/pks-vra-01/nginx:1.0 $ docker push harbor.zabedu.ru/pks-vra-01/nginx:1.0 $ docker logout harbor.zabedu.ru
Развертывание приложений
Для тестирования развертывания приложения на PKS создайте файл nxinx.yaml:
apiVersion: v1 kind: Service metadata: labels: name: nginx name: nginx namespace: app01 spec: ports: - port: 80 selector: app: nginx type: LoadBalancer --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx namespace: app01 spec: replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: harbor.zabedu.ru/pks-vra-01/nginx:latest ports: - containerPort: 80
Этот файл описывает простое приложение, состоящее из трех контейнеров nginx и балансировщика нагрузки. В настройках указано пространство имен (app01) и метки для удобства поиска приложения и управления им.
$ kubectl apply -f nginx.yaml service/nginx created deployment.extensions/nginx created
- запуск приложения;
$ kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx 3 3 3 3 19s
- вывод информации о текущих развертываниях;
$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE nginx-584f549cf5-5z6xn 1/1 Running 0 38s 192.168.1.2 4ad39b5d-7b3d-4af1-82e4-133374c55baenginx-584f549cf5-kwdqr 1/1 Running 0 38s 192.168.1.4 b9b587f7-1eb4-4b33-a305-78ec645a286b nginx-584f549cf5-pkwdc 1/1 Running 0 38s 192.168.1.3 e8381546-d404-495b-b992-5362a295356d
- информация о подах, -o wide выводит расширенную информацию;
$ kubectl get pods -l app=nginx NAME READY STATUS RESTARTS AGE nginx-584f549cf5-5z6xn 1/1 Running 0 4m nginx-584f549cf5-kwdqr 1/1 Running 0 4m nginx-584f549cf5-pkwdc 1/1 Running 0 4m
- тот же список, но с фильтрацией по метке, данная возможность просто необходима для сложных приложений;
$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx LoadBalancer 10.10.20.12 10.91.33.23 80:32297/TCP 4m
- информация о службах (services), в нашем приложении это LoadBalancer. Обратите внимание на поле EXTERNAL-IP, оно содержит IP для обращения к Вашему приложению;
$ kubectl scale deployment nginx --replicas 5 deployment.extensions/nginx scaled
- масштабирование приложения, увеличит количество под до 5;
$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE nginx-584f549cf5-5z6xn 1/1 Running 0 7m 192.168.1.2 4ad39b5d-7b3d-4af1-82e4-133374c55baenginx-584f549cf5-f7mlx 1/1 Running 0 21s 192.168.1.6 4ad39b5d-7b3d-4af1-82e4-133374c55bae nginx-584f549cf5-kwdqr 1/1 Running 0 7m 192.168.1.4 b9b587f7-1eb4-4b33-a305-78ec645a286b nginx-584f549cf5-n7krw 1/1 Running 0 21s 192.168.1.5 b9b587f7-1eb4-4b33-a305-78ec645a286b nginx-584f549cf5-pkwdc 1/1 Running 0 7m 192.168.1.3 e8381546-d404-495b-b992-5362a295356d
$ kubectl delete -f nginx.yaml service "nginx" deleted deployment.extensions "nginx" deleted
- удаление/выключение приложения.
Мониторинг работы и GUI
Если Вам удобнее работать с графическим интерфейсом, то уже реализована интеграция PKS с VMware vRealize Automation (начиная с версии 7.5). Доработанный интерфейс admiral не только отображает информацию о кластере и всех его компонентах, он позволяет загрузить конфигурационный файл kubernetes для кластера и управлять всеми приложениями:
А для мониторинга кластера kubernetes выпущен VMware vRealize® Operations Management Pack™ for Container Monitoring для vROps. Пакет предназначен для мониторинга кластеров kubernetes: пространства имен, кластеры, наборы реплик, узлы, подсети и контейнеры. Панель мониторинга пригодится и при устранении неполадок: вычисляются индексы производительности и отображаются предупреждения по различным компонентам kubernetes. Кластер ставится на мониторинг администратором PKS.
Официальная документация по продукту PKS: https://docs.pivotal.io/runtimes/pks/1-2/