Kubernetes: различия между версиями
Geochip (обсуждение | вклад) (Обновление версий) |
Geochip (обсуждение | вклад) (Улучшение читаемости) |
||
Строка 14: | Строка 14: | ||
=== Пакеты и сервисы === | === Пакеты и сервисы === | ||
1. Нужно установить следующие пакеты: | 1. Нужно установить следующие пакеты: | ||
<syntaxhighlight lang="console"> | |||
# apt-get install kubernetes-kubeadm kubernetes-kubelet kubernetes-crio cri-tools | |||
</syntaxhighlight> | |||
2. И запустить сервисы crio и kubelet: | 2. И запустить сервисы crio и kubelet: | ||
<syntaxhighlight lang="console"> | |||
# systemctl enable --now crio kubelet | |||
</syntaxhighlight> | |||
== Разворачивание кластера == | == Разворачивание кластера == | ||
=== Подготовка === | === Подготовка === | ||
* отключите подкачку: | * отключите подкачку: | ||
<syntaxhighlight lang="console"> | |||
# swapoff -a | |||
</syntaxhighlight> | |||
=== Разворачивание === | === Разворачивание === | ||
Строка 27: | Строка 33: | ||
<li> | <li> | ||
На мастере нужно запустить одну из двух следующих команд для запуска кластера: | На мастере нужно запустить одну из двух следующих команд для запуска кластера: | ||
:* Для настройки сети с использованием Flannel: | :* Для настройки сети с использованием '''Flannel''': | ||
<syntaxhighlight lang="console"> | |||
# kubeadm init --pod-network-cidr=10.244.0.0/16 | |||
</syntaxhighlight> | |||
:: Для использования control plane образов на базе ALT вместо образов по умолчанию: | :: Для использования control plane образов на базе ALT вместо образов по умолчанию: | ||
<syntaxhighlight lang="console"> | |||
:* Для настройки сети с использованием Calico | # kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=1.26.3 --image-repository=registry.altlinux.org/k8s-p10 | ||
</syntaxhighlight> | |||
:* Для настройки сети с использованием '''Calico''' | |||
<syntaxhighlight lang="console"> | |||
# kubeadm init --pod-network-cidr=192.168.0.0/16 | |||
</syntaxhighlight> | |||
:: Для использования control plane образов на базе ALT вместо образов по умолчанию: | :: Для использования control plane образов на базе ALT вместо образов по умолчанию: | ||
<syntaxhighlight lang="console"> | |||
# kubeadm init --pod-network-cidr=192.168.0.0/16 --kubernetes-version=1.26.3 --image-repository=registry.altlinux.org/k8s-p10 | |||
</syntaxhighlight> | |||
: Пояснение флагов: | : Пояснение флагов: | ||
:: <code>--pod-network-cidr=10.244.0.0/16</code> - внутренняя (разворачиваемая Kubernetes) сеть, данное значение рекомендуется оставить для правильной работы <tt>Flannel</tt>; | :: <code>--pod-network-cidr=10.244.0.0/16</code> - внутренняя (разворачиваемая Kubernetes) сеть, данное значение рекомендуется оставить для правильной работы <tt>Flannel</tt>; | ||
Строка 40: | Строка 54: | ||
:: <code>--kubernetes-version=1.26.3</code> - использовать версию kubernetes 1.26.3 для компонентов control plane. | :: <code>--kubernetes-version=1.26.3</code> - использовать версию kubernetes 1.26.3 для компонентов control plane. | ||
: В конце вывода будет строка вида: | : В конце вывода будет строка вида: | ||
<syntaxhighlight lang="console"> | |||
kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш> | |||
</syntaxhighlight> | |||
</li> | </li> | ||
<li> | <li> | ||
Строка 47: | Строка 63: | ||
<li> | <li> | ||
Создать каталог {{path|~/.kube}}: | Создать каталог {{path|~/.kube}}: | ||
<syntaxhighlight lang="console"> | |||
$ mkdir ~/.kube | |||
</syntaxhighlight> | |||
</li> | </li> | ||
<li> | <li> | ||
Скопировать конфиг: | Скопировать конфиг: | ||
<syntaxhighlight lang="console"> | |||
# cp /etc/kubernetes/admin.conf /home/<пользователь>/.kube/config | |||
</syntaxhighlight> | |||
</li> | </li> | ||
<li> | <li> | ||
Изменить владельца конфига: | Изменить владельца конфига: | ||
<syntaxhighlight lang="console"> | |||
# chown <пользователь>: /home/<пользователь>/.kube/config | |||
</syntaxhighlight> | |||
</li> | </li> | ||
</ol> | </ol> | ||
Строка 61: | Строка 83: | ||
<li> | <li> | ||
После этого все остальные ноды нужно подключить к мастеру: | После этого все остальные ноды нужно подключить к мастеру: | ||
<syntaxhighlight lang="console"> | |||
# kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш> | |||
</syntaxhighlight> | |||
: Проверить наличие нод можно так: | : Проверить наличие нод можно так: | ||
: <syntaxhighlight lang="console"> | |||
$ kubectl get nodes -o wide | |||
</syntaxhighlight> | |||
: Вывод примерно следующий: | : Вывод примерно следующий: | ||
< | <syntaxhighlight lang="console"> | ||
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME | NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME | ||
master NotReady control-plane 19m v1.24.8 172.16.0.8 <none> ALT Regular 5.15.90-std-def-alt1 cri-o://1.24.3 | master NotReady control-plane 19m v1.24.8 172.16.0.8 <none> ALT Regular 5.15.90-std-def-alt1 cri-o://1.24.3 | ||
node NotReady <none> 19m v1.24.8 172.16.0.9 <none> ALT Regular 5.15.90-std-def-alt1 cri-o://1.24.3 | node NotReady <none> 19m v1.24.8 172.16.0.9 <none> ALT Regular 5.15.90-std-def-alt1 cri-o://1.24.3 | ||
</ | </syntaxhighlight> | ||
Обратите внисание, что ноды находятся в состоянии <tt>'''NotReady'''</tt>. Они перейдут в состояние <tt>Ready</tt> после настройки сети. | Обратите внисание, что ноды находятся в состоянии <tt>'''NotReady'''</tt>. Они перейдут в состояние <tt>Ready</tt> после настройки сети. | ||
</li> | </li> | ||
Строка 75: | Строка 101: | ||
Далее следует развернуть сеть. Для этого можно запустить один из следующих наборов команд: | Далее следует развернуть сеть. Для этого можно запустить один из следующих наборов команд: | ||
:* Для Flannel: | :* Для Flannel: | ||
: <syntaxhighlight lang="console"> | |||
$ kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml | |||
</syntaxhighlight> | |||
:* Для Flannel с использованием образов на базе ALT: | :* Для Flannel с использованием образов на базе ALT: | ||
:: Скачиваем манифест flannel. | :: Скачиваем манифест flannel. | ||
: <syntaxhighlight lang="console"> | |||
$ wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml | |||
</syntaxhighlight> | |||
:: Заменяем образы по умолчанию на образы ALT в манифесте. | :: Заменяем образы по умолчанию на образы ALT в манифесте. | ||
::: Вместо <code>image: docker.io/rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.2</code> нужно <code>image: registry.altlinux.org/k8s-p10/flannel-cni-plugin:v1.1.2</code>. | ::: Вместо <code>image: docker.io/rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.2</code> нужно <code>image: registry.altlinux.org/k8s-p10/flannel-cni-plugin:v1.1.2</code>. | ||
::: Вместо <code>image: docker.io/rancher/mirrored-flannelcni-flannel:v0.22.0</code> нужно <code>image: registry.altlinux.org/k8s-p10/flannel:v0.21.4</code>. | ::: Вместо <code>image: docker.io/rancher/mirrored-flannelcni-flannel:v0.22.0</code> нужно <code>image: registry.altlinux.org/k8s-p10/flannel:v0.21.4</code>. | ||
:: С использованием sed можно заменить образы в две команды: | :: С использованием sed можно заменить образы в две команды: | ||
:: <syntaxhighlight lang="console"> | |||
$ sed -i 's/^\([ ]*\)image: docker.io\/rancher\/mirrored-flannelcni-flannel-cni-plugin:v1.1.2/\1image: registry\.altlinux\.org\/k8s-p10\/flannel-cni-plugin:v1.1.2/g' kube-flannel.yml | |||
</syntaxhighlight> | |||
:: <syntaxhighlight lang="console"> | |||
$ sed -i 's/^\([ ]*\)image: docker.io\/rancher\/mirrored-flannelcni-flannel:v0.22.0/\1image: registry\.altlinux\.org\/k8s-p10\/flannel:v0.21.4/g' kube-flannel.yml | |||
</syntaxhighlight> | |||
:: Применяем отредактированный манифест. | :: Применяем отредактированный манифест. | ||
: <syntaxhighlight lang="console"> | |||
$ kubectl apply -f kube-flannel.yml | |||
</syntaxhighlight> | |||
:* Для Calico: | :* Для Calico: | ||
: <syntaxhighlight lang="console"> | |||
$ kubectl apply -f https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml | |||
</syntaxhighlight> | |||
: <syntaxhighlight lang="console"> | |||
$ kubectl apply -f https://projectcalico.docs.tigera.io/manifests/custom-resources.yaml | |||
</syntaxhighlight> | |||
: Проверить, что всё работает можно так: | : Проверить, что всё работает можно так: | ||
<syntaxhighlight lang="console"> | |||
$ kubectl get pods --namespace kube-system | |||
</syntaxhighlight> | |||
: Вывод должен быть примерно таким: | : Вывод должен быть примерно таким: | ||
< | <syntaxhighlight lang="console"> | ||
NAME READY STATUS RESTARTS AGE | NAME READY STATUS RESTARTS AGE | ||
coredns-78fcdf6894-6trk7 1/1 Running 0 2h | coredns-78fcdf6894-6trk7 1/1 Running 0 2h | ||
Строка 109: | Строка 151: | ||
kube-proxy-szvlt 1/1 Running 0 2h | kube-proxy-szvlt 1/1 Running 0 2h | ||
kube-scheduler-k8s 1/1 Running 0 2h | kube-scheduler-k8s 1/1 Running 0 2h | ||
</ | </syntaxhighlight> | ||
</li> | </li> | ||
</ol> | </ol> | ||
Следует обратить внимание, что <tt>coredns</tt> находятся в состоянии <tt>Running</tt>. | Следует обратить внимание, что <tt>coredns</tt> находятся в состоянии <tt>'''Running'''</tt>. | ||
Количество <tt>kube-flannel</tt> и <tt>kube-proxy</tt> зависит от общего числа нод (в данном случае их четыре). | Количество <tt>kube-flannel</tt> и <tt>kube-proxy</tt> зависит от общего числа нод (в данном случае их четыре). | ||
Если coredns находится в состоянии "crashloopbackoff", то проверьте содержимое файла /etc/resolv.conf. Для каждой ноды в резолвере должны быть указаны реальные адреса (например 192.168.3.30, при развертывании в локальной сети на виртуальных машинах) | Если coredns находится в состоянии "crashloopbackoff", то проверьте содержимое файла {{path|/etc/resolv.conf}}. Для каждой ноды в резолвере должны быть указаны реальные адреса (например 192.168.3.30, при развертывании в локальной сети на виртуальных машинах) | ||
== Тестовый запуск <tt>nginx</tt> == | == Тестовый запуск <tt>nginx</tt> == | ||
Строка 121: | Строка 163: | ||
<li> | <li> | ||
Для начала создадим Deployment: | Для начала создадим Deployment: | ||
<syntaxhighlight lang="console"> | |||
$ kubectl apply -f https://k8s.io/examples/application/deployment.yaml | |||
</syntaxhighlight> | |||
</li> | </li> | ||
<li> | <li> | ||
Затем создадим сервис, с помощью которого можно получить доступ к нашему приложению из внешней сети. | Затем создадим сервис, с помощью которого можно получить доступ к нашему приложению из внешней сети. | ||
Сохраним в файл {{path|nginx-service.yaml}} следующую кофигурацию: | |||
< | <syntaxhighlight lang="yaml"> | ||
apiVersion: v1 | apiVersion: v1 | ||
kind: Service | kind: Service | ||
Строка 140: | Строка 184: | ||
selector: | selector: | ||
app: nginx | app: nginx | ||
</ | </syntaxhighlight> | ||
</li> | </li> | ||
<li> | <li> | ||
Запустим новый сервис: | Запустим новый сервис: | ||
<syntaxhighlight lang="console"> | |||
$ kubectl apply -f nginx-service.yaml | |||
</syntaxhighlight> | |||
</li> | </li> | ||
<li> | <li> | ||
Теперь можно узнать его порт: | Теперь можно узнать его порт: | ||
<syntaxhighlight lang="console"> | |||
$ kubectl get svc nginx | |||
< | </syntaxhighlight> | ||
Возможный вывод: | |||
<syntaxhighlight lang="console"> | |||
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE | NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE | ||
nginx NodePort 10.108.199.141 <none> 80:32336/TCP 4h | nginx NodePort 10.108.199.141 <none> 80:32336/TCP 4h | ||
</ | </syntaxhighlight> | ||
</li> | </li> | ||
<li> | <li> | ||
Проверим, что всё работает: | Проверим, что всё работает: | ||
<syntaxhighlight lang="console"> | |||
$ curl <ip адрес>:<порт> | |||
</syntaxhighlight> | |||
где | |||
: ip адрес - это адрес любой из нод (не мастера), а порт - это порт сервиса, полученный с помощью предыдущей команды. Если использовать данные из примеров, то возможная команда: <code>curl 10.10.3.120:32336</code>. | : ip адрес - это адрес любой из нод (не мастера), а порт - это порт сервиса, полученный с помощью предыдущей команды. Если использовать данные из примеров, то возможная команда: <code>curl 10.10.3.120:32336</code>. | ||
</li> | </li> |
Версия от 12:59, 5 июля 2023
Kubernetes
Инструкция по работе с kubernetes.
Подготовка
Нужны несколько машин (nodes), одна из которых будет мастером. Системные требования:
- 2GB ОЗУ или больше;
- 2 ядра процессора или больше;
- Все машины должны быть доступны по сети друг для друга;
- Все машины должны успешно разрешать имена hostname друг друга (через DNS или hosts);
- Своп должен быть выключен
Пакеты и сервисы
1. Нужно установить следующие пакеты:
# apt-get install kubernetes-kubeadm kubernetes-kubelet kubernetes-crio cri-tools
2. И запустить сервисы crio и kubelet:
# systemctl enable --now crio kubelet
Разворачивание кластера
Подготовка
- отключите подкачку:
# swapoff -a
Разворачивание
-
На мастере нужно запустить одну из двух следующих команд для запуска кластера:
- Для настройки сети с использованием Flannel:
# kubeadm init --pod-network-cidr=10.244.0.0/16
- Для использования control plane образов на базе ALT вместо образов по умолчанию:
# kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=1.26.3 --image-repository=registry.altlinux.org/k8s-p10
- Для настройки сети с использованием Calico
# kubeadm init --pod-network-cidr=192.168.0.0/16
- Для использования control plane образов на базе ALT вместо образов по умолчанию:
# kubeadm init --pod-network-cidr=192.168.0.0/16 --kubernetes-version=1.26.3 --image-repository=registry.altlinux.org/k8s-p10
- Пояснение флагов:
--pod-network-cidr=10.244.0.0/16
- внутренняя (разворачиваемая Kubernetes) сеть, данное значение рекомендуется оставить для правильной работы Flannel;--image-repository=registry.altlinux.org/k8s-p10
- переопределение реестра, откуда будут скачиваться control plane образы.--kubernetes-version=1.26.3
- использовать версию kubernetes 1.26.3 для компонентов control plane.
- В конце вывода будет строка вида:
kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш>
-
Настройка kubernetes для работы от пользователя
-
Создать каталог ~/.kube:
$ mkdir ~/.kube
-
Скопировать конфиг:
# cp /etc/kubernetes/admin.conf /home/<пользователь>/.kube/config
-
Изменить владельца конфига:
# chown <пользователь>: /home/<пользователь>/.kube/config
-
Создать каталог ~/.kube:
-
После этого все остальные ноды нужно подключить к мастеру:
# kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш>
- Проверить наличие нод можно так:
$ kubectl get nodes -o wide
- Вывод примерно следующий:
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME master NotReady control-plane 19m v1.24.8 172.16.0.8 <none> ALT Regular 5.15.90-std-def-alt1 cri-o://1.24.3 node NotReady <none> 19m v1.24.8 172.16.0.9 <none> ALT Regular 5.15.90-std-def-alt1 cri-o://1.24.3
Обратите внисание, что ноды находятся в состоянии NotReady. Они перейдут в состояние Ready после настройки сети.
-
Далее следует развернуть сеть. Для этого можно запустить один из следующих наборов команд:
- Для Flannel:
$ kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
- Для Flannel с использованием образов на базе ALT:
- Скачиваем манифест flannel.
$ wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
- Заменяем образы по умолчанию на образы ALT в манифесте.
- Вместо
image: docker.io/rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.2
нужноimage: registry.altlinux.org/k8s-p10/flannel-cni-plugin:v1.1.2
. - Вместо
image: docker.io/rancher/mirrored-flannelcni-flannel:v0.22.0
нужноimage: registry.altlinux.org/k8s-p10/flannel:v0.21.4
.
- Вместо
- С использованием sed можно заменить образы в две команды:
$ sed -i 's/^\([ ]*\)image: docker.io\/rancher\/mirrored-flannelcni-flannel-cni-plugin:v1.1.2/\1image: registry\.altlinux\.org\/k8s-p10\/flannel-cni-plugin:v1.1.2/g' kube-flannel.yml
$ sed -i 's/^\([ ]*\)image: docker.io\/rancher\/mirrored-flannelcni-flannel:v0.22.0/\1image: registry\.altlinux\.org\/k8s-p10\/flannel:v0.21.4/g' kube-flannel.yml
- Применяем отредактированный манифест.
- Заменяем образы по умолчанию на образы ALT в манифесте.
$ kubectl apply -f kube-flannel.yml
- Для Calico:
$ kubectl apply -f https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml
$ kubectl apply -f https://projectcalico.docs.tigera.io/manifests/custom-resources.yaml
- Проверить, что всё работает можно так:
$ kubectl get pods --namespace kube-system
- Вывод должен быть примерно таким:
NAME READY STATUS RESTARTS AGE coredns-78fcdf6894-6trk7 1/1 Running 0 2h coredns-78fcdf6894-nwt5l 1/1 Running 0 2h etcd-k8s 1/1 Running 0 2h kube-apiserver-k8s 1/1 Running 0 2h kube-controller-manager-k8s 1/1 Running 0 2h kube-flannel-ds-894bt 1/1 Running 0 2h kube-flannel-ds-kbngw 1/1 Running 0 2h kube-flannel-ds-n7h45 1/1 Running 0 2h kube-flannel-ds-tz2rc 1/1 Running 0 2h kube-proxy-6f4lm 1/1 Running 0 2h kube-proxy-f92js 1/1 Running 0 2h kube-proxy-qkh54 1/1 Running 0 2h kube-proxy-szvlt 1/1 Running 0 2h kube-scheduler-k8s 1/1 Running 0 2h
Следует обратить внимание, что coredns находятся в состоянии Running. Количество kube-flannel и kube-proxy зависит от общего числа нод (в данном случае их четыре). Если coredns находится в состоянии "crashloopbackoff", то проверьте содержимое файла /etc/resolv.conf. Для каждой ноды в резолвере должны быть указаны реальные адреса (например 192.168.3.30, при развертывании в локальной сети на виртуальных машинах)
Тестовый запуск nginx
-
Для начала создадим Deployment:
$ kubectl apply -f https://k8s.io/examples/application/deployment.yaml
-
Затем создадим сервис, с помощью которого можно получить доступ к нашему приложению из внешней сети.
Сохраним в файл nginx-service.yaml следующую кофигурацию:
apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: type: NodePort ports: - port: 80 targetPort: 80 selector: app: nginx
-
Запустим новый сервис:
$ kubectl apply -f nginx-service.yaml
-
Теперь можно узнать его порт:
$ kubectl get svc nginx
Возможный вывод:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx NodePort 10.108.199.141 <none> 80:32336/TCP 4h
-
Проверим, что всё работает:
$ curl <ip адрес>:<порт>
где
- ip адрес - это адрес любой из нод (не мастера), а порт - это порт сервиса, полученный с помощью предыдущей команды. Если использовать данные из примеров, то возможная команда:
curl 10.10.3.120:32336
.
- ip адрес - это адрес любой из нод (не мастера), а порт - это порт сервиса, полученный с помощью предыдущей команды. Если использовать данные из примеров, то возможная команда: