Docker安装

安装步骤

  1. [root@clientvm k8s]# cd /resources/playbooks/k8s/
  2. [root@clientvm k8s]# ansible-playbook -i hosts docker.yml

验证

  1. ansible -i hosts lab -m command -a 'docker images'

官方安装步骤

  1. # (Install Docker CE)
  2. ## Set up the repository
  3. ### Install required packages
  4. sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  5. ## Add the Docker repository
  6. sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  1. # Install Docker CE
  2. yum install -y containerd.io-1.2.13 docker-ce-19.03.11 docker-ce-cli-19.03.11

如果需要安装指定版本,请先显示所有版本号:

  1. yum list docker-ce --showduplicates | sort -r
  2. docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
  3. docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
  4. docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
  5. docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable

然后指定版本进行安装:

  1. yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

继续……

  1. ## Create /etc/docker
  2. sudo mkdir /etc/docker
  1. # Set up the Docker daemon
  2. cat <<EOF | sudo tee /etc/docker/daemon.json
  3. {
  4. "registry-mirrors": ["https://pee6w651.mirror.aliyuncs.com", "https://ustc-edu-cn.mirror.aliyuncs.com"],
  5. "exec-opts": ["native.cgroupdriver=systemd"],
  6. "log-driver": "json-file",
  7. "log-opts": {
  8. "max-size": "100m"
  9. },
  10. "storage-driver": "overlay2"
  11. }
  12. EOF
  1. # Create /etc/systemd/system/docker.service.d
  2. sudo mkdir -p /etc/systemd/system/docker.service.d
  1. # Restart Docker
  2. sudo systemctl daemon-reload
  3. sudo systemctl restart docker
  1. sudo systemctl enable docker

kubelet kubeadm kubectl安装

安装步骤

完成系统配置

  • Turn off swapping
  • Turn off SELinux
  • Manage Kernel parameters
    1. [root@clientvm k8s]# ansible-playbook -i hosts tune-os.yml
    安装kubeadm, kubelet, kubectl
    1. [root@clientvm k8s]# ansible-playbook -i hosts kubeadm-kubelet.yml
    命令补全
    1. [root@clientvm k8s]# echo "source <(kubectl completion bash)" >>~/.bashrc
    2. [root@clientvm k8s]# . ~/.bashrc

官方安装步骤

  1. cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
  5. enabled=1
  6. gpgcheck=1
  7. repo_gpgcheck=1
  8. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  9. EOF

显示所有版本

  1. yum list kubeadm --showduplicates | sort -r

安装指定版本

  1. setenforce 0
  2. yum install -y kubelet-<VERSION_STRING> kubeadm-<VERSION_STRING> kubectl-<VERSION_STRING>
  3. systemctl enable kubelet && systemctl start kubelet

安装K8S集群

安装master

预先导入Image以节约时间,为避免多虚拟机同时读写磁盘数据带来磁盘压力导致镜像导入出错,增加 —forks 1 的参数,配置并行数量为1:

  1. [root@clientvm k8s]# ansible-playbook --forks 1 -i hosts 01-preload-install-Image.yml
  2. [root@clientvm k8s]# ansible-playbook --forks 1 -i hosts 02-preload-other.yml
  3. [root@clientvm k8s]# ansible-playbook --forks 1 -i hosts 03-preload-ingress-storage-metallb-metrics.yml
  4. [root@clientvm k8s]# ansible-playbook --forks 1 -i hosts 08-preload-Exam.yml

如果镜像导入出错,需要在每个节点上执行如下命令删除镜像,然后重新导入:

  1. for i in $(docker images | awk '{print $3}' |grep -v IMAGE); do docker rmi $i ; done
  1. [root@clientvm k8s]# ssh master
  2. Last login: Thu Nov 26 11:53:41 2020 from 192.168.241.132
  3. [root@master ~]#
  4. [root@master ~]# source <(kubeadm completion bash)

创建生成配置文件
以下IP替换为你自己master节点的IP:

  1. [root@master ~]# kubeadm config print init-defaults >init.yaml
  2. [root@master ~]# vim init.yaml
  3. ##修改如下几行
  4. advertiseAddress: 192.168.133.129
  5. imageRepository: registry.aliyuncs.com/google_containers
  6. ......
  7. networking:
  8. dnsDomain: example.com
  9. serviceSubnet: 10.96.0.0/12
  10. podSubnet: 10.244.0.0/16

初始化
可以修改此文件中的IP地址后直接使用:/resources/yaml/cluster-init.yaml

  1. [root@master ~]# kubeadm init --config /resources/yaml/cluster-init.yaml
  2. ......
  3. Your Kubernetes control-plane has initialized successfully!
  4. To start using your cluster, you need to run the following as a regular user:
  5. mkdir -p $HOME/.kube
  6. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  7. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  8. You should now deploy a pod network to the cluster.
  9. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  10. https://kubernetes.io/docs/concepts/cluster-administration/addons/
  11. Then you can join any number of worker nodes by running the following on each as root:
  12. kubeadm join 192.168.133.129:6443 --token abcdef.0123456789abcdef \
  13. --discovery-token-ca-cert-hash sha256:3c2a964155d000ac6950f7bc33f765e937fe2f58fdf4c2fe99792f886a4a84a4

手动拉取镜像命令

  1. kubeadm config images pull --config cluster-init.yaml

配置kubectl

配置master的kubectl

  1. [root@master ~]# mkdir -p ~/.kube
  2. [root@master ~]# cp -i /etc/kubernetes/admin.conf ~/.kube/config

配置客户端VM的kubectl

  1. [root@clientvm k8s]# mkdir -p ~/.kube
  2. [root@clientvm k8s]# scp master:/root/.kube/config ~/.kube/
  3. [root@clientvm k8s]# kubectl get node
  4. NAME STATUS ROLES AGE VERSION
  5. master.example.com Ready master 46m v1.20.0

添加节点

  1. [root@clientvm k8s]# ssh worker1
  2. Last login: Thu Nov 26 16:27:47 2020 from 192.168.241.132
  3. [root@worker1 ~]#
  4. [root@worker1 ~]#
  5. [root@worker1 ~]# kubeadm join 192.168.133.129:6443 --token abcdef.0123456789abcdef \
  6. > --discovery-token-ca-cert-hash sha256:00a111079e7d2e367e2b21500c64202a981898cf7e058957cfa5d06e933c2362
  1. [root@clientvm k8s]# ssh worker2
  2. Last login: Thu Nov 26 16:27:44 2020 from 192.168.241.132
  3. [root@worker2 ~]# kubeadm join 192.168.133.129:6443 --token abcdef.0123456789abcdef \
  4. > --discovery-token-ca-cert-hash sha256:00a111079e7d2e367e2b21500c64202a981898cf7e058957cfa5d06e933c2362

部署网络组件calico

可参考官方文档:
https://docs.projectcalico.org/getting-started/kubernetes/quickstart
或直接使用以下yaml
https://docs.projectcalico.org/v3.14/manifests/calico.yaml
https://docs.projectcalico.org/v3.17/manifests/calico.yaml

K8S1.20版本请使用:calico-v3.14.yaml
K8S1.23版本请使用:calico-v3.21.yaml,镜像已经预先导入

  1. [root@master ~]# cd /resources/yaml/
  2. [root@master yaml]# ls
  3. calico.yaml cluster-init.yaml
  4. [root@master yaml]# kubectl get node
  5. NAME STATUS ROLES AGE VERSION
  6. master.example.com NotReady master 4m57s v1.20.0
  7. [root@master yaml]#
  8. [root@master yaml]# kubectl apply -f calico-v3.21.yaml

集群部署完成后,为4台VM创建一个快照


其他操作

ComponentStatus资源报错

故障:

  1. [root@master yaml]# kubectl get cs
  2. Warning: v1 ComponentStatus is deprecated in v1.19+
  3. NAME STATUS MESSAGE ERROR
  4. scheduler Unhealthy Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
  5. controller-manager Unhealthy Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused
  6. etcd-0 Healthy {"health":"true"}

解决:

  1. #编辑如下两个配置文件,注释掉- port=0 的行
  2. [root@master yaml]# vim /etc/kubernetes/manifests/kube-controller-manager.yaml
  3. [root@master yaml]# vim /etc/kubernetes/manifests/kube-scheduler.yaml
  4. [root@master yaml]# grep 'port=0' /etc/kubernetes/manifests/kube-controller-manager.yaml /etc/kubernetes/manifests/kube-scheduler.yaml
  5. /etc/kubernetes/manifests/kube-controller-manager.yaml:# - --port=0
  6. /etc/kubernetes/manifests/kube-scheduler.yaml:# - --port=0
  7. ## 重启 kubelet.service 服务
  8. [root@master yaml]# systemctl restart kubelet.service
  9. [root@master yaml]# kubectl get cs
  10. Warning: v1 ComponentStatus is deprecated in v1.19+
  11. NAME STATUS MESSAGE ERROR
  12. controller-manager Healthy ok
  13. scheduler Healthy ok
  14. etcd-0 Healthy {"health":"true"}

删除节点

在需要删除的节点上运行

  1. [root@worker2 ~]# kubeadm reset -f
  2. [root@worker2 ~]# iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
  3. [root@worker2 ~]# ipvsadm -C

在master上运行

  1. [root@master yaml]# kubectl delete node worker2.example.com
  2. node "worker2.example.com" deleted
  3. [root@master yaml]# kubectl delete node worker2.example.com
  4. node "worker2.example.com" deleted
  5. [root@master yaml]# kubectl delete node worker1.example.com
  6. node "worker1.example.com" deleted
  7. [root@master yaml]#
  8. [root@master yaml]# kubectl get node
  9. NAME STATUS ROLES AGE VERSION
  10. master.example.com Ready master 32m v1.20.0

Token过期后加入节点

在master上列出Token

  1. [root@master yaml]# kubeadm token list
  2. TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
  3. abcdef.0123456789abcdef 23h 2020-11-27T16:29:16+08:00 authentication,signing <none> system:bootstrappers:kubeadm:default-node-token

生成永久Token

  1. [root@master yaml]# kubeadm token create --ttl 0
  2. [root@master yaml]# kubeadm token list
  3. TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
  4. 2kpxk0.3861kgminh7jafrp <forever> <never> authentication,signing <none> system:bootstrappers:kubeadm:default-node-token
  5. abcdef.0123456789abcdef 23h 2020-11-27T16:29:16+08:00 authentication,signing <none> system:bootstrappers:kubeadm:default-node-token

获取discovery-token-ca-cert-hash

  1. [root@master yaml]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
  2. 00a111079e7d2e367e2b21500c64202a981898cf7e058957cfa5d06e933c2362

在节点上执行命令加入集群

  1. [root@worker1 ~]# kubeadm join 192.168.133.129:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:00a111079e7d2e367e2b21500c64202a981898cf7e058957cfa5d06e933c2362

Containerd参考

使用Containerd作为RUNC
Containerd 安装配置参考:
https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd
注意: 还需要按照kubeadm的版本相应修改image registry为:registry.aliyuncs.com/google_containers
pause容器版本为K8S兼容的版本。

  1. ......
  2. sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
  3. ......
  4. [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
  5. [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  6. ......
  7. [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  8. SystemdCgroup = true

参考配置文件:/resources/playbooks/k8s/config.toml
部署步骤:

  1. /resources/playbooks/k8s
  2. ansible-playbook -i hosts containerd.yaml
  3. ansible-playbook -i hosts tune-os.yml
  4. ansible-playbook -i hosts kubeadm-kubelet.yml
  5. kubeadm init --config /resources/yaml/cluster-init-containerd.yaml

在cluster-init-containerd.yaml 中需要修改criSocket指定RUNC,位置与containerd配置相同:

  1. apiVersion: kubeadm.k8s.io/v1beta3
  2. bootstrapTokens:
  3. - groups:
  4. - system:bootstrappers:kubeadm:default-node-token
  5. token: abcdef.0123456789abcdef
  6. ttl: 24h0m0s
  7. usages:
  8. - signing
  9. - authentication
  10. kind: InitConfiguration
  11. localAPIEndpoint:
  12. advertiseAddress: 192.168.126.128
  13. bindPort: 6443
  14. nodeRegistration:
  15. criSocket: unix:///run/containerd/containerd.sock
  16. imagePullPolicy: IfNotPresent
  17. name: master.example.com
  18. taints: null
  19. ---
  20. apiServer:
  21. timeoutForControlPlane: 4m0s
  22. apiVersion: kubeadm.k8s.io/v1beta3
  23. certificatesDir: /etc/kubernetes/pki
  24. clusterName: kubernetes
  25. controllerManager: {}
  26. dns: {}
  27. etcd:
  28. local:
  29. dataDir: /var/lib/etcd
  30. imageRepository: registry.aliyuncs.com/google_containers
  31. kind: ClusterConfiguration
  32. kubernetesVersion: 1.23.0
  33. networking:
  34. dnsDomain: example.com
  35. serviceSubnet: 10.96.0.0/12
  36. scheduler: {}
  37. ---
  38. apiVersion: kubelet.config.k8s.io/v1beta1
  39. kind: KubeletConfiguration
  40. cgroupDriver: systemd