1 comment.
Kubernetes集群部署笔记
发布于2021-08-31
,全文约4802
字,阅读时间约10
分钟。
Kubernetes Debian Helm kubeadm containerd flannel kube-router metallb podman 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.3
更新至v1.23.6
;containerd
版本由v1.4.9
更新至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
;
概述¶
本文用于整理基于Debian操作系统使用kubeadm工具部署Kubernetes集群的操作过程。该集群部署于一组本地虚拟服务器上,用于学习Kubernetes
的基础概念和基本操作,并作为今后其他学习内容的实践部署提供环境。
考虑到不同的网络环境,本文中一些步骤会记录两种操作方式,通过镜像等方式加快部署效率、避免部署错误。有关镜像同步的方案,可参考附件内容中的同步所需镜像。
随着操作系统和各相关组件版本的更新,笔者将在验证通过后对本文进行补充和更新。
服务器¶
受限于本地物理服务器的配置,虚拟服务器配置规划如下表。
Host | OS | IP | CPU | RAM | K8s | Roles |
---|---|---|---|---|---|---|
k8s-n0 |
Debian 11.3 | 10.0.0.50 |
2 vCPUs | 4 GB | v1.24.2 | control-plane , master |
k8s-n1 |
Debian 11.3 | 10.0.0.51 |
4 vCPUs | 8 GB | v1.24.2 | |
k8s-n2 |
Debian 11.3 | 10.0.0.52 |
4 vCPUs | 8 GB | v1.24.2 | |
k8s-n3 |
Debian 11.3 | 10.0.0.53 |
4 vCPUs | 8 GB | v1.24.2 |
所有虚拟服务器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
为静态分配,供负载均衡器使用
其他组件¶
-
容器运行时
containerdv1.6.6
-
Pod网络组件
flannelv0.14.0
kube-routerv1.5.0
-
负载均衡器
metallbv0.12.1
-
持久卷供应
local-path-provisionerv0.0.22
-
指标服务
metrics-serverv0.6.1
准备工作¶
服务器配置¶
本文假设服务器硬件和操作系统已经配置完毕,所有服务器上都已经正确配置了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# 安装openssh-server,并配置ssh服务为自动启动 2sudo apt update 3sudo apt install openssh-server 4sudo systemctl enable ssh --now
配置过程¶
安装容器运行时¶
本文配置的集群选择containerd作为容器运行时。
在所有节点上执行如下操作。
-
配置模块加载
1cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf 2overlay 3br_netfilter 4EOF 5 6sudo modprobe overlay 7sudo modprobe br_netfilter
-
配置
sysctl
参数1cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf 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 apt-transport-https ca-certificates curl gnupg lsb-release
1# 根据网络环境选择官方源或镜像源 2 3# 1. 配置Docker官方源 4curl -fsSL https://download.docker.com/linux/debian/gpg \ 5 | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker-archive-keyring.gpg 6echo "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" \ 7 | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null 8 9# 2. 配置Aliyun镜像源 10curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg \ 11 | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker-archive-keyring.gpg 12echo "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/debian $(lsb_release -cs) stable" \ 13 | 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 's|SystemdCgroup = false|SystemdCgroup = true|g' /etc/containerd/config.toml
1# (可选)配置sandbox image地址 2# 为了方便,这里配置为与kubelet所需相同的版本(可以使用kubeadm config images list命令查看) 3sudo sed -i 's|"k8s.gcr.io/pause:.\+"|"registry.cn-beijing.aliyuncs.com/choral-k8s/pause:3.7"|g' /etc/containerd/config.toml
1# 重启containerd服务,使上述配置修改生效 2sudo systemctl restart containerd
安装kubeadm¶
在所有节点上执行如下操作。
-
配置APT源
1# 根据网络环境选择官方源或镜像源 2 3# 1. 使用Google官方源 4curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg \ 5 | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubernetes-archive-keyring.gpg 6echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" \ 7 | sudo tee /etc/apt/sources.list.d/kubernetes.list 8 9# 2. 使用Aliyun镜像源 10curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg \ 11 | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubernetes-archive-keyring.gpg 12echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" \ 13 | sudo tee /etc/apt/sources.list.d/kubernetes.list
-
安装
kubeadm
、kubelet
和kubectl
1# apt-cache madison kubeadm | head -1 # check latest release 2sudo apt install -y kubelet=1.24.2-00 kubeadm=1.24.2-00 kubectl=1.24.2-00 # --allow-change-held-packages 3sudo 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 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.24.2 # --image-repository registry.cn-beijing.aliyuncs.com/choral-k8s 3 4# 1. 使用默认容器镜像仓库 5sudo kubeadm config images pull --kubernetes-version=v1.24.2 6 7# 2. 使用自建容器镜像仓库 8sudo kubeadm config images pull --kubernetes-version=v1.24.2 \ 9 --image-repository registry.cn-beijing.aliyuncs.com/choral-k8s
-
初始化控制平面节点
1# --apiserver-advertise-address: 当前节点IP地址 2# --pod-network-cidr : Pod网络地址段(CIDR: https://datatracker.ietf.org/doc/html/rfc4632) 3 4# 1. 使用默认容器镜像仓库 5sudo kubeadm init --apiserver-advertise-address 10.0.0.50 \ 6 --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.24.2 \ 7 --skip-phases=addon/kube-proxy 8 9# 2. 使用自建容器镜像仓库 10sudo kubeadm init --apiserver-advertise-address 10.0.0.50 \ 11 --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.24.2 \ 12 --image-repository registry.cn-beijing.aliyuncs.com/choral-k8s \ 13 --skip-phases=addon/kube-proxy
执行完上述操作后,
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/kube-router@master/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\"|g" \ 6 | kubectl apply -f -
添加工作节点¶
在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 2kubectl top nodes
安装Helm工具(可选)¶
本文暂不涉及使用helm
执行的操作,该步骤可选。
-
安装Helm工具
1# 下载并安装 2curl -sL https://get.helm.sh/helm-v3.8.2-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# 1.1 为避免特殊网络环境中的清单文件加载问题,可以使用FastGit提供的加速方案 5curl -sL https://endpoint.fastgit.org/https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml \ 6 | sed -e "s|\(\s\+\)- args:|\1- args:\n\1 - --kubelet-insecure-tls|" | kubectl apply -f - 7 8# 2. 使用自定义镜像地址安装 9curl -sL https://endpoint.fastgit.org/https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml \ 10 | sed \ 11 -e "s|\(\s\+\)- args:|\1- args:\n\1 - --kubelet-insecure-tls|" \ 12 -e "s|k8s.gcr.io/metrics-server|registry.cn-beijing.aliyuncs.com/choral-k8s|g" \ 13 | kubectl apply -f -
安装负载均衡组件¶
由云服务商提供的Kubernetes
服务,通常会提供内置的负载均衡实现。而笔者部署环境为私有环境,需要一个轻量的负载均衡实现以支撑LoadBalancer
类型的服务。
笔者选择MetalLB作为负载均衡实现,配置为二层网络模式。LoadBalancer
地址范围配置为10.0.0.201-10.0.0.254
,需根据具体网络环境进行修改。
在k8s-n0
节点上执行如下操作。
-
安装
MetalLB
1# 创建用于部署MetalLB的命名空间 2kubectl create namespace metallb-system 3 4# 创建必须的配置文件 5cat <<EOF | kubectl apply -f - 6apiVersion: v1 7kind: ConfigMap 8metadata: 9 namespace: metallb-system 10 name: config 11data: 12 config: | 13 address-pools: 14 - name: default 15 protocol: layer2 16 addresses: 17 - 10.0.0.201-10.0.0.254 18EOF 19 20# 1. 直接执行清单文件 21kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/metallb.yaml 22 23# 2. 为避免特殊网络环境中的清单文件加载问题,可以使用jsdelivr提供的加速方案加速地址 24kubectl apply -f https://cdn.jsdelivr.net/gh/metallb/metallb@v0.12.1/manifests/metallb.yaml
安装持久卷供应程序¶
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/master/deploy/local-path-storage.yaml 3# 1.1 同样可以使用jsdelivr提供的加速方案 4kubectl apply -f https://cdn.jsdelivr.net/gh/rancher/local-path-provisioner@master/deploy/local-path-storage.yaml 5 6# 2. 替换命名空间 7curl -s https://cdn.jsdelivr.net/gh/rancher/local-path-provisioner@master/deploy/local-path-storage.yaml \ 8 | sed \ 9 -e "1,6d" \ 10 -e "s/local-path-storage/kube-system/" \ 11 | 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# 根据需要将`registry.cn-beijing.aliyuncs.com`替换为私有镜像仓库地址 2docker login registry.cn-beijing.aliyuncs.com
创建一个脚本
gcr_mirror_sync.sh
,内容如下。1# gcr_mirror_sync.sh 2# 根据需要将`registry.cn-beijing.aliyuncs.com/choral-k8s/`替换为私有镜像仓库地址 3while read o 4 do { 5 t=$(echo $o | sed 's|k8s.gcr.io.*/|registry.cn-beijing.aliyuncs.com/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.24.2 | bash gcr_mirror_sync.sh
1# 列出所需镜像列表并保存到文件 2kubeadm config images list --kubernetes-version=v1.24.2 > gcr-image-list 3# 拷贝该文件至gcr_mirror_sync.sh所在主机,然后执行该脚本 4bash gcr_mirror_sync.sh gcr-image-list
-
同步附加组件镜像
1# 根据需要将`registry.cn-beijing.aliyuncs.com/choral-k8s/`替换为私有镜像仓库地址。 2 3# 同步metrics server所需镜像 4docker pull k8s.gcr.io/metrics-server/metrics-server:v0.6.1 5docker tag k8s.gcr.io/metrics-server/metrics-server:v0.6.1 registry.cn-beijing.aliyuncs.com/choral-k8s/metrics-server:v0.6.1 6docker push registry.cn-beijing.aliyuncs.com/choral-k8s/metrics-server:v0.6.1 7docker rmi k8s.gcr.io/metrics-server/metrics-server:v0.6.1 8docker rmi registry.cn-beijing.aliyuncs.com/choral-k8s/metrics-server:v0.6.1