Настройка Kubernetes-кластера из 1-го мастера и 2-х нод на виртуальных машин c Ubuntu 18.04
Для практической работы были взяты виртуалки в Digital Ocean(2Gb, 2СPU) с бесплатным бонусом в размере 100$ в течение 60 дней при регистрации на Digital Ocean.
Алгоритм действий состоит из следующих шагов
1.Подготовка к запуску кластера(отключение swap, настройка /etc/hosts-файла серверов, установка имени хоста, установка необходимых пакетов)
2.Инициализация Master-сервера
3.Присоединения Node к кластеру
4.Проверка состояния кластера
1.Подготовка к запуску кластера(отключение swap, настройка /etc/hosts-файлов серверов, установка имени хоста, установка необходимых пакетов)
На всех серверах отключаем swap
1 |
# swapoff -a |
Закомментировать подключение swap(если оно там есть) в файле /etc/fstab
1 |
# sed -i '/swap/ s/^/#/' /etc/fstab |
В файл /etc/hosts на всех серверах добавляем имена серверов и их IP-адреса
1 2 3 |
159.65.XXX.XXX kub-master.mydomain.com kub-master 167.99.YYY.YYY kub-node1.mydomain.com kub-node1 167.99.ZZZ.ZZZ kub-node2.mydomain.com kub-node2 |
Установки имени хоста
Мастер
1 |
# hostname kub-master |
1 |
# cat /etc/hostname |
1 |
kub-master |
Нода1
1 |
# hostname kub-node1 |
1 |
# cat /etc/hostname |
1 |
kub-node1 |
Нода2
1 |
# hostname kub-node2 |
1 |
# cat /etc/hostname |
1 |
kub-node2 |
Обновление пакетов и установка необходимых пакетов
1 |
# apt-get update && apt-get -y upgrade && apt-get install -y apt-transport-https curl |
Просмотр версии и репозитария, с которого будет установлен пакет docker.io
1 |
# apt-cache policy docker.io | head -n 6 |
1 2 3 4 5 6 |
docker.io: Installed: (none) Candidate: 18.09.2-0ubuntu1~18.04.1 Version table: 18.09.2-0ubuntu1~18.04.1 500 500 http://mirrors.digitalocean.com/ubuntu bionic-updates/universe amd64 Packages |
Добавление GPG-ключа и репозитария для установки kubelet, kubeadm, kubectl
1 |
# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - |
1 2 3 |
# cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://apt.kubernetes.io/ kubernetes-xenial main EOF |
Обновение кеша пакета и просмотр версии и репозитария, с которого будет установлен kubelet
1 |
# apt-get update && apt-cache policy kubelet | head -n 6 |
1 2 3 4 5 6 |
kubelet: Installed: (none) Candidate: 1.13.4-00 Version table: 1.13.4-00 500 500 https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages |
Установка kubelet kubeadm kubectl docker.io
1 |
# apt-get install -y kubelet kubeadm kubectl docker.io |
1 |
# dpkg -l | grep -E 'kubelet|kubeadm|kubectl|docker.io' |
1 2 3 4 |
ii docker.io 18.09.2-0ubuntu1~18.04.1 amd64 Linux container runtime ii kubeadm 1.13.4-00 amd64 Kubernetes Cluster Bootstrapping Tool ii kubectl 1.13.4-00 amd64 Kubernetes Command Line Tool ii kubelet 1.13.4-00 amd64 Kubernetes Node Agent |
Установка блокировки обновления пакетов
1 |
# apt-mark hold kubelet kubeadm kubectl |
Проверка состояния kubelet. Он должен быть в статусе 255
Kubelet теперь перезапускается каждые несколько секунд, так как в аварийном цикле он ждет готовности kubeadm
1 |
# systemctl status kubelet |
1 2 3 4 5 6 7 8 9 10 11 |
● kubelet.service - kubelet: The Kubernetes Node Agent Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled) Drop-In: /etc/systemd/system/kubelet.service.d └─10-kubeadm.conf Active: activating (auto-restart) (Result: exit-code) since Sun 2019-03-24 16:12:43 UTC; 2s ago Docs: https://kubernetes.io/docs/home/ Process: 17695 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ Main PID: 17695 (code=exited, status=255) Mar 24 16:12:43 kub-master systemd[1]: kubelet.service: Main process exited, code=exited, status=255/n/a Mar 24 16:12:43 kub-master systemd[1]: kubelet.service: Failed with result 'exit-code'. |
Проверка состояния Container runtime – docker
Docker должен быть запущен
1 |
# systemctl status docker |
1 2 3 4 5 6 7 8 9 |
● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled) Active: active (running) since Sun 2019-03-24 15:50:22 UTC; 27min ago Docs: https://docs.docker.com Main PID: 13618 (dockerd) Tasks: 22 CGroup: /system.slice/docker.service ├─13618 /usr/bin/dockerd -H fd:// └─13643 docker-containerd --config /var/run/docker/containerd/containerd.toml --log-level info |
Добавление docker и kubelet в автозагрузку
1 |
# systemctl enable docker |
1 |
# systemctl enable kubelet |
2.Инициализация Master-сервера(команды выполняем на Master-сервере)
Параметром
1 |
--apiserver-advertise-address=159.65.XXX.XXX |
мы указываем IP-адрес,на котором будет доступен API-сервер(в данном случае это внешний IP-адрес сервера). Кстати, по умолчанию используется IP-адрес сетевого интерфейса, связанного с дефолтным шлюзем(через который доступен дефолтный шлюз)(Поэтому в данном случае можно было и не указывать опцию —apiserver-advertise-address т.к. ее значение по дефолту совпадает с тем,что было указано опцией)
Параметром
1 |
--pod-network-cidr |
определяется тип сети, который будет использоваться для связи подов между собой
Важно отметить,что подсеть Pod-ов не должна пересекаться с уже имеющимися на хосте подсетями
В данном случае в качестве сетевого провайдера используется Calico, (именно поэтому при выполнени команды kubeadm init значение —pod-network-cidr равно 192.168.0.0/16)
Если, например, использовать Flannel вместо Calico, то CIDR-подсеть необходимо указывать 10.244.0.0/16
Все доступные провайдеры сетей с соотвествующими CIDR-подсетями и инструкцией по настройки сети доступны по ссылке
https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#pod-network
https://kubernetes.io/docs/concepts/cluster-administration/addons/
1 |
# kubeadm init --apiserver-advertise-address=159.65.XXX.XXX --pod-network-cidr=192.168.0.0/16 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
…… [addons] Applied essential addon: CoreDNS [addons] Applied essential addon: kube-proxy Your Kubernetes master has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ You can now join any number of machines by running the following on each node as root: kubeadm join 159.65.XXX.XXX:6443 --token pk3jol.j90cb9pka97dqnm3 --discovery-token-ca-cert-hash sha256:af674f65504b03e5db5cd692cbd0dd29968b50c019d5702fcc6a79b6f9eeb798 |
Здесь создаются манифесты для создания pod-ов с etcd, apiserver, controller-manager, scheduler
1 |
# ls -l /etc/kubernetes/manifests |
1 2 3 4 5 |
total 16 -rw------- 1 root root 1989 Mar 24 16:47 etcd.yaml -rw------- 1 root root 3190 Mar 24 16:47 kube-apiserver.yaml -rw------- 1 root root 2835 Mar 24 16:47 kube-controller-manager.yaml -rw------- 1 root root 1051 Mar 24 16:47 kube-scheduler.yaml |
Здесь создаются kubeconfig-файлы
1 |
# ls -al /etc/kubernetes/*.conf |
1 2 3 4 |
-rw------- 1 root root 5450 Mar 24 16:47 /etc/kubernetes/admin.conf -rw------- 1 root root 5490 Mar 24 16:47 /etc/kubernetes/controller-manager.conf -rw------- 1 root root 5482 Mar 24 16:47 /etc/kubernetes/kubelet.conf -rw------- 1 root root 5434 Mar 24 16:47 /etc/kubernetes/scheduler.conf |
Настройка kubectl на работу с кластером
Для настройки kubectl на работу с кластером выполним команды, предложенные установщиком
1 |
# mkdir -p $HOME/.kube |
1 |
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config |
1 |
# sudo chown $(id -u):$(id -g) $HOME/.kube/config |
Установка пода сети с типом Calico для коммуникации Pod-ов
1 |
# kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml |
1 |
# kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml |
Свидетельством успешной установки сети пода сети является запущенный под CoreDNS
1 |
# kubectl get pods -o wide --all-namespaces | grep -i coredns |
1 2 |
kube-system coredns-86c58d9df4-kjspd 1/1 Running 0 61m 192.168.0.3 kub-master <none> <none> kube-system coredns-86c58d9df4-zxs5j 1/1 Running 0 61m 192.168.0.2 kub-master <none> <none> |
Полезным будет также настроить автодополнение команды kubectl
Включение автодополнения kubectl
1 |
# apt-get install bash-completion |
1 |
# source <(kubectl completion bash) |
1 |
# echo "source <(kubectl completion bash)" >> ~/.bashrc |
3.Присоединения Node-серверов к кластеру
На каждой ноде, которую нужно ввести в кластер выполняем команду, которая была выведена/отображена при инициализации мастера
1 |
# kubeadm join 159.65.XXX.XXX:6443 --token pk3jol.j90cb9pka97dqnm3 --discovery-token-ca-cert-hash sha256:af674f65504b03e5db5cd692cbd0dd29968b50c019d5702fcc6a79b6f9eeb798 |
Добавляем kubelet и docker в авто загрузку
1 |
# systemctl enable kubelet; systemctl enable docker |
Структура каталогов и файлов на присоединенных нодах имеет вид
1 |
# tree /etc/kubernetes/ |
1 2 3 4 5 6 |
/etc/kubernetes/ ├── bootstrap-kubelet.conf ├── kubelet.conf ├── manifests └── pki └── ca.crt |
Структура каталогов и файлов на мастере имеет вид
1 |
# tree /etc/kubernetes/ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
/etc/kubernetes/ ├── admin.conf ├── controller-manager.conf ├── kubelet.conf ├── manifests │ ├── etcd.yaml │ ├── kube-apiserver.yaml │ ├── kube-controller-manager.yaml │ └── kube-scheduler.yaml ├── pki │ ├── apiserver-etcd-client.crt │ ├── apiserver-etcd-client.key │ ├── apiserver-kubelet-client.crt │ ├── apiserver-kubelet-client.key │ ├── apiserver.crt │ ├── apiserver.key │ ├── ca.crt │ ├── ca.key │ ├── etcd │ │ ├── ca.crt │ │ ├── ca.key │ │ ├── healthcheck-client.crt │ │ ├── healthcheck-client.key │ │ ├── peer.crt │ │ ├── peer.key │ │ ├── server.crt │ │ └── server.key │ ├── front-proxy-ca.crt │ ├── front-proxy-ca.key │ ├── front-proxy-client.crt │ ├── front-proxy-client.key │ ├── sa.key │ └── sa.pub └── scheduler.conf |
4.Проверка состояния кластера
На Master-е проверяем наличие нод в кластере
1 |
# kubectl get nodes -o wide |
1 2 3 4 |
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME kub-master Ready master 47m v1.13.4 159.65.XXX.XXX <none> Ubuntu 18.04.2 LTS 4.15.0-46-generic docker://18.9.2 kub-node1 Ready <none> 108s v1.13.4 167.99.YYY.YYY <none> Ubuntu 18.04.2 LTS 4.15.0-46-generic docker://18.9.2 kub-node2 Ready <none> 52s v1.13.4 167.99.ZZZ.ZZZ <none> Ubuntu 18.04.2 LTS 4.15.0-46-generic docker://18.9.2 |
Наличие Pod-ов во всех namespace-ах
1 |
# kubectl get pod --all-namespaces |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-node-kq28q 2/2 Running 0 4m10s kube-system calico-node-m8kbx 2/2 Running 0 28m kube-system calico-node-zmj2m 2/2 Running 0 5m6s kube-system coredns-86c58d9df4-kjspd 1/1 Running 0 50m kube-system coredns-86c58d9df4-zxs5j 1/1 Running 0 50m kube-system etcd-kub-master 1/1 Running 0 50m kube-system kube-apiserver-kub-master 1/1 Running 0 50m kube-system kube-controller-manager-kub-master 1/1 Running 0 50m kube-system kube-proxy-6k7t6 1/1 Running 0 5m6s kube-system kube-proxy-l6l7z 1/1 Running 0 4m10s kube-system kube-proxy-xpzlk 1/1 Running 0 50m kube-system kube-scheduler-kub-master 1/1 Running 0 49m |
Просмотр состояния кластера
1 |
# kubectl cluster-info |
1 2 3 4 |
Kubernetes master is running at https://159.65.XXX.XXX:6443 KubeDNS is running at https://159.65.XXX.XXX:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. |
Просмотр состояния компонентов кластера
1 |
# kubectl get componentstatuses |
1 2 3 4 |
NAME STATUS MESSAGE ERROR controller-manager Healthy ok scheduler Healthy ok etcd-0 Healthy {"health": "true"} |
Просмотр текущего токена(команду выполняем на Master-е)
1 |
# kubeadm token list |
1 2 |
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS pk3jol.j90cb9pka97dqnm3 23h 2019-03-25T16:48:14Z authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token |
Token используется для взаимной аутентфикации master и присоединяющейся к кластеру ноде
Он должен харнится в безопасности т.к. токен позволяет любому, кто им владеет присодинить ноду в кластер
Токен имеет срок годности – сутки
По истечению суток нужно генерировать новый токен
1 |
# kubeadm token create |
Получение значение параметра —discovery-token-ca-cert-hash
1 |
# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' |
1 |
af674f65504b03e5db5cd692cbd0dd29968b50c019d5702fcc6a79b6f9eeb798 |
5.Доступ к Kubernetes-кластеру с другого сервера/десктопа
Для этого необходимо скопировать с мастера kubeconfig-файл на сервер/десктоп, с котрого нужно иметь доступ к кластеру через kubectl
1 |
# scp -P2222 159.65.XXX.XXX:/etc/kubernetes/admin.conf ~/ |
При запуске kubectl передавать опцию —kubeconfig с указанием конфигурационного файла kubeconfig
Например
1 |
# kubectl --kubeconfig ~/admin.conf get nodes -o wide |
1 2 3 4 |
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME kub-master Ready master 47h v1.13.4 159.65.XXX.XXX <none> Ubuntu 18.04.2 LTS 4.15.0-46-generic docker://18.9.2 kub-node1 Ready <none> 46h v1.13.4 167.99.YYY.YYY <none> Ubuntu 18.04.2 LTS 4.15.0-46-generic docker://18.9.2 kub-node2 Ready <none> 46h v1.13.4 167.99.ZZZ.ZZZ <none> Ubuntu 18.04.2 LTS 4.15.0-46-generic docker://18.9.2 |
Для удобства можно создать alias для короткого ввода команды
1 |
# grep bash_aliases ~/.bashrc |
1 2 3 |
# ~/.bash_aliases, instead of adding them here directly. if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases |
1 |
# nano ~/.bash_aliases |
1 |
alias kubectl="kubectl --kubeconfig ~/admin.conf" |
1 |
# source ~/.bash_aliases |
1 |
# kubectl get nodes -o wide |
1 2 3 4 |
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME kub-master Ready master 47h v1.13.4 159.65.XXX.XXX <none> Ubuntu 18.04.2 LTS 4.15.0-46-generic docker://18.9.2 kub-node1 Ready <none> 46h v1.13.4 167.99.YYY.YYY <none> Ubuntu 18.04.2 LTS 4.15.0-46-generic docker://18.9.2 kub-node2 Ready <none> 46h v1.13.4 167.99.ZZZ.ZZZ <none> Ubuntu 18.04.2 LTS 4.15.0-46-generic docker://18.9.2 |
Источник:
https://kubernetes.io/docs/setup/independent/install-kubeadm
https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#pod-network
https://kubernetes.io/docs/concepts/cluster-administration/addons