Важно понимать, что в кластере должно быть нечётное количество control нод.
После создания первой ноды кластера, kubeadm выведет на стандартный вывод команды для добавления новых нод. Если не прошло больше суток после создания первой control ноды, то эти команды можно использовать для добавления. Если прошло больше суток (время жизни сгенерированного токена), то придётся почитать этот раздел до конца.
Посмотреть список токенов можно следующим образом:
kubeadm token list
В столбце TTL будет показано, сколько времени осталось до окончания действия токена.
На самом деле всё, что будет показано ниже можно сделать за меньшее количество шагов. Но этот пример в дальнейшем будет легко автоматизировать.
Сначала создадим новый токен (join_token).
kubeadm token create
Программа выдаст на стандартный вывод новый токен. Что-то типа: 8g5max.xfbtvkmud52htbmv
.
Так же нам потребуется хеш сертификата CA (ca_cert_hash):
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | \
openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
На стандартном выводе получим что-то типа: 41ead9594abbcfb6d8c85cbde18e91ecb39669f08b6ac4093ebfed43d7a1e588
.
На следующем шаге поместим сертификаты в secret kubeadm-certs
в namespace kube-system
.
kubeadm init phase upload-certs --upload-certs | tail -1
В последней строке получим ключ сертификата (certificate_key). Что-то
вроде: 3f47da5379374fe688e92ebc93d59a58e8b3b130aca807bc9db68a7821ecfd95
.
Можно посмотреть содержимое сгенерированного сикрета:
kubectl -n kube-system get secret kubeadm-certs -o yaml
Ну и в заключение получим путь (join_path), по которому будем посылать запрос на подключение.
kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}' | cut -c9-
На стандартном выводе должны получить IP адрес и порт. 192.168.218.189:7443
Команда для подключения control ноды будет следующая:
kubeadm join join_path --token join_token \
--discovery-token-ca-cert-hash sha256:ca_cert_hash \
--control-plane --certificate-key certificate_key
Подставьте свои значения и запустите команду на остальных серверах, где планируется разместить control ноды.
kubeadm join 192.168.218.189:7443 --token 8g5max.xfbtvkmud52htbmv \
--discovery-token-ca-cert-hash sha256:41ead9594abbcfb6d8c85cbde18e91ecb39669f08b6ac4093ebfed43d7a1e588 \
--control-plane --certificate-key 3f47da5379374fe688e92ebc93d59a58e8b3b130aca807bc9db68a7821ecfd95
Убедитесь, что control ноды добавлены в кластер.
kubectl get nodes
kubectl get pods -A
Посмотрим, на каких нодах работают поды coredns.
kubectl -n kube-system get pods -o wide | grep coredns
Несмотря на то, что в Deployment корректно настроен podAntiAffinity, он не сработает до тех пор, пока в системе не появятся новые ноды кластера и мы не перезапустим Deployment.
kubectl -n kube-system rollout restart deployment coredns
Убедимся, что поды DNS сервера разъехались по разным нодам кластера.
kubectl -n kube-system get pods -o wide | grep coredns
Ansible install-another-controls.yaml