安装前准备
系统配置
Master, Worker 1, Worker 2 节点配置
创建 /etc/modules-load.d/containerd.conf
配置文件,确保在系统启动时自动加载所需的内核模块,以满足容器运行时的要求:
cat << EOF > /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
执行以下命令使配置生效:
modprobe overlay
modprobe br_netfilter
CNI 配置
创建/etc/sysctl.d/99-kubernetes-cri.conf
配置文件:
cat << EOF > /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
user.max_user_namespaces=28633
EOF
执行以下命令使配置生效:
sysctl -p /etc/sysctl.d/99-kubernetes-cri.conf
在文件名/etc/sysctl.d/99-kubernetes-cri.conf
中,“99”
代表文件的优先级或顺序。sysctl是Linux内核参数的配置工具,它可以通过修改/proc/sys/
目录下的文件来设置内核参数。
在/etc/sysctl.d/
目录中,可以放置一系列的配置文件,以便在系统启动时自动加载这些参数。这些配置文件按照文件名的字母顺序逐个加载。数字前缀用于指定加载的顺序,较小的数字表示较高的优先级。
开启ipvs
由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块:
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
创建/etc/modules-load.d/ipvs.conf
文件,保证在节点重启后能自动加载所需模块:
cat > /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
EOF
执行以下命令使配置立即生效:
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
使用lsmod | grep -e ip_vs -e nf_conntrack
命令查看是否已经正确加载所需的内核模块。
接下来还需要确保各个节点上已经安装了ipset软件包,为了便于查看ipvs的代理规则,最好安装一下管理工具ipvsadm。
apt install -y ipset ipvsadm
NFS 共享存储配置
- 在 Master 上安装 NFS 服务器
- 在 Worker 1 / Worker 2 上挂载 NFS 共享目录 如果使用的云服务, 建议使用云平台自带的 nfs, 价格非常便宜而且可靠
[Master] 安装 / 配置 NFS 服务器
在主节点 Master
上安装 nfs-server
sudo apt install nfs-kernel-server
您可以运行cat命令sudo cat /proc/fs/nfsd/versions
来验证正在运行的NFS版本。
root@master:~# sudo cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2
[Master] NFS 配置共享目录
创建共享目录 /nfs
mkdir -p /nfs
chmod 777 /nfs
打开/etc/exports
文件,输入以下内容来定义NFS共享。
/nfs *(rw,sync,no_subtree_check)
授权其他节点访问:在终端中输入以下命令以重新加载NFS配置文件。
sudo exportfs -a
[Master] 启动NFS服务器
在终端中输入以下命令以启动NFS服务。
sudo systemctl start nfs-kernel-server
[Worker 1] 验证安装结果
在 Worker 1
节点上验证
- 安装依赖
sudo apt install nfs-common
- 挂载目录
# 192.168.88.101 为 Master 的 ip
mkdir -p /mnt/nfs
mount 192.168.88.101:/nfs /mnt/nfs
- 在
Worker 1
共享目录下创建文件进行验证
root@worker1:/mnt/nfs# echo 'hello, nfs!' > test.txt
- 检查 Master 目录数据
root@master:~# cd /nfs
root@master:/nfs# ls -l
total 4
-rw-r--r-- 1 nobody nogroup 12 May 10 15:11 test.txt
root@master:/nfs# cat test.txt
hello, nfs!
验证成功!!
[Worker 1, Worker 2] 挂载 NFS 并配置开机启动
在 Worker 1 / Worker 2
上分别挂载
- 安装依赖
sudo apt install nfs-common
- 您需要编辑
/etc/fstab
文件并添加一行类似于以下内容的条目:
192.168.88.101:/nfs /mnt/nfs nfs default 0 0
- 重启
Worker 1 / Worker 2
并进行验证
Last login: Wed May 10 15:32:10 2023 from 192.168.88.1
root@worker1:~# df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 393M 1.1M 392M 1% /run
/dev/sda3 47G 6.7G 38G 16% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda2 2.0G 134M 1.7G 8% /boot
192.168.88.101:/nfs 47G 6.8G 38G 16% /mnt/nfs
tmpfs 393M 4.0K 393M 1% /run/user/0
root@worker1:~# cd /mnt/nfs/
root@worker1:/mnt/nfs# ls -l
total 4
-rw-r--r-- 1 nobody nogroup 12 May 10 15:11 test.txt
root@worker1:/mnt/nfs# cat test.txt
hello, nfs!
root@worker1:/mnt/nfs#
禁用 Swap 交换分区
Master, Worker 1, Worker 2 节点均要执行
编辑 /etc/fstab
, 在 /swap.img
一行前面加 #
或者删除此行
# /swap.img none swap sw 0 0
swappiness参数调整,修改/etc/sysctl.d/99-kubernetes-cri.conf
添加下面一行:
swappiness参数调整,修改/etc/sysctl.d/99-kubernetes-cri.conf添加下面一行:
vm.swappiness=0
执行sysctl -p /etc/sysctl.d/99-kubernetes-cri.conf
使修改生效。
重启
安装 helm
Master 节点安装
版本对比
版本对比: https://helm.sh/zh/docs/topics/version_skew/ (opens in a new tab)
安装 helm v3.12.0
see https://helm.sh/zh/docs/intro/install/ (opens in a new tab)
添加仓库
wget https://get.helm.sh/helm-v3.12.0-linux-amd64.tar.gz
tar -zxvf helm-v3.12.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/
执行helm list
确认没有错误输出。
安装 Containerd
Master, Worker 1, Worker 2 节点均要安装
下载最新版本的 Containerd, 截止到目前最新版本是 1.7.2
下载Containerd的二进制包, 需要注意cri-containerd-(cni-)-VERSION-OS-ARCH.tar.gz发行包自containerd 1.6版本起已经被弃用,
在某些 Linux 发行版上无法正常工作,并将在containerd 2.0版本中移除,这里下载containerd-x.tar.gz的发行包,后边在单独下载安装runc和CNI plugins:
wget https://github.com/containerd/containerd/releases/download/v1.7.2/containerd-1.7.2-linux-amd64.tar.gz
> wget
将其解压缩到/usr/local
下:
tar Cxzvf /usr/local containerd-1.7.2-linux-amd64.tar.gz
bin/
bin/containerd-shim-runc-v1
bin/containerd-shim-runc-v2
bin/containerd-stress
bin/containerd
bin/containerd-shim
bin/ctr
接下来从runc的github上单独下载安装runc,该二进制文件是静态构建的,并且应该适用于任何Linux发行版。
wget https://github.com/opencontainers/runc/releases/download/v1.1.7/runc.amd64
install -m 755 runc.amd64 /usr/local/sbin/runc
接下来生成containerd的配置文件:
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
根据文档Container runtimes中的内容,对于使用systemd作为init system的Linux的发行版, 使用systemd作为容器的cgroup driver可以确保服务器节点在资源紧张的情况更加稳定,因此这里配置各个节点上containerd的cgroup driver为systemd。
修改前面生成的配置文件/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
再修改/etc/containerd/config.toml
中的
[plugins."io.containerd.grpc.v1.cri"]
...
# sandbox_image = "registry.k8s.io/pause:3.8"
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
如果你的containerd版本和操作系统和本文的一致, 也可以直接下载此文件, https://cdn.jansora.com/files/uPic/2023/09/21/config.toml (opens in a new tab)
为了通过systemd启动containerd,请还需要从
https://raw.githubusercontent.com/containerd/containerd/main/containerd.service (opens in a new tab)
下载containerd.service
单元文件,并将其放置在 /etc/systemd/system/containerd.service
中。 配置containerd开机启动,并启动containerd,执行以下命令:
systemctl daemon-reload
systemctl enable containerd --now
下载安装crictl工具:
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.27.0/crictl-v1.27.0-linux-amd64.tar.gz
tar -zxvf crictl-v1.27.0-linux-amd64.tar.gz
install -m 755 crictl /usr/local/bin/crictl
使用crictl测试一下,确保可以打印出版本信息并且没有错误信息输出:
crictl --runtime-endpoint=unix:///run/containerd/containerd.sock version
Version: 0.1.0
RuntimeName: containerd
RuntimeVersion: v1.7.2
RuntimeApiVersion: v1
安装 kubeadm,kubectl,kubelet 1.28.2
Master, Worker 1, Worker 2 节点均要安装
加入阿里云镜像源, 并安装
apt-get update
apt-get install -y apt-transport-https ca-certificates curl
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF'
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
安装 kubeadm,kubectl,kubelet 软件包 1.28.2 版本。
apt-get update
apt install kubeadm=1.28.2-00 kubelet=1.28.2-00 kubectl=1.28.2-00
apt-mark hold kubelet kubeadm kubectl
上面的命令在安装kubeadm, kubectl, kubelet 时,会自动安装依赖项conntrack, cri-tools, ebtables, kubernetes-cni, soca
运行kubelet --help可以看到原来kubelet的绝大多数命令行flag参数都被DEPRECATED了,官方推荐我们使用--config指定配置文件,并在配置文件中指定原来这些flag所配置的内容。具体内容可以查看这里Set Kubelet parameters via a config file。最初Kubernetes这么做是为了支持动态Kubelet配置(Dynamic Kubelet Configuration),但动态Kubelet配置特性从k8s 1.22中已弃用,并在1.24中被移除。如果需要调整集群汇总所有节点kubelet的配置,还是推荐使用ansible等工具将配置分发到各个节点。
安装 Calico 网卡
部署Pod Network组件Calico
选择calico作为k8s的Pod网络组件,下面使用helm在k8s集群中安装calico。
下载tigera-operator
的helm chart:
wget https://github.com/projectcalico/calico/releases/download/v3.26.0/tigera-operator-v3.26.0.tgz
查看这个chart的中可定制的配置:
helm show values tigera-operator-v3.26.0.tgz
imagePullSecrets: {}
installation:
enabled: true
kubernetesProvider: ""
apiServer:
enabled: true
certs:
node:
key:
cert:
commonName:
typha:
key:
cert:
commonName:
caBundle:
# Resource requests and limits for the tigera/operator pod.
resources: {}
# Tolerations for the tigera/operator pod.
tolerations:
- effect: NoExecute
operator: Exists
- effect: NoSchedule
operator: Exists
# NodeSelector for the tigera/operator pod.
nodeSelector:
kubernetes.io/os: linux
# Custom annotations for the tigera/operator pod.
podAnnotations: {}
# Custom labels for the tigera/operator pod.
podLabels: {}
# Image and registry configuration for the tigera/operator pod.
tigeraOperator:
image: tigera/operator
version: v1.30.0
registry: quay.io
calicoctl:
image: docker.io/calico/ctl
tag: v3.26.0
使用helm安装calico:
helm install calico tigera-operator-v3.26.0.tgz -n kube-system --create-namespace
等待并确认所有pod处于Running状态:
监测 calico 以及集群状态
root@master:/mnt/nfs/share/kubernetes# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 12m v1.28.2
root@master:/mnt/nfs/share/kubernetes# kubectl get pod -n kube-system | grep tigera-operator
tigera-operator-689d868448-b6ff8 1/1 Running 0 5m20s
root@master:/mnt/nfs/share/kubernetes# kubectl get pods -n calico-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-67ddfd6d9d-v9494 1/1 Running 0 5m20s
calico-node-m4w7j 1/1 Running 0 5m20s
calico-typha-b4c9b5fd8-5w7dx 1/1 Running 0 5m20s
csi-node-driver-l6js2 2/2 Running 0 5m20s
查看一下calico向k8s中添加的api资源:
kubectl api-resources | grep calico
bgpconfigurations crd.projectcalico.org/v1 false BGPConfiguration
bgpfilters crd.projectcalico.org/v1 false BGPFilter
bgppeers crd.projectcalico.org/v1 false BGPPeer
blockaffinities crd.projectcalico.org/v1 false BlockAffinity
caliconodestatuses crd.projectcalico.org/v1 false CalicoNodeStatus
clusterinformations crd.projectcalico.org/v1 false ClusterInformation
felixconfigurations crd.projectcalico.org/v1 false FelixConfiguration
globalnetworkpolicies crd.projectcalico.org/v1 false GlobalNetworkPolicy
globalnetworksets crd.projectcalico.org/v1 false GlobalNetworkSet
hostendpoints crd.projectcalico.org/v1 false HostEndpoint
ipamblocks crd.projectcalico.org/v1 false IPAMBlock
ipamconfigs crd.projectcalico.org/v1 false IPAMConfig
ipamhandles crd.projectcalico.org/v1 false IPAMHandle
ippools crd.projectcalico.org/v1 false IPPool
ipreservations crd.projectcalico.org/v1 false IPReservation
kubecontrollersconfigurations crd.projectcalico.org/v1 false KubeControllersConfiguration
networkpolicies crd.projectcalico.org/v1 true NetworkPolicy
networksets crd.projectcalico.org/v1 true NetworkSet
bgpconfigurations bgpconfig,bgpconfigs projectcalico.org/v3 false BGPConfiguration
bgpfilters projectcalico.org/v3 false BGPFilter
bgppeers projectcalico.org/v3 false BGPPeer
blockaffinities blockaffinity,affinity,affinities projectcalico.org/v3 false BlockAffinity
caliconodestatuses caliconodestatus projectcalico.org/v3 false CalicoNodeStatus
clusterinformations clusterinfo projectcalico.org/v3 false ClusterInformation
felixconfigurations felixconfig,felixconfigs projectcalico.org/v3 false FelixConfiguration
globalnetworkpolicies gnp,cgnp,calicoglobalnetworkpolicies projectcalico.org/v3 false GlobalNetworkPolicy
globalnetworksets projectcalico.org/v3 false GlobalNetworkSet
hostendpoints hep,heps projectcalico.org/v3 false HostEndpoint
ipamconfigurations ipamconfig projectcalico.org/v3 false IPAMConfiguration
ippools projectcalico.org/v3 false IPPool
ipreservations projectcalico.org/v3 false IPReservation
kubecontrollersconfigurations projectcalico.org/v3 false KubeControllersConfiguration
networkpolicies cnp,caliconetworkpolicy,caliconetworkpolicies projectcalico.org/v3 true NetworkPolicy
networksets netsets projectcalico.org/v3 true NetworkSet
profiles projectcalico.org/v3 false Profile
这些api资源是属于calico的,因此不建议使用kubectl来管理,推荐按照calicoctl来管理这些api资源。 将calicoctl安装为kubectl的插件:
cd /usr/local/bin
curl -o kubectl-calico -O -L "https://github.com/projectcalico/calicoctl/releases/download/v3.21.5/calicoctl-linux-amd64"
chmod +x kubectl-calico
验证插件正常工作:
kubectl calico -h
验证k8s DNS是否可用
kubectl run curl --image=radial/busyboxplus:curl -it
If you don't see a command prompt, try pressing enter.
[ root@curl:/ ]$
进入后执行nslookup kubernetes.default确认解析正常:
nslookup kubernetes.default
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes.default
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
配置Calico BGP
由于calico默认不会启用BGP,需要修改calico的clusterrole,添加-bpgfilter参数 tigera operator 3.26 bug 导致的问题
kubectl edit clusterrole calico-crds
编辑资源, 加上 -bpgfilter 如下图所示