Добрый день, сегодня будем запускать Kubernetes версии 1.15 в High Availability режиме.
Схема кластера выглядит так:
И так у нас будет 3 сервера для master nodes, 2 для worker nodes и 1 для load balancer:
Имя | IP |
master-1 | 10.0.0.1 |
master-2 | 10.0.0.2 |
master-2 | 10.0.0.3 |
load-balancer | 10.0.0.4 |
worker-1 | 10.0.0.5 |
worker-2 | 10.0.0.6 |
Балансировщик нагрузки NGINX
Будем использовать NGINX в качестве TCP балансировщика.
Добавляем nginx репозиторий:
1 2 3 4 5 6 |
cat <<EOF > /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1 |
Устанавливаем nginx:
1 |
yum install -y nginx |
Заменяем nginx.conf на:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
events { } stream { upstream stream_backend { least_conn; server 10.0.0.1:6443; server 10.0.0.2:6443; server 10.0.0.3:6443; } server { listen 6443; proxy_pass stream_backend; } } |
Рестартуем nginx сервер:
1 |
systemctl nginx restart |
Kubernetes
Подготавливаем Kubernetes сервера на базе centos 7.
Добавляем docker репозиторий:
1 |
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo |
Устанавливаем docker:
1 2 |
yum install -y yum-utils device-mapper-persistent-data lvm2 yum install -y docker-ce-18.09.8 docker-ce-cli-18.09.8 containerd.io |
Запускаем docker службу и ставим ее в автозагрузку:
1 2 |
systemctl enable docker systemctl start docker |
Создаем конфигурационный файл для docker:
1 |
vi /etc/docker/daemon.json |
С содержимым:
1 2 3 4 5 6 7 8 |
{ "exec-opts": ["native.cgroupdriver=systemd"], "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ], "experimental":true } |
Рестартуем docker для применения новой конфигурации:
1 |
systemctl restart docker |
Добавляем kubernetes репозиторий:
1 2 3 4 5 6 7 8 9 |
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 пакеты:
1 |
yum install -y kubelet kubeadm kubectl |
Добавляем kubelet в автозапуск и стартуем его:
1 2 |
systemctl enable kubelet systemctl start kubelet |
Добавляем параметры в systctl:
1 2 3 4 5 |
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 |
Применяем:
1 |
sysctl --system |
Мастер ноды:
Создаем директорию kubeadm:
1 |
mkdir /etc/kubernetes/kubeadm |
В этой директории создаем конфигурационный файл для инициализации кластера:
1 |
vim /etc/kubernetes/kubeadm/kubeadm-config.yaml |
C содержимым:
1 2 3 4 5 6 |
apiVersion: kubeadm.k8s.io/v1beta1 kind: ClusterConfiguration kubernetesVersion: stable controlPlaneEndpoint: "10.0.0.4:6443" networking: podSubnet: 192.168.0.0/16 |
Обозначения: | |
kubernetesVersion | Версия kubernetes |
controlPlaneEndpoint | IP адрес api, мы указываем ip нашего балансировщика |
podSubnet | Сеть для pod-ов |
Инициализируем кластер с указанием нашего конфига и флагом —upload-certs. С версии 1.14 появилась возможность загружать сертификаты в etcd.
1 |
kubeadm init --config=/etc/kubernetes/kubeadm/kubeadm-config.yaml --upload-certs |
Kubeadm сгенерирует нам сертификаты, конфиги для компонентов Kubernetes, и команды для join.
Начиная с версии 1.14 в kubeadm появилась функция join для мастеров и оператор для etcd. Что позволяет быстро добавлять новые мастера в кластер
Теперь мы просто запускаем команду для join мастеров на 2(3,4…) сервере и kubeadm автоматом выкачает сертификаты и перепишет конфиг для etcd.
Создаем директорию и кладем туда конфигурационный файл для подключения к kubernetes API:
1 2 3 |
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config |
Проверяем работоспособность нашего API
1 |
kubectl get nodes |
Должны получить ответ:
NAME | STATUS | ROLES | AGE | VERSION |
master-1 | NotReady | master | 3m51s | v1.15.2 |
Далее копируем команду для join мастеров и запускаем ее на 2 и 3 сервере:
1 2 3 |
kubeadm join 10.0.0.4:6443 --token n7xoow.oqcrlo5a3h2rawxq \ --discovery-token-ca-cert-hash sha256:c0ad04b8bd64e793b615cdac5c51c2552e9be69146d3191f196c78881e9e85ba \ --control-plane --certificate-key 1a187ef8f80b94a03265c2cd65fa9cac10714f9c3507438b7785e31b120862e7 |
После удачного завершения мы увидим новые мастера:
1 |
kubectl get nodes |
NAME | STATUS | ROLES | AGE | VERSION |
master-1 | NotReady | master | 3m51s | v1.15.2 |
master-2 | NotReady | master | 2m31s | v1.15.2 |
master-3 | NotReady | master | 1m22s | v1.15.2 |
Сертификаты будут удаленны через 2 часа, токен для join будет удален через 24 часа, токен для выгрузки сертификатов удалится через 1 час
Смотрим наши токены :
1 |
kubeadm token list |
Вывод:
TOKEN | TTL | EXPIRES | USAGES | DESCRIPTION | EXTRA GROUPS |
n7xoow.oqcrlo5a3h2rawxq | 23h | 2019-08-07T21:47:34+02:00 | authentication,signing | <none> | system:bootstrappers:kubeadm:default-node-token |
q4rc7k.7ratynao0w2caguz | 1h | 2019-08-06T23:47:33+02:00 | <none> | Proxy for managing TTL for the kubeadm-certs secret | <none> |
Теперь удалим все наши токены:
1 2 |
kubeadm token delete n7xoow.oqcrlo5a3h2rawxq kubeadm token delete q4rc7k.7ratynao0w2caguz |
Создадим токен с 10 минутным TTL:
1 |
kubeadm token create --ttl 10m --print-join-command |
Вывод:
1 |
kubeadm join 10.0.0.4:6443 --token am19v8.zov3nu6od7js4t2x --discovery-token-ca-cert-hash sha256:c0ad04b8bd64e793b615cdac5c51c2552e9be69146d3191f196c78881e9e85ba |
Запустим фазу upload-certs:
1 |
kubeadm init phase upload-certs --experimental-upload-certs |
Вывод:
1 2 3 |
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace [upload-certs] Using certificate key: b904b8248991eebe9c783b55a353fb95825e4e2823cb741522f2f4dcdcce5527 |
Новые мастера можно добавлять командой:
1 2 3 4 5 6 |
kubeadm join 10.0.0.4:6443 \ --token am19v8.zov3nu6od7js4t2x \ --discovery-token-ca-cert-hash \ sha256:c0ad04b8bd64e793b615cdac5c51c2552e9be69146d3191f196c78881e9e85ba --control-plane \ --certificate-key b904b8248991eebe9c783b55a353fb95825e4e2823cb741522f2f4dcdcce5527 |
С мастерами закончили переходим на worker ноды
Воркер ноды
По такому же принципу как и для мастеров запускаем команду join на всех worker нодах:
1 2 |
kubeadm join 10.0.0.4:6443 --token am19v8.zov3nu6od7js4t2x \ --discovery-token-ca-cert-hash sha256:c0ad04b8bd64e793b615cdac5c51c2552e9be69146d3191f196c78881e9e85ba |
После добавления всех серверов должные увидеть в выводе команды:
1 |
kubectl get nodes |
Вывод:
NAME | STATUS | ROLES | AGE | VERSION |
master-1 | NotReady | master | 5h | v1.15.2 |
master-2 | NotReady | master | 5h | v1.15.2 |
master-3 | NotReady | master | 5h | v1.15.2 |
worker-1 | NotReady | <none> | 3h | v1.15.2 |
worker-2 | NotReady | <none> | 3h | v1.15.2 |
Все сервера добавлены, но они в статусе NotReady. Это из-за отсутствия сети. В нашем примере мы будем использовать сеть calico. Для этого установим ее в наш кластер
1 2 |
curl https://docs.projectcalico.org/v3.8/manifests/calico.yaml -O kubectl apply -f calico.yaml |
Поверяем:
1 |
kubectl get nodes |
Вывод:
NAME | STATUS | ROLES | AGE | VERSION |
master-1 | Ready | master | 5h | v1.15.2 |
master-2 | Ready | master | 5h | v1.15.2 |
master-3 | Ready | master | 5h | v1.15.2 |
worker-1 | Ready | <none> | 3h | v1.15.2 |
worker-2 | Ready | <none> | 3h | v1.15.2 |
Вот и все наша базовая установка Kubernetes закончена.