配置Kubernetes从节点与集群Calico网络
在上一篇博客中,我们成功安装并初始化了Kubernetes的主节点,并且看到了集群初始化成功的标志信息。接下来,我们将继续安装从节点(worker nodes),以构建一个完整的Kubernetes集群。
步骤回顾
在上一步中,主节点初始化成功后,我们得到了加入控制平面节点和从节点的命令。这些命令包含了集群的加入端点(cluster-endpoint)、token以及CA证书哈希值。请确保这些信息在加入新节点时是有效的,因为token有默认的有效期(通常是24小时)。如果token过期,你需要在主节点上生成新的token。
# token过期时执行
kubeadm token create --print-join-command
查看node状态
kubectl get nodes
Kubernetes集群中的k8s-master节点处于NotReady状态。这时需要安装网络插件并且Pod网络已经就绪。本篇文章主要介绍从节点安装Kubernetes和集群配置网络插件。
步骤详解
步骤1: 设置主机名和hosts文件
#查看本机hostname
hostname
若有重复的主机名使用下面命令进行修改
假设我们有以下三台机器:
- k8s-master: 172.16.196.23
- k8s-node1: 172.16.196.24
- k8s-node2: 172.16.196.25
在每台机器上修改主机名,并更新/etc/hosts
文件,使各节点可以相互通信。
# 在k8s-master上执行
hostnamectl set-hostname k8s-master
# 在k8s-node1上执行
hostnamectl set-hostname k8s-node1
# 在k8s-node2上执行
hostnamectl set-hostname k8s-node2
步骤2: 关闭swap分区
Kubernetes不支持开启swap分区的系统。关闭swap并注释掉/etc/fstab
中的swap条目以防止重启后swap重新启用。
swapoff -a # 临时禁用
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久禁用
步骤3: 添加Kubernetes仓库
创建一个名为 kubernetes.repo
的文件在 /etc/yum.repos.d/
目录下,并添加官方的Kubernetes YUM仓库。
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/repodata/repomd.xml.key
EOF
步骤4: 安装Kubernetes三大件:kubeadm、kubelet 和 kubectl
在每台机器上安装以下的软件包:
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
sudo systemctl enable --now kubelet
如果要安装以前的版本,可以直接指定版本号,例如
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes
kubeadm
:用来初始化集群的指令。kubelet
:在集群中的每个节点上用来启动 Pod 和容器等。kubectl
:用来与集群通信的命令行工具。
具体描述,本篇不再赘述,需要了解请阅读上篇文章
步骤5: 添加master域名映射
#查看master节点ip地址
ifconfig
#所有机器添加master域名映射
echo "10.211.55.5 cluster-endpoint" >> /etc/hosts
测试通信
# 执行看是否能联通
ping cluster-endpoint
步骤6: 启用 IPv4 数据包转发
默认情况下,Linux 内核不允许 IPv4 数据包在接口之间路由。 大多数 Kubernetes 集群网络实现都会更改此设置(如果需要),但有些人可能希望管理员为他们执行此操作。 (有些人可能还期望设置其他 sysctl 参数、加载内核模块等;请参阅你的特定网络实施的文档。)
手动启用 IPv4 数据包转发:
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
使用以下命令验证 net.ipv4.ip_forward
是否设置为 1:
sysctl net.ipv4.ip_forward
步骤7: 安装containerd
-
添加 containerd 的官方仓库
首先,确保你有一个稳定的软件包源。你可以使用阿里云的镜像源来加快下载速度:wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#查看yum源中containerd软件 yum list | grep containerd
-
安装 containerd
使用 yum 安装 containerd:sudo yum install -y containerd.io
-
启用并启动 containerd 服务
安装完成后,启用并启动 containerd 服务:sudo systemctl enable --now containerd
-
检查 containerd 状态
确认 containerd 已成功启动并正在运行:sudo systemctl status containerd
5. 配置 containerd
重新生成一个默认配置,修改下面4处:
# sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
# sudo mkdir -p /etc/containerd
vim /etc/containerd/config.toml
SystemdCgroup
:此配置改为 SystemdCgroup = truedisabled_plugins
:此配置不能存在cri
,如果用此配置,需要删除。sandbox_image
改为 "registry.aliyuncs.com/google_containers/pause:3.6plugins."io.containerd.grpc.v1.cri".registry.mirrors
: 添加镜像加速地址,国内的一些镜像地址,包括阿里云、腾讯云以及各大高校提供的镜像源,已经全部关闭。可用镜像地址需要自行搜索,找到两篇文章:2025年1月国内可用Docker镜像源汇总、DockerHub 国内加速镜像列表,里面镜像地址是否可用自行测试!
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://1ms.run"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
endpoint = ["https://1ms.run"]
修改完成,重启containerd
sudo systemctl restart containerd
步骤8: 主节点
安装 Calico
下载 Calico 的 YAML 文件
根据k8s的版本,找到支持的Calico,calico归档版本
使用以下命令下载 Calico 的 YAML 配置文件:
wget https://raw.githubusercontent.com/projectcalico/calico/v3.29.1/manifests/calico.yaml
或者,你也可以下载 Calico 的 Operator 和自定义资源 YAML 文件,以便进行更精细的控制:
wget https://raw.githubusercontent.com/projectcalico/calico/v3.29.1/manifests/tigera-operator.yaml
wget https://raw.githubusercontent.com/projectcalico/calico/v3.29.1/manifests/custom-resources.yaml
部署 Calico
使用 kubectl
命令将下载的 YAML 文件应用到 Kubernetes 集群中:
kubectl apply -f calico.yaml
或者,如果你下载了 Operator 和自定义资源文件,则分别应用它们:
kubectl create -f tigera-operator.yaml
kubectl apply -f custom-resources.yaml
验证 Calico 是否成功安装并正常运行
使用以下命令检查 Calico 组件的部署情况:
kubectl get pods --all-namespaces
可能出现下载失败
Warning Failed 20s (x2 over 77s) kubelet
Failed to pull image "docker.io/calico/cni:v3.25.0": rpc error: code = DeadlineExceeded
desc = failed to pull and unpack image "docker.io/calico/cni:v3.25.0":
failed to resolve reference "docker.io/calico/cni:v3.25.0":
failed to do request: Head "https://registry-1.docker.io/v2/calico/cni/manifests/v3.25.0":
dial tcp 202.160.129.37:443: i/o timeout
将文件中的镜像地址改为可以访问到的镜像地址,实例中的镜像地址随时可能失效,可以参考上篇文章里的镜像地址进行配置。
sed -i 's|docker.io/calico|docker.1ms.run/calico|g' calico.yaml
kubectl delete -f calico.yaml
kubectl apply -f calico.yaml
你应该能看到 Calico 相关的 Pod(如 calico-node
、calico-kube-controllers
等)都处于 Running
状态。
步骤9:加入从节点
现在,让我们把工作节点加入到Kubernetes集群中。请记住,在每个工作节点上,你需要以root权限运行下面的命令。如果你之前没有保存下来,可以通过在主节点上运行下面命令来获取最新的kubeadm join命令。
kubeadm token create --print-join-command
以下是加入命令的例子,请用实际的集群端点、token和discovery-token-ca-cert-hash替换示例中的值:
kubeadm join cluster-endpoint:6443 --token emo01i.1k9co48bf6o5end8 \
--discovery-token-ca-cert-hash sha256:dbad3d1197b173b2c94ebd6e2f39f38cdbe3fd9fe61f0be8c81256df0768e567
在执行此命令后,工作节点将下载必要的组件并加入集群。一旦所有的工作节点都加入了集群,你应该能够在主节点上看到它们的状态。你可以使用kubectl get nodes
命令来检查集群中的节点列表及其状态。
开启端口和防火墙设置
理论上需要开这些端口:
Master 节点
sudo firewall-cmd --zone=public --permanent --add-port=6443/tcp
sudo firewall-cmd --zone=public --permanent --add-port=2379-2380/tcp
sudo firewall-cmd --zone=public --permanent --add-port=10250/tcp
sudo firewall-cmd --zone=public --permanent --add-port=10251/tcp
sudo firewall-cmd --zone=public --permanent --add-port=10252/tcp
sudo firewall-cmd --reload
Worker 节点
sudo firewall-cmd --zone=public --permanent --add-port=10250/tcp
sudo firewall-cmd --zone=public --permanent --add-port=30000-32767/tcp
sudo firewall-cmd --reload
不过对于测试环境来说,为了以防未知的坑,还是直接关闭掉防火墙比较直接。在部署Dashboard的时候,Pod的状态一直为CrashLoopBackOff或Error。
查看log日志得到了如下的错误信息:
Error from server: Get "https://10.211.55.9:10250/containerLogs/kubernetes-dashboard/kubernetes-dashboard-api-cbbb6644d-szvc5/kubernetes-dashboard-api": dial tcp 10.211.55.9:10250: connect: no route to hos
通过kubectl get svc -n=kube-system 命令查询service,发现kube-dns还需要开启53/UDP,53/TCP,9153/TCP这三个端口。
kubernetes-dashboard也需要443端口。
综上所述,将本步骤修改为:
systemctl stop firewalld
systemctl disable firewalld
Kubernetes 集群安装总结
前置步骤(主从节点均需执行)
- 节点设置主机名和hosts文件
- Node的名字会与主机名相同。
- 主机的hosts文件必须添加映射,
kubeadm join
时会用到这些映射。
- 关闭swap分区
- 禁用swap分区,以确保Kubernetes集群的稳定运行。
- 启用IPv4数据包转发
- 启用IPv4转发功能,以便Kubernetes节点之间的网络通信。
- 安装并配置containerd
- 安装容器运行时containerd。
- 需要修改配置4处。
- 添加Kubernetes仓库
- 将Kubernetes仓库添加到
/etc/yum.repos.d/
目录下。 - 由于原始yum源中没有Kubernetes安装包,外网Kubernetes仓库可能无法访问,因此直接添加阿里云的Kubernetes仓库。
- 将Kubernetes仓库添加到
- 安装三大件
- 在主从节点上安装Kubernetes的核心组件(kubelet、kubeadm、kubectl)。
主节点专属步骤
- 初始化主节点
- 使用
kubeadm init
命令初始化Kubernetes主节点。 - 初始化过程中会生成kubeadm join命令,用于从节点加入集群。
- 使用
- 安装网络插件Calico
- 安装Calico网络插件,以提供Kubernetes集群的Pod间网络通信。
从节点专属步骤
- 从节点加入集群
- 使用在主节点初始化时生成的
kubeadm join
命令,将从节点加入Kubernetes集群。
- 使用在主节点初始化时生成的
至此我们已经成功搭建完kubernetes集群,下一篇将介绍如何搭建Dashboard。