目录

使用kubeadm部署一套高可用k8s集群 for Ubuntu

基于ubuntu使用kubeadm搭建集群, centos部署文档, 有疑问的地方可以看官方文档

准备机器

我的机器详情如下, 配置至少为4C4G

hostname IP 作用
public 10.0.0.3 ingress、apiserver负载均衡,nfs存储
master1 10.0.0.11 k8s master节点
master2 10.0.0.12 k8s master节点
master3 10.0.0.13 k8s master节点
worker1 10.0.0.21 k8s worker节点
worker2 10.0.0.22 k8s worker节点

每台机器都做域名解析,或者绑定hosts(可选但建议)

vim /etc/hosts

10.0.0.3  public kube-apiserver
10.0.0.11 master1
10.0.0.12 master2
10.0.0.13 master3

基础环境配置

基础环境是不管master还是worker都需要的环境

  1. 禁用swap
  2. 确保每个节点上 MAC 地址和 product_uuid 的唯一性sudo cat /sys/class/dmi/id/product_uuid
  3. 修改hostname
  4. 允许 iptables 检查桥接流量
  5. 关闭防火墙
sudo systemctl disable --now ufw

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

安装runtime

安装kubeadm、kubelet 和 kubectl

准备负载均衡

public机器上执行,负载均衡软件选一个就行了,以下二选一

创建集群

kubeadm init

也可以用kubeadm config print init-defaults > init.yaml 生成kubeadm的配置,并用 kubeadm init --config=init.yaml来创建集群。

安装网络插件

获取join命令, 增加新的节点

node

kubeadm init 后会输出在终端上, 有效期2小时, 超时后可以重新生成

生成添加命令:

kubeadm token create --print-join-command

master

  1. 生成证书, 记录certificate key

    kubeadm init phase upload-certs --upload-certs
    
  2. 获取加入命令

    kubeadm token create --print-join-command
    
  3. 上面两步可以简化成

    echo "$(kubeadm token create --print-join-command) --control-plane --certificate-key $(kubeadm init phase upload-certs --upload-certs | tail -1)"
    

移除节点

移除节点

kubectl drain worker2 --ignore-daemonsets
kubectl delete node worker2

如果是master节点还需要移除etcd member

kubectl exec -it -n kube-system etcd-master1 -- /bin/sh

# 查看etcd member list
etcdctl --endpoints 127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key member list

# 通过ID来删除etcd member
etcdctl --endpoints 127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key member remove 12637f5ec2bd02b8

常见问题

一个比较奇怪的初始化失败问题

kubeadm有个坑的地方,使用kubeadm image pull可以事先把镜像拉取下来,但是后面kubeadm init会报错:

> journalctl -xeu kubelet -f

Jul 22 08:35:49 master1 kubelet[2079]: E0722 08:35:49.169395    2079 pod_workers.go:190] "Error syncing pod, skipping" err="failed to \"CreatePodSandbox\" for \"etcd-master1_kube-system(642dcd53ce8660a2287cd7eaabcd5fdc)\" with CreatePodSandboxError: \"Failed to create sandbox for pod \\\"etcd-master1_kube-system(642dcd53ce8660a2287cd7eaabcd5fdc)\\\": rpc error: code = Unknown desc = failed to get sandbox image \\\"k8s.gcr.io/pause:3.6\\\": failed to pull image \\\"k8s.gcr.io/pause:3.6\\\": failed to pull and unpack image \\\"k8s.gcr.io/pause:3.6\\\": failed to resolve reference \\\"k8s.gcr.io/pause:3.6\\\": failed to do request: Head \\\"https://k8s.gcr.io/v2/pause/manifests/3.6\\\": dial tcp 142.250.157.82:443: connect: connection refused\"" pod="kube-system/etcd-master1" podUID=642dcd53ce8660a2287cd7eaabcd5fdc

这里我们已经提前拉取了镜像在本地了, 但是init的时候还是会从gcr.io拉取镜像,造成init失败,如果网络条件比较好的情况下则可以完成初始化。比较坑的地方就是哪怕你指定了阿里云的镜像源,init的过程都会通过gcr.io拉取镜像。

这是init前

root@master1:~# crictl images
IMAGE                                TAG                 IMAGE ID            SIZE
k8s.gcr.io/coredns/coredns           v1.8.0              296a6d5035e2d       12.9MB
k8s.gcr.io/etcd                      3.4.13-0            0369cf4303ffd       86.7MB
k8s.gcr.io/kube-apiserver            v1.21.10            704b64a9bcd2f       30.5MB
k8s.gcr.io/kube-controller-manager   v1.21.10            eeb3ff9374071       29.5MB
k8s.gcr.io/kube-proxy                v1.21.10            ab8993ba3211b       35.9MB
k8s.gcr.io/kube-scheduler            v1.21.10            2f776f4731317       14.6MB
k8s.gcr.io/pause                     3.4.1               0f8457a4c2eca       301kB

init后

root@master1:~# crictl images
IMAGE                                TAG                 IMAGE ID            SIZE
k8s.gcr.io/coredns/coredns           v1.8.0              296a6d5035e2d       12.9MB
k8s.gcr.io/etcd                      3.4.13-0            0369cf4303ffd       86.7MB
k8s.gcr.io/kube-apiserver            v1.21.10            704b64a9bcd2f       30.5MB
k8s.gcr.io/kube-controller-manager   v1.21.10            eeb3ff9374071       29.5MB
k8s.gcr.io/kube-proxy                v1.21.10            ab8993ba3211b       35.9MB
k8s.gcr.io/kube-scheduler            v1.21.10            2f776f4731317       14.6MB
k8s.gcr.io/pause                     3.4.1               0f8457a4c2eca       301kB
k8s.gcr.io/pause                     3.6                 6270bb605e12e       302kB              # 增加了这个image