kubeadm развертывает один главный и два подчиненных кластера k8s

Kubernetes

0. Предварительная работа

Быстрее создать три убунты с мультипроходом

multipass launch -n k8s-master -c 2 -m 4G -d 16G
multipass launch -n k8s-node01 -c 2 -m 4G -d 16G
multipass launch -n k8s-node02 -c 2 -m 4G -d 16G

image.png

1. Виртуальный ящик создает три виртуальных машины ubuntu server 20.04, а сеть выбирает режим моста.

хозяин ip
k8s-master 192.168.1.248
k8s-node1 192.168.1.106
k8s-node2 192.168.1.251
  • ubuntu 20.04 установить статический IP:
## 配置master,两台node配置类似
sudo vim /etc/netplan/00-installer-config.yaml

# This is the network config written by 'subiquity'
network:
  ethernets:
    enp0s3:
      dhcp4: no
      dhcp6: no
      addresses: [192.168.1.248/24]  ## 设置成你自己实际的网络
      gateway4: 192.168.1.1
      nameservers:
          addresses: [8.8.8.8]
  version: 2

sudo netplan apply
  • Установите хосты, сохраните, чтобы применить
192.168.1.248 k8s-master
192.168.1.106 k8s-node1
192.168.1.251 k8s-node2
  • закрыть раздел подкачки
sudo swapoff -a

# 查看交换分区状态
sudo free -m 

2. Установите докер

docs.docker.com/engine/Inst…

3. Установите kubectk\kubeadm\kubelet

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

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
sudo apt-get update && sudo apt-get install -y ca-certificates curl software-properties-common apt-transport-https curl

curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF 
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

sudo apt update
sudo apt install kubelet kubeadm kubectl

sudo systemctl enable kubelet && sudo systemctl start kubelet

4. Настроить кластер — мастер

sudo kubeadm init --pod-network-cidr 172.16.0.0/16 \
    --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers

Возможные проблемы:

  • detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd".
sudo vim /etc/docker/daemon.json

"exec-opts": ["native.cgroupdriver=systemd"]

sudo systemctl restart docker
  • the number of available CPUs 1 is less than the required 2
virtualbox 将虚拟机cpu设置为2
  • Error response from daemon: manifest for registry.cn-hangzhou.aliyuncs.com/google_containers/coredns/coredns:v1.8.0 not found:
## 手动拉取coredns镜像并打标签
sudo docker pull coredns/coredns:1.8.0

sudo docker tag coredns/coredns:1.8.0 registry.cn-hangzhou.aliyuncs.com/google_containers/coredns/coredns:v1.8.0

См. следующую информацию, указывающую на то, что инициализация главного узла прошла успешно:image.png

## init完成之后会有提示信息:
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

5. Настроить кластер — узел

## 将两个node节点加入集群
sudo kubeadm join 192.168.1.248:6443 --token... (init master 最后输出的信息)

В настоящее время, поскольку сетевой подключаемый модуль не установлен, состояние узла ненормальное:image.png

## 安装calio
wget https://docs.projectcalico.org/manifests/calico.yaml

vim calico.yaml
## 修改这个值为kubeadm init中的cidr
- name: CALICO_IPV4POOL_CIDR
  value: "172.16.0.0/16"
  
kubectl apply -f calico.yaml

Возможные проблемы:

  • get pod found kube-system coredns-57d4cbf879-22lwd 0/1 ErrImagePull, описать pod обнаружил, что образ не может быть извлечен, так как образ существовал локально до этого (помеченный вручную), а политика извлечения при развертывании была imagePullPolicy: IfNotPresent:

image.pngРешение. Зеркало не существует на узле узла, и когда эти два модуля запланированы на узле узла, зеркало не может быть найдено. Обратитесь к описанной выше операции ручной маркировки и вручную потяните и пометьте два узла, чтобы решить проблему.

image.png

6. Проверьте компоненты после развертывания кластера

  • dial tcp 127.0.0.1:10251: connect: connection refused

image.png

cd /etc/kubernetes/manifests
vim vim kube-scheduler.yaml             ## 将 --port=0 注释
sudo vim kube-controller-manager.yaml   ## 将 --port=0 注释
sudo systemctl restart kubelet

решить:

image.png

7. Виртуальная машина одной ноды зависает, удаляем ноду, а потом снова присоединяемся к кластеру

ubuntu@k8s-node2:/etc/kubernetes$ sudo kubeadm reset
[reset] WARNING: Changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted.
[reset] Are you sure you want to proceed? [y/N]: y
[preflight] Running pre-flight checks
W0911 12:25:01.398018   53191 removeetcdmember.go:79] [reset] No kubeadm config, using etcd pod spec to get data directory
[reset] No etcd config found. Assuming external etcd
[reset] Please, manually reset etcd to prevent further issues
[reset] Stopping the kubelet service
[reset] Unmounting mounted directories in "/var/lib/kubelet"
[reset] Deleting contents of config directories: [/etc/kubernetes/manifests /etc/kubernetes/pki]
[reset] Deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf /etc/kubernetes/controller-manager.conf /etc/kubernetes/scheduler.conf]
[reset] Deleting contents of stateful directories: [/var/lib/kubelet /var/lib/dockershim /var/run/kubernetes /var/lib/cni]

The reset process does not clean CNI configuration. To do so, you must remove /etc/cni/net.d

The reset process does not reset or clean up iptables rules or IPVS tables.
If you wish to reset iptables, you must do so manually by using the "iptables" command.

If your cluster was setup to utilize IPVS, run ipvsadm --clear (or similar)
to reset your system's IPVS tables.

The reset process does not clean your kubeconfig files and you must remove them manually.
Please, check the contents of the $HOME/.kube/config file.
ubuntu@k8s-node2:/etc/kubernetes$
ubuntu@k8s-node2:/etc/kubernetes$
ubuntu@k8s-node2:/etc/kubernetes$
ubuntu@k8s-node2:/etc/kubernetes$ sudo kubeadm join 192.168.1.248:6443 --token buz01v.qcrobh663fyjlssy --discovery-token-ca-cert-hash sha256:6190832c8cdc233a9b01708d658cffb1c303006c36dec99bd82bfe90005e4b86
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[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.


8. Если команда kubectl не может быть использована после перезапуска

ubuntu@k8s-master:~$ kubectl get pod -A
The connection to the server 192.168.1.248:6443 was refused - did you specify the right host or port?

Вы можете проверить использование диска.Я обнаружил, что петлевые устройства все 100%, и моя ошибка вызвана этой причиной.

image.png

Ручная очистка:

sudo apt autoremove --purge snapd