实战:Kubernetes v1.34.1异构集群搭建(Ubuntu 24.04 + containerd + Calico)

该文章已生成可运行项目,

    📋 Kubernetes 集群完整配置清单

    🔧 基础环境配置

    • 操作系统‌:Ubuntu 24.04.3 LTS
    • Kubernetes版本‌:v1.34.2
    • 推荐安装顺序‌:containerd → kubelet → kubeadm → kubectl

    🏗️ 核心组件功能说明

    • containerd‌:容器运行时,Kubernetes运行Pod的基础环境
    • kubelet‌:Kubernetes节点代理,负责管理Pod和容器
    • kubeadm‌:集群管理工具
    • kubectl‌:Kubernetes命令行客户端

    🌐 网络与插件配置

    • CNI网络插件‌:Calico(使用tigera-operator管理)
    • kube-proxy模式‌:IPVS
    • Pod网段(podSubnet)‌:10.244.0.0/16 ✅
    • Service网段‌:10.96.0.0/12
    • Ingress控制器‌:ingress-nginx

    📊 附加服务部署(可选)

    • Kubernetes仪表板‌:Dashboard(需要单独部署和配置访问)

    💡 部署建议

    按照以下步骤执行部署‌:

    1. 所有操作需在管理员权限下完成(root 或 sudo 用户)
    2. 完成系统基础环境配置和内核参数调整
    3. 严格按照推荐顺序安装各组件:containerd → kubelet → kubeadm → kubectl
    4. 使用kubeadm初始化集群时指定网络配置参数
    5. 部署Calico网络插件和ingress-nginx控制器
    6. 最后部署Dashboard并配置安全的访问方式

    一、环境配置清单

    📋 硬件配置清单

    节点类型节点名称CPU内存存储IP
    Mastermaster-nodei5-12400F32GB1T SSD192.168.2.101
    Worker1worker-node01i7-8750H16GB116GB SSD192.168.2.102
    Worker2worker-node02ARMv84GB128GB SD卡192.168.2.103

    🔧系统基础环境配置

    以下是所有节点(包括 Master 和 Worker)设置主机名的具体操作步骤:

    步骤1:临时设置主机名(立即生效)

    每个节点上分别执行以下命令,将 <hostname> 替换为当前节点的主机名(例如 master-nodeworker-node01):

    hostname <hostname>
    

    示例:

    hostname master-node  # Master 节点执行 对应IP:192.168.2.101
    hostname worker-node01 # Worker 节点执行 对应IP:192.168.2.102
    hostname worker-node02 # Worker 节点执行 对应IP:192.168.2.103
    

    步骤2:永久设置主机名(重启后生效)

    方法一:修改配置文件(推荐)

    1. 编辑主机名配置文件:
      sudo vi /etc/hostname
      
    2. 清空文件内容,分别在三台设备上的/etc/hostname中写入新的主机名(例如 master-node/worker-node01/worker-node02),保存退出。

    方法二:使用命令(部分系统支持)

    sudo hostnamectl set-hostname <hostname>

    示例:

    # 在 192.168.2.101 所在设备上执行
    sudo hostnamectl set-hostname master-node
    
    # 在 192.168.2.102 所在设备上执行
    sudo hostnamectl set-hostname worker-node01
    
    # 在 192.168.2.103 所在设备上执行
    sudo hostnamectl set-hostname worker-node02
    

    步骤3:同步修改 hosts 文件

    在每个节点的 /etc/hosts 中添加所有节点的主机名与 IP 映射:

    sudo vi /etc/hosts
    

    添加内容示例:

    192.168.2.101 master-node
    192.168.2.102 worker-node01
    192.168.2.103 worker-node02
    

    步骤4:验证配置

    执行以下命令检查主机名是否生效:

    hostname  # 查看当前主机名
    hostnamectl # 查看永久主机名状态
    cat /etc/hostname # 检查配置文件
    

     步骤5:关闭 Swap 交换分区

    核心指令模块‌:

    # 临时关闭当前所有Swap分区
    sudo swapoff -a
    
    # 永久禁用Swap - 注释掉fstab中所有swap相关行
    sudo sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
    
    
    # 验证Swap状态(应该显示为空)
    free -h
    sudo swapon --show
    

    配置说明‌:

    • swapoff -a:立即停用所有swap设备,效果立即可见
    • sed命令:在/etc/fstab中注释掉包含"swap"的行,确保重启后仍生效
    • Kubernetes要求关闭Swap是为了保证内存管理的准确性和稳定性

    步骤6:加载内核模块(IPVS + 桥接)

    临时加载模块(立即生效)

    # 加载网络桥接相关模块
    sudo modprobe br_netfilter
    sudo modprobe bridge
    
    # 加载IPVS负载均衡模块
    sudo modprobe ip_vs
    sudo modprobe ip_vs_rr
    sudo modprobe ip_vs_wrr
    sudo modprobe ip_vs_sh
    sudo modprobe nf_conntrack
    
    # 加载OverlayFS模块(容器存储必需)
    sudo modprobe overlay
    
    
    # 验证模块加载状态
    lsmod | grep -E 'br_netfilter|bridge|ip_vs|nf_conntrack|overlay'
    

    持久化配置模块

    cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
    br_netfilter
    overlay
    bridge
    ip_vs
    ip_vs_rr
    ip_vs_wrr
    ip_vs_sh
    nf_conntrack
    EOF
    
    sudo systemctl restart systemd-modules-load
    

    核心模块功能说明

    • br_netfilter‌:启用桥接网络的数据包过滤,确保iptables规则能正确管理桥接流量
    • ip_vs‌:IPVS核心模块,提供负载均衡功能
    • ip_vs_rr / ip_vs_wrr / ip_vs_sh‌:IPVS调度算法(轮询/加权轮询/源地址哈希)
    • nf_conntrack‌:网络连接跟踪,用于NAT和状态防火墙

    步骤7:网络参数配置

    配置目的‌:设置系统网络参数,确保 Kubernetes 网络正常工作

    核心配置内容

    cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    EOF
    

    参数功能说明

    net.bridge.bridge-nf-call-ip6tables = 1

    • 启用 IPv6 桥接流量的 iptables 过滤
    • 确保桥接的 IPv6 流量能够被 iptables 规则正确处理

    net.bridge.bridge-nf-call-iptables = 1

    • 启用 IPv4 桥接流量的 iptables 过滤
    • 允许 iptables 对通过网桥的数据包进行过滤和转发

    net.ipv4.ip_forward = 1

    • 启用 IPv4 路由转发功能
    • 这是 Pod 跨节点通信的基础要求

    配置应用命令

    sudo sysctl --system
    

    该命令作用‌:

    • 重新加载所有 sysctl 配置文件
    • 使 /etc/sysctl.d/k8s.conf 中的参数立即生效
    • 确保系统重启后配置仍然保持

    验证配置生效

    # 检查关键参数是否已正确设置
    sysctl net.bridge.bridge-nf-call-iptables
    sysctl net.bridge.bridge-nf-call-ip6tables
    sysctl net.ipv4.ip_forward
    

    预期输出‌:

    • net.bridge.bridge-nf-call-iptables = 1
    • net.bridge.bridge-nf-call-ip6tables = 1
    • net.ipv4.ip_forward = 1

    这些网络参数配置对于 Kubernetes 集群的正常运行至关重要,它们确保了容器网络能够正确地进行路由转发和流量过滤。

    💡注意事项

    1. 操作需在每个节点单独执行
    2. 主机名需全局唯一不含特殊字符(建议使用小写字母、数字和连字符)
    3. 修改后建议重启节点:
      sudo reboot
      

    通过以上步骤,所有节点的主机名将被正确配置,为后续集群部署奠定基础。


    二、容器运行时选型:containerd

    在Kubernetes 1.24+版本中,containerd作为轻量级容器运行时具备显著优势:

    1. 性能优势:相比Docker更少的抽象层,内存占用降低40%
    2. 稳定性:通过CRI标准接口直接对接kubelet
    3. 项目适配:更适合GPU设备直通场景

    🔧安装步骤

    步骤1:系统准备工作

    # 更新系统包列表
    sudo apt update && sudo apt upgrade -y
    
    # 安装基础依赖
    sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
    
    # 加载必要的内核模块
    sudo modprobe overlay
    sudo modprobe br_netfilter
    

    步骤2:添加Docker仓库(使用国内镜像源)

    # 备份原有的docker.list(如果存在)
    sudo mv /etc/apt/sources.list.d/docker.list /etc/apt/sources.list.d/docker.list.bak 2>/dev/null || true
    
    # 1. 下载 GPG 密钥(使用备用方法)
    wget -O- https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    
    # 2. 添加仓库(明确指定架构)
    echo "deb [arch=arm64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu noble stable" | sudo tee /etc/apt/sources.list.d/docker.list
    

    步骤3:安装containerd

    # 更新软件包列表并安装containerd
    sudo apt update && sudo apt install -y containerd.io
    

    步骤4:配置containerd

    生成默认配置

    # 生成默认配置(如果不存在)
    sudo mkdir -p /etc/containerd
    sudo containerd config default | sudo tee /etc/containerd/config.toml
    

    关键配置修改

    编辑 /etc/containerd/config.toml,确保以下关键配置:

    # 编辑修改配置文件:
    vim /etc/containerd/config.toml
    

    找到以下部分进行修改

    推荐使用systemd作为cgroup驱动

    # ‌重要性‌:Kubernetes v1.22+ 推荐使用systemd作为cgroup驱动,与kubelet保持一致,避免资源管理冲突
    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true
    

    重载沙箱(pause)镜像

    [plugins."io.containerd.grpc.v1.cri"]
      sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10.1"

     步骤5:配置国内镜像加速

    在 containerd 配置文件中,config_path 参数用于指定镜像仓库证书和配置文件的搜索路径。

    • 使用冒号 : 分隔多个路径(Linux/Unix 系统)
    • containerd 会按顺序在这些路径中查找镜像仓库配置
    # 编辑修改配置文件:
    vim /etc/containerd/config.toml
    
    # 找到指定镜像仓库证书和配置文件的搜索路径
    ......
    [plugins.'io.containerd.cri.v1.images'.registry]
      config_path = '/var/lib/containerd/io.containerd.content.v1.content/plugins/certs.d:/etc/containerd/certs.d:/etc/docker/certs.d'
    ......

    目录结构要求

    确保配置文件放置在正确位置:

    /var/lib/containerd/io.containerd.content.v1.content/plugins/certs.d/
    ├── docker.io/
    │   └── hosts.toml
    ├── registry.k8s.io/
    │   └── hosts.toml
    └── k8s.gcr.io/
        └── hosts.toml

    配置 Kubernetes 相关的镜像仓库设置代理服务器,解决在国内环境访问

    # 1. 创建正确的目录结构
    sudo mkdir -p /var/lib/containerd/io.containerd.content.v1.content/plugins/certs.d/registry.k8s.io
    sudo mkdir -p /var/lib/containerd/io.containerd.content.v1.content/plugins/certs.d/docker.io
    sudo mkdir -p /var/lib/containerd/io.containerd.content.v1.content/plugins/certs.d/k8s.gcr.io
    
    # 2. 修正 hosts.toml 文件内容
    # Kubernetes 官方镜像仓库
    sudo tee /var/lib/containerd/io.containerd.content.v1.content/plugins/certs.d/registry.k8s.io/hosts.toml << 'EOF'
    server = "https://registry.k8s.io"
    
    [host."https://registry.aliyuncs.com"]
    capabilities = ["pull", "resolve"]
    override_path = true
    EOF
    
    # Docker Hub 镜像仓库  
    sudo tee /var/lib/containerd/io.containerd.content.v1.content/plugins/certs.d/docker.io/hosts.toml << 'EOF'
    server = "https://docker.io"
    
    [host."https://docker.m.daocloud.io"]
    capabilities = ["pull", "resolve"]
    override_path = true
    EOF
    
    # Google 容器镜像仓库
    sudo tee /var/lib/containerd/io.containerd.content.v1.content/plugins/certs.d/k8s.gcr.io/hosts.toml << 'EOF'
    server = "https://k8s.gcr.io"
    
    [host."https://registry.aliyuncs.com"]
    capabilities = ["pull", "resolve"]
    override_path = true
    EOF
    

    步骤6:重启并启用containerd服务

     单独配置以上每个步骤都需要重启 containerd

    sudo systemctl restart containerd
    sudo systemctl enable containerd
    

    步骤7:验证安装

    # 检查服务状态
    sudo systemctl status containerd
    
    # 检查containerd版本
    containerd --version
    
    # 测试基本功能
    sudo ctr images pull docker.io/library/hello-world:latest
    sudo ctr images list
    

    提前拉取pause镜像(可选)

    # 使用crictl拉取(自动进入k8s.io命名空间)
    crictl pull registry.aliyuncs.com/google_containers/pause:3.10
    
    # 打标签为官方名称
    ctr -n k8s.io images tag \
    registry.aliyuncs.com/google_containers/pause:3.10 \
    registry.k8s.io/pause:3.10
    
    # 加个label防止被误删
    ctr -n k8s.io images label registry.k8s.io/pause:3.10 keep=true
    

    注意‌:ctr -n k8s.io中的k8s.io是Kubernetes使用的containerd命名空间,必须指定。

    配置说明
    SystemdCgroup‌:启用systemd cgroup驱动
    镜像加速‌:解决国内访问registry.k8s.io和k8s.gcr.io网络问题
    镜像预拉取‌:避免kubeadm初始化时因镜像拉取失败而卡住
    完成以上步骤后,containerd容器运行时已成功安装并配置完成,可以继续进行Kubernetes其他组件的安装。


    三、安装 kubeadm、kubelet、kubectl(所有节点)

    安装 Kubernetes 核心工具。

    步骤1:添加 Kubernetes v1.34 仓库

    # 使用阿里云Docker镜像源
    sudo mkdir -p /etc/apt/keyrings
    # 添加 GPG 密钥
    curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker-archive-keyring.gpg
    # 添加 APT 源
    echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    
    
    # 更新软件包列表
    sudo apt update
    

    步骤2:安装组件

    # 安装 ipvsadm(用于验证 IPVS)
    sudo apt install -y ipvsadm
    
    # 安装 kubeadm, kubelet, kubectl
    sudo apt install -y kubelet kubeadm kubectl
    
    # 锁定版本,防止意外升级
    sudo apt-mark hold kubelet kubeadm kubectl
    
    # 启用并启动 kubelet(此时会因缺少配置而报错,正常)
    sudo systemctl enable --now kubelet
    

    四、初始化 Master 节点

    主节点直接初始化(不推荐)

    $ sudo kubeadm init --control-plane-endpoint=master-ip:6443 \
    --pod-network-cidr=192.168.0.0/16 \
    --cri-socket=unix:///var/run/containerd/containerd.sock
    

    使用kubeadm配置文件初始化主节点(推荐)

    🔧初始化步骤

    步骤1:创建kubeadm配置文件

    方法1:查看默认配置模板

    kubeadm config print init-defaults > kubeadm-config.yaml
    

    方法2:从运行中集群导出配置

    kubeadm config view > kubeadm-config.yaml
    

    添加配置:

    apiVersion: kubeadm.k8s.io/v1beta4
    bootstrapTokens:
    - groups:
      - system:bootstrappers:kubeadm:default-node-token
      token: abcdef.0123456789abcdef
      ttl: 24h0m0s
      usages:
      - signing
      - authentication
    kind: InitConfiguration
    localAPIEndpoint:
      advertiseAddress: "192.168.2.101"
      bindPort: 6443
    nodeRegistration:
      criSocket: unix:///var/run/containerd/containerd.sock
      imagePullPolicy: IfNotPresent
      imagePullSerial: true
      name: "master-node"
      taints: null
    timeouts:
      controlPlaneComponentHealthCheck: 4m0s
      discovery: 5m0s
      etcdAPICall: 2m0s
      kubeletHealthCheck: 4m0s
      kubernetesAPICall: 1m0s
      tlsBootstrap: 5m0s
      upgradeManifests: 5m0s
    ---
    apiServer: {}
    apiVersion: kubeadm.k8s.io/v1beta4
    caCertificateValidityPeriod: 87600h0m0s
    certificateValidityPeriod: 8760h0m0s
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controllerManager: {}
    dns: {}
    encryptionAlgorithm: RSA-2048
    etcd:
      local:
        dataDir: /var/lib/etcd
    kind: ClusterConfiguration
    kubernetesVersion: 1.34.2
    imageRepository: "registry.aliyuncs.com/google_containers"  # 关键配置:使用国内镜像源
    networking:
      dnsDomain: cluster.local
      serviceSubnet: 10.96.0.0/12
      podSubnet: "10.244.0.0/16"
    proxy: {}
    scheduler: {}
    

    其他配置(可选但推荐)

    配置 crictl 工具,方便调试。

    cat <<EOF | sudo tee /etc/crictl.yaml
    runtime-endpoint: unix:///var/run/containerd/containerd.sock
    image-endpoint: unix:///var/run/containerd/containerd.sock
    timeout: 2
    debug: false
    EOF
    

    步骤2:初始化集群

    # 可选:清理旧环境(重新初始化时使用)
    sudo kubeadm reset -f
    sudo rm -rf /etc/kubernetes/
    sudo rm -rf /var/lib/etcd
    
    # 执行初始化
    kubeadm init --config kubeadm-config.yaml --v=5

    成功大概会返回以下信息

    Your Kubernetes control-plane has initialized successfully!
    
    To start using your cluster, you need to run the following as a regular user:
    
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    Alternatively, if you are the root user, you can run:
    
      export KUBECONFIG=/etc/kubernetes/admin.conf
    
    You should now deploy a pod network to the cluster.
    Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
      https://kubernetes.io/docs/concepts/cluster-administration/addons/
    
    Then you can join any number of worker nodes by running the following on each as root:
    
    kubeadm join master-ip:6443 --token <token> \
    --discovery-token-ca-cert-hash sha256:<hash>
    

    步骤3:配置 kubectl

    普通用户配置

    # 创建.kube目录
    mkdir -p $HOME/.kube
    # 复制管理员配置文件
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    # 设置正确的文件权限
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    

    root用户配置

    # 直接设置环境变量
    export KUBECONFIG=/etc/kubernetes/admin.conf
    

    五、Calico网络部署

    选用tigera-operator的优势:

    1. 策略管理:支持NetworkPolicy细粒度控制
    2. 性能优化:IPIP模式降低跨节点延迟
    3. 混合架构:完整支持ARM64节点

    🔧安装步骤

    步骤1:下载tigera-operator.yaml、custom-resources.yaml

    # 下载 tigera-operator.yaml
    wget -O tigera-operator.yaml https://raw.githubusercontent.com/projectcalico/calico/v3.29.0/manifests/tigera-operator.yaml
    
    # 下载 custom-resources.yaml
    wget -O custom-resources.yaml https://raw.githubusercontent.com/projectcalico/calico/v3.29.0/manifests/custom-resources.yaml
    

    步骤2:修改custom-resources.yaml信息

    apiVersion: operator.tigera.io/v1
    kind: Installation
    metadata:
      name: default
    spec:
      calicoNetwork:
        ipPools:
        - blockSize: 26
          cidr: 10.244.0.0/16
          encapsulation: VXLANCrossSubnet
          natOutgoing: Enabled
          nodeSelector: all()
        nodeAddressAutodetectionV4:
          interface: "enp3s0"
    

    使用建议

    初次安装时:

    # Operator 只需创建一次 
    kubectl create -f tigera-operator.yaml 
    # 配置可以随时更新 
    kubectl apply -f custom-resources.yaml

    后续更新时:

    # 如果修改了 operator 配置,需要先删除再创建 
    kubectl delete -f tigera-operator.yaml 
    kubectl create -f tigera-operator.yaml 
    # 配置更新直接使用 apply 
    kubectl apply -f custom-resources.yaml

    💡 ‌实用建议‌:在日常工作中,对于需要频繁更新的配置类资源优先使用 apply,对于一次性安装的基础组件使用 create,这样既能保证安全性又方便后续维护。

    步骤3:验证calico是否就绪

    watch kubectl get pods -n calico-system -l k8s-app=calico-node
    # 或 使用crictl ps 检查cni 容器中所有运行的组件
    crictl ps
    # 或 使用crictl ps -a   检查连同没运行的组件的所有列表
    crlctl ps -a

    指令:crictl ps 返回的结果应该会是:

     步骤4、工作节点加入集群

    如果前面初始化之后,忘记保存join命令,可以重新生成一个

     生成join命令:

    kubeadm token create --print-join-command
    

    工作节点加入:

    # sudo kubeadm join master-ip:6443 --token <token> \
    #   --discovery-token-ca-cert-hash sha256:<hash>
    
    
    # 例如:
    # kubeadm join 192.168.2.101:6443 --token l32ga7.zxs4v1nyd0s2y36k \
    # 	--discovery-token-ca-cert-hash \
    # sha256:8efe56c36985cb4899d57c4124bf49e4ecc134209e71b17ede8985b2966cec5d

    验证节点:

    # 获取节点列表
    kubectl get nodes

    返回

    NAME            STATUS   ROLES           AGE   VERSION
    master-node     Ready    control-plane   3h   v1.34.2
    worker-node01   Ready    <none>          3h   v1.34.2
    worker-node02   Ready    <none>          3h   v1.34.2
    

    六、Ingress-Nginx部署

    为 Kubernetes 集群部署 Ingress-Nginx,提供外部 HTTP(S) 访问能力,并确保整个部署过程安全可靠。

    🔧安装步骤

    步骤1:下载Ingress-Nginx Controller文件

    # 下载 Ingress-Nginx Controller 文件
    wget -O Ingress-Nginx-deploy.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.0/deploy/static/provider/cloud/deploy.yaml

    步骤2:部署 Ingress-Nginx Controller

    部署 Ingress-Nginx Controller
    kubectl apply -f Ingress-Nginx-deploy.yaml
    

    步骤3:检查部署状态

    # 检查部署状态
    kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx

    成功预计会返回以下 

    NAME                                        READY   STATUS      RESTARTS   AGE
    ingress-nginx-admission-create-gqmmh        0/1     Completed   0          74m
    ingress-nginx-admission-patch-djj5j         0/1     Completed   0          74m
    ingress-nginx-controller-7d5845d948-wzlrq   1/1     Running     0          74m
    

    # 如需 NodePort 方式暴露(适合测试环境)

    kubectl patch svc ingress-nginx-controller -n ingress-nginx -p '{"spec":{"type":"NodePort"}}'
    

    📊 部署验证步骤
    1. 验证 IPVS 负载均衡‌

    sudo ipvsadm -ln
    # 正常应显示大量 Kubernetes service 的 IPVS 规则:ml-citation{ref="1" data="citationList"}

    2. 检查 Pod 网络分配‌

    kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'
    # 输出应类似:10.244.1.0/24 10.244.2.0/24 ...:ml-citation{ref="2" data="citationList"}

    3. 创建测试 Pod 验证网络‌

    kubectl run testpod --image=nginx:alpine --restart=Never
    kubectl get pod testpod -o wide
    # IP 地址应属于 10.244.x.x 范围,表明 Pod 网络正常工作:ml-citation{ref="3" data="citationList"}

    🔧 完整测试应用部署
    以下是完整的 Nginx 演示应用部署配置,包含 Deployment、Service 和 Ingress:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-demo
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx-demo
      template:
        metadata:
          labels:
            app: nginx-demo
        spec:
          containers:
          - name: nginx
            image: nginx:alpine
            ports:
            - containerPort: 80
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-svc
    spec:
      selector:
        app: nginx-demo
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: nginx-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
      ingressClassName: nginx
      rules:
      - host: nginx.local
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx-svc
                port:
                  number: 80

    🌐 访问配置
    本地 hosts 文件配置:‌

    192.168.2.101 nginx.local

    部署完成后,访问 http://nginx.local 即可看到 Nginx 欢迎页面,证明 Ingress 配置成功。

    ⚠️ 常见问题排查
    Pod CIDR not assigned:检查 Calico 运行状态,确认 podSubnet 与 CALICO_IPV4POOL_CIDR 匹配
    IPVS not working:检查 ip_vs、br_netfilter 内核模块,确认 kube-proxy ConfigMap 中 mode 设置为 ipvs
    ImagePullBackOff:使用国内镜像仓库提前拉取镜像
    NodeNotReady:检查 kubelet、containerd、CNI 插件日志


    七、部署Dashboard

    部署和访问 Kubernetes 仪表板(Dashboard)

    Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览信息,也可以创建或者修改 Kubernetes 资源 (如 Deployment、Job、DaemonSet 等等)。 例如,你可以对 Deployment 实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新的应用。

    🔧安装步骤

    步骤1:部署 Dashboard

    执行以下命令安装最新稳定版 Dashboard:

    # 下载 dashboard yaml文件
    wget -O recommended.yaml https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
    # kubectl 应用recommended.yaml
    kubectl apply -f recommended.yaml
    

    步骤2:访问令牌类型与创建

    Service Account 令牌创建

    ‌# 创建 Service Account:‌
    kubectl -n kubernetes-dashboard create serviceaccount dashboard-admin
    

    为 Service Account 授权:‌

    kubectl create clusterrolebinding dashboard-admin-binding \
      --clusterrole=cluster-admin \
      --serviceaccount=kubernetes-dashboard:dashboard-admin

    获取令牌:‌

    kubectl -n kubernetes-dashboard create token dashboard-admin

    执行上述命令序列后,会输出一个长字符串的令牌

      步骤3:访问 Dashboard

      方案一:端口转发(临时访问)
      kubectl port-forward -n kubernetes-dashboard svc/kubernetes-dashboard 8080:443
      

      访问:https://localhost:8080

      方案二:NodePort 暴露(生产慎用)

      修改 Service 类型:

      kubectl patch svc kubernetes-dashboard -n kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}'
      

      获取端口号:

      kubectl get svc -n kubernetes-dashboard
      

      返回:

      访问:https://<节点IP>:<端口>,如:https://10.103.153.59:443

      步骤4:登录 Dashboard

      在登录界面选择 Token 方式,粘贴步骤2 获取的 Token。

      💡注意事项

      1. 安全建议

        • 生产环境应配置 Ingress + HTTPS
        • 限制访问 IP 范围
        • 定期轮换 Token
      2. 版本兼容: Dashboard 版本需与 Kubernetes 版本匹配,可通过以下命令检查:

        kubectl get pods -n kubernetes-dashboard -o jsonpath="{.items[0].metadata.labels.version}"
        

      验证部署

      kubectl get pods -n kubernetes-dashboard
      

      正常状态应显示:

      NAME                                         READY   STATUS    RESTARTS   AGE
      dashboard-metrics-scraper-5ffb7d645f-vtjq7   1/1     Running   0          26m
      kubernetes-dashboard-6c7b75ffc-7spw4         1/1     Running   0          26m
      

      八、故障排查案例

      1、在 kubeadm init 时几乎肯定会遇到 10.96.0.1:443 连接失败的问题‌,这会导致整个集群初始化失败。

        Warning  FailedCreatePodSandBox  13s (x1747 over 6h18m)  
      kubelet  (combined from similar events): 
      Failed to create pod sandbox: 
      rpc error: 
      code = Unknown desc = failed to setup network for sandbox "a5857dffc00334d3df387d49aeb57d6ea8f0c889a6dcf91c840e67a0fa165ffa": 
      plugin type="calico" failed (add): 
      error getting ClusterInformation: 
      Get "https://10.96.0.1:443/apis/crd.projectcalico.org/v1/clusterinformations/default": 
      tls: failed to verify certificate: x509: 
      certificate signed by unknown authority (possibly because of 
      "crypto/rsa: verification error" 
      while trying to verify candidate authority certificate "kubernetes")

      🔍 ‌问题根源分析‌
      10.96.0.1:443 是什么?‌
      这是 Kubernetes ‌API Server 的 ClusterIP 服务地址‌
      默认的 Service CIDR 范围是 10.96.0.0/12
      443 端口是 API Server 的安全通信端口

      br_netfilter‌ - 确保 iptables 能够正确管理桥接网络流量
      IPVS 系列模块‌ - 提供负载均衡功能(替代 kube-proxy 的 iptables 模式)
      nf_conntrack‌ - 跟踪网络连接状态,支持 NAT
      ⚠️ ‌具体故障表现‌
      如果没有这些模块,您可能会遇到:
      [kubelet-check] It seems like the kubelet isn't running or healthy.
      [kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp 127.0.0.1:10248: connect: connection refused
      或者直接显示 API Server 无法启动,无法连接到 10.96.0.1:443。


      2、节点处于NotReady状态

      具体表现为:

      1. Calico节点异常‌:

        • calico-node-4r7qp 处于CrashLoopBackOff状态(已重启49次)
        • calico-node-v6djb 卡在Init:0/2状态
        • csi-node-driver Pod卡在ContainerCreating状态
      2. CNI配置缺失‌:

        • /etc/cni/net.d/目录下只有.kubernetes-cni-keep文件,缺少Calio配置文件
      3. 网络插件依赖‌:

        • Calico需要正确配置才能管理节点网络
        • worker-node02缺少关键CNI配置文件

      典型的‌CNI网络插件配置缺失‌问题。

      🔍 问题诊断

      核心问题‌:/etc/cni/net.d/目录中缺少必要的CNI配置文件,导致Calico网络插件无法正常初始化。

      🚨 当前状态分析

      正常运行组件‌:

      • ✅ master-node(控制平面)
      • ✅ worker-node01(工作节点)
      • ✅ CoreDNS(服务发现)
      • ✅ etcd、API Server等控制平面组件

      异常状态组件‌:

      • ❌ worker-node02 - NotReady
      • ❌ calico-node-4r7qp - CrashLoopBackOff(已重启49次)
      • ❌ calico-node-v6djb - Init:0/2(初始化卡住)
      • ❌ kube-proxy-5lzrw - ContainerCreating
      • ❌ csi-node-driver-hbh8p/rxgmm - ContainerCreating

      🔧 解决方案

      立即修复步骤:

      1. 检查master节点的正确配置

      # 在master节点查看CNI配置
      ls -la /etc/cni/net.d/
      cat /etc/cni/net.d/10-calico.conflist  # 如果存在
      

      2. 复制配置文件到worker-node02

      # 从master节点复制到worker-node02 
      scp /etc/cni/net.d/* root@192.168.2.103:/etc/cni/net.d/

      3. 重启相关服务

      # 在worker-node02节点执行 
      systemctl restart containerd 
      systemctl restart kubelet

      如果master节点也缺少配置:

      重新部署Calico网络插件‌:

      # 在master节点执行 
      kubectl delete -f custom-resources.yaml
      kubectl delete -f tigera-operator.yaml
      
      kubectl apply -f tigera-operator.yaml
      kubectl apply -f custom-resources.yaml

      💡 验证修复效果

      修复完成后,执行以下验证:

      检查节点状态‌:

      kubectl get nodes

      查看Calico Pods状态‌:

      kubectl get pods -n calico-system

      返回

      NAME            STATUS   ROLES           AGE     VERSION
      master-node     Ready    control-plane   4h26m   v1.34.2
      worker-node01   Ready    <none>          4h14m   v1.34.2
      worker-node02   Ready    <none>          4h14m   v1.34.2
      

      🎯 Kubernetes 集群异构搭建总结

      📋 部署核心要点回顾

      环境配置基础‌:成功部署 Kubernetes 集群始于正确的基础环境配置,包括主机名设置、Swap 关闭、内核模块加载和网络参数调优,这是集群稳定运行的基石。

      容器运行时选择‌:containerd 作为推荐的容器运行时,其轻量级特性和稳定性为集群提供了可靠的容器管理能力。

      核心组件协同‌:kubeadm、kubelet、kubectl 三者的完美配合构成了集群的管理核心,其中 kubeadm 的配置文件方式提供了最大的灵活性和可控性。

      🌐 网络与插件部署精髓

      Calico 网络部署‌:Tigera Operator 使用 create 确保一次性安装,而 Custom Resources 使用 apply 支持后续配置更新,这种设计体现了 Kubernetes 声明式管理的精髓。

      Ingress-Nginx 控制器‌:从之前遇到的 ContainerCreating 状态经验来看,Ingress-Nginx 的正常启动需要耐心等待镜像拉取和容器初始化,这是集群网络流量的重要入口。

      🔧 实践经验与故障排查

      Dashboard 访问安全‌:Dashboard 的部署不仅要关注功能实现,更要重视安全配置,通过 ServiceAccount 和 ClusterRoleBinding 实现最小权限原则。

      常见故障应对‌:

      • kubeadm init 连接失败‌:通常是网络配置或防火墙问题
      • 节点 NotReady 状态‌:多与容器运行时或网络插件配置相关

      💡 关键部署建议

      1. 分阶段验证‌:每完成一个部署阶段都要进行验证,确保各组件正常运行
      2. 日志监控‌:充分利用 kubectl logs 和 kubectl describe 进行问题诊断
      • 资源预留‌:为系统组件预留足够的 CPU 和内存资源
      • 备份策略‌:定期备份 etcd 数据和关键配置文件

      🚀 从部署到生产

      记住你之前在实践中积累的经验:‌耐心等待组件启动‌、‌理解命令的适用场景‌、‌重视配置的持久化‌。这些经验将使你的 Kubernetes 集群从"能用"升级到"好用"。

      Kubernetes 集群部署是一个系统工程,每个环节都环环相扣。遵循本文的步骤,结合你的实践经验,你将能够构建出稳定、高效的容器化平台。

      本文章已经生成可运行项目
      评论
      成就一亿技术人!
      拼手气红包6.0元
      还能输入1000个字符
       
      红包 添加红包
      表情包 插入表情
       条评论被折叠 查看
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包
      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

      余额充值