kubernetes v1.23 部署

基于 kubeadm 工具进行 kubernetes 1.23 版本部署

部署环境:Ubuntu 20.04 部署版本:kubernetes 1.23 Runtime:containerd

安装前环境准备

https://kubernetes.io/zh/docs/setup/production-environment/container-runtimes/

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# 应用 sysctl 参数而无需重新启动
sudo sysctl --system

containerd 安装

设置储存库

1
2
3
4
5
6
7
8
 # 安装必要软件
 sudo apt-get update
 sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release 
    

添加Docker官方GPG密钥

1
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

设置稳定版储存库

1
2
3
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装 Docker 引擎

1
2
3
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo docker info

配置 containerd

1
2
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

重启 containerd

1
sudo systemctl restart containerd

使用 systemd cgroup 驱动程序

1
2
3
4
5
6
7
8
9
# 结合 runc 使用 systemd cgroup 驱动,在 /etc/containerd/config.toml 中设置

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true
    
# 重启
sudo systemctl restart containerd

配置 Docker 驱动

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
sudo mkdir /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

重启服务

1
2
3
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

安装 kubeadm、kubelet 和 kubectl

1. 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包

1
2
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

2. 下载 Google Cloud 公开签名秘钥(访问不了 Google 则跳过)

1
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

3. 添加 Kubernetes apt 仓库

  • 可以访问 Google 则添加官方源即可
1
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
  • 无法访问则设置为国内镜像源,以中科大源为例:
1
2
3
cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main
EOF

4. 更新源

1
sudo apt-get update

更新源可能会The following signatures couldn't be verified because the public key is not available: NO_PUBKEY FEEA9169307EA071 NO_PUBKEY 8B57C5C2836F4BEB的问题,可以通过将提示缺少的公钥添加到服务器进行解决:

1
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys $PUBKEY

5. 安装工具

1
2
3
4
# 因安装时 1.23 为当前最新版本,所以没有指定版本安装,工具需要根据之后运行的 kubernetes 版本进行指定版本安装

sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

使用 kubeadm 初始化集群

修改 kubeadm 默认配置信息

  1. 确定使用哪种网络插件实现,kubeadm 只支持 CNI 网络插件;这里使用 Flannel 插件
  2. 修改 kubeadm 的默认仓库为阿里云仓库镜像

由于 Kubernetes 镜像仓库在 k8s.gcr.io 上,大陆无法访问,需要使用阿里云的镜像站,因此需要修改 kubeadm 默认配置。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 导出默认配置
kubeadm config print init-defaults > kubeadm-init-config.yaml

# 修改仓库镜像地址与
sed -i "s/imageRepository: .*/imageRepository: registry.cn-hangzhou.aliyuncs.com\/google_containers/g" kubeadm-init-config.yaml

# 修改 kubernetes 版本号(一般默认和 kubeadm 版本一致)
sed -i "s/kubernetesVersion: .*/kubernetesVersion: v1.23.4/g" kubeadm-init-config.yaml

# 修改默认 criSocket 为 containerd
# sed -i "s/criSocket: .*/criSocket: \/run\/containerd\/containerd.sock/g" kubeadm-init-config.yaml

# 修改默认 DNS 服务
address=`ifconfig eth0 | egrep "inet\s" | awk '{print $2}'` && sed -i "s/advertiseAddress: .*/advertiseAddress: ${address}/g" kubeadm-init-config.yaml

# 在 kubeadm-init-config.yaml 增加 podSubnet: 参数,如
...
kind: ClusterConfiguration
networking:
  podSubnet: 10.244.0.0/16
...

kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd

使用配置文件进行初始化

1
kubeadm init  --config ./kubeadm-init-config.yaml

配置 Kubectl

1
2
3
4
5
6
7
# 非 root 用户可以运行 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# root 用户运行 kubectl
export KUBECONFIG=/etc/kubernetes/admin.conf

部署 flannel 插件

1
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

其他节点加入

其它的 node 节点加入集群(如果只有一台 master 则跳过这个步骤);确保 node 节点和 master 节点的 kube 工具版本相同,镜像版本相同node 节点在 kubelet init 之前的步骤和 master 的步骤相同

1
kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>

将 master 节点设置为工作节点

K8S 集群默认不会将 Pod 调度到 k8s-master 上。在 Master 上,去除 master 的 taint,使Pod 也可以调度到 Master 上,可以运行以下命令使其作为一个工作节点:

1
kubectl taint nodes --all node-role.kubernetes.io/master-

后续 Node 节点加入集群

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 显示 k8s 当前所有 token
kubeadm token list

# 生成一条永久有效的 token
kubeadm token create --ttl 0

# 使用 openssl 获取 ca 证书 sha256 编码的 hash 值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

# node 节点加入 master 节点
kubeadm join x.x.x.x:6443 --token Token --discovery-token-ca-cert-hash sha256:ca的hash

kubernetes 环境重置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 重置 k8s 
kubeadm reset
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
rm -rf ~/.kube
systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/ /var/lib/kubelet/* /etc/cni/
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1
systemctl start docker

# 重载 kubelet 服务配置文件
systemctl daemon-reload 
# 重启 kubelet
systemctl restart kubelet

端口及协议

master

协议 方向 端口范围 目的 使用者
TCP 入站 6443 Kubernetes API server 所有
TCP 入站 2379-2380 etcd server client API kube-apiserver, etcd
TCP 入站 10250 Kubelet API 自身, 控制面
TCP 入站 10259 kube-scheduler 自身
TCP 入站 10257 kube-controller-manager 自身

node

协议 方向 端口范围 目的 使用者
TCP 入站 10250 Kubelet API 自身, 控制面
TCP 入站 30000-32767 NodePort Services† 所有
Built with Hugo
主题 StackJimmy 设计