[kubernetes]使用kubeadm和containerd部署kubernetes

前言

因宿主机内核版本限制和垂直伸缩特性的需要,安装的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

系统初始化

系统初始化步骤要求每个节点都要操作,一些主机名等信息需要根据实际修改。

  1. 修改hostname,k8s要求每个节点的hostname不一样
bash 复制代码
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3
  1. (可选)如果没有dns可以让hostname之间直接访问,需要配置/etc/hosts

    192.168.0.11 node1
    192.168.0.12 node2
    192.168.0.13 node3

  2. (可选)如果要长时间使用,最好配置一下时间同步。

  3. 关闭swap。默认情况下,k8s检测到swap就会异常退出,导致node上的k8s启动失败。

bash 复制代码
# 临时关闭。永久关闭需要修改 /etc/fstab
swapoff -a
  1. 装载内核模块。如果不装载br_netfilter,下一步配置系统参数会报错。
bash 复制代码
# 添加配置
cat << EOF > /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

# 立即装载
modprobe overlay
modprobe br_netfilter

# 检查装载。如果没有输出结果说明没有装载。
lsmod | grep br_netfilter
  1. 配置系统参数。编辑/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

  2. (可选)内核版本若高于4.1,可考虑使用ipvs来增强网络通信性能

  3. 安装依赖,否则安装containerd时,runc组件会有问题

bash 复制代码
# conntrack-tools的版本为1.4.4-4.el7,如果低了可能会导致runc异常
# 如果安装提示缺少依赖,而依赖在centos 7的repo源里没有,可从高版本centos、alma等发行版下载rpm包再安装
yum install -y conntrack-tools

安装containerd

  1. https://github.com/containerd/containerd/releases下载二进制包
  2. 解压压缩包到根目录。压缩包里面的文件路径都已经按照根目录组织好了,所以直接解压到根路径就行了。
bash 复制代码
tar xf cri-containerd-cni-1.7.21-linux-amd64.tar.gz -C /
  1. 生成containerd的配置文件
bash 复制代码
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
  1. 编辑containerd的配置文件/etc/containerd/config.toml,主要修改container的数据目录,并启用systemd的cgroup
toml 复制代码
# 修改数据存储目录
root = "/home/apps/containerd"

# 对于使用systemd作为init system的linux发行版,官方建议用systemd作为容器cgroup driver
# false改成true
SystemdCgroup = true
  1. 重加载systemd配置,启动containerd
bash 复制代码
systemctl daemon-reload
systemctl start containerd
systemctl enable containerd
  1. 简单验证下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的二进制文件。

  1. 解压下载好的压缩包,并将其中的二进制文件放到环境变量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/ \;
  1. 新建或编辑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
  1. 创建目录
bash 复制代码
mkdir -p  /usr/lib/systemd/system/kubelet.service.d/
  1. 新建或编辑文件/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
  1. 启动kubelet
bash 复制代码
systemctl enable --now kubelet

创建集群

创建集群的步骤在control panel节点操作即可。

  1. 初始化集群,这里主要指定k8s版本,可根据需求,参考kubeadm init --help提示配置初始化参数,比如pause镜像地址,pod ip范围等。
bash 复制代码
kubeadm init --kubernetes-version v1.25.16

如果init报错失败,可以查下containerdkubelet的日志。失败后可以重置下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
  1. 配置网络插件。k8s需要cni插件才能让pod之间正常通信,这里用的是calico插件
bash 复制代码
# 下载配置文件。下载后可根据需求修改其中的image地址
wget https://docs.projectcalico.org/manifests/calico.yaml

# 部署calico
kubectl apply -f calico.yaml
  1. 检查网络插件部署效果。只有全部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
相关推荐
明月_清风5 小时前
K8s 从入门到上手:核心概念+常用工具全解析
后端·kubernetes
塔克拉玛攻城狮9 小时前
详解cni插件cilium篇一:它为什么这么快?它还有哪些高级功能?
kubernetes·cilium
阿里云云原生10 小时前
HiClaw 发布 v1.1.0,提供 Kubernetes 集群部署实现,支持 Hermes Worker 运行时
kubernetes
Cat_Rocky12 小时前
kubernetes ingress粗浅学习
学习·容器·kubernetes
PH = 713 小时前
K8S集群部署Dashboard
云原生·容器·kubernetes
陈陈CHENCHEN16 小时前
【Kubernetes】Ubuntu 24.04 二进制方式部署 K8s
云原生·容器·kubernetes
成为你的宁宁17 小时前
【K8s Service 基础知识、五大类型应用机制及Endpoint 深度解析】
云原生·容器·kubernetes
老卢聊运维17 小时前
K8s 资源一直 Terminating?kubectl 强制删除完整实操手册
云原生·容器·kubernetes
眷蓝天17 小时前
Kubernetes Ingress 资源对象
云原生·容器·kubernetes
Nice_Fold17 小时前
Kubernetes Ingress 七层负载均衡与Nginx实现
nginx·kubernetes·负载均衡