kubeadm搭建kubenetes集群(Ubuntu 20.04,kubenetes 1.20.5)

说明

本次搭建使用三台云主机,一个master节点,两个node节点,配置均为:2核8G,30G存储。
系统采用Ubuntu 20.04。

安装过程

关闭 swap

// 注释掉有swap的行
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
// 关闭swap
sudo swapoff -a

关闭防火墙

systemctl stop ufw
systemctl disable ufw

修改 cloud.cfg(如果有该文件)

vi /etc/cloud/cloud.cfg
#该配置默认为 false,修改为 true 即可
preserve_hostname: true

修改DNS

vi /etc/systemd/resolved.conf打开文件,修改如下:

[Resolve]
DNS=114.114.114.114

修改hostname

运行hostnamectl set-hostname kubernetes-master修改hostname,kubernetes-master为修改后的hostname。

安装docker

使用最新的docker,会提示:this Docker version is not on the list of validated versions: 20.10.5. Latest validated version: 19.03。20.10.5版本不在支持列表里面,所以这里安装的时候需限制版本为19.03

依次执行以下命令:

// 确保移除已安装的docker
sudo apt-get remove docker docker-engine docker-ce docker.io
// 更新软件
sudo apt-get update
// 安装必要的工具
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
// 添加Docker官方的GPG密钥
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
 // 设置stable存储库
 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
 // 更新软件源
sudo apt-get update
// 查看docker可用的版本
apt-cache madison docker-ce

查看docker可用的版本输出大概结果如下:

.
.
.
 docker-ce | 5:19.03.9~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

第二栏为版本号,这里选择版本号为:5:19.03.9~3-0~ubuntu-focal。将版本号放到docker-ce=后面,执行命令如下所示:

sudo apt-get install docker-ce=5:19.03.9~3-0~ubuntu-focal

安装完后检查docker的状态:

systemctl status docker

运行以下命令配置docker:

cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "registry-mirrors": ["https://1uovoul9.mirror.aliyuncs.com"],
  "storage-driver": "overlay2"
}
EOF

其中,registry-mirrors添加国内的docker镜像源,这里使用阿里云的。获取方法:登录阿里云后,转到cr.console.aliyun.com/cn-guangzhou... ,点击左边菜单栏的「镜像工具」-「镜像加速」即可看到镜像源地址。
最后,重新启动 Docker 并在启动时启用:

sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

安装 kubeadm,kubelet,kubectl

先安装一些依赖和做一些配置:

# 安装系统工具
apt-get update && apt-get install -y apt-transport-https
# 安装 GPG 证书
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# 写入软件源;注意:我们用系统代号为 bionic,但目前阿里云不支持,所以沿用 16.04 的 xenial
cat << EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

开始安装:

apt-get update  
apt-get install -y kubelet kubeadm kubectl

各组件的作用说明:

  • kubeadm:用来初始化集群的指令。
  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
  • kubectl:用来与集群通信的命令行工具。

接着,设置kubelet自启动并启动:

systemctl enable kubelet && systemctl start kubelet

配置kubeadm

# 导出配置文件
# 在home目录下
kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml

修改配置文件如下所示:

# 修改配置为如下内容
apiVersion: kubeadm.k8s.io/v1beta1
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  # 修改为`主节点` IP
  advertiseAddress: 172.19.122.236
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: kubernetes-master
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta1
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: ""
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
# 国内不能访问 Google,修改为阿里云
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
# 修改版本号 必须对应
kubernetesVersion: v1.20.5
networking:
  # 新增该配置 用于后续 Calico网络插件
  podSubnet: 192.168.0.0/16
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
scheduler: {}
---

接着,执行以下命令拉取镜像:

kubeadm config images pull --config kubeadm.yml

初始化master节点

在home目录下(kubeadm.yml所在目录)执行:

 kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log

大概等几分钟就执行完毕。输出信息的结尾会有如下信息:

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 172.19.122.236:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:05bc648be3f406d2bde977cdfe1c0dfe4fb50c3d7b62b8f0950c66c0052e27c0 

后面添加worker节点的时候,可通过运行kubeadm join...命令添加。
接下来配置kubectl,执行:

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# 修改文件所有者(非 ROOT 用户才需要执行)
chown $(id -u):$(id -g) $HOME/.kube/config

验证是否成功:

kubectl get nodes

输出信息大概如下所示;

NAME                STATUS     ROLES                  AGE   VERSION
kubernetes-master   NotReady   control-plane,master   39m   v1.20.5

表示主节点已经配置成功。如果安装失败,重试的话,需先运行: kubeadm reset清理配置文件。

配置worker节点

首先,新开一台机器,重复上面配置kubeadm之前的操作,在worker节点安装docker, kubeadm,kubectl,kubelet,除了hostname改为不一样的名字,安装完后不用执行启动命令。
其次,在master节点上,可以使用之前控制台输出的join命令,也可以重新生成join命令。步骤如下:

  • 创建新的token:
    kubeadm token generate
    输出结果示例:18ezo4.huyg5hw5tv0g07kg
  • 使用上面生成的token生成join命令:
    kubeadm token create 18ezo4.huyg5hw5tv0g07kg --print-join-command --ttl=0
    ttl代表token有效期,0为永久有效。可用kubeadm token list查看现有的token。
    运行结果示例:
    kubeadm join 172.19.122.236:6443 --token 18ezo4.huyg5hw5tv0g07kg     --discovery-token-ca-cert-hash sha256:05bc648be3f406d2bde977cdfe1c0dfe4fb50c3d7b62b8f0950c66c0052e27c0 

复制该命令到子节点上运行,如果运行成功,会有如下提示:

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.

到master节点上运行:

kubectl get nodes

可看到新添加的节点:

NAME                STATUS     ROLES                  AGE     VERSION
kubenetes-node1     NotReady   <none>                 11s     v1.20.5
kubernetes-master   NotReady   control-plane,master   5h44m   v1.20.5

按照同样的步骤,可添加更多节点。

安装网络插件(CNI)

在master节点运行:kubectl get pod -n kube-system -o wide,输出如下所示:

NAME                                        READY   STATUS    RESTARTS   AGE    IP               NODE                NOMINATED NODE   REA
coredns-7f89b7bc75-5chtb                    0/1     Pending   0          6h9m   <none>           <none>              <none>           <no
coredns-7f89b7bc75-nrwmw                    0/1     Pending   0          6h9m   <none>           <none>              <none>           <no
etcd-kubernetes-master                      1/1     Running   1          6h9m   172.19.122.236   kubernetes-master   <none>           <no
kube-apiserver-kubernetes-master            1/1     Running   1          6h9m   172.19.122.236   kubernetes-master   <none>           <no
kube-controller-manager-kubernetes-master   1/1     Running   1          6h9m   172.19.122.236   kubernetes-master   <none>           <no
kube-proxy-fw96l                            1/1     Running   1          6h9m   172.19.122.236   kubernetes-master   <none>           <no
kube-proxy-gcjwr                            1/1     Running   0          25m    172.19.122.237   kubenetes-node1     <none>           <no
kube-proxy-xz25z                            1/1     Running   0          71s    172.19.122.238   kubenetes-node2     <none>           <no
kube-scheduler-kubernetes-master            1/1     Running   1          6h9m   172.19.122.236   kubernetes-master   <none>           <no

coredns还未运行,说明缺少网络插件。
这里选择Calico作为CNI插件。
依次执行如下命令:

kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
kubectl create -f https://docs.projectcalico.org/manifests/custom-resources.yaml

然后查看pod状态:

watch kubectl get pods --all-namespaces

可能要等待几分钟,等所有 container 都变成 running 状态才算安装完成。最终结果如下所示:

NAMESPACE         NAME                                        READY   STATUS    RESTARTS   AGE
calico-system     calico-kube-controllers-f95867bfb-jpfd5     1/1     Running   0          6m3s
calico-system     calico-node-47vkb                           1/1     Running   0          6m3s
calico-system     calico-node-7sj6n                           1/1     Running   0          6m3s
calico-system     calico-node-v2g49                           1/1     Running   0          6m3s
calico-system     calico-typha-57c9945bcf-4zbfw               1/1     Running   0          6m
calico-system     calico-typha-57c9945bcf-cz7wx               1/1     Running   0          6m
calico-system     calico-typha-57c9945bcf-tmc5s               1/1     Running   0          6m4s
kube-system       coredns-7f89b7bc75-5chtb                    1/1     Running   0          6h36m
kube-system       coredns-7f89b7bc75-nrwmw                    1/1     Running   0          6h36m
kube-system       etcd-kubernetes-master                      1/1     Running   1          6h36m
kube-system       kube-apiserver-kubernetes-master            1/1     Running   1          6h36m
kube-system       kube-controller-manager-kubernetes-master   1/1     Running   1          6h36m
kube-system       kube-proxy-fw96l                            1/1     Running   1          6h36m
kube-system       kube-proxy-gcjwr                            1/1     Running   0          52m
kube-system       kube-proxy-xz25z                            1/1     Running   0          28m
kube-system       kube-scheduler-kubernetes-master            1/1     Running   1          6h36m
tigera-operator   tigera-operator-675ccbb69c-2d68b            1/1     Running   0          6m51s

自此,kubenetes集群搭建完成。

状态组件运行检查

运行 kubectl get cs

NAME                 STATUS      MESSAGE                                                                                       ERROR
scheduler            Unhealthy   Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused   
controller-manager   Unhealthy   Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused   
etcd-0               Healthy     {"health":"true"}   
  • scheduler 为调度服务,主要作用是将 POD 调度到 Node
  • controller-manager 为自动化修复服务,主要作用是 Node 宕机后自动修复 Node 回到正常的工作状态
  • etcd-0 则是熟悉的服务注册与发现
    输出结果中,有两个组件是unhealthy,出现这种情况,是 /etc/kubernetes/manifests下的 kube-controller-manager.yamlkube-scheduler.yaml 设置的默认端口是0,在文件中注释掉- --port=0就可以了(在前面加上#号)。再次运行查看命令,修改后都变为ok状态了。

参考

本作品采用《CC 协议》,转载必须注明作者和本文链接
Was mich nicht umbringt, macht mich stärker
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!