部署环境: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 仓库
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. 更新源
更新源可能会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 默认配置信息
- 确定使用哪种网络插件实现,kubeadm 只支持 CNI 网络插件;这里使用 Flannel 插件
- 修改 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† |
所有 |