Создание Kubernetes-кластера в Ubuntu 22.04

Оцените статью

Самый простой способ по быстрому настроить это хозяйство, это использовать kubespray, но лучше один раз пройти этот квест ручками.

Итого, у меня есть два узла и первым делом необходимо объединить их в VPN-сеть по инструкции Объединение bare-metal и vps серверов в коммутируемую сеть при помощи OpenVPN. После объединения у нас получились два узла srv-prod-sbercloud-01 (10.100.1.1) и srv-prod-sbercloud-02 (10.100.1.2).

Устанавливаем Docker по инструкциям.

Отключаем Swap

Я все еще не понимаю, почему они так swap не любят. Как везде написано использование swap путает планировщик ресурсов, но есть дополнительная опция, чтобы игнорировать наличие swap.

Будем делать как в инструкции написано и в fstab отключаем использование swap и руками сбрасываем текущий в оперативную память.

# swapoff -a

Подключаем сетевые модули ядра

Загрузка модулей при старте сервера.

cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

Подключаем сразу, но временно.

# modprobe overlay
# modprobe br_netfilter

Проверяем, что модули загружены.

# lsmod | egrep "br_netfilter|overlay"
br_netfilter           32768  0
bridge                311296  1 br_netfilter
overlay               151552  1

Еще правил посоветовали если вы UFW используете (в файлике /etc/ufw/sysctl.conf).

net/bridge/bridge-nf-call-ip6tables = 1
net/bridge/bridge-nf-call-iptables = 1
net/bridge/bridge-nf-call-arptables = 1

Перезагрузим один узел и проверим, что модули подхватываются на старте и если все ок, то продолжаем.

Немного правок по параметрам iptables

Мостики и маршрутизация.

cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

Применяем настройки.

# sysctl --system

Так как я закрыт fiewall от cloud.ru можно смело отключить UFW.

# systemctl stop ufw
# systemctl disable ufw

Ну или если вы в дикий интернет напрямую ходите, то откройте порты 644323792380102501025910257 и у меня для этого тоже есть заметка «Работа со штатным Firewall Ubuntu (UFW)«

Аналогично на вкус и цвет еще накручиваем.

# apt-get install ebtables ethtool

Установка Kubernetes

Теоретически, мы на этапе подготовки узла все необходимые манипуляции уже провели, но повторение мать учения и т.п. Лезем смотреть какая у нас актуальная версия на сайт https://kubernetes.io/releases/download/ и сейчас актуальная 1.32

# curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | tee /etc/apt/sources.list.d/kubernetes.list
# apt-get update
# apt -y install kubelet kubeadm kubectl && apt-mark hold kubelet kubeadm kubectl

Инициализируем мастер-node

Я как старовер хотел использовать стандартный движок docker-ce и вот тут начинаются фокусы.

These instructions assume that you are using the cri-dockerd adapter to integrate Docker Engine with Kubernetes.

И нам понадобится адаптер для подключения ретро движка к которому на самом деле многие привыкли и не хотят слезать.

Итак, установка.

# wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.5/cri-dockerd-0.2.5.amd64.tgz
# tar -xvf cri-dockerd-0.2.5.amd64.tgz
# cd cri-dockerd/
# mkdir -p /usr/local/bin
# install -o root -g root -m 0755 ./cri-dockerd /usr/local/bin/cri-dockerd

Запуск этой прослойки в виде SystemD сервиса.

# tee /etc/systemd/system/cri-docker.service << EOFOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=
ExecReload=/bin/kill -s HUP 
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
# tee /etc/systemd/system/cri-docker.socket << EOF
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target

Запускаем.

# systemctl daemon-reload
# systemctl enable cri-docker.service
# systemctl enable --now cri-docker.socket
# systemctl start cri-docker.service
# systemctl status cri-docker.service

P.S. актуальная версия сейчас 0.3.16
https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.16/cri-dockerd-0.3.16.amd64.tgz

P.P.S. С адаптером свежие версии kubeadm больше не работают, ну или у меня не получилось их подружить и будем использовать стандартный cri-o для работы.

Установка CRI-O

(Вот так не делайте!) Подключаем репозиторий с cri-o.

А у меня блог познавательный, вдруг кому пригодится.

# export CRIO_VERSION=v1.32.2
# curl -fsSL https://download.opensuse.org/repositories/isv:/cri-o:/stable:/$CRIO_VERSION/deb/Release.key |
    gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg

# echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://download.opensuse.org/repositories/isv:/cri-o:/stable:/$CRIO_VERSION/deb/ /" |
    tee /etc/apt/sources.list.d/cri-o.list
# apt-get update

Если сделали, удаляйте эти репы к чертовой матери.

Давайте руками все сделаем

В принципе (это же блог и я не претендую на первую инстанцию) скачаем https://storage.googleapis.com/cri-o/artifacts/cri-o.amd64.v1.32.2.tar.gz

Распакуем в /tmp/ и запустим install. И получаем вот такую простыню текста.

# ./install 
++ DESTDIR=
++ PREFIX=/usr/local
++ ETCDIR=/etc
++ LIBEXECDIR=/usr/libexec
++ LIBEXEC_CRIO_DIR=/usr/libexec/crio
++ ETC_CRIO_DIR=/etc/crio
++ CONTAINERS_DIR=/etc/containers
++ CONTAINERS_REGISTRIES_CONFD_DIR=/etc/containers/registries.conf.d
++ CNIDIR=/etc/cni/net.d
++ BINDIR=/usr/local/bin
++ MANDIR=/usr/local/share/man
++ OCIDIR=/usr/local/share/oci-umount/oci-umount.d
++ BASHINSTALLDIR=/usr/local/share/bash-completion/completions
++ FISHINSTALLDIR=/usr/local/share/fish/completions
++ ZSHINSTALLDIR=/usr/local/share/zsh/site-functions
++ OPT_CNI_BIN_DIR=/opt/cni/bin
++ dpkg -l
++ SYSCONFIGDIR=/etc/default
++ sed -i 's;sysconfig/crio;default/crio;g' etc/crio
++ source /etc/os-release
+++ PRETTY_NAME='Ubuntu 22.04.5 LTS'
+++ NAME=Ubuntu
+++ VERSION_ID=22.04
+++ VERSION='22.04.5 LTS (Jammy Jellyfish)'
+++ VERSION_CODENAME=jammy
+++ ID=ubuntu
+++ ID_LIKE=debian
+++ HOME_URL=https://www.ubuntu.com/
+++ SUPPORT_URL=https://help.ubuntu.com/
+++ BUG_REPORT_URL=https://bugs.launchpad.net/ubuntu/
+++ PRIVACY_POLICY_URL=https://www.ubuntu.com/legal/terms-and-policies/privacy-policy
+++ UBUNTU_CODENAME=jammy
++ [[ ubuntu == \f\e\d\o\r\a ]]
++ [[ ubuntu == \r\h\c\o\s ]]
++ SYSTEMDDIR=/usr/local/lib/systemd/system
++ SELINUX=
++ selinuxenabled
++ ARCH=amd64
++ install -d -m 755 /etc/cni/net.d
++ install -D -m 755 -t /opt/cni/bin cni-plugins/LICENSE cni-plugins/README.md cni-plugins/bandwidth cni-plugins/bridge cni-plugins/dhcp cni-plugins/dummy cni-plugins/firewall cni-plugins/host-device cni-plugins/host-local cni-plugins/ipvlan cni-plugins/loopback cni-plugins/macvlan cni-plugins/portmap cni-plugins/ptp cni-plugins/sbr cni-plugins/static cni-plugins/tap cni-plugins/tuning cni-plugins/vlan cni-plugins/vrf
++ install -D -m 644 -t /etc/cni/net.d contrib/10-crio-bridge.conflist.disabled
++ install -d -m 755 /usr/libexec/crio
++ install -D -m 755 -t /usr/libexec/crio bin/conmon
++ install -D -m 755 -t /usr/libexec/crio bin/conmonrs
++ install -D -m 755 -t /usr/libexec/crio bin/crun
++ install -D -m 755 -t /usr/libexec/crio bin/runc
++ install -d -m 755 /usr/local/share/bash-completion/completions
++ install -d -m 755 /usr/local/share/fish/completions
++ install -d -m 755 /usr/local/share/zsh/site-functions
++ install -d -m 755 /etc/containers/registries.conf.d
++ install -D -m 755 -t /usr/local/bin bin/crio
++ install -D -m 755 -t /usr/local/bin bin/pinns
++ install -D -m 755 -t /usr/local/bin bin/crictl
++ install -D -m 644 -t /etc etc/crictl.yaml
++ install -D -m 644 -t /usr/local/share/oci-umount/oci-umount.d etc/crio-umount.conf
++ install -D -m 644 -t /etc/default etc/crio
++ install -D -m 644 -t /etc/crio contrib/policy.json
++ install -D -m 644 -t /etc/crio/crio.conf.d etc/10-crio.conf
++ install -D -m 644 -t /usr/local/share/man/man5 man/crio.conf.5
++ install -D -m 644 -t /usr/local/share/man/man5 man/crio.conf.d.5
++ install -D -m 644 -t /usr/local/share/man/man8 man/crio.8
++ install -D -m 644 -t /usr/local/share/bash-completion/completions completions/bash/crio
++ install -D -m 644 -t /usr/local/share/fish/completions completions/fish/crio.fish
++ install -D -m 644 -t /usr/local/share/zsh/site-functions completions/zsh/_crio
++ install -D -m 644 -t /usr/local/lib/systemd/system contrib/crio.service
++ install -D -m 644 -t /etc/containers/registries.conf.d contrib/registries.conf
++ sed -i 's;/usr/bin;/usr/local/bin;g' /etc/crio/crio.conf.d/10-crio.conf
++ sed -i 's;/usr/libexec;/usr/libexec;g' /etc/crio/crio.conf.d/10-crio.conf
++ sed -i 's;/etc/crio;/etc/crio;g' /etc/crio/crio.conf.d/10-crio.conf
++ '[' -n '' ']'

Ок, судя по выхлопу у нас есть сервис и даже конфиги.

Ну, шо погнали включаем и смотрим статус.

# systemctl start crio
# systemctl enable crio
# systemctl status crio
● crio.service - Container Runtime Interface for OCI (CRI-O)
     Loaded: loaded (/usr/local/lib/systemd/system/crio.service; disabled; vendor preset: enabled)
     Active: active (running) since Fri 2025-03-07 04:30:59 UTC; 6s ago
       Docs: https://github.com/cri-o/cri-o
   Main PID: 439149 (crio)
      Tasks: 7
     Memory: 10.3M
        CPU: 132ms
     CGroup: /system.slice/crio.service
             └─439149 /usr/local/bin/crio

Итого, работает в чистом виде.

# /usr/local/bin/crictl ps
CONTAINER           IMAGE               CREATED             STATE               NAME                ATTEMPT             POD ID              POD                 NAMESPACE

Господь с ним и запихиваем в автозапуск.

# systemctl enable crio

Смертельный номер и мы ребутим хост (на проде таких опытов не делайте!)

Работает cri-o

# /usr/local/bin/crictl ps
CONTAINER           IMAGE               CREATED             STATE               NAME                ATTEMPT             POD ID              POD                 NAMESPACE

Работает старый движок.

# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

Изумительно.

Давайте в кубик играть

Сейчас мы руками MiniKube (Аналог) соберем и даже там что-то странное запустим.

В целом если вам интересно, то реально лучше читать документацию. Например, тут https://kubernetes.io/docs/reference/setup-tools/kubeadm/ там все описано.

# kubeadm init --pod-network-cidr=192.168.0.0/16 --cri-socket unix:///var/run/crio/crio.sock

Коллеги, за 192.168.0.0 тут сорян, мне в голову пришло только это безумие.

Окей, у нас джойн ключ появился.

kubeadm join 10.0.0.7:6443 --token xxxTokenxxx \
        --discovery-token-ca-cert-hash sha256:xxxRaznaya-heroboraxxx

Адрес конечно странноватый из внутренней подсети cloud.ru. И мы его не будем использовать (ну не нраятся k8s сети хоть и мостовые).

Смотрим на наш кластер из одного узла.

# kubectl get nodes
E0309 04:46:44.521685   10905 memcache.go:265] "Unhandled Error" err="couldn't get current server API group list: Get \"http://localhost:8080/api?timeout=32s\": dial tcp 127.0.0.1:8080: connect: connection refused"

Маразм крепчал.

# crictl ps
CONTAINER           IMAGE                                                              CREATED             STATE               NAME                      ATTEMPT             POD ID              POD                                             NAMESPACE
3e7ee50b68d71       f1332858868e1c6a905123b21e2e322ab45a5b99a3532e68ff49a87c2266ebc5   9 minutes ago       Running             kube-proxy                0                   1acd62827bf18       kube-proxy-r9n7c                                kube-system
ab01eeed44764       85b7a174738baecbc53029b7913cd430a2060e0cbdb5f56c7957d32ff7f241ef   9 minutes ago       Running             kube-apiserver            0                   895cce371d03f       kube-apiserver-srv-prod-sbercloud-01            kube-system
5445234427c29       d8e673e7c9983f1f53569a9d2ba786c8abb42e3f744f77dc97a595f3caf9435d   9 minutes ago       Running             kube-scheduler            0                   191b0c4b4886f       kube-scheduler-srv-prod-sbercloud-01            kube-system
2f33ebe5f4e25       b6a454c5a800d201daacead6ff195ec6049fe6dc086621b0670bca912efaf389   9 minutes ago       Running             kube-controller-manager   0                   647ac8348c819       kube-controller-manager-srv-prod-sbercloud-01   kube-system
f42907da88b39       a9e7e6b294baf1695fccb862d956c5d3ad8510e1e4ca1535f35dc09f247abbfc   9 minutes ago       Running             etcd                      0                   1aa54f8edb256       etcd-srv-prod-sbercloud-01                      kube-system

Если в лоб делать, то получится как-то так.

# ls /etc/kubernetes
admin.conf  controller-manager.conf  kubelet.conf  manifests  pki  scheduler.conf  super-admin.conf

Опять всем привет.

# kubectl get nodes --kubeconfig /etc/kubernetes/kubelet.conf
Error from server (Forbidden): nodes is forbidden: User "system:node:srv-prod-sbercloud-01" cannot list resource "nodes" in API group "" at the cluster scope: node 'srv-prod-sbercloud-01' cannot read all nodes, only its own Node object

Ну тут имя надо указывать при создании кластера или свой локальный DNS, но мне лень, погнали на локаль раскидаем и поправим адреса. И это называется дурдом на минималках.

Доступ по портам (но только для своего адреса) придется все же выдать (специфика такая в cloud.ru). Пока ему печально и похоже надо в логи лезть.

Пока все грустно и медленно, но плюс-минус пойдет.

# kubectl get pods --all-namespaces 
NAMESPACE     NAME                                            READY   STATUS    RESTARTS   AGE
kube-system   coredns-668d6bf9bc-cxrlz                        0/1     Pending   0          41m
kube-system   coredns-668d6bf9bc-wf5zf                        0/1     Pending   0          41m
kube-system   etcd-srv-prod-sbercloud-01                      1/1     Running   0          41m
kube-system   kube-apiserver-srv-prod-sbercloud-01            1/1     Running   0          41m
kube-system   kube-controller-manager-srv-prod-sbercloud-01   1/1     Running   0          41m
kube-system   kube-proxy-r9n7c                                1/1     Running   0          41m
kube-system   kube-scheduler-srv-prod-sbercloud-01            1/1     Running   0          41m

Итого у нас CoreDNS в состоянии не стояния.

# kubectl get pods --namespace=kube-system -l k8s-app=kube-dns
NAME                       READY   STATUS    RESTARTS   AGE
coredns-668d6bf9bc-cxrlz   0/1     Pending   0          58m
coredns-668d6bf9bc-wf5zf   0/1     Pending   0          58m

Разрешим запуск подов на мастер-узле, ну и будет такой мини-куб. Сейчас так.

# kubectl get nodes
NAME                    STATUS     ROLES           AGE   VERSION
srv-prod-sbercloud-01   NotReady   control-plane   68m   v1.32.2

Примерно так делаем (хоть так и не стоит делать).

# kubectl taint node srv-prod-sbercloud-01 node-role.kubernetes.io/control-plane:NoSchedule-
# kubectl patch node srv-prod-sbercloud-01 -p "{\"spec\":{\"unschedulable\":false}}"
# kubectl label nodes srv-prod-sbercloud-01 kubernetes.io/role=master

Проверим, что за чертовщину мы наделали.

# kubectl describe pod coredns-668d6bf9bc-cxrlz
Name:                 coredns-668d6bf9bc-cxrlz
Namespace:            kube-system
Priority:             2000000000
Priority Class Name:  system-cluster-critical
Service Account:      coredns
Node:                 <none>
Labels:               k8s-app=kube-dns
                      pod-template-hash=668d6bf9bc
Annotations:          <none>
Status:               Pending
IP:                   
IPs:                  <none>
Controlled By:        ReplicaSet/coredns-668d6bf9bc
Containers:
  coredns:
    Image:       registry.k8s.io/coredns/coredns:v1.11.3
    Ports:       53/UDP, 53/TCP, 9153/TCP
    Host Ports:  0/UDP, 0/TCP, 0/TCP
    Args:
      -conf
      /etc/coredns/Corefile
    Limits:
      memory:  170Mi
    Requests:
      cpu:        100m
      memory:     70Mi
    Liveness:     http-get http://:8080/health delay=60s timeout=5s period=10s #success=1 #failure=5
    Readiness:    http-get http://:8181/ready delay=0s timeout=1s period=10s #success=1 #failure=3
    Environment:  <none>
    Mounts:
      /etc/coredns from config-volume (ro)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-qppjv (ro)
Conditions:
  Type           Status
  PodScheduled   False 
Volumes:
  config-volume:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      coredns
    Optional:  false
  kube-api-access-qppjv:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   Burstable
Node-Selectors:              kubernetes.io/os=linux
Tolerations:                 CriticalAddonsOnly op=Exists
                             node-role.kubernetes.io/control-plane:NoSchedule
                             node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason            Age                   From               Message
  ----     ------            ----                  ----               -------
  Warning  FailedScheduling  3m33s (x18 over 88m)  default-scheduler  0/1 nodes are available: 1 node(s) had untolerated taint {node.kubernetes.io/not-ready: }. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.

Еще смертельный номер.

# kubectl label nodes srv-prod-sbercloud-01 ingress-ready=true
# kubectl taint nodes srv-prod-sbercloud-01 dedicated=special-user:NoSchedule

Добавим еще один рабочий узел

Подготовка хоста аналогичная мастер-узлу, все так-же с cri-o. И потом инициализируем инфраструктуру.

# kubeadm join 10.100.1.1:6443 --token olo9fy.bbnalvyeygtak7z4 \                    
        --discovery-token-ca-cert-hash sha256:3030XXXXtokenXXXX --cri-socket unix:///var/run/crio/crio.sock

Тут мы словили ошибку.

error execution phase preflight: couldn't validate the identity of the API Server: failed to request the cluster-info ConfigMap: Get "https://10.100.1.1:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s": tls: failed to verify certificate: x509: certificate is valid for 10.96.0.1, 10.0.0.7, not 10.100.1.1

Слишком много интерфейсов наплодили, тут и cloud.ru свои внутренние сети понамешал и я еще добавил, а так-как блог у нас образовательный сносим мастер ноду к черту.

# kubeadm reset --cri-socket unix:///var/run/crio/crio.sock

И пересоздаем по инструкции выше, но теперь я настроил еще и доступ с локальной машины до этой сети и можем использовать VsCode для управления кластером. И уберем этот 192.168.0.0/16 оно реально бесит где встречаю.

И вот это недоразумение автоматизации то и призналось, что нам надо еще и имя на интерфейс в hosts записать.

[certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local srv-prod-sbercloud-01] and IPs [10.96.0.1 10.0.0.7]

Блин, я забыл про этот пень и с мульти-интерфейсами и теперь заклинание получилось гораздо интереснее.

# kubeadm init --pod-network-cidr=10.20.0.0/16 --apiserver-advertise-address=10.100.1.1 --cri-socket unix:///var/run/crio/crio.sock

Вот теперь у нас двуногий кластер.

[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

Чем дальше в лес тем страшнее. Сносим CoreDNS.

# kubectl delete deployment coredns -n kube-system

Хотя похоже дело в том, что calico забанило РФ и пойдем другим путем.

# kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

Идиотия на марше (никогда не повторяйте описанное в этой заметке)

Итого, Weave справилась задачей, а вот штатный сетевой оркестратор говорит, что из РФ нельзя и это уже начинает бесить.

Ну, теперь допустим, что сеть у нас есть и теперь надо CoreDNS и Ingress вернуть и мы молодцы.

$ kubectl get nodes
NAME                    STATUS   ROLES           AGE   VERSION
srv-prod-sbercloud-01   Ready    control-plane   65m   v1.32.2
srv-prod-sbercloud-02   Ready    <none>          56m   v1.32.2

А зачем нам CoreDNS когда есть более современные игрушки. Хотя пофиг потом посмотрим потом.

# helm --namespace=kube-system install coredns coredns/coredns
# kubectl run -it --rm --restart=Never --image=infoblox/dnstools:latest dnstools

Дальше наши любимые ошибочки.

If you don't see a command prompt, try pressing enter.
warning: couldn't attach to pod/dnstools, falling back to streaming logs: Internal error occurred: error sending request: Post "https://213.171.26.110:10250/attach/default/dnstools/dnstools?input=1&output=1&tty=1": dial tcp 213.171.26.110:10250: i/o timeout
pod "dnstools" deleted
Error from server: Get "https://213.171.26.110:10250/containerLogs/default/dnstools/dnstools": dial tcp 213.171.26.110:10250: i/o timeout

Полный абзац, дальше мне еще правила рисовать между хостами. Ну спасибо Cloud.ru там сейчас сам черт ногу сломает где что и куда ходит.

Для тестирования внутреннего DNS подходит образ dnstools.

# kubectl run -it --rm --restart=Never --image=infoblox/dnstools:latest dnstools

Как показывает практика на внешнем интерфейсе мастер-ноды все же придется открыть порты 6443,  2379,  2380,  10250,  10259,  10257.

Добавим еще Ingress и в первом приближении плюс-минус что-то готово.

# helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
# helm install ingress-nginx/ingress-nginx --generate-name

Проверяем, что под появился и статус.

В первом приближении что-то собрал. Опыт конечно интересный, но специфичный.

Похожие записи

Настройка взаимодействия RED ADM и Windows Active Directory

Сегодня проведем несколько экспериментов по настройке взаимодействия RED ADM и Windows Active Directory. Есть несколько способов настройки доверия для упрощения миграции с решений Microsoft на Российское ПО и сегодня их…

Подробная инструкция по написанию YAML‑файлов для Docker Compose

Так как на севере делать абсолютно нечего, то я продолжаю заниматься саморазвитием 🙂 На этой неделе вспоминаю и углубляю свои знания в Docker. Лучший способ запомнить тему, это вести конспект…

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Читать еще статьи

Настройка взаимодействия RED ADM и Windows Active Directory

Настройка взаимодействия RED ADM и Windows Active Directory

Подробная инструкция по написанию YAML‑файлов для Docker Compose

Подробная инструкция по написанию YAML‑файлов для Docker Compose

Установка основного контроллера домена на базе REDADM

Установка основного контроллера домена на базе REDADM

zVirt работа с шаблонами виртуальных машин

zVirt работа с шаблонами виртуальных машин

Подробная инструкция по работе с томами (volumes) в Docker

Подробная инструкция по работе с томами (volumes) в Docker

Сетевые возможности Docker

Сетевые возможности Docker