前言
因宿主机内核版本限制和垂直伸缩特性的需要,安装的k8s版本为1.25,runtime为containerd,cni为calico。
containerd、kubeadm、kubelet也可以用包管理器来安装,因为不想配repo,也不想校验repo版有哪些区别,所以这几个都是用原生二进制方式安装的。
环境信息
IP | Hostname | OS Version | Kernel Version | Comment |
---|---|---|---|---|
192.168.0.11 | node1 | centos 7.9 | 3.10 | control panel |
192.168.0.12 | node2 | centos 7.9 | 3.10 | worker node |
192.168.0.13 | node3 | centos 7.9 | 3.10 | worker node |
用到的组件版本信息
- containerd: 1.7.21
- k8s: 1.25.16
系统初始化
系统初始化步骤要求每个节点都要操作,一些主机名等信息需要根据实际修改。
- 修改hostname,k8s要求每个节点的hostname不一样
bash
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3
-
(可选)如果没有dns可以让hostname之间直接访问,需要配置
/etc/hosts
192.168.0.11 node1
192.168.0.12 node2
192.168.0.13 node3 -
(可选)如果要长时间使用,最好配置一下时间同步。
-
关闭swap。默认情况下,k8s检测到swap就会异常退出,导致node上的k8s启动失败。
bash
# 临时关闭。永久关闭需要修改 /etc/fstab
swapoff -a
- 装载内核模块。如果不装载
br_netfilter
,下一步配置系统参数会报错。
bash
# 添加配置
cat << EOF > /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
# 立即装载
modprobe overlay
modprobe br_netfilter
# 检查装载。如果没有输出结果说明没有装载。
lsmod | grep br_netfilter
-
配置系统参数。编辑
/etc/sysctl.conf
文件或/etc/sysctl.d/
目录下的文件,添加或修改以下配置。编辑完成后执行sysctl -p
使配置生效。(如果修改的是/etc/sysctl.d
目录下的文件,sysctl -p
需要指定文件名才能生效)net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0 -
(可选)内核版本若高于4.1,可考虑使用ipvs来增强网络通信性能
-
安装依赖,否则安装containerd时,
runc
组件会有问题
bash
# conntrack-tools的版本为1.4.4-4.el7,如果低了可能会导致runc异常
# 如果安装提示缺少依赖,而依赖在centos 7的repo源里没有,可从高版本centos、alma等发行版下载rpm包再安装
yum install -y conntrack-tools
安装containerd
- 从 https://github.com/containerd/containerd/releases下载二进制包
- 解压压缩包到根目录。压缩包里面的文件路径都已经按照根目录组织好了,所以直接解压到根路径就行了。
bash
tar xf cri-containerd-cni-1.7.21-linux-amd64.tar.gz -C /
- 生成containerd的配置文件
bash
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
- 编辑containerd的配置文件
/etc/containerd/config.toml
,主要修改container的数据目录,并启用systemd的cgroup
toml
# 修改数据存储目录
root = "/home/apps/containerd"
# 对于使用systemd作为init system的linux发行版,官方建议用systemd作为容器cgroup driver
# false改成true
SystemdCgroup = true
- 重加载systemd配置,启动containerd
bash
systemctl daemon-reload
systemctl start containerd
systemctl enable containerd
- 简单验证下containerd是否正常
bash
# 查看systemd status
systemctl status containerd
# 查看image,正常情况下还没有image
crictl images
# 验证runc是否正常,如果输出有报错,可以参考"系统初始化"的第8步"安装依赖"
runc --version
安装kubelet和kubeadm
本节步骤在所有k8s node都要操作。k8s的二进制文件安装包可以从github下载:https://github.com/kubernetes/kubernetes/releases
在changelog中找到二进制包的下载链接,下载server binary即可,里面包含了master和node的二进制文件。
- 解压下载好的压缩包,并将其中的二进制文件放到环境变量
PATH
目录下
bash
tar xf kubernetes-server-linux-amd64.tar.gz
cd kubernetes/server/bin/
find . -type f -perm /u+x -exec cp {} /usr/local/bin/ \;
- 新建或编辑kubelet的service文件
/usr/lib/systemd/system/kubelet.service
ini
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/local/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10
[Install]
WantedBy=multi-user.target
- 创建目录
bash
mkdir -p /usr/lib/systemd/system/kubelet.service.d/
- 新建或编辑文件
/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
ini
# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/sysconfig/kubelet
ExecStart=
ExecStart=/usr/local/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
- 启动kubelet
bash
systemctl enable --now kubelet
创建集群
创建集群的步骤在control panel节点操作即可。
- 初始化集群,这里主要指定k8s版本,可根据需求,参考
kubeadm init --help
提示配置初始化参数,比如pause镜像地址,pod ip范围等。
bash
kubeadm init --kubernetes-version v1.25.16
如果init
报错失败,可以查下containerd
和kubelet
的日志。失败后可以重置下kubeadm reset
bash
systemctl status containerd
journalctl -xeu containerd
systemctl status kubelet
journalctl -xeu kubelet
如果init
成功,控制台会输出worker node加入cluster的命令,将这个命令粘贴到worker node执行即可,比如:
bash
kubeadm join 192.168.0.11:6443 --token 123456 \
--discovery-token-ca-cert-hash sha256:123456
init
成功后,输出还会提示创建kubeconfig,根据提示操作即可
bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 配置网络插件。k8s需要cni插件才能让pod之间正常通信,这里用的是calico插件
bash
# 下载配置文件。下载后可根据需求修改其中的image地址
wget https://docs.projectcalico.org/manifests/calico.yaml
# 部署calico
kubectl apply -f calico.yaml
- 检查网络插件部署效果。只有全部ready都为1/1才算成功
bash
kubectl get nodes
kubectl get pod -n kube-system
测试集群
部署完成后,可以起个pod试下能否正常调度
bash
# 创建一个pod。nginx需要提前docker pull
kubectl create deployment nginx --image=nginx
# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看状态
kubectl get pods,svc