#{ commentsCount } comment.
Kubernetes集群部署笔记
发布于2021-08-31
,最后编辑于2024-12-05
,全文约4382
字,阅读时间约9
分钟。
Kubernetes Debian Helm kubeadm containerd flannel kube-router metallb podman skopeo docker
更新记录
-
2021-09-04
- 服务器操作系统由
Debian 10 ("buster")
更新至Debian 11 ("bullseye")
; - 使用
kube-router
代替kube-proxy
和flannel
实现Service Proxy
和Pod Network
; - 修复一些代码错误;
- 服务器操作系统由
-
2021-09-08
- 部署
kube-router
时添加运行参数--advertise-loadbalancer-ip=true
;
- 部署
-
2021-09-18
Kubernetes
版本由v1.22.1
更新至v1.22.2
;
-
2021-10-29
Kubernetes
版本由v1.22.2
更新至v1.22.3
;metallb
版本由v0.10.2
更新至v0.10.3
;
-
2021-11-20
Debian
版本由v11.0
更新至v11.1
;Kubernetes
版本由v1.22.3
更新至v1.22.4
;containerd
版本由v1.4.9
更新至v1.4.12
;metallb
版本由v0.10.3
更新至v0.11.0
;kube-router
版本由v1.3.1
更新至v1.3.2
;metrics-server
版本由v0.5.0
更新至v0.5.2
;
-
2022-04-30
Debian
版本由v11.1
更新至v11.3
;Kubernetes
版本由v1.22.4
更新至v1.23.6
;containerd
版本由v1.4.12
更新至v1.5.11
;metallb
版本由v0.11.0
更新至v0.12.1
;kube-router
版本由v1.3.2
更新至v1.4.0
;local-path-provisioner
版本由v0.0.20
更新至v0.0.22
;metrics-server
版本由v0.5.2
更新至v0.6.1
;
-
2022-05-20
Kubernetes
版本由v1.23.6
更新至v1.24.0
;containerd
版本由v1.5.11
更新至v1.6.4
;
-
2022-05-29
Kubernetes
版本由v1.24.0
更新至v1.24.1
;
-
2022-06-23
containerd
版本由v1.6.4
更新至v1.6.6
;Kubernetes
版本由v1.24.1
更新至v1.24.2
;kube-router
版本由v1.4.0
更新至v1.5.0
;
-
2022-07-09
Debian
版本由v11.3
更新至v11.4
;
-
2022-07-24
Kubernetes
版本由v1.24.2
更新至v1.24.3
;
-
2022-08-14
containerd
版本由v1.6.6
更新至v1.6.7
;kube-router
版本由v1.5.0
更新至v1.5.1
;
-
2022-08-25
Kubernetes
版本由v1.24.3
更新至v1.25.0
;
-
2022-08-27
containerd
版本由v1.6.7
更新至v1.6.8
;
-
2022-09-13
Debian
版本由v11.4
更新至v11.5
;- 添加集群日志采集方案文章引用;
-
2022-09-18
- 添加使用GitHub Actions同步镜像方法描述;
-
2022-09-21
Kubernetes
版本由v1.25.0
更新至v1.25.1
;
-
2022-09-24
Kubernetes
版本由v1.25.1
更新至v1.25.2
;- 使用
quay.io
代替registry.cn-beijing.aliyuncs.com
作为私有镜像仓库示例;
-
2022-10-26
containerd
版本由v1.6.8
更新至v1.6.9
;Kubernetes
版本由v1.25.2
更新至v1.25.3
;
-
2022-11-08
kube-router
版本由v1.5.1
更新至v1.5.2
;local-path-provisioner
版本由v0.0.22
更新至v0.0.23
;
-
2022-11-12
Kubernetes
版本由v1.25.3
更新至v1.25.4
;
-
2022-11-18
containerd
版本由v1.6.9
更新至v1.6.10
;
-
2022-12-08
containerd
版本由v1.6.10
更新至v1.6.12
;
-
2022-12-09
Kubernetes
版本由v1.25.4
更新至v1.25.5
;kube-router
版本由v1.5.2
更新至v1.5.3
;metrics-server
版本由v0.6.1
更新至v0.6.2
;
-
2022-12-17
Kubernetes
版本由v1.25.5
更新至v1.26.0
;
-
2022-12-30
Debian
版本由v11.5
更新至v11.6
;containerd
版本由v1.6.12
更新至v1.6.14
;
-
2023-01-10
containerd
版本由v1.6.14
更新至v1.6.15
;
-
2023-01-28
Kubernetes
版本由v1.26.0
更新至v1.26.1
;
-
2023-02-01
containerd
版本由v1.6.15
更新至v1.6.16
;
-
2023-02-18
containerd
版本由v1.6.16
更新至v1.6.18
;
-
2023-03-03
Kubernetes
版本由v1.26.1
更新至v1.26.2
;
-
2023-03-20
Kubernetes
版本由v1.26.2
更新至v1.26.3
;
-
2023-03-27
containerd
版本由v1.6.18
更新至v1.6.19
;
-
2023-04-12
containerd
版本由v1.6.19
更新至v1.6.20
;Kubernetes
版本由v1.26.3
更新至v1.27.0
;metrics-server
版本由v0.6.2
更新至v0.6.3
;local-path-provisioner
版本由v0.0.23
更新至v0.0.24
;
-
2023-04-15
Kubernetes
版本由v1.27.0
更新至v1.27.1
;
-
2023-05-03
Debian
版本由v11.6
更新至v11.7
;kube-router
版本由v1.5.3
更新至v1.5.4
;
-
2023-06-02
containerd
版本由v1.6.20
更新至v1.6.21
;Kubernetes
版本由v1.27.1
更新至v1.27.2
;
-
2023-06-22
Kubernetes
版本由v1.27.2
更新至v1.27.3
;
-
2023-07-24
Kubernetes
版本由v1.27.3
更新至v1.27.4
;kube-router
版本由v1.5.4
更新至v1.6.0
;
-
2023-07-31
metallb
版本由v0.12.1
更新至v0.13.10
;
-
2023-08-08
containerd
版本由v1.6.21
更新至v1.6.22
;metrics-server
版本由v0.6.3
更新至v0.6.4
;
-
2023-08-17
Kubernetes
版本由v1.27.4
更新至v1.28.0
;
-
2023-09-01
Kubernetes
版本由v1.28.0
更新至v1.28.1
;
-
2023-09-11
Debian
版本由v11.7
更新至v12.1
;
-
2023-09-14
Kubernetes
版本由v1.28.1
更新至v1.28.2
;metallb
版本由v0.13.10
更新至v0.13.11
;
-
2023-09-26
containerd
版本由v1.6.22
更新至v1.6.24
;
-
2023-10-19
Debian
版本由v12.1
更新至v12.2
;Kubernetes
版本由v1.28.2
更新至v1.28.3
;
-
2023-10-28
- 更新用于同步镜像的GitHub Actions定义文件;
-
2023-11-16
Kubernetes
版本由v1.28.3
更新至v1.28.4
;
-
2023-11-18
kube-router
版本由v1.6.0
更新至v2.0.1
;- 配置
kube-router
支持发卡模式(Hairpin-Mode)流量; metallb
版本由v0.13.11
更新至v0.13.12
;
-
2023-11-27
containerd
版本由v1.6.24
更新至v1.6.25
;local-path-provisioner
版本由v0.0.24
更新至v0.0.25
;
-
2023-12-14
Debian
版本由v12.2
更新至v12.4
;containerd
版本由v1.6.25
更新至v1.6.26
;Kubernetes
版本由v1.28.4
更新至v1.29.0
;local-path-provisioner
版本由v0.0.25
更新至v0.0.26
;
-
2024-01-18
containerd
版本由v1.6.26
更新至v1.6.27
;Kubernetes
版本由v1.29.0
更新至v1.29.1
;
-
2024-02-10
Kubernetes
版本由v1.29.1
更新至v1.29.2
;
-
2024-03-22
Debian
版本由v12.4
更新至v12.5
;Kubernetes
版本由v1.29.2
更新至v1.29.3
;
-
2024-03-31
kube-router
版本由v2.0.1
更新至v2.1.0
;metallb
版本由v0.14.3
更新至v0.14.4
;metrics-server
版本由v0.7.0
更新至v0.7.1
;
-
2024-04-17
containerd
版本由v1.6.28
更新至v1.6.31
;Kubernetes
版本由v1.29.3
更新至v1.29.4
;
-
2024-04-18
Kubernetes
版本由v1.29.4
更新至v1.30.0
;
-
2024-04-20
metallb
版本由v0.14.4
更新至v0.14.5
;
-
2024-04-28
kube-router
版本由v2.1.0
更新至v2.1.1
;
-
2024-05-14
kube-router
版本由v2.1.1
更新至v2.1.2
;
-
2024-05-16
Kubernetes
版本由v1.30.0
更新至v1.30.1
;
-
2024-05-24
containerd
版本由v1.6.31
更新至v1.6.32
;
-
2024-07-24
Debian
版本由v12.5
更新至v12.6
;containerd
版本由v1.6.32
更新至v1.7.19
;Kubernetes
版本由v1.30.1
更新至v1.30.3
;kube-router
版本由v2.1.2
更新至v2.1.3
;metallb
版本由v0.14.5
更新至v0.14.8
;local-path-provisioner
版本由v0.0.26
更新至v0.0.28
;
-
2024-08-04
kube-router
版本由v2.1.3
更新至v2.2.0
;
-
2024-09-02
Debian
版本由v12.6
更新至v12.7
;containerd
版本由v1.7.19
更新至v1.7.21
;Kubernetes
版本由v1.30.3
更新至v1.31.0
;kube-router
版本由v2.2.0
更新至v2.2.1
;metrics-server
版本由v0.7.1
更新至v0.7.2
;
-
2024-09-14
containerd
版本由v1.7.21
更新至v1.7.22
;Kubernetes
版本由v1.31.0
更新至v1.31.1
;
-
2024-09-28
local-path-provisioner
版本由v0.0.28
更新至v0.0.29
;
-
2024-10-22
kube-router
版本由v2.2.1
更新至v2.2.2
;local-path-provisioner
版本由v0.0.29
更新至v0.0.30
;
-
2024-10-25
Kubernetes
版本由v1.31.1
更新至v1.31.2
;
-
2024-12-05
containerd
版本由v1.7.22
更新至v1.7.24
;Kubernetes
版本由v1.31.2
更新至v1.31.3
;kube-router
版本由v2.2.2
更新至v2.4.0
;
概述¶
本文用于整理基于Debian操作系统使用kubeadm工具部署Kubernetes集群的操作过程。该集群部署于一组本地虚拟服务器上,用于学习Kubernetes的基础概念和基本操作,并作为今后其他学习内容的实践部署提供环境。
考虑到不同的网络环境,本文中一些步骤会记录两种操作方式,通过镜像等方式加快部署效率、避免部署错误。有关镜像同步的方案,可参考附件内容中的同步所需镜像。
随着操作系统和各相关组件版本的更新,笔者将在验证通过后对本文进行补充和更新,请参考更新记录。
本文未包含集群日志采集相关演练内容,可参考笔者的另一篇笔记《Kubernetes环境OpenSearch部署与应用》中的演练内容。
服务器¶
受限于本地物理服务器的配置,虚拟服务器配置规划如下表。
Host | OS | IP | CPU | RAM | K8s | Roles |
---|---|---|---|---|---|---|
k8s-n0 |
Debian 12.7 | 10.0.0.50 |
2 vCPUs | 4 GB | v1.31.3 | control-plane |
k8s-n1 |
Debian 12.7 | 10.0.0.51 |
4 vCPUs | 8 GB | v1.31.3 | |
k8s-n2 |
Debian 12.7 | 10.0.0.52 |
4 vCPUs | 8 GB | v1.31.3 | |
k8s-n3 |
Debian 12.7 | 10.0.0.53 |
4 vCPUs | 8 GB | v1.31.3 |
所有虚拟服务器CPU均为amd64
架构。
截止本文发布时,笔者基于最新Debian 11 (“bullseye”)部署的集群仍然存在一些问题,故暂且发布基于Debian 10 (“buster”)的笔记。
网络环境¶
本地网络IP地址范围为10.0.0.0/24
,其中:
10.0.0.2
-10.0.0.99
为静态分配,供虚拟服务器使用。10.0.0.100
-10.0.0.200
用于DHCP
自动分配。10.0.0.201
-10.0.0.254
为静态分配,供负载均衡器使用。
其他组件¶
-
容器运行时 containerd
v1.7.24
-
Pod网络组件
flannelkube-routerv0.14.0
v2.4.0
-
负载均衡器 metallb
v0.14.8
-
持久卷供应 local-path-provisioner
v0.0.30
-
指标服务 metrics-server
v0.7.2
准备工作¶
服务器配置¶
本文假设服务器硬件和操作系统已经配置完毕,所有服务器上都已经正确配置了ssh
服务和sudo
权限。
作为参考,这里记录笔者配置sudo
权限和ssh
服务的过程。
-
配置
sudo
权限如操作人员的登录用户已经被正确配置了sudo权限,可跳过此步骤。
本示例中,操作人员的登录用户名为
tiscs
,需要实际环境情况进行替换。1# 使用root用户登录系统 2# 安装sudo,并配置sudo权限 3apt update 4apt install sudo 5echo "tiscs ALL=(ALL) NOPASSWD: ALL" | tee /etc/sudoers.d/tiscs # 这在生产环境绝不是个好主意,仅仅是为了演练环境操作方便
-
配置
ssh
服务1# sudo sed -i 's/http:/https:/g' /etc/apt/sources.list 2# 安装openssh-server,并配置ssh服务为自动启动 3sudo apt update 4sudo apt install openssh-server 5sudo systemctl enable ssh --now
也可以参考笔者的原创视频:《演练环境准备——部署虚拟服务器》。
配置过程¶
安装容器运行时¶
本文配置的集群选择containerd作为容器运行时。
在所有节点上执行如下操作。
-
配置模块加载
1cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf > /dev/null 2overlay 3br_netfilter 4EOF 5 6sudo modprobe overlay 7sudo modprobe br_netfilter
-
配置
sysctl
参数1cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf > /dev/null 2net.bridge.bridge-nf-call-iptables = 1 3net.ipv4.ip_forward = 1 4net.bridge.bridge-nf-call-ip6tables = 1 5EOF 6 7sudo sysctl --system
-
配置APT源
1# 安装依赖项 2sudo apt install -y ca-certificates curl gnupg
1curl -fsSL https://download.docker.com/linux/debian/gpg \ 2 | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg 3echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \ 4 | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
-
安装containerd
1sudo apt update 2sudo apt install -y containerd.io
-
初始化配置
1sudo mkdir -p /etc/containerd 2containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
1# 配置systemd cgroup驱动 2sudo sed -i -e 's|SystemdCgroup = false|SystemdCgroup = true|g' /etc/containerd/config.toml
1# (可选)配置sandbox image地址 2# 为了方便,这里配置为与kubelet所需相同的版本(可以使用kubeadm config images list命令查看) 3sudo sed -i -e 's|"registry.k8s.io/pause:.\+"|"quay.io/choral-k8s/pause:3.10"|g' /etc/containerd/config.toml
1# 重启containerd服务,使上述配置修改生效 2sudo systemctl restart containerd
安装kubeadm¶
在所有节点上执行如下操作。
-
配置APT源
1curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key \ 2 | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg 3echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /" \ 4 | sudo tee /etc/apt/sources.list.d/kubernetes.list
-
安装
kubeadm
、kubelet
和kubectl
1# apt-cache madison kubeadm | head -1 # check latest release 2sudo apt update 3sudo apt install -y kubeadm=1.31.3-1.1 kubelet=1.31.3-1.1 kubectl=1.31.3-1.1 # --allow-change-held-packages 4sudo apt-mark hold kubelet kubeadm kubectl
-
安装并配置
crictl
(可选)可以安装并配置
crictl
,便于在k8s
节点上管理容器运行时。1# 安装crictl工具 2sudo apt install -y cri-tools 3 4# 配置crictl使用containerd运行时 5cat <<EOF | sudo tee /etc/crictl.yaml > /dev/null 6runtime-endpoint: unix:///run/containerd/containerd.sock 7image-endpoint: unix:///run/containerd/containerd.sock 8timeout: 10 9debug: false 10EOF 11 12# 验证crictl配置 13sudo crictl images # 列出所有镜像
配置控制平面节点¶
在k8s-n0
节点上执行如下操作。
-
预先下载所需镜像
1# 查看所需的镜像列表 2kubeadm config images list --kubernetes-version=v1.31.3 # --image-repository quay.io/choral-k8s 3 4# 1. 使用默认容器镜像仓库 5sudo kubeadm config images pull --kubernetes-version=v1.31.3 6 7# 2. 使用指定容器镜像仓库 8sudo kubeadm config images pull --kubernetes-version=v1.31.3 --image-repository quay.io/choral-k8s
-
初始化控制平面节点
1# --apiserver-advertise-address 当前节点IP地址 2# --pod-network-cidr Pod网络地址段(CIDR: https://datatracker.ietf.org/doc/html/rfc4632) 3# --skip-phases=addon/kube-proxy 跳过安装kube-proxy组件(使用`kube-router`作为网络组件) 4 5# 1. 使用默认容器镜像仓库 6sudo kubeadm init --apiserver-advertise-address 10.0.0.50 \ 7 --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.31.3 \ 8 --skip-phases=addon/kube-proxy 9 10# 2. 使用指定容器镜像仓库 11sudo kubeadm init --apiserver-advertise-address 10.0.0.50 \ 12 --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.31.3 \ 13 --skip-phases=addon/kube-proxy \ 14 --image-repository quay.io/choral-k8s
执行完上述操作后,
kubeadm init
命令会输出用于添加节点到集群中的说明,请保存该说明中的内容。示例如下:1sudo kubeadm join 10.0.0.50:6443 \ 2 --token vafq03.5dl6j1cbcd1yzf3c \ 3 --discovery-token-ca-cert-hash sha256:6a725d98e0f6bda713c9f93b8441a735cc60e8ec7454fbe960c74ab80683f938
-
添加kubectl配置(可选)
1mkdir -p ~/.kube 2sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config 3sudo chown $(id -u):$(id -g) ~/.kube/config
安装网络组件¶
-
安装(已废弃,使用flannel
kube-router
代替)1# 1. 使用默认镜像仓库(quay.io/coreos)安装 2kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 3 4# 2 如果访问raw.githubusercontent.com上的文件存在网络问题 5# 可以使用jsdelivr提供的GitHub CDN地址(https://www.jsdelivr.com/github) 6kubectl apply -f https://cdn.jsdelivr.net/gh/coreos/flannel@master/Documentation/kube-flannel.yml
-
安装
kube-router
1curl -s https://cdn.jsdelivr.net/gh/cloudnativelabs/[email protected]/daemonset/generic-kuberouter-all-features.yaml \ 2 | sed \ 3 -e "s|%APISERVER%|$(kubectl get cm -n kube-public -o yaml cluster-info | sed -n 's/^ \+server: \(.\+\)/\1/p')|g" \ 4 -e "s|%CLUSTERCIDR%|$(kubectl get cm -n kube-system -o yaml kubeadm-config | sed -n 's/^ \+podSubnet: \(.\+\)/\1/p')|g" \ 5 -e "s|\(\s\+\)args:|\1args:\n\1- \"--advertise-loadbalancer-ip=true\"\n\1- \"--hairpin-mode=true\"|g" \ 6 -e "s|docker.io/cloudnativelabs/kube-router\$|quay.io/choral-k8s/kube-router:v2.4.0|g" \ 7 | kubectl apply -f - 8# 检查组件部署成功 9kubectl get pods -n kube-system
添加工作节点¶
在k8s-n1
、k8s-n2
和k8s-n3
节点上执行如下操作。该操作中需要的token值和hash值通过上述步骤中的kubeadm init
操作获取。
-
添加工作节点
1sudo kubeadm join 10.0.0.50:6443 \ 2 --token vafq03.5dl6j1cbcd1yzf3c \ 3 --discovery-token-ca-cert-hash sha256:6a725d98e0f6bda713c9f93b8441a735cc60e8ec7454fbe960c74ab80683f938
-
查看节点状态
在
k8s-n0
节点上执行如下操作。1kubectl get nodes
安装Helm工具(可选)¶
本文暂不涉及使用helm
执行的操作,该步骤可选。
-
安装Helm工具
1# 下载并安装 2curl -sL https://get.helm.sh/helm-v3.16.1-linux-amd64.tar.gz | tar xzf - linux-amd64/helm 3sudo cp ./linux-amd64/helm /usr/local/bin/helm 4rm -rf ./linux-amd64 5sudo chown root:root /usr/local/bin/helm 6sudo chmod 755 /usr/local/bin/helm 7 8# 验证helm安装 9helm version
安装Metrics Server(可选)¶
部署metrics server
以启用指标服务,未安装metrics server
前,kubectl top
命令无法正常执行。
在k8s-n0
节点上执行如下操作。
-
执行清单文件
这里需要注意,为解决证书错误,需要添加
metrics-server
容器的参数--kubelet-insecure-tls
,这里选择通过sed
命令修改清单文件后再使用kubectl
执行。1# 1. 使用官方镜像地址直接安装 2curl -sL https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml \ 3 | sed -e "s|\(\s\+\)- args:|\1- args:\n\1 - --kubelet-insecure-tls|" | kubectl apply -f - 4 5# 2. 使用自定义镜像地址安装 6curl -sL https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml \ 7 | sed \ 8 -e "s|\(\s\+\)- args:|\1- args:\n\1 - --kubelet-insecure-tls|" \ 9 -e "s|registry.k8s.io/metrics-server|quay.io/choral-k8s|g" \ 10 | kubectl apply -f - 11 12# 3. 查看集群指标信息 13kubectl top nodes 14kubectl top pods -n kube-system
安装负载均衡组件¶
由云服务商提供的Kubernetes
服务,通常会提供内置的负载均衡实现,而笔者部署环境为私有环境,需要一个轻量的负载均衡实现以支撑LoadBalancer
类型的服务。
笔者选择MetalLB作为负载均衡实现,配置为二层网络模式。LoadBalancer
地址范围配置为10.0.0.201-10.0.0.254
,需根据具体网络环境进行修改。
在k8s-n0
节点上执行如下操作。
-
安装
MetalLB
1# 创建用于部署MetalLB的命名空间 2kubectl create namespace metallb-system 3 4# 1. 直接执行清单文件 5kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-frr.yaml 6 7# 2. 为避免特殊网络环境中的清单文件加载问题,可以使用jsdelivr提供的加速方案 8kubectl apply -f https://cdn.jsdelivr.net/gh/metallb/[email protected]/config/manifests/metallb-frr.yaml 9 10# 创建地址池配置文件 11cat <<EOF | kubectl apply -f - > /dev/null 12apiVersion: metallb.io/v1beta1 13kind: IPAddressPool 14metadata: 15 name: default-pool 16 namespace: metallb-system 17spec: 18 addresses: 19 - 10.0.0.201-10.0.0.254 20EOF 21 22# 创建二层广播配置文件 23cat <<EOF | kubectl apply -f - > /dev/null 24apiVersion: metallb.io/v1beta1 25kind: L2Advertisement 26metadata: 27 name: default-l2ad 28 namespace: metallb-system 29spec: 30 ipAddressPools: 31 - default-pool 32EOF
安装持久卷供应程序¶
Kubernetes
内置的local-storage
存储类无法动态供应卷,为便于基于该环境演练时自动创建持久卷,选择使用local-path-provisioner
作为持久卷供应程序。
-
创建所需的目录
在所有节点上执行如下操作。
1sudo mkdir -p /opt/local-path-provisioner
-
安装
local-path-provisioner
在
k8s-n0
节点上执行如下操作。1# 1. 使用官方清单文件地址直接安装 2kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.30/deploy/local-path-storage.yaml 3# 1.1 同样可以使用jsdelivr提供的加速方案 4kubectl apply -f https://cdn.jsdelivr.net/gh/rancher/[email protected]/deploy/local-path-storage.yaml 5 6# 2. 替换命名空间 7curl -s https://cdn.jsdelivr.net/gh/rancher/[email protected]/deploy/local-path-storage.yaml \ 8 | sed \ 9 -e "1,6d" \ 10 -e "s|namespace: local-path-storage|namespace: kube-system|" \ 11 -e "s|image: rancher|image: quay.io/choral-k8s|" \ 12 -e "s|image: busybox|image: quay.io/choral-k8s/busybox|" \ 13 | kubectl apply -f -
-
配置默认存储类
1kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
检查集群工作状态¶
在k8s-n0
节点上执行如下操作。
-
查看节点状态
1kubectl get nodes
1kubectl top nodes
-
查看Pod状态
1kubectl get pods -A
1kubectl top pods -A
附加内容¶
同步所需镜像¶
由于特殊网络环境问题,需要同步kubelet所需镜像至其他镜像仓库的,可参考如下操作。
笔者开发环境中使用podman管理容器和镜像,已将docker
设置为podman
的别名(alias docker=podman
)。
-
同步kubelet所需镜像
首先,需要创建自定义镜像仓库认证凭据。
1# 根据需要将`quay.io`替换为自定义镜像仓库地址 2docker login quay.io
创建一个脚本
k8s_mirror_sync.sh
,内容如下。1# k8s_mirror_sync.sh 2# 根据需要将`quay.io/choral-k8s/`替换为自定义镜像仓库地址 3while read o 4 do { 5 t=$(echo $o | sed -e 's|registry.k8s.io.*/|quay.io/choral-k8s/|g' -e 's|registry.k8s.io.*/|quay.io/choral-k8s/|g') 6 docker pull $o 7 docker tag $o $t 8 docker push $t 9 docker rmi $o 10 docker rmi $t 11 } 12done < "${1:-/dev/stdin}"
该脚本有两种使用方法。
1kubeadm config images list --kubernetes-version=v1.31.3 | bash k8s_mirror_sync.sh
1# 列出所需镜像列表并保存到文件 2kubeadm config images list --kubernetes-version=v1.31.3 > k8s-image-list 3# 拷贝该文件至k8s_mirror_sync.sh所在主机,然后执行该脚本 4bash k8s_mirror_sync.sh k8s-image-list
-
同步附加组件镜像
1# 根据需要将`quay.io/choral-k8s/`替换为自定义镜像仓库地址。 2 3# 同步metrics server所需镜像 4docker pull registry.k8s.io/metrics-server/metrics-server:v0.7.2 5docker tag registry.k8s.io/metrics-server/metrics-server:v0.7.2 quay.io/choral-k8s/metrics-server:v0.7.2 6docker push quay.io/choral-k8s/metrics-server:v0.7.2 7docker rmi registry.k8s.io/metrics-server/metrics-server:v0.7.2 8docker rmi quay.io/choral-k8s/metrics-server:v0.7.2
-
使用GitHub Actions同步镜像
整理上面步骤中的脚本后,可以使用GitHub Actions执行镜像同步任务,使用skopeo工具同步镜像。
首先创建GitHub Actions执行时所需的Secrets。
1# GitHub Actions Secrets 2CONTAINER_REGISTRY_NAMESPACE: 'choral-k8s' # 根据需要将`choral-k8s`替换为自定义命名空间 3CONTAINER_REGISTRY_HOSTNAME: 'quay.io' # 根据需要将`quay.io`替换为自定义镜像仓库主机名称 4CONTAINER_REGISTRY_USERNAME: '<REDACTED>' 5CONTAINER_REGISTRY_PASSWORD: '<REDACTED>'
创建一个GitHub Actions配置文件,例如
.github/workflows/sync-kubeadm-images.yml
。1name: Sync images required by kubeadm 2 3on: 4 push: 5 branches: [ "main" ] 6 7jobs: 8 sync-images: 9 runs-on: ubuntu-latest 10 container: 11 image: quay.io/skopeo/stable:latest 12 env: 13 KUBERNETES_VERSION: v1.31.3 # 需要同步镜像的`kubernetes`版本 14 CONTAINER_REGISTRY_HOSTNAME: ${{ secrets.CONTAINER_REGISTRY_HOSTNAME }} 15 CONTAINER_REGISTRY_USERNAME: ${{ secrets.CONTAINER_REGISTRY_USERNAME }} 16 CONTAINER_REGISTRY_PASSWORD: ${{ secrets.CONTAINER_REGISTRY_PASSWORD }} 17 CONTAINER_REGISTRY_NAMESPACE: ${{ secrets.CONTAINER_REGISTRY_NAMESPACE }} 18 19 steps: 20 - run: | 21 curl -sL https://dl.k8s.io/release/$KUBERNETES_VERSION/bin/linux/amd64/kubeadm -o /usr/local/bin/kubeadm 22 chmod 755 /usr/local/bin/kubeadm 23 kubeadm version 24 kubeadm config images list --kubernetes-version=$KUBERNETES_VERSION 25 - run: | 26 echo $CONTAINER_REGISTRY_PASSWORD | skopeo login --username $CONTAINER_REGISTRY_USERNAME --password-stdin $CONTAINER_REGISTRY_HOSTNAME 27 for o in $(kubeadm config images list --kubernetes-version=$KUBERNETES_VERSION); do 28 t=$(echo $o | sed "s|registry.k8s.io.*/|$CONTAINER_REGISTRY_HOSTNAME/$CONTAINER_REGISTRY_NAMESPACE/|g" | sed "s|registry.k8s.io.*/|$CONTAINER_REGISTRY_HOSTNAME/$CONTAINER_REGISTRY_NAMESPACE/|g") 29 echo "Syncing $o" 30 skopeo copy --all docker://$o docker://$t 31 done
执行上述配置文件定义的GitHub Actions时,将指定版本
Kubernetes
所需的镜像同步到指定仓库的指定命名空间中。
参考资料¶
-
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
-
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
-
https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
-
https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/upgrading-linux-nodes/
-
https://github.com/flannel-io/flannel/blob/master/Documentation/kubernetes.md