Есть различные готовые реализации кластера Kubernetes, например:
- Minikube — готовый кластер, который разворачивается на один компьютер - хороший способ познакомиться с Kubernetes.
- Kubespray — набор Ansible ролей.
- Готовые кластеры в облаке, например AWS, Google Cloud, Yandex Cloud и так далее. Использовать одну из готовых реализаций — быстрый и надежный способ развертывания системы оркестрации контейнеров Docker. Однако, мы рассмотрим ручное создание кластера Kubernetes из 3-х нод — один мастер (управление) и две рабочие ноды (запуск контейнеров).
Подготовка системы
Данные действия выполняем на всех узлах будущего кластера. Это необходимо, чтобы удовлетворить программные системные требования для нашего кластера.
- Задаем имена узлам, выполняив команды на соответствующих серверах:
hostnamectl set-hostname k8s-master1.server.local
hostnamectl set-hostname k8s-worker1.server.local
hostnamectl set-hostname k8s-worker2.server.local
В данном примере мы зададим имя k8s-master1 для мастера и k8s-worker1, k8s-worker2 — для первого и второго рабочих нод, соотвественно. Чтобы наши серверы были доступны по заданным именам, на сервере DNS добавим соответствующие А-записи, либо правим файл hosts на каждом сервере:
$sudo vi /etc/hosts
добавляем записи(Вы можете использовать свои имена):
192.168.0.15 k8s-master1.server.local k8s-master1
192.168.0.20 k8s-worker1.server.local k8s-worker1
192.168.0.25 k8s-worker2.server.local k8s-worker2
где, 192.168.0.15, 192.168.0.20, 192.168.0.25 — IP-адреса наших серверов, k8s-master1, k8s-worker1, k8s-worker2 — имена серверов, server.local — наш внутренний домен.
- Устанавливаем необходимые компоненты — дополнительные пакеты и утилиты. Для начала, обновим список пакетов и саму систему:
$sudo apt-get update && apt-get upgrade
Выполняем установку пакетов:
$sudo apt-get install curl apt-transport-https git iptables-persistent
где:
- git — утилита для работы с GIT. Понадобиться для загрузки файлов из репозитория git.
- curl — утилита для отправки GET, POST и других запросов на http-сервер. Понадобиться для загрузки ключа репозитория Kubernetes.
- apt-transport-https — позволяет получить доступ к APT-репозиториям по протоколу https.
- iptables-persistent — утилита для сохранения правил, созданных в iptables (не обязательна, но повышает удобство). В процессе установки iptables-persistent может запросить подтверждение сохранить правила брандмауэра — отказываемся.
- Отключаем файл подкачки, так как с ним Kubernetes не запустится. Выполняем команду для разового отключения:
$sudo swapoff -a
Чтобы swap не появился после перезагрузки сервера, открываем на редактирование файл:
$sudo vi /etc/fstab
И комментируем строку:
#/swap.img none swap sw 0 0
- Загружаем дополнительные модули ядра.
$sudo vi /etc/modules-load.d/k8s.conf
br_netfilter
overlay
- модуль br_netfilter расширяет возможности netfilter;
- overlay необходим для Docker. Загрузим модули в ядро:
$sudo modprobe br_netfilter
$sudo modprobe overlay
Проверяем, что данные модули работают:
$sudo lsmod | egrep "br_netfilter|overlay"
Мы должны увидеть что-то на подобие:
overlay 114688 10
br_netfilter 28672 0
bridge 176128 1 br_netfilter
- Изменим параметры ядра. Создаем конфигурационный файл:
$sudo vi /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-iptables контролирует возможность обработки трафика через bridge в netfilter. В нашем примере мы разрешаем данную обработку для IPv4 и IPv6. Применяем параметры командой:
sysctl --system
Брандмауэр
Для мастер-ноды и рабочей создаем разные наборы правил. По умолчанию, в Ubuntu брандмауэр настроен на разрешение любого трафика. Если мы настраиваем наш кластер в тестовой среде, настройка брандмауэра не обязательна.
- На мастер-ноде (Control-plane) Выполняем команду:
$sudo iptables -I INPUT 1 -p tcp --match multiport --dports 6443,2379:2380,10250:10252 -j ACCEPT
в данном примере мы открываем следующие порты:
- 6443 — подключение для управления (Kubernetes API).
- 2379:2380 — порты для взаимодействия мастера с воркерами (etcd server client API).
- 10250:10252 — работа с kubelet (соответственно API, scheduler, controller-manager). Для сохранения правил выполняем команду:
$sudo netfilter-persistent save
- На рабочей ноде (Worker): На нодах для контейнеров открываем такие порты:
$sudo iptables -I INPUT 1 -p tcp --match multiport --dports 10250,30000:32767 -j ACCEPT
где:
- 10250 — подключение к kubelet API.
- 30000:32767 — рабочие порты по умолчанию для подключения к подам (NodePort Services). Сохраняем правила командой:
$sudo netfilter-persistent save
Установка и настройка Docker
На все узлы кластера выполняем установку Docker следующей командой:
$sudo apt-get install docker docker.io
После установки разрешаем автозапуск сервиса docker:
systemctl enable docker
Создаем файл:
$sudo vi /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
для нас является важной настройкой cgroupdriver — она должна быть выставлена в значение systemd. В противном случае, при создании кластера Kubernetes выдаст предупреждение. Хоть на возможность работы последнего это не влияет, но мы постараемся выполнить развертывание без ошибок и предупреждений со стороны системы. Перезапускаем docker:
$sudo systemctl restart docker
Установка Kubernetes
- Установку необходимых компонентов выполним из репозитория. Добавим его ключ для цифровой подписи:
$sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
- Создадим файл с настройкой репозитория:
$sudo vi /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
- Обновим список пакетов:
$sudo apt-get update
- Устанавливаем пакеты:
$sudo apt-get install kubelet kubeadm kubectl
где:
- kubelet — сервис, который запускается и работает на каждом узле кластера. Следит за работоспособностью подов.
- kubeadm — утилита для управления кластером Kubernetes.
- kubectl — утилита для отправки команд кластеру Kubernetes. Нормальная работа кластера сильно зависит от версии установленных пакетов. Поэтому бесконтрольное их обновление может привести к потере работоспособности всей системы. Чтобы этого не произошло, запрещаем обновление установленных компонентов:
$sudo apt-mark hold kubelet kubeadm kubectl
Установка завершена — можно запустить команду:
$sudo kubectl version --client
Мы увидим установленную версию программы:
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.2", GitCommit:"faecb196815e248d3ecfb03c680a4507229c2a56", GitTreeState:"clean", BuildDate:"2021-01-13T13:28:09Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
Наши серверы готовы к созданию кластера.
Создание кластера
По-отдельности, рассмотрим процесс настройки мастер ноды (control-plane) и присоединения к ней двух рабочих нод (worker).
Настройка control-plane (мастер ноды) Выполняем команду на мастер ноде:
$sudo kubeadm init --pod-network-cidr=10.244.0.0/16
данная команда выполнит начальную настройку и подготовку основного узла кластера. Ключ --pod-network-cidr задает адрес внутренней подсети для нашего кластера. Выполнение займет несколько минут, после чего мы увидим что-то на подобие:
...
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.0.15:6443 --token f7sihu.wmgzwxkvbr8500al \
--discovery-token-ca-cert-hash sha256:6746f66b2197ef496192c9e240b31275747734cf74057e04409c33b1ad280321
данную команду нужно вводить на worker нодах, чтобы присоединить их к нашему кластеру. Можно ее скопировать, но позже мы будем генерировать данную команду по новой. В окружении пользователя создаем переменную KUBECONFIG, с помощью которой будет указан путь до файла конфигурации kubernetes:
$sudo export KUBECONFIG=/etc/kubernetes/admin.conf
Чтобы каждый раз при входе в систему не приходилось повторять данную команду, открываем файл:
$sudo vi /etc/environment
И добавляем в него строку:
export KUBECONFIG=/etc/kubernetes/admin.conf
Посмотреть список узлов кластера можно командой:
$sudo kubectl get nodes
На данном этапе мы должны увидеть только мастер ноду:
NAME STATUS ROLES AGE VERSION
k8s-master.server.local NotReady <none> 10m v1.20.2
Чтобы завершить настройку, необходимо установить CNI (Container Networking Interface) — в моем примере это flannel:
$sudo kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Узел управления кластером готов к работе.
Настройка worker (рабочей ноды)
Мы можем использовать команду для присоединения рабочего узла, которую мы получили после инициализации мастер ноды или вводим (на первом узле):
$sudo kubeadm token create --print-join-command
Данная команда покажет нам запрос на присоединения новой ноды к кластеру, например:
kubeadm join 192.168.0.15:6443 --token f7sihu.wmgzwxkvbr8500al \
--discovery-token-ca-cert-hash sha256:6746f66b2197ef496192c9e240b31275747734cf74057e04409c33b1ad280321
Копируем его и используем на двух наших узлах. После завершения работы команды, мы должны увидеть:
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
На мастер ноде вводим:
$sudo kubectl get nodes
Мы должны увидеть:
NAME STATUS ROLES AGE VERSION
k8s-master1.server.local Ready control-plane,master 18m v1.20.2
k8s-worker1.server.local Ready <none> 79s v1.20.2
k8s-worker2.server.local Ready <none> 77s v1.20.2
Наш кластер готов к работе. Теперь можно создавать поды, развертывания и службы. Рассмотрим эти процессы подробнее.
Pods
Поды — неделимая сущность объекта в Kubernetes. Каждый Pod может включать в себя несколько контейнеров (минимум, 1). Рассмотрим несколько примеров, как работать с подами. Все команды выполняем на мастере. Создание Поды создаются командой kubectl, например:
$sudo kubectl run nginx --image=nginx:latest --port=80
в данном примере мы создаем под с названием nginx, который в качестве образа Docker будет использовать nginx (последнюю версию); также наш под будет слушать запросы на порту 80. Чтобы получить сетевой доступ к созданному поду, создаем port-forward следующей командой:
$sudo kubectl port-forward nginx --address 0.0.0.0 8888:80
в данном примере запросы к кластеру kubernetes на порт 8888 будут вести на порт 80 (который мы использовали для нашего пода). Команда kubectl port-forward является интерактивной. Ее мы используем только для тестирования. Чтобы пробросить нужные порты в Kubernetes используются Services — об этом будет сказано ниже. Можно открыть браузер и ввести адрес http://<IP-адрес мастера>:8888 — должна открыться страница приветствия для NGINX. Просмотр Получить список всех подов в кластере можно командой:
kubectl get pods
Например, в нашем примере мы должны увидеть что-то на подобие:
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 3m26s
Посмотреть подробную информацию о конкретном поде можно командой:
kubectl describe pods nginx
Запуск команд внутри контейнера Мы можем запустить одну команду в контейнере, например, такой командой:
kubectl exec nginx -- date
в данном примере будет запущена команда date внутри контейнера nginx. Также мы можем подключиться к командной строке контейнера командой:
kubectl exec --tty --stdin nginx -- /bin/bash
Удаление Для удаления пода вводим:
$sudo kubectl delete pods nginx
Использование манифестов
В продуктивной среде управление подами выполняется с помощью специальных файлов с описанием того, как должен создаваться и настраиваться под — манифестов. Рассмотрим пример создания и применения такого манифеста. Создадим файл формата yml:
$sudo vi manifest_pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: web-srv
labels:
app: web_server
owner: dmosk
description: web_server_for_site
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
- containerPort: 443
- name: php-fpm
image: php-fpm:latest
ports:
- containerPort: 9000
- name: mariadb
image: mariadb:latest
ports:
- containerPort: 3306
в данном примере будет создан под с названием web-srv; в данном поде будет развернуто 3 контейнера — nginx, php-fpm и mariadb на основе одноименных образов. Для объектов Kubernetes очень важное значение имеют метки или labels. Необходимо всегда их описывать. Далее, данные метки могут использоваться для настройки сервисов и развертываний. Чтобы применить манифест выполняем команду:
$sudo kubectl apply -f manifest_pod.yaml
Мы должны увидеть ответ:
pod/web-srv created
Смотрим поды командой:
$sudo kubectl get pods
Мы должны увидеть:
NAME READY STATUS RESTARTS AGE
web-srv 3/3 Ready 0 3m11s
для Ready мы можем увидеть 0/3 или 1/3 — это значит, что контейнеры внутри пода еще создаются и нужно подождать.
Deployments
Развертывания позволяют управлять экземплярами подов. С их помощью контролируется их восстановление, а также балансировка нагрузки. Рассмотрим пример использования Deployments в Kubernetes. Создание Deployment создаем командой со следующим синтаксисом: kubectl create deploy <название для развертывания> --image <образ, который должен использоваться> Например:
kubectl create deploy web-set --image nginx:latest
данной командой мы создадим deployment с именем web-set; в качестве образа будем использовать nginx:latest. Просмотр Посмотреть список развертываний можно командой:
$sudo kubectl get deploy
Подробное описание для конкретного развертывания мы можем посмотреть так:
$sudo kubectl describe deploy web-set
в данном примере мы посмотрим описание deployment с названием web-set.
Scaling
Как было написано выше, deployment может балансировать нагрузкой. Это контролируется параметром scaling:
kubectl scale deploy web-set --replicas 3
в данном примере мы указываем для нашего созданного ранее deployment использовать 3 реплики — то есть Kubernetes создаст 3 экземпляра контейнеров. Также мы можем настроить автоматическую балансировку:
$sudo kubectl autoscale deploy web-set --min=5 --max=10 --cpu-percent=75
В данном примере Kubernetes будет создавать от 5 до 10 экземпляров контейнеров — добавление нового экземпляра будет происходить при превышении нагрузки на процессор до 75% и более. Посмотреть созданные параметры балансировки можно командой:
$sudo kubectl get hpa
Редактирование Для нашего развертывания мы можем изменить используемый образ, например:
$sudo kubectl set image deploy/web-set nginx=httpd:latest --record
данной командой для deployment web-set мы заменим образ nginx на httpd, а ключ record позволит нам записать действие в историю изменений. Если мы использовали ключ record, то историю изменений можно посмотреть командой:
$sudo kubectl rollout history deploy/web-set
Перезапустить deployment можно командой:
$sudo kubectl rollout restart deploy web-set
Манифесты
Как в случае с подами, для создания развертываний мы можем использовать манифесты. Попробуем рассмотреть конкретный пример. Создание Создаем новый файл:
$sudo vi manifest_deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deploy
labels:
app: web_server
owner: dmosk
description: web_server_for_site
spec:
replicas: 5
selector:
matchLabels:
project: myweb
template:
metadata:
labels:
project: myweb
owner: dmosk
description: web_server_pod
spec:
containers:
- name: myweb-httpd
image: httpd:latest
ports:
- containerPort: 80
- containerPort: 443
---
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: web-deploy-autoscaling
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myweb-autoscaling
minReplicas: 5
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 75
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
в данном манифесте мы создадим deployment и autoscaling. Итого, мы получим 5 экземпляров подов для развертывания web-deploy, которые могут быть расширены до 10 экземпляров. Добавление нового будет происходить при превышении нагрузки на процессор более чем на 75% или потреблением оперативной памяти более чем на 80%. Чтобы создать объекты с помощью нашего манифеста вводим:
$sudo kubectl apply -f manifest_deploy.yaml
Мы должны увидеть:
deployment.apps/web-deploy created
horizontalpodautoscaler.autoscaling/web-deploy-autoscaling created
Объекты web-deploy и web-deploy-autoscaling созданы. Удаление Для удаления конкретного развертывания используем команду:
$sudo kubectl delete deploy web-set
Для удаления всех развертываний вместо названия deployment указываем ключ --all:
$sudo kubectl delete deploy --all
Удалить критерии autoscaling для конкретного развертывания можно командой:
$sudo kubectl delete hpa web-set
Удалить все критерии autoscaling можно командой:
$sudo kubectl delete hpa --all
Удалить объекты, созданные с помощью манифеста можно командой:
$sudo kubectl delete -f manifest_deploy.yaml
Services
Службы позволяют обеспечить сетевую доступность для развертываний. Существует несколько типов сервисов:
- ClusterIP — сопоставление адреса с deployments для подключений внутри кластера Kubernetes.
- NodePort — для внешней публикации развертывания.
- LoadBalancer — сопоставление через внешний балансировщик.
- ExternalName — сопоставляет службу по имени (возвращает значение записи CNAME). Мы рассмотрим первые два варианта.
Привязка к Deployments
Попробуем создать сопоставления для ранее созданного развертывания:
kubectl expose deploy web-deploy --type=ClusterIP --port=80
где web-deploy — deployment, который мы развернули с помощью манифеста. Публикация ресурса происходит на внутреннем порту 80. Обращаться к контейнерам можно внутри кластера Kubernetes. Для создания сопоставления, с помощью которого можно будет подключиться к контейнерам из внешней сети выполняется командой:
$sudo kubectl expose deploy web-deploy --type=NodePort --port=80
данная команда отличается от команды выше только типом NodePort — для данному deployment будет сопоставлен порт для внешнего подключения, который будет вести на внутренний (в нашем примере, 80). Просмотр Чтобы посмотреть созданные нами службы, вводим:
kubectl get services
Мы можем увидеть что-то на подобие:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web-deploy NodePort 10.111.229.132 <none> 80:30929/TCP 21s
в данном примере указано, что у нас есть служба типа NodePort, а к сервису можно подключиться по порту 30929. Можно попробовать открыть браузер и ввести http://<IP-адрес мастера>:30929 — мы должны увидеть нужную нам страницу (в наших примерах, либо NGINX, либо Apache). Просмотр Посмотреть список сервисов с указанием селектором можно командой:
$sudo kubectl get services -o wide
Удаление Удаляем созданную службу командой:
$sudo kubectl delete services web-deploy
в данном примере будет удалена служба для развертывания web-deploy. Удалить все службы можно командой:
$sudo kubectl delete services --all
** Манифест ** Как в случае с подами и развертываниями, мы можем использовать манифест-файлы. Рассмотрим небольшой пример.
$sudo vi manifest_service.yaml
apiVersion: v1
kind: Service
metadata:
name: web-service
labels:
app: web_server
owner: dmosk
description: web_server_for_site
spec:
selector:
project: myweb
type: NodePort
ports:
- name: app-http
protocol: TCP
port: 80
targetPort: 80
- name: app-smtp
protocol: TCP
port: 25
targetPort: 25
в данном примере мы создадим службу, которая будем связываться с развертыванием по лейболу project: myweb.
Ingress Controller
В данной инструкции не будет рассказано о работе с Ingress Controller. Оставляем данный пункт для самостоятельного изучения. Данное приложение позволяет создать балансировщик, распределяющий сетевые запросы между нашими сервисами. Порядок обработки сетевого трафика определяем с помощью Ingress Rules. Существует не маленькое количество реализаций Ingress Controller — их сравнение можно найти в документе по ссылке в Google Docs. Для установки Ingress Controller Contour (среди множества контроллеров, он легко устанавливается и на момент обновления данной инструкции полностью поддерживает последнюю версию кластера Kubernetes) вводим:
$sudo kubectl apply -f https://projectcontour.io/quickstart/contour.yaml
Установка веб-интерфейса Веб-интерфейс позволяет получить информацию о работе кластера в удобном для просмотра виде. В большинстве инструкций рассказано, как получить доступ к веб-интерфейсу с того же компьютера, на котором находится кластер (по адресу 127.0.0.1 или localhost). Но мы рассмотрим настройку для удаленного подключения, так как это более актуально для серверной инфраструктуры.
- Переходим на страницу веб-интерфейса в GitHub и копируем ссылку на последнюю версию файла yaml. Копируем ссылку на конфигурационный файл для создания панели управления Kubernetes, на момент обновления инструкции, последняя версия интерфейса была 2.1.0.
- Скачиваем yaml-файл командой:
$wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.1.0/aio/deploy/recommended.yaml
где https://raw.githubusercontent.com/kubernetes/dashboard/v2.1.0/aio/deploy/recommended.yaml — ссылка, которую мы скопировали на портале GitHub.
- Открываем на редактирование скачанный файл:
$vi recommended.yaml
Комментируем строки для kind: Namespace и kind: Secret (в файле несколько блоков с kind: Secret — нам нужен тот, что с name: kubernetes-dashboard-certs):
...
#apiVersion: v1
#kind: Namespace
#metadata:
# name: kubernetes-dashboard
...
#apiVersion: v1
#kind: Secret
#metadata:
# labels:
# k8s-app: kubernetes-dashboard
# name: kubernetes-dashboard-certs
# namespace: kubernetes-dashboard
#type: Opaque
нам необходимо закомментировать эти блоки, так как данные настройки в Kubernetes мы должны будем сделать вручную. Теперь в том же файле находим kind: Service (который с name: kubernetes-dashboard) и добавляем строки type: NodePort и nodePort: 30001 (выделены красным):
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 30001
selector:
k8s-app: kubernetes-dashboard
таким образом, мы публикуем наш сервис на внешнем адресе и порту 30001. Для подключения к веб-интерфейсу не через локальный адрес, начиная с версии 1.17, обязательно необходимо использовать зашифрованное подключение (https). Для этого нужен сертификат. В данной инструкции мы сгенерируем самоподписанный сертификат — данный подход удобен для тестовой среды, но в продуктивной среде необходимо купить сертификат или получить его бесплатно в Let's Encrypt. И так, создаем каталог, куда разместим наши сертификаты:
$sudo mkdir -p /etc/ssl/kubernetes
Сгенерируем сертификаты командой:
$sudo openssl req -new -x509 -days 1461 -nodes -out /etc/ssl/kubernetes/cert.pem -keyout /etc/ssl/kubernetes/cert.key -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=kubernetes.dmosk.local/CN=kubernetes"
можно не менять параметры команды, а так их и оставить. Браузер все-равно будет выдавать предупреждение о неправильном сертификате, так как он самоподписанный. Создаем namespace
$sudo kubectl create namespace kubernetes-dashboard
это та первая настройка, которую мы комментировали в скачанном файле recommended.yaml. Теперь создаем настройку для secret с использованием наших сертификатов:
$sudo kubectl create secret generic kubernetes-dashboard-certs --from-file=/etc/ssl/kubernetes/cert.key --from-file=/etc/ssl/kubernetes/cert.pem -n kubernetes-dashboard
собственно, мы не использовали настройку в скачанном файле, так как создаем ее с включением в параметры пути до созданных нами сертификатов. Теперь создаем остальные настройки с помощью скачанного файла:
$sudo kubectl create -f recommended.yaml
Мы увидим что-то на подобие:
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
Создадим настройку для админского подключения:
$sudo vi dashboard-admin.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: kubernetes-dashboard
name: dashboard-admin
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dashboard-admin-bind-cluster-role
labels:
k8s-app: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kubernetes-dashboard
Создаем настройку с применением созданного файла:
$sudo kubectl create -f dashboard-admin.yaml
Теперь открываем браузер и переходим по ссылке https://<IP-адрес мастера>:30001 — браузер покажет ошибку сертификата (если мы настраиваем по инструкции и сгенерировали самоподписанный сертификат). Игнорируем ошибку и продолжаем загрузку. Kubernetes Dashboard потребует пройти проверку подлинности. Для этого можно использовать токен или конфигурационный файл. На сервере вводим команду для создания сервисной учетной записи:
$sudo kubectl create serviceaccount dashboard-admin -n kube-system
Создадим привязку нашего сервисного аккаунта с Kubernetes Dashboard:
$sudo kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
Теперь камандой:
$sudo kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
... получаем токен для подключения:
Data
====
ca.crt: 1066 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IkpCT0J5TWF2VWxWQUotdHZYclFUaWwza2NfTW1IZVNuSlZSN3hWUzFrNTAifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tbnRqNmYiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMzIwNjVhYmQtNzAwYy00Yzk5LThmZjktZjc0YjM5MTU0Y2VhIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.wvDGeNiTCRBakDplO6PbdqvPH_W2EsBgJjZnTDflneP3cdXQv6VgBkI8NalplXDRF-lF36KbbC2hpRjbkblrLW7BemIVWYOznmc8kmrgCSxO2FVi93NK3biE9TkDlj1BbdiyfOO86L56vteXGP20X0Xs1h3cjAshs-70bsnJl6z3MY5GbRVejOyVzq_PWMVYsqvQhssExsJM2tKJWG0DnXCW687XHistbYUolhxSRoRpMZk-JrguuwgLH5FYIIU-ZdTZA6mz-_hqrx8PoDvqEfWrsniM6Q0k8U3TMaDLlduzA7rwLRJBQt3C0aD6XfR9wHUqUWd5y953u67wpFPrSA
Используя полученный токен, вводим его в панели авторизации. Мы должны увидеть стартовое окно системы управления.
Удаление нод
При необходимости удалить ноду из нашего кластера, вводим 2 команды:
$sudo kubectl drain k8s-worker2.server.local --ignore-daemonsets
$sudo kubectl delete node k8s-worker2.server.local
в данном примере мы удаляем ноду k8s-worker2.server.local.