Далее мы установим кластер Kubernetes с виртуализацией сети flannel. Вы можете выбрать любой другой способ виртуализировать сеть в официальной документации по установке.
Как обычно, если у вас что-то пошло не так, вы можете сбросить установку и начать заново, выполнив команду:
$ sudo kubeadm reset Прежде всего необходимо инициализировать и установить master сервер:
$ sudo kubeadm init --apiserver-advertise-address=192.168.0.4 --pod-network-cidr=10.244.0.0/16 Здесь ключ —apiserver-advertise-address=192.168.0.4 явно указывает мастеру на IP адрес, который нужно сообщать клиентам для подключения, а ключ —pod-network-cidr=10.244.0.0/16 используется для установки адресного пространства для ваших pod-ов в flannel.
Вывод команды будет примерно следующий:
[kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
[init] Using Kubernetes version: v1.7.0
[init] Using Authorization modes: [Node RBAC]
[preflight] Running pre-flight checks
[preflight] Starting the kubelet service
[certificates] Generated CA certificate and key.
[certificates] Generated API server certificate and key.
[certificates] API Server serving cert is signed for DNS names [kubeadm-master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.138.0.4]
[certificates] Generated API server kubelet client certificate and key.
[certificates] Generated service account token signing key and public key.
[certificates] Generated front-proxy CA certificate and key.
[certificates] Generated front-proxy client certificate and key.
[certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/controller-manager.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/scheduler.conf"
[apiclient] Created API client, waiting for the control plane to become ready
[apiclient] All control plane components are healthy after 16.502136 seconds
[token] Using token:
[apiconfig] Created RBAC rules
[addons] Applied essential addon: kube-proxy
[addons] Applied essential addon: kube-dns
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run (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:
http://kubernetes.io/docs/admin/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join --token : Выполним настройку параметров подключения к кластеру, как посоветовал нам установщик:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config Далее установим для наших pod-ов сеть:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel-rbac.yml Все, теперь можно начать подключать к кластеру вычислительные узлы. Kubeadm уже сказал нам, как это сделать:
$ kubeadm join --token : После выполнения этих команд, убедитесь, что вычислительные узлы подключились и доступны для размещения pod-ов:
kubectl get nodes Поздравляю, вы только что выполнили установку кластера Kubernetes самой последней версии. Далее можно переходить к изучению новых доступных в нем фичей или этой технологии в принципе.
Данная статья предназначена для тех, кто искал подробное и понятное руководство о том, как установить Kubernetes на Ubuntu Server 22.04 LTS.
Kubernetes — открытое программное обеспечение для оркестровки контейнеризированных приложений — автоматизации их развёртывания, масштабирования и координации в условиях кластера.
В этом руководстве мы будем рассматривать тот случай, когда у вас уже есть сервер с установленной на нем операционной системой Ubuntu Server 22.04 LTS.
Подробно о том, как установить Ubuntu Server 22.04 LTS, вы можете прочитать в моем руководстве “ Установка Ubuntu Server 22.04 LTS
”.
Кроме того, на сервер должен быть установлен OpenSSH, а также открыт 22 порт, чтобы иметь возможность подключаться к серверу по протоколу SSH.
Для установки OpenSSH на сервер вы можете воспользоваться командой:
apt openssh-server Если вы планируете подключиться к серверу, используя операционную систему Windows, то можете воспользоваться PuTTY
или MobaXterm
.
В данном руководстве рассматривается подключение к серверу при помощи терминального эмулятора iTerm2
, установленного на операционную систему macOS.
Обратите внимание, вам потребуется открыть следующие порты TCP для доступа к вашему серверу:
Kubernetes Master (Control Plane):
- TCP порт 6443 — для работы Kubernetes API.
- TCP порт 2379-2380 — для работы etcd server client API.
- TCP порт 10250 — для работы Kubelet API.
- TCP порт 10259 — для работы kube-scheduler.
- TCP порт 10257 — для работы kube-controller-manager.
- TCP порт 0250 — для работы Kubelet API.
- TCP порт 30000-32767 — для работы NodePort Services.
Мы будем рассматривать установку одного сервера с ролью Master и одного сервера с ролью Worker. В дальнейшем вы сможете самостоятельно добавить необходимое количество серверов для обеспечения высокой доступности.
Подключаемся к серверу, на который планируется установить роль Kubernetes Master.
Присвоим имя серверу с помощью команды:
hostnamectl set-hostname kubernetes-master-1.heyvaldemar.net В данном руководстве в качестве имени сервера с ролью Master используется “kubernetes-master-1.heyvaldemar.net”.

Сервер с ролью Worker должен разрешать имя сервера с ролью Master, и также сервер с ролью Master должен разрешать имя сервера с ролью Worker.
"10.0.5.140 kubernetes-master-1.heyvaldemar.net kubernetes-master-1" | /etc/hosts Наличие данной записи позволит серверу с установленным агентом разрешать имя сервера Kubernetes даже без записи DNS.

Убедитесь, что имя сервера с ролью Worker имеет правильную запись DNS, а также обновите файл “/etc/hosts” на сервере с помощью команды:
"10.0.6.19 kubernetes-worker-1.heyvaldemar.net kubernetes-worker-1" | /etc/hosts Наличие данной записи позволит серверу с установленным агентом разрешать имя сервера Kubernetes даже без записи DNS.

Перезапустим службу hostamed, чтобы внесенные изменения для имени сервера вступили в силу, с помощью команды:
systemctl restart systemd-hostnamed 
Проверим корректность имени сервера с помощью команды:

Теперь заменим текущий процесс оболочки на новый с помощью команды:
bash 
Далее необходимо отключить файл подкачки с помощью команды:
swapoff 
Команда выше отключает файл подкачки до тех пор, пока система не будет перезагружена. Мы должны убедиться, что он останется выключенным даже после перезагрузки. Для этого нужно отредактировать файл “fstab”, закомментировав строку “/swapfile” символом “#”.
'/ swap / s/^\(.*\)$/#\1/g' /etc/fstab 
Загрузите модули ядра с помощью команды:
/etc/modules-load.d/containerd.conf 
Загружаем модуль “overlay” с помощью команды:
modprobe overlay 
Загружаем модуль “br_netfilter” с помощью команды:
modprobe br_netfilter 
Установите параметры ядра для Kubernetes с помощью команды:
/etc/sysctl.d/kubernetes.conf net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF 
Применим внесенные изменения с помощью команды:
sysctl 
Теперь добавим официальный ключ Docker с помощью команды:
curl https://download.docker.com/linux/ubuntu/gpg | gpg /etc/apt/trusted.gpg.d/docker.gpg 
Далее подключаем репозиторий Docker с помощью команды:
add-apt-repository lsb_release 
Нажимаем на кнопку “Enter”.

Обновим локальный индекс пакетов до последних изменений в репозиториях с помощью команды:
apt update 
Теперь установим пакеты, необходимые для работы Kubernetes, с помощью команды:
apt curl gnupg2 software-properties-common apt-transport-https ca-certificates containerd.io 
Теперь необходимо настроить containerd.
containerd — стандартная среда выполнения контейнеров с упором на простоту, надежность и переносимость.
containerd config default | /etc/containerd/config.toml /dev/null 2>&1 
's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml 
Перезапустим containerd, чтобы применить внесенные изменения, с помощью команды:
systemctl restart containerd 
Включаем автозапуск сервиса containerd при запуске операционной системы с помощью команды:
systemctl containerd 
Теперь добавим официальный ключ Kubernetes с помощью команды:
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - 
Далее подключаем репозиторий Kubernetes с помощью команды:
apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main" Обратите внимание, на момент написания этого руководства Xenial является актуальным репозиторием Kubernetes, но когда репозиторий будет доступен для Ubuntu 22.04 (Jammy Jellyfish), то вам нужно будет заменить слово в команде выше с “xenial” на “jammy”.

Нажимаем на кнопку “Enter”.

Обновим локальный индекс пакетов до последних изменений в репозиториях с помощью команды:
apt update 
Теперь установим пакеты kubelet, kubeadm и kubectl с помощью команды:
apt kubelet kubeadm kubectl 
На следующем шаге нужно запретить автоматическое обновление и удаление установленных пакетов с помощью команды:
apt-mark hold kubelet kubeadm kubectl 
Теперь необходимо запустить инициализацию кластера Kubernetes с помощью команды:
kubeadm init kubernetes-master-1.heyvaldemar.net В данном руководстве в качестве имени сервера с ролью Master используется “kubernetes-master-1.heyvaldemar.net”.

Обратите внимание, для добавления еще одного сервера в кластер вам потребуется проделать такую же работу по установке и настройке сервера, а затем выполнить команду kubeadm join
с соответствующим токеном для сервера с ролью Master или Worker.
Далее необходимо выполнить несколько команд, чтобы начать взаимодействие с кластером.
/.kube 
/etc/kubernetes/admin.conf /.kube/config 
: /.kube/config 
Далее можно посмотреть адреса мастера и сервисов с помощью команды:
kubectl cluster-info 
Теперь можно посмотреть список всех узлов в кластере и статус каждого узла с помощью команды:
kubectl get nodes 
Подключаемся к серверу, на который планируется установить роль Kubernetes Master.
Присвоим имя серверу с помощью команды:
hostnamectl set-hostname kubernetes-worker-1.heyvaldemar.net В данном руководстве в качестве имени сервера с ролью Worker используется “kubernetes-worker-1.heyvaldemar.net”.

Сервер с ролью Worker должен разрешать имя сервера с ролью Master, и также сервер с ролью Master должен разрешать имя сервера с ролью Worker.
"10.0.6.19 kubernetes-worker-1.heyvaldemar.net kubernetes-worker-1" | /etc/hostsНаличие данной записи позволит серверу с установленным агентом разрешать имя сервера Kubernetes даже без записи DNS.

Убедитесь, что имя сервера с ролью Worker имеет правильную запись DNS, а также обновите файл “/etc/hosts” на сервере с помощью команды:
"10.0.5.140 kubernetes-master-1.heyvaldemar.net kubernetes-master-1" | /etc/hostsНаличие данной записи позволит серверу с установленным агентом разрешать имя сервера Kubernetes даже без записи DNS.

Перезапустим службу hostamed, чтобы внесенные изменения для имени сервера вступили в силу, с помощью команды:
systemctl restart systemd-hostnamed 
Проверим корректность имени сервера с помощью команды:

Теперь заменим текущий процесс оболочки на новый с помощью команды:
bash 
Далее необходимо отключить файл подкачки с помощью команды:
swapoff 
Команда выше отключает файл подкачки до тех пор, пока система не будет перезагружена. Мы должны убедиться, что он останется выключенным даже после перезагрузки. Для этого нужно отредактировать файл “fstab”, закомментировав строку “/swapfile” символом “#”.
'/ swap / s/^\(.*\)$/#\1/g' /etc/fstab 
Загрузите модули ядра с помощью команды:
/etc/modules-load.d/containerd.conf 
Загружаем модуль “overlay” с помощью команды:
modprobe overlay 
Загружаем модуль “br_netfilter” с помощью команды:
modprobe br_netfilter 
Установите параметры ядра для Kubernetes с помощью команды:
/etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF 
Применим внесенные изменения с помощью команды:
sysctl 
Теперь добавим официальный ключ Docker с помощью команды:
curl https://download.docker.com/linux/ubuntu/gpg | gpg /etc/apt/trusted.gpg.d/docker.gpg 
Далее подключаем репозиторий Docker с помощью команды:
add-apt-repository lsb_release 
Нажимаем на кнопку “Enter”.

Обновим локальный индекс пакетов до последних изменений в репозиториях с помощью команды:
apt update 
Теперь установим пакеты, необходимые для работы Kubernetes, с помощью команды:
apt curl gnupg2 software-properties-common apt-transport-https ca-certificates containerd.io 
Теперь необходимо настроить containerd.
containerd — стандартная среда выполнения контейнеров с упором на простоту, надежность и переносимость.
containerd config default | /etc/containerd/config.toml /dev/null 2>&1 
's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml 
Перезапустим containerd, чтобы применить внесенные изменения, с помощью команды:
systemctl restart containerd 
Включаем автозапуск сервиса containerd при запуске операционной системы с помощью команды:
systemctl containerd 
Теперь добавим официальный ключ Kubernetes с помощью команды:
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - 
Далее подключаем репозиторий Kubernetes с помощью команды:
apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main" Обратите внимание, на момент написания этого руководства Xenial является актуальным репозиторием Kubernetes, но когда репозиторий будет доступен для Ubuntu 22.04 (Jammy Jellyfish), то вам нужно будет заменить слово в команде выше с “xenial” на “jammy”.

Нажимаем на кнопку “Enter”.

Обновим локальный индекс пакетов до последних изменений в репозиториях с помощью команды:
apt update 
Теперь установим пакеты kubelet, kubeadm и kubectl с помощью команды:
apt kubelet kubeadm kubectl 
На следующем шаге нужно запретить автоматическое обновление и удаление установленных пакетов с помощью команды:
apt-mark hold kubelet kubeadm kubectl 
Далее необходимо добавить сервер с ролью Worker в кластер Kubernetes с помощью команды:
kubeadm kubernetes-master-1.heyvaldemar.net:6443 5xuqag.tefxcfleieexwbos sha256:8c3e8eb9d95cd16496db9f65956e2ce1c2164fa64d17a487374bd906dbc0dcb3 
Сервер с ролью Worker успешно присоединен к кластеру Kubernetes.

Возвращаемся на сервер с ролью Kubernetes Master.
Теперь можно посмотреть список всех узлов в кластере и статус каждого узла с помощью команды:
kubectl get nodes 
Узлы находятся статусе “NotReady”. Чтобы это исправить нужно установить CNI (Container Network Interface) или сетевые надстройки, такие как Calico, Flannel и Weave-net.
Загрузим манифест Calico с помощью команды:
curl https://projectcalico.docs.tigera.io/manifests/calico.yaml 
Установим Calico с помощью команды:
kubectl apply calico.yaml 
Проверим статус подов в пространстве имен kube-system с помощью команды:
kubectl get pods kube-system 
Теперь можно посмотреть список всех узлов в кластере и статус каждого узла с помощью команды:
kubectl get nodes 
Узлы находятся статусе “Ready” и кластер Kubernetes готов к работе.

- Установка мастера
- Требования
- Install a CNI plugin
- Install a test application
- We’ve just provisioned a cluster using kubeadm on Ubuntu 22. 04!
- Untaint node
- В этой статье мы покажем как развернуть полностью рабочий и безопасный кластер Kubernetes на CentOS 7, состоящий из 1 мастер сервера и трех вычислительных узлов.
- Ensure swap is disabled
- Create the cluster using kubeadm
- Install CNI network plugins
- Настройка виртуальной сети
- Ограничения kubeadm
- Install kubeadm, kubelet & kubectl
- Установка Web-UI
- Установка Weave Scope
- Install runc
- Configure kubectl
- Удаление приложения
- Подготовка серверов
- Install helm
- Запуск приложения
- Forward IPv4 and let iptables see bridged network traffic
- Install a CSI driver
- Получение доступа к Web-UI
- Управление кластером с узлов, не принадлежащих кластеру
- Подключение вычислительных узлов
- Install containerd
- Install general dependencies
Установка мастера
На мастер-сервере выполните команду:
kubeadm init --api-advertise-addresses=192.168.0.4
--api-external-dns-names=master-1.comp.avmaksimov.ru
--pod-network-cidr 10.244.0.0/16 Вывод команды будет примерно следующим:
[kubeadm] WARNING: kubeadm is in alpha, please do not use
it for production clusters.
[preflight] Running pre-flight checks
[init] Using Kubernetes version: v1.5.3
[tokens] Generated token: "aecc37.5d0fc1b9a673ecaa"
[certificates] Generated Certificate Authority key and certificate.
[certificates] Generated API Server key and certificate
[certificates] Generated Service Account signing keys
[certificates] Created keys and certificates
in "/etc/kubernetes/pki"
[kubeconfig] Wrote KubeConfig file to disk:
"/etc/kubernetes/kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk:
"/etc/kubernetes/admin.conf"
[apiclient] Created API client, waiting for the control
plane to become ready
[apiclient] All control plane components are healthy
after 44.788287 seconds
[apiclient] Waiting for at least one node to
register and become ready
[apiclient] First node is ready after 2.502671 seconds
[apiclient] Creating a test deployment
[apiclient] Test deployment succeeded
[token-discovery] Created the kube-discovery deployment,
waiting for it to become ready
[token-discovery] kube-discovery is ready after 16.002846 seconds
[addons] Created essential addon: kube-proxy
[addons] Created essential addon: kube-dns
Your Kubernetes master has initialized successfully!
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with
one of the options listed at: http://kubernetes.io/docs/admin/addons/
You can now join any number of machines
by running the following on each node:
kubeadm join --token=aecc37.5d0dfasdf673ecaa 192.168.0.4 Эта команда подготовит и установит все необходимое для работы вашего Kubernetes кластера, а также протестирует его работоспособность. В качестве параметров для kubeadm переданы:
- —api-advertise-addresses — устанавливает IP-адрес, на котором будет слушать API-сервис, нужный для взаимодействия с кластером утилиты kubectl. В нашем случае — 192.168.0.4. Если не указывать этот параметр, будет использоваться IP-адрес интерфейса, смотрящего в сеть шлюза по-умолчанию
- —pod-network-cidr — сообщает кластеру адресное пространство (10.244.0.0/16) виртуальных сетей используемых во flannel. Оно задается в файле конфигурации flannel, ссылка на который приведена по URL
из вывода kubeadm - —api-external-dns-names — указывает на внешнее DNS имя хоста (в нашем случае master-1.comp.avmaksimov.ru); это позволит вам пройти аутентификацию и авторизацию при использовании kubectl с рабочего места
В конце выполнения kubeadm выдаст вам команду и токен для подключения ваших вычислительных узлов.
Требования
Никаких предварительных специфических требований нет. Вам потребуется 1-4 виртуальные машины (в зависимости от того, какое количество вычислительных узлов вам нужно) с CentOS 7, объединенные общей сетью и с доступом в Интернет.
Install a CNI plugin
For networking to function, you must install a Container Network Interface (CNI) plugin
. With this in mind, we’re installing flannel
.
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml Install a test application
To test the cluster, you can deploy WordPress. Note that we need to specify the storage class provided by our CSI.
# Add bitnami repo to helm
helm repo add bitnami https://charts.bitnami.com/bitnamihelm install wordpress bitnami/wordpress \
--set=global.storageClass=openebs-hostpath
We’ve just provisioned a cluster using kubeadm on Ubuntu 22. 04!
You have successfully created a single-node Kubernetes Cluster using kubeadm on Ubuntu 22.04, and the cluster has everything you need to install your application.
If you’d like to watch this in a video, see below:
https://youtube.com/watch?v=uvy_F3-blt4%3Ffeature%3Doembed
Untaint node
We must untaint the node to allow pods to be deployed to our single-node cluster. Otherwise, your pods will be stuck in a pending state.
kubectl taint nodes --all node-role.kubernetes.io/master-
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
В этой статье мы покажем как развернуть полностью рабочий и безопасный кластер Kubernetes на CentOS 7, состоящий из 1 мастер сервера и трех вычислительных узлов.
Начиная с Kubernetes 1.5 в состав этого фремворка начала входить утилита kubeadm
, которая значительно упростила процесс создания и администрирования кластера Kubernetes. Kubeadm
до сих пор находится в версии alpha, но тем не менее уже отлично выполняет свои функции и пригодна для использования.
В качестве системы виртуализации сети в кластере мы будем использовать flannel
. Схема кластера приведена ниже.

Не смотря на то, что в качестве облачной платформы я буду использовать Облако КРОК
, вы легко можете повторить эту установку в любом другом облаке, платформе виртуализации или “железе”.
Ensure swap is disabled
You have to disable the swap feature because Kubernetes does not support it. See the GitHub issue regarding swap on Kubernetes
for details.
# See if swap is enabled
swapon --show# Turn off swap
sudo swapoff -a# Disable swap completely
sudo sed -i -e '/swap/d' /etc/fstab
Create the cluster using kubeadm
It’s only a single command to initialise the cluster, but it won’t be very functional in single-node environments until we make some changes. Note that we’re providing “–pod-network-cidr” parameter as required by our CNI plugin (Flannel).
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
Install CNI network plugins
Install Container Network Interface network plugins from their official GitHub repository.
curl -fLo cni-plugins-linux-amd64-v1.1.1.tgz \ https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz sudo mkdir -p /opt/cni/bin sudo tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.1.1.tgz
Настройка виртуальной сети
Для настройки виртуальной сети на мастере Kubernetes необходимо выполнить следующую команду:
kubectl apply -f
https://github.com/coreos/flannel/blob/master/Documentation/kube-flannel.yml?raw=true Убедиться в правильной настройке виртуальной сети можно по запущенному Pod kube-dns из вывода команды:
kubectl get pods --all-namespaces Вывод должен быть похож на следующий:
NAMESPACE NAME
READY STATUS RESTARTS AGE
default kube-flannel-ds-76mm0
2/2 Running 0 2m
kube-system dummy-2088944543-6t4fs
1/1 Running 0 15m
kube-system etcd-master-1.comp.avmaksimov.ru
1/1 Running 0 14m
kube-system kube-apiserver-master-1.comp.avmaksimov.ru
1/1 Running 0 15m
kube-system kube-controller-manager-master-1.comp.avmaksimov.ru
1/1 Running 0 14m
kube-system kube-discovery-1769846148-vmzw9
1/1 Running 0 15m
kube-system kube-dns-2924299975-9slml
4/4 Running 0 15m
kube-system kube-proxy-k8f4m
1/1 Running 0 15m
kube-system kube-scheduler-master-1.comp.avmaksimov.ru
1/1 Running 0 14m Ограничения kubeadm
Самые важные ограничения kubeadm
на текущий момент времени:
- не поддерживает кластеризацию матер серверов
- не поддерживает использование балансировщиков трафика ( LoadBalancer
)
Об остальных ограничениях можно подробнее узнать из соответствующего раздела
документации.
После прочтения этой стати вы самостоятельно сможете развернуть кластер Kubernetes, а также продолжить изучение этого потрясающего фреймворка.
Install kubeadm, kubelet & kubectl
You need to ensure the versions of kubeadm, kubelet and kubectl are compatible.
# Add Kubernetes GPG key curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg # Add Kubernetes apt repository echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list # Fetch package list sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl # Prevent them from being updated automatically sudo apt-mark hold kubelet kubeadm kubectl
Установка Web-UI
Для установки Web-UI (Dashboard) для вашего кластера Kubernetes, необходимо выполнить команду:
kubectl --kubeconfig ./admin.conf create -f
https://rawgit.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml Контейнер с Web-UI автоматически определит ваш сервер API и подключится к нему.
Проверить запуск контейнера можно командой:
kubectl --kubeconfig ./admin.conf get pods -n kube-system Pod с Web-UI (kubernetes-dashboard) должен быть запущен:
NAME
READY STATUS RESTARTS AGE
dummy-2088944543-pttw1
1/1 Running 0 4h
etcd-master-1.comp.avmaksimov.ru
1/1 Running 0 4h
kube-apiserver-master-1.comp.avmaksimov.ru
1/1 Running 1 4h
kube-controller-manager-master-1.comp.avmaksimov.ru
1/1 Running 0 4h
kube-discovery-1769846148-hzl49
1/1 Running 0 4h
kube-dns-2924299975-2ljvn
4/4 Running 0 4h
kube-proxy-6l5k6
1/1 Running 0 4h
kube-proxy-hwgr7
1/1 Running 0 4h
kube-proxy-q1krp
1/1 Running 0 4h
kube-proxy-x2ll1
1/1 Running 0 4h
kube-scheduler-master-1.comp.avmaksimov.ru
1/1 Running 0 4h
kubernetes-dashboard-3203831700-tsk1c
1/1 Running 0 3h wget https://rawgit.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml Раскомментировать и отредактировать строку подключения к API-серверу —apiserver-host:
spec: containers: - name: kubernetes-dashboard image:
gcr.io/google_containers/kubernetes-dashboard-amd64:v1.5.1 imagePullPolicy: Always ports: - containerPort: 9090 protocol: TCP args: # Uncomment the following line to manually specify
Kubernetes API server Host # If not specified, Dashboard will attempt to auto
discover the API server and connect # to it. Uncomment only if the default does not work. - --apiserver-host=http://192.168.0.4:8080 livenessProbe: httpGet: path: / port: 9090 initialDelaySeconds: 30 timeoutSeconds: 30 kubectl --kubeconfig ./admin.conf create -f kubernetes-dashboard.yaml Установка Weave Scope
Weave Scope
— это отличный инструмент, предназначенный для графического отображения ваших контейнеров, pod, сервисов и других компонент кластера, а также связей между ними.
Weave Scope может быть установлен как с подключением к Облаку Weave Cloud
, так и без него. Для того, чтобы установить Weave Scope с подключением к их облаку, воспользуйтесь документацией. Сейчас мы остановимся на том, что установим Weave Scope в автономном режиме. Для того, чтобы это сделать, выполните команду:
kubectl --kubeconfig ./admin.conf apply -f 'https://cloud.weave.works/launch/k8s/weavescope.yaml' Чтобы получить доступ к Web-интерфейсу, отображающему всю вашу инфраструктуру, необходимо выполнить другую команду:
kubectl --kubeconfig ./admin.conf port-forward $(kubectl --kubeconfig ./admin.conf get pod --selector=weave-scope-component=app -o jsonpath='{.items..metadata.name}') 4040 
Install runc
Installing runc
from their official GitHub repository is the recommended way.
curl -fsSLo runc.amd64 \
https://github.com/opencontainers/runc/releases/download/v1.1.3/runc.amd64
sudo install -m 755 runc.amd64 /usr/local/sbin/runc
Configure kubectl
To access the cluster, we have to configure kubectl.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Удаление приложения
Для того, чтобы удалить тестовое приложение, можно просто удалить пространство имен sock-shop, а Kubernetes самостоятельно удалит все в нужной последовательности и освободит ресурсы. Сделать это можно командой:
kubectl --kubeconfig ./admin.conf delete namespace sock-shop Подготовка серверов
Для удобства работы я рекомендую выполнить базовые операции по предварительной настройке ваших серверов:
- Обновленная ОС:
yum -y update - Правильно установленное и синхронизируемое время:
yum -y install ntp systemctl enable ntpd systemctl start ntpd - Аккуратно заданное имя хоста:
hostnamectl set-hostname master-1.comp.avmaksimov.ruЕсли вы повторяете эту установку в Облаке КРОК, я рекомендую вам дополнительно для удобства отключить обновление имени хоста в cloud-init. Для этого вам необходимо отредактировать файл /etc/cloud/cloud.cfg и закомментировать следующие строчки:
cloud_init_modules: - migrator - bootcmd - write-files - growpart - resizefs # - set_hostname # - update_hostname # - update_etc_hosts - rsyslog - users-groups - sshДалее идут обязательные операции, которые необходимо выполнить на каждом из серверов вашего кластера перед началом установки Kubernetes.
Добавьте Kubernetes репозиторий:
cat < /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://yum.kubernetes.io/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 EOFПосле добавления репозитория обязательно отключите SELinux, т.к. Kubernetes еще не очень хорошо с ним работает. Для этого выполните следующую команду:
setenforce 0А также отредактируйте файл /etc/sysconfig/selinux, изменив значение переменной SELINUX на disabled:
sed -i --follow-symlinks's/^SELINUX=.*/SELINUX=disabled/g' /etc sysconfig/selinuxДалее нужно установить необходимые для инсталляции кластера пакеты:
yum -y install docker kubelet kubeadm kubectl kubernetes-cniДалее необходимо запустить сервис docker:
systemctl enable docker systemctl start dockersystemctl enable kubelet systemctl start kubelet
Процесс установки кластера очень прост и фактически сводится к выполнению всего пары команд.
Если что-то пошло не так, вы всегда можете начать с начала, выполнив на нужном вам узле кластера команду:
kubeadm reset Install helm
To install our packages, we’re installing helm v3.
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash Запуск приложения
В качестве примера, как это сделано в официальной документации, предлагаю вам запустить тестовое микросервисное приложение sock-shop (Интернет-магазин носков).
Для этого создайте для него отдельное пространство имен (namespace) sock-shop:
kubectl --kubeconfig ./admin.conf create namespace sock-shop А затем выполните запуск приложения:
kubectl --kubeconfig ./admin.conf apply -n sock-shop -f "https://github.com/microservices-demo/microservices-demo/blob/master/deploy/kubernetes/complete-demo.yaml?raw=true" Здесь ключ -n предназначен для указания пространства пространства имен, в котором необходимо запустить приложение.
Смотреть за процессом запуска контейнеров приложения можно командой:
kubectl --kubeconfig ./admin.conf get pods -n sock-shop Как только все контейнеры будут запущены, необходимо выяснить, на каком порту опубликовано это приложение, т.к. мы не используем никакие балансировщики. Сделать это можно выполнив команду:
kubectl --kubeconfig ./admin.conf describe svc front-end -n sock-shop Данная команда предназначена для вывода информации о сервисе front-end. Вы получите следующий вывод:
Name: front-end
Namespace: sock-shop
Labels: name=front-end
Selector: name=front-end
Type: NodePort
IP: 10.103.253.240
Port: 80/TCP
NodePort: 30001/TCP
Endpoints: 10.244.2.4:8079
Session Affinity: None
No events. В строке NodePort обозначен порт, на котором слушает подключения сервис front-end.

Также вы можете посмотреть на все сущности, которые были созданы в соответствующем пространстве имен в Web-UI Kubernetes.
Forward IPv4 and let iptables see bridged network traffic
You need to enable overlay and br_netfilter kernel modules. Additionally, you need to allow iptables see bridged network traffic.
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOFsudo modprobe -a overlay br_netfilter
# Apply sysctl params without reboot
sudo sysctl --system
Install a CSI driver
We need to install a Container Storage Interface (CSI) driver
for the storage to work. We’ll install OpenEBS
.
# Add openebs repo to helm
helm repo add openebs https://openebs.github.io/chartskubectl create namespace openebs
helm--namespace=openebsinstall openebs openebs/openebs
Получение доступа к Web-UI
Для получение доступа к Web-UI интерфейсу кластера (по-умолчанию не открыт во внешние сети), с рабочего ПК выполните команду:
kubectl --kubeconfig ./admin.conf proxy После чего подключиться к Web-UI можно будет по адресу http://localhost:8001/api/v1

Управление кластером с узлов, не принадлежащих кластеру
clusters:
- cluster: certificate-authority-data: ... server: https://master-1.comp.avmaksimov.ru:6443 name: kubernetes Важно: убедитесь, что в правилах межсетевого экрана в VPC вашей виртуальной сети разрешен трафик на порт 6443/TCP.
Запуск kubectl в таком случае будет выглядеть, например, следующим образом:
kubectl --kubeconfig ./admin.conf get nodes Подключение вычислительных узлов
Для подключения вычислительных узлов к кластеру необходимо выполнить команду, сообщенную вам kubeadm:
kubeadm join --token=aecc37.5d0dfasdf673ecaa 192.168.0.4 Проверить корректность подключения узла можно командой:
kubectl get nodes В случае успешного подключения всех узлов вывод будет следующим:
master-1.comp.avmaksimov.ru Ready,master 5m
node-1.comp.avmaksimov.ru Ready 1m
node-2.comp.avmaksimov.ru Ready 1m
node-3.comp.avmaksimov.ru Ready 1m Install containerd
Although we have a few container runtimes to choose from, we’re going with containerd. Before we install containerd, we’ll create its configuration file.
curl -fsSLo containerd-config.toml \
https://gist.githubusercontent.com/oradwell/31ef858de3ca43addef68ff971f459c2/raw/5099df007eb717a11825c3890a0517892fa12dbf/containerd-config.toml
sudo mkdir /etc/containerd
sudo mv containerd-config.toml /etc/containerd/config.toml
curl -fLo containerd-1.6.14-linux-amd64.tar.gz \ https://github.com/containerd/containerd/releases/download/v1.6.14/containerd-1.6.14-linux-amd64.tar.gz # Extract the binaries sudo tar Cxzvf /usr/local containerd-1.6.14-linux-amd64.tar.gz # Install containerd as a service sudo curl -fsSLo /etc/systemd/system/containerd.service \ https://raw.githubusercontent.com/containerd/containerd/main/containerd.service sudo systemctl daemon-reload sudo systemctl enable --now containerd
Install general dependencies
You need to install packages on your system for the commands we will use later.
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl</pre

