当前位置: 首页 > article >正文

配置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

在这里插入图片描述

  1. 添加 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
    

    在这里插入图片描述

  2. 安装 containerd
    使用 yum 安装 containerd:

    sudo yum install -y containerd.io
    
  3. 启用并启动 containerd 服务
    安装完成后,启用并启动 containerd 服务:

    sudo systemctl enable --now containerd
    
  4. 检查 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 = true
  • disabled_plugins:此配置不能存在cri,如果用此配置,需要删除。
  • sandbox_image 改为 "registry.aliyuncs.com/google_containers/pause:3.6
  • plugins."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

在这里插入图片描述
SystemdCgroup:此配置改为 SystemdCgroup = true
 disabled_plugins:此配置不能存在cri

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

步骤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-nodecalico-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 集群安装总结

前置步骤(主从节点均需执行)
  1. 节点设置主机名和hosts文件
    • Node的名字会与主机名相同。
    • 主机的hosts文件必须添加映射,kubeadm join时会用到这些映射。
  2. 关闭swap分区
    • 禁用swap分区,以确保Kubernetes集群的稳定运行。
  3. 启用IPv4数据包转发
    • 启用IPv4转发功能,以便Kubernetes节点之间的网络通信。
  4. 安装并配置containerd
    • 安装容器运行时containerd。
    • 需要修改配置4处。
  5. 添加Kubernetes仓库
    • 将Kubernetes仓库添加到/etc/yum.repos.d/目录下。
    • 由于原始yum源中没有Kubernetes安装包,外网Kubernetes仓库可能无法访问,因此直接添加阿里云的Kubernetes仓库。
  6. 安装三大件
    • 在主从节点上安装Kubernetes的核心组件(kubelet、kubeadm、kubectl)。
主节点专属步骤
  1. 初始化主节点
    • 使用kubeadm init命令初始化Kubernetes主节点。
    • 初始化过程中会生成kubeadm join命令,用于从节点加入集群。
  2. 安装网络插件Calico
    • 安装Calico网络插件,以提供Kubernetes集群的Pod间网络通信。
从节点专属步骤
  1. 从节点加入集群
    • 使用在主节点初始化时生成的kubeadm join命令,将从节点加入Kubernetes集群。

至此我们已经成功搭建完kubernetes集群,下一篇将介绍如何搭建Dashboard。


http://www.kler.cn/a/505105.html

相关文章:

  • 从代码层面熟悉UniAD,开始学习了解端到端整体架构
  • ISP各模块功能介绍
  • 【入门级】计算机网络学习
  • 软件工程和项目管理领域 - CMMI 极简理解
  • java人脸识别
  • 战略与规划方法——深入解析波士顿矩阵(BCG Matrix):分析产品组合的关键工具
  • Java算法 数据结构 栈 单调栈实战 模版题 [洛谷-P5788]
  • WOA-CNN-LSTM-Attention、CNN-LSTM-Attention、WOA-CNN-LSTM、CNN-LSTM四模型对比多变量时序预测
  • Android 播放SMB共享视频
  • ImageSharp图形库学习
  • Docker 部署 Typecho
  • 期权懂|场内期权合约行权价格是如何设定制度的?
  • java进行pdf文件压缩
  • 03.选择排序
  • qml XmlListModel详解
  • SDK调用文心一言如何接入,文心一言API接入教程
  • 检验统计量与p值笔记
  • LabVIEW智能水肥一体灌溉控制系统
  • 查看APK的公钥,MD5信息
  • Pytest入门—allure生成报告
  • Leetcode热题100(双指针篇)
  • 网络网络层ICMP协议
  • Unity用官方第三人称Third Person模板,替换成自己的人物
  • ue5 1.平A,两段连击蒙太奇。鼠标点一下,就放2段动画。2,动画混合即融合,边跑边挥剑,3,动画通知,动画到某一帧,把控制权交给蓝图。就执行蓝图节点
  • 《AI语言模型的技术演进与未来发展趋势:从参数堆叠到智能检索》
  • Android SystemUI——StatusBar视图创建(六)