Статья-заметка о том как поднять kubernetes кластер из трех control-plane. Без отдельного балансировщика, используя DNS Round Robin. Компоненты — containerd и сетевой плагин flannel. В моём случае bare-metall, ОС Alma Linux 9 (RHEL 9).
Сразу создайте DNS A запись с тремя IP адресами control-plane’ов.
На всех нодах, которые будут control-plane
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
setenforce 0 sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/sysconfig/selinux swapoff -a sed -i '/ swap / s/^/#/' /etc/fstab firewall-cmd --permanent --add-port=6443/tcp firewall-cmd --permanent --add-port=2379-2380/tcp firewall-cmd --permanent --add-port=10250/tcp firewall-cmd --permanent --add-port=10251/tcp firewall-cmd --permanent --add-port=10259/tcp firewall-cmd --permanent --add-port=10257/tcp firewall-cmd --permanent --add-port=179/tcp firewall-cmd --permanent --add-port=4789/udp firewall-cmd --reload dnf -y install yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo dnf -y install containerd.io systemctl enable containerd |
1 2 3 4 5 6 7 8 9 |
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF |
1 2 3 4 5 6 7 8 9 |
dnf install -y kubelet kubeadm kubectl --disableexcludes=Kubernetes systemctl enable kubelet systemctl start kubelet modprobe overlay modprobe br_netfilter cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br_netfilter EOF |
1 2 3 4 5 |
cat <<EOF | tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF |
1 2 3 |
sysctl --system mv /etc/containerd/config.toml /etc/containerd/config.toml.orig containerd config default > /etc/containerd/config.toml |
vi /etc/containerd/config.toml
1 2 3 4 5 |
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] ... # здесь уже есть параметры, трогать их не нужно ... ... SystemdCgroup = true |
1 2 3 4 |
systemctl restart containerd.service mkdir /opt/bin curl -fsSLo /opt/bin/flanneld https://github.com/flannel-io/flannel/releases/download/v0.21.4/flannel-v0.21.4-linux-amd64.tar.gz chmod +x /opt/bin/flanneld |
На первой ноде, которая будет control-plane
1 2 3 4 5 |
kubeadm config images pull kubeadm init --pod-network-cidr=10.244.0.0/16 --upload-certs --control-plane-endpoint=DNS ЗАПИСЬ С ТРЕМЯ IP АДРЕСАМИ CONTROL-PLANES:6443 echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile.d/k8s.sh kubectl apply -f https://github.com/flannel-io/flannel/releases/download/v0.21.4/kube-flannel.yml reboot |
Присоединение оставшихся control-plane нод
1 |
kubectl get cm kubeadm-config -n kube-system -o yaml |
Вывод из предыдущей команды (от apiServer: и до scheduler: {} включительно) записать в отдельный файл
vi kubeadm-config.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
apiServer: extraArgs: authorization-mode: Node,RBAC timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta3 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controlPlaneEndpoint: DNS ЗАПИСЬ С ТРЕМЯ IP АДРЕСАМИ CONTROL-PLANES:6443 controllerManager: {} dns: {} etcd: local: dataDir: /var/lib/etcd imageRepository: registry.k8s.io kind: ClusterConfiguration kubernetesVersion: v1.27.1 networking: dnsDomain: cluster.local podSubnet: 10.244.0.0/16 serviceSubnet: 10.96.0.0/12 scheduler: {} |
Теперь нужно выполнить.
1 |
kubeadm init phase upload-certs --upload-certs --config kubeadm-config.yaml |
Вывод который выдаст предыдущая команда, будет похож на этот и пригодится далее.
1 2 3 |
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace [upload-certs] Using certificate key: 7e5ac2f48c75c97bcb3f56a12f9c6ba0ca102d3365c1d661a080fd3216c5656 |
Теперь отобразим команду на присоединение к кластеру
1 |
kubeadm token create --print-join-command |
Вывод который выдаст предыдущая команда, будет похож на этот и пригодится далее.
1 |
kubeadm join DNS ЗАПИСЬ С ТРЕМЯ IP АДРЕСАМИ CONTROL-PLANES:6443 --token g9x45o.0091fmr1zf5fcnog --discovery-token-ca-cert-hash sha256:7b66e98d396a6c1fc2d06310a9da62151427068a3aa882сfa2af43139221e99c |
Теперь нужно объединить 2 предыдущих вывода следующим образом:
1 |
<basic join command> --control-plane --certificate-key <ceritifcate-key> |
Получится похожее на это
1 |
kubeadm join DNS ЗАПИСЬ С ТРЕМЯ IP АДРЕСАМИ CONTROL-PLANES:6443 --token g9x45o.0091fmr1zf5fcnog --discovery-token-ca-cert-hash sha256:7b66e98d396a6c1fc2d06310a9da62151427068a3aa882сfa2af43139221e99c --control-plane --certificate-key 7e5ac2f48c75c97bcb3f56a12f9c6ba0ca102d3365c1d661a080fd3216c5656 |
Эту команду нужно продублировать на нодах которые хотим добавить в кластер и сделать их control-plane.
Подготовка рабочей ноды (worker)
1 2 3 4 5 6 7 8 |
setenforce 0 sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/sysconfig/selinux swapoff -a sed -i '/ swap / s/^/#/' /etc/fstab dnf -y install yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo dnf -y install containerd.io systemctl enable containerd |
1 2 3 4 5 6 7 8 9 |
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF |
1 2 3 4 5 6 7 8 9 |
dnf install -y kubelet kubeadm kubectl --disableexcludes=Kubernetes systemctl enable kubelet systemctl start kubelet modprobe overlay modprobe br_netfilter cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br_netfilter EOF |
1 2 3 4 5 |
cat <<EOF | tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF |
1 2 3 |
sysctl --system mv /etc/containerd/config.toml /etc/containerd/config.toml.orig containerd config default > /etc/containerd/config.toml |
vi /etc/containerd/config.toml
1 2 3 4 5 |
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] ... # здесь уже есть параметры, трогать их не нужно ... ... SystemdCgroup = true |
1 2 3 4 5 6 7 8 9 10 |
systemctl restart containerd.service mkdir /opt/bin curl -fsSLo /opt/bin/flanneld https://github.com/flannel-io/flannel/releases/download/v0.21.4/flannel-v0.21.4-linux-amd64.tar.gz chmod +x /opt/bin/flanneld systemctl enable kubelet systemctl start kubelet firewall-cmd --permanent --add-port=10248/tcp # Kubelet firewall-cmd --permanent --add-port=10250/tcp # Kubelet firewall-cmd --reload mkdir /run/flannel |
Присоединение к кластеру
1 |
kubeadm token create --print-join-command |
1 |
kubeadm join DNS ЗАПИСЬ С ТРЕМЯ IP АДРЕСАМИ CONTROL-PLANES:6443 --token g9x45o.0091fmr1zf5fcnog --discovery-token-ca-cert-hash sha256:7b66e98d396a6c1fc2d06310a9da62151427068a3aa882сfa2af43139221e99c |