Kubernetes. Установка 3 мастера 2 воркера 1 баллансировщик

Thank you for reading this post, don't forget to subscribe!

Общая схе­ма:

име­ют­ся сле­ду­ю­щие сервера:
3 сер­ве­ра для master nodes, 2 для worker nodes и 1 для load balancer:

192.168.1.120 kub-lb-120
192.168.1.121 kub-master-121
192.168.1.122 kub-master-122
192.168.1.123 kub-master-123
192.168.1.124 kub-work-124
192.168.1.124 kub-work-125

Балансировщик нагрузки NGINX

Будем исполь­зо­вать NGINX в каче­стве TCP балансировщика.

Добав­ля­ем репозиторий:

yum install -y epel-release

Добав­ля­ем в самый них nginx.conf /etc/nginx/nginx.conf
на:

Рестар­ту­ем nginx сервер:

Kubernetes

Под­го­тав­ли­ва­ем Kubernetes сер­ве­ра на базе centos 7. (на всех нодах кро­ме балансировщика)

Добав­ля­ем docker репозиторий:

Уста­нав­ли­ва­ем docker:

yum install -y yum-utils device-mapper-persistent-data lvm2
yum install -y docker-ce docker-ce-cli containerd.io
Запус­ка­ем docker служ­бу  и ста­вим ее в автозагрузку:
systemctl enable docker
systemctl start docker
Созда­ем кон­фи­гу­ра­ци­он­ный файл для docker:
vim /etc/docker/daemon.json
[codesyntax lang="php"]

[/codesyntax]
Рестар­ту­ем docker для при­ме­не­ния новой конфигурации:
systemctl restart docker
Добав­ля­ем kubernetes репозиторий:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
Уста­нав­ли­ва­ем kubernetes пакеты:
yum install -y kubelet kubeadm kubectl
Добав­ля­ем kubelet в авто­за­пуск и стар­ту­ем его:
systemctl enable kubelet
systemctl start kubelet
Добав­ля­ем пара­мет­ры в systctl:
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
При­ме­ня­ем:
sysctl --system
Отсклю­ча­ем swap:
swapoff -a
а так­же комен­тим его в /etc/fstab

Мастер ноды:

Созда­ем дирек­то­рию kubeadm:

В этой дирек­то­рии созда­ем кон­фи­гу­ра­ци­он­ный файл для ини­ци­а­ли­за­ции кластера:

C содер­жи­мым:

Обо­зна­че­ния:
kubernetesVersion Вер­сия kubernetes
controlPlaneEndpoint IP адрес api, мы ука­зы­ва­ем ip наше­го балансировщика
podSubnet Сеть для pod-ов

 

Ини­ци­а­ли­зи­ру­ем кла­стер с ука­за­ни­ем наше­го кон­фи­га и фла­гом —upload-certs. С вер­сии 1.14 появи­лась воз­мож­ность загру­жать сер­ти­фи­ка­ты в etcd.

При­ме­ча­ние!!!!!!!

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

при запус­ке дан­ной коман­ды может воз­ник­нуть сле­ду­ю­щая ошибка:
[root@kub-master-121 ~]# kubeadm init --config=/etc/kubernetes/kubeadm/kubeadm-config.yaml --upload-certs
W0126 16:48:07.358693 14441 common.go:77] your configuration file uses a deprecated API spec: "kubeadm.k8s.io/v1beta1". Please use 'kubeadm config migrate --old-config old.yaml --new-config new.yaml', which will write the new, similar spec using a newer API version.
W0126 16:48:07.358928 14441 strict.go:54] error unmarshaling configuration schema.GroupVersionKind{Group:"kubeadm.k8s.io", Version:"v1beta1", Kind:"ClusterConfiguration"}: error unmarshaling JSON: while decoding JSON: json: unknown field "\u00a0\u00a0podSubnet"
W0126 16:48:08.378766 14441 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0126 16:48:08.378873 14441 validation.go:28] Cannot validate kubelet config - no validator is available
[init] Using Kubernetes version: v1.17.2
[preflight] Running pre-flight checks
[WARNING Hostname]: hostname "kub-master-121" could not be reached
[WARNING Hostname]: hostname "kub-master-121": lookup kub-master-121 on 8.8.8.8:53: no such host
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'

запу­стим что рекомендуется:
[root@kub-master-121 ~]# kubeadm config migrate --old-config /etc/kubernetes/kubeadm/kubeadm-config.yaml --new-config /etc/kubernetes/kubeadm/kubeadm-config-new.yaml
W0126 16:50:33.453918 14598 strict.go:54] error unmarshaling configuration schema.GroupVersionKind{Group:"kubeadm.k8s.io", Version:"v1beta1", Kind:"ClusterConfiguration"}: error unmarshaling JSON: while decoding JSON: json: unknown field "\u00a0\u00a0podSubnet"
W0126 16:50:34.532884 14598 validation.go:28] Cannot validate kubelet config - no validator is available
W0126 16:50:34.532916 14598 validation.go:28] Cannot validate kube-proxy config - no validator is available

новый файл выгля­дит сле­ду­ю­щим образом:
cat /etc/kubernetes/kubeadm/kubeadm-config-new.yaml

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

запу­стим ини­ци­а­цию с новым конфигом:
[root@kub-master-121 ~]# kubeadm init --config=/etc/kubernetes/kubeadm/kubeadm-config-new.yaml --upload-certs

резуль­тат выпол­не­ния следующий:
[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

Созда­ем дирек­то­рию и кла­дем туда кон­фи­гу­ра­ци­он­ный файл для под­клю­че­ния к kubernetes API:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Про­ве­ря­ем рабо­то­спо­соб­ность наше­го API
kubectl get nodes
Долж­ны полу­чить ответ:

Далее копи­ру­ем коман­ду для join масте­ров и запус­ка­ем ее на 2 и 3 сервере:

kubeadm join 192.168.1.120:6443 --token fey0rr.e29qe2vp4mk8sr15 \
--discovery-token-ca-cert-hash sha256:dadc52e26eba9da1e96cc005e8339e92426cecd6ce948536b06382cc79a1b07c \
--control-plane --certificate-key 5f362f91181397c2579e2c0d90befa28b641f58c53fd14a8f06dc1fb4faba53c

После удач­но­го завер­ше­ния мы уви­дим новые мастера

kubectl get nodes

Сер­ти­фи­ка­ты будут уда­лен­ны через 2 часа, токен для join будет уда­лен через 24 часа, токен для выгруз­ки сер­ти­фи­ка­тов уда­лит­ся через 1 час

Смот­рим наши токены :

kubeadm token list

вор­кер ноды добав­ля­ем командой:
kubeadm join 192.168.1.120:6443 --token fey0rr.e29qe2vp4mk8sr15 \ --discovery-token-ca-cert-hash sha256:dadc52e26eba9da1e96cc005e8339e92426cecd6ce948536b06382cc79a1b07c

про­ве­ря­ем:

Все сер­ве­ра добав­ле­ны, но они в ста­ту­се NotReady. Это из-за отсут­ствия сети. В нашем при­ме­ре мы будем исполь­зо­вать сеть  calico. Для это­го уста­но­вим ее в наш кластер

Захо­дим на оф сайт.  На момент напи­са­ния ста­тьи самая послед­няя версия:
https://docs.projectcalico.org/v3.11/introduction/

выка­чи­ва­ем её

curl https://docs.projectcalico.org/v3.11/manifests/calico.yaml -O
kubectl apply -f calico.yaml

 

ждём пару минут и проверяем:
kubectl get nodes

базо­вая уста­нов­ка завершена.

================================================

сге­не­ри­ро­вать токен для добав­ле­ния воркеров:
kubeadm token generate
kubeadm token create <generated-token> --print-join-command --ttl=24h