Home

K8s 多主集群部署实战指南

00 角色分配与环境清单(建议方案)

角色数量推荐主机名建议配置关键组件
Master3k8s-master-01/02/032C/4GAPI Server, Etcd, Controller, Scheduler
Worker3k8s-node-01/022C/4GKubelet, Containerd/Docker, Proxy
Load Balancer2k8s-lb-01/021C/1GHAProxy, Keepalived
VIP1--虚拟 IP(用于高可用接入点)

01 基础环境准备

关闭防火墙和SELinux

systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

禁用Swap

swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab

加载内核模块(K8s 网络必需)

cat > /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter

配置内核参数

cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
sysctl --system

设置时间同步

yum install -y chrony
systemctl enable --now chronyd
chronyc sources -v       # 验证时间同步状态

设置主机名解析(所有节点执行相同操作)

cat > /etc/hosts <<EOF
127.0.0.1 localhost localhost.localdomain
::1 localhost localhost.localdomain
10.0.5.10 lb-vip
10.0.5.1 k8s-master-01
10.0.5.2 k8s-master-02
10.0.5.3 k8s-master-03
10.0.5.4 k8s-node-01
10.0.5.5 k8s-node-02
10.0.5.6 k8s-node-03
10.0.5.7 k8s-lb-01
10.0.5.8 k8s-lb-02
EOF

02-负载均衡层部署 (HAProxy)

适用机器:k8s-lb-01 (10.0.5.6), k8s-lb-02 (10.0.5.7)

1. 安装 HAProxy

yum install -y haproxy

2. 生成配置文件

注意:已经根据你的规划补全了 k8s-master-03,并更新了 IP 地址。

cat > /etc/haproxy/haproxy.cfg <<EOF
global
    log /dev/log local0
    maxconn 20000
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode tcp                # K8s API Server 使用 TCP 转发
    option tcplog
    timeout connect 5s
    timeout client 50s
    timeout server 50s


frontend k8s-api
    bind *:6443
    default_backend k8s-api

backend k8s-api
    balance roundrobin
    option tcp-check
    # 转发至 3 台 Master 节点的 6443 端口
    server k8s-master-01 10.0.5.1:6443 check port 6443 inter 5s fall 3 rise 2
    server k8s-master-02 10.0.5.2:6443 check port 6443 inter 5s fall 3 rise 2
    server k8s-master-03 10.0.5.3:6443 check port 6443 inter 5s fall 3 rise 2

# --- (可选) 监控组件访问入口 ---
# 注意:生产环境通常通过 Service/Ingress 访问,若实验需要可保留
frontend k8s-metrics
    bind *:10250
    default_backend kubelet-metrics

backend kubelet-metrics
    balance roundrobin
    option tcp-check
    server k8s-master-01 10.0.5.1:10250 check
    server k8s-master-02 10.0.5.2:10250 check
    server k8s-master-03 10.0.5.3:10250 check
EOF

启动服务与验证

Bash

# 启动并设置开机自启
systemctl enable --now haproxy

# 验证端口监听状态
ss -lntp | grep haproxy

02-负载均衡层部署 (Keepalived)

适用机器:k8s-lb-01 (10.0.5.6), k8s-lb-02 (10.0.5.7)

1. 安装 Keepalived

Bash

# 在 k8s-lb-01, k8s-lb-02 上执行
yum install -y keepalived

2. 配置 Keepalived

注意: 请先执行 ip add 查看你的网卡名称(如 ens33eth0),如果不是 ens33,请修改下方配置中的 interface 字段。

适用机器:k8s-lb-01 (Master 节点)

Bash

cat > /etc/keepalived/keepalived.conf <<EOF
global_defs {
   router_id k8s-lb-01
}

# 周期性检查 haproxy 进程是否存活
vrrp_script check_haproxy {
    script "/usr/bin/killall -0 haproxy"
    interval 3
    weight -20
}

vrrp_instance VI_1 {
    state MASTER              # 主节点
    interface ens33           # !!!确认你的网卡名
    virtual_router_id 51
    priority 100              # 优先级100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.5.10             # 虚拟 IP (VIP)
    }
    track_script {
        check_haproxy
    }
}
EOF

适用机器:k8s-lb-02 (Backup 节点)

Bash

cat > /etc/keepalived/keepalived.conf <<EOF
global_defs {
   router_id k8s-lb-02
}

vrrp_script check_haproxy {
    script "/usr/bin/killall -0 haproxy"
    interval 3
    weight -20
}

vrrp_instance VI_1 {
    state BACKUP              # 备节点
    interface ens33           # !!!确认你的网卡名
    virtual_router_id 51
    priority 90               # 优先级90 (低于主节点)
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.5.10             # 虚拟 IP (VIP)
    }
    track_script {
        check_haproxy
    }
}
EOF

启动服务与验证

适用机器:k8s-lb-01, k8s-lb-02

Bash

# 启动服务
systemctl enable --now keepalived

# --- 验证 1:查看 VIP 是否生效 ---
# 在 k8s-lb-01 上执行,应该能看到 10.0.5.10
ip addr show ens33

# --- 验证 2:测试漂移 (可选) ---
# 在 k8s-lb-01 上停止 keepalived,观察 VIP 是否在 k8s-lb-02 上出现
systemctl stop keepalived
ip addr show ens33 (在 lb-02 上查看)

03-容器运行时与 K8s 组件安装 (最终验证版)

适用机器:所有 Master 和 Node 节点 (k8s-master-0103, k8s-node-0102)

1. 安装 Containerd 基础环境

Bash

# 1. 安装必要工具
yum install -y yum-utils device-mapper-persistent-data lvm2

# 2. 添加阿里云 Docker 源并安装
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y containerd.io

containerd配置镜像加速

1.修改/etc/containerd/config.toml配置文件

指定config_path的目录

sed -i 's|config_path = .*|config_path = "/etc/containerd/certs.d"|' /etc/containerd/config.toml

2.创建目录

mkdir -p  /etc/containerd/certs.d

添加对应的镜像加速配置

# docker hub镜像加速
mkdir -p /etc/containerd/certs.d/docker.io
cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"

[host."https://docker.m.daocloud.io"]
  capabilities = ["pull", "resolve"]
EOF

# registry.k8s.io镜像加速
mkdir -p /etc/containerd/certs.d/registry.k8s.io
tee /etc/containerd/certs.d/registry.k8s.io/hosts.toml << 'EOF'
server = "https://registry.k8s.io"

[host."https://k8s.m.daocloud.io"]
  capabilities = ["pull", "resolve", "push"]
EOF

# docker.elastic.co镜像加速
mkdir -p /etc/containerd/certs.d/docker.elastic.co
tee /etc/containerd/certs.d/docker.elastic.co/hosts.toml << 'EOF'
server = "https://docker.elastic.co"

[host."https://elastic.m.daocloud.io"]
  capabilities = ["pull", "resolve", "push"]
EOF

# gcr.io镜像加速
mkdir -p /etc/containerd/certs.d/gcr.io
tee /etc/containerd/certs.d/gcr.io/hosts.toml << 'EOF'
server = "https://gcr.io"

[host."https://gcr.m.daocloud.io"]
  capabilities = ["pull", "resolve", "push"]
EOF

# ghcr.io镜像加速
mkdir -p /etc/containerd/certs.d/ghcr.io
tee /etc/containerd/certs.d/ghcr.io/hosts.toml << 'EOF'
server = "https://ghcr.io"

[host."https://ghcr.m.daocloud.io"]
  capabilities = ["pull", "resolve", "push"]
EOF

# k8s.gcr.io镜像加速
mkdir -p /etc/containerd/certs.d/registry.k8s.io
tee /etc/containerd/certs.d/registry.k8s.io/hosts.toml << 'EOF'
server = "https://registry.k8s.io"

[host."https://k8s-gcr.m.daocloud.io"]
  capabilities = ["pull", "resolve", "push"]
EOF

# mcr.m.daocloud.io镜像加速
mkdir -p /etc/containerd/certs.d/mcr.microsoft.com
tee /etc/containerd/certs.d/mcr.microsoft.com/hosts.toml << 'EOF'
server = "https://mcr.microsoft.com"

[host."https://mcr.m.daocloud.io"]
  capabilities = ["pull", "resolve", "push"]
EOF

# nvcr.io镜像加速
mkdir -p /etc/containerd/certs.d/nvcr.io
tee /etc/containerd/certs.d/nvcr.io/hosts.toml << 'EOF'
server = "https://nvcr.io"

[host."https://nvcr.m.daocloud.io"]
  capabilities = ["pull", "resolve", "push"]
EOF

# quay.io镜像加速
mkdir -p /etc/containerd/certs.d/quay.io
tee /etc/containerd/certs.d/quay.io/hosts.toml << 'EOF'
server = "https://quay.io"

[host."https://quay.m.daocloud.io"]
  capabilities = ["pull", "resolve", "push"]
EOF

# registry.jujucharms.com镜像加速
mkdir -p /etc/containerd/certs.d/registry.jujucharms.com
tee /etc/containerd/certs.d/registry.jujucharms.com/hosts.toml << 'EOF'
server = "https://registry.jujucharms.com"

[host."https://jujucharms.m.daocloud.io"]
  capabilities = ["pull", "resolve", "push"]
EOF

# rocks.canonical.com镜像加速
mkdir -p /etc/containerd/certs.d/rocks.canonical.com
tee /etc/containerd/certs.d/rocks.canonical.com/hosts.toml << 'EOF'
server = "https://rocks.canonical.com"

[host."https://rocks-canonical.m.daocloud.io"]
  capabilities = ["pull", "resolve", "push"]
EOF
sed -i "s|registry.k8s.io/pause|registry.cn-hangzhou.aliyuncs.com/google_containers/pause|g" /etc/containerd/config.toml && \
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml && \
systemctl restart containerd && \
containerd config dump | grep -E "sandbox|SystemdCgroup"

配置 crictl 永久使用 endpoint

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

#重启containerd
systemctl restart containerd

安装 Kubernetes 三剑客 (kubeadm, kubelet, kubectl)

使用修正后的阿里云稳定源路径。

Bash

# 1. 添加 K8s 软件源这个只能安装到1.28.2
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF

# 2. 清理并安装核心组件
yum clean all && yum makecache
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

#  设置 kubelet 开机自启
systemctl enable --now kubelet

想要安装最新版本就是用官方源

cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF

# 清理并建立缓存(确认仓库元数据正常)
yum clean all && yum makecache

# 查看所有可用的 kubeadm 版本(从新到旧排序)
yum list --showduplicates kubeadm --disableexcludes=kubernetes

# 安装 kubelet, kubeadm, kubectl(会自动安装最新稳定版)
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

# 启动 kubelet 并设置开机自启
systemctl enable --now kubelet

05-集群高可用初始化

适用机器:仅在 k8s-master-01 (10.0.5.1) 执行

1. 预拉取镜像 (推荐)

在正式初始化前,先使用指定仓库拉取镜像,这样可以避免 kubeadm init 过程中因为网络抖动导致超时报错。

Bash

kubeadm config images pull \
  --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
  --kubernetes-version v1.28.2 # 请确保版本与你安装的 kubeadm 一致

2. 执行集群初始化

注意:--apiserver-advertise-address 必须是当前机器的物理 IP。

Bash

kubeadm init \
  --control-plane-endpoint "lb-vip:6443" \
  --upload-certs \
  --pod-network-cidr=10.244.0.0/16 \
  --apiserver-advertise-address=10.0.5.1 \
  --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
  | tee kubeadm-init.log

#成功的话就配置环境参数
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

如果失败

# 重置 kubeadm 状态
kubeadm reset -f

# 删除旧的集群配置和证书(可选,但推荐确保干净)
rm -rf /etc/kubernetes/*
rm -rf ~/.kube
rm -rf /var/lib/etcd
rm -rf /var/lib/kubelet

# 重启容器运行时和 kubelet
systemctl restart containerd
systemctl restart kubelet

配置 kubectl 权限

初始化成功后,执行以下命令让当前用户可以操作集群:

Bash

# 验证集群状态
kubectl get nodes

4. 提取并保存加入命令

由于是高可用集群,kubeadm 会生成两类加入命令:Master 加入命令Worker 加入命令

Bash

# 1. 保存 Master 加入命令 (含 --control-plane 和 --certificate-key)
# 这个命令用于 master02 和 master03
grep -A 2 "kubeadm join" kubeadm-init.log | head -n 3 > master-join.txt

# 2. 保存 Worker 加入命令
# 这个命令用于 node01 和 node02
grep -A 2 "kubeadm join" kubeadm-init.log | tail -n 3 > node-join.txt

06-网络插件部署 (Calico )

适用机器:仅在 k8s-master-01 执行

1. 下载 Calico 配置文件

不要直接应用远程 URL,先下载到本地进行修改。

Bash

wget https://raw.githubusercontent.com/projectcalico/calico/v26.1/manifests/calico.yaml

2. 修改 Pod 网段 (关键步骤)

你需要找到 CALICO_IPV4POOL_CIDR 这一项,并将其值改为你 kubeadm init 时填写的 10.244.0.0/16

Bash

# 使用 sed 直接修改配置文件
sed -i 's/192.168.0.0\/16/10.244.0.0\/16/g' calico.yaml

(可选) 针对国内环境替换镜像

由于 Calico 的镜像分布在 docker.ioquay.io,如果你担心拉取慢,可以执行以下替换(使用你之前验证成功的加速地址):

Bash

sed -i 's|docker.io/|docker.m.daocloud.io/|g' calico.yaml
sed -i 's|quay.io/|quay.m.daocloud.io/|g' calico.yaml

4. 应用配置

Bash

kubectl apply -f calico.yaml

5. 验证安装状态

你提供的验证命令非常正确,通过 watch 可以实时观察进度。

Bash

watch kubectl get pods -n kube-system -l k8s-app=calico-node

预期结果: 当所有 calico-node 变为 Running 状态,且 READY1/1 时,集群节点就会变为 Ready

07 高可用验证

1 控制平面故障模拟

# 在master01停止服务
systemctl stop kube-apiserver kube-controller-manager kube-scheduler

# 在master02检查状态
kubectl get componentstatus  # 应显示正常
kubectl get pods -A -o wide  # 确认无Pod重启

2 负载均衡切换测试

# 停止lb01的keepalived
systemctl stop keepalived

# 在lb02验证VIP接管
ip addr show eth0 | grep 172.20.1.10
curl -k https://lb-vip:6443/healthz  # 持续访问测试

08 生产环境增强

1 证书管理

# 安装cert-manager
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.12.0/cert-manager.yaml

# 配置自动续期
kubectl edit cm kubeadm-config -n kube-system
# 设置clusterConfiguration.apiServer.timeoutForControlPlane=4m0s

2 命令自动补全

yum install -y bash-completion
echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc

3 为 <font style="color:rgb(0, 0, 0);">k</font> 别名配置补全(进阶必备)

作为 DBA 或系统管理员,你肯定经常用 <font style="color:rgb(0, 0, 0);">alias k=kubectl</font>。默认情况下,别名是没法自动补全的,需要额外配置:

# 1. 设置别名
echo 'alias k=kubectl' >> ~/.bashrc

# 2. 设置别名的补全规则
echo 'complete -o default -F __start_kubectl k' >> ~/.bashrc

#  立即生效
source ~/.bashrc

09 最终验证清单

# 集群状态检查
kubectl get nodes -o wide          # 所有节点Ready
kubectl get pods -A -o wide       # 核心组件运行正常
kubectl get svc -A                # 服务端点正常

# 网络验证
kubectl exec -it <pod-name> -- ping <another-pod-ip>

# 存储测试
kubectl apply -f test-pvc.yaml
kubectl get pvc,pv

10 部署 NFS Provisioner

1、创建 ServiceAccount

现在的 Kubernetes 集群大部分是基于 RBAC 的权限控制,所以创建一个一定权限的 ServiceAccount 与后面要创建的 “NFS Provisioner” 绑定,赋予一定的权限。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  namespace: default # 替换成你要部署的 Namespace
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  namespace: default
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  namespace: default
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    namespace: default
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io

创建 RBAC:

kubectl apply -f nfs-rbac.yaml

2、部署 NFS-Subdir-External-Provisioner

创建 NFS Provisioner 部署文件,这里将其部署到 “default” Namespace 中。

<font style="color:rgb(36, 41, 46);background-color:rgba(27, 31, 35, 0.05);">nfs-provisioner-deploy.yaml</font>

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
spec:
  replicas: 1
  strategy:
    type: Recreate                   ## 设置升级策略为删除再创建(默认为滚动更新)
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          #image: gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.0
          image: registry.cn-beijing.aliyuncs.com/xngczl/nfs-subdir-external-provisione:v4.0.0
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME     ## Provisioner的名称,以后设置的storageclass要和这个保持一致
              value: nfs-client
            - name: NFS_SERVER           ## NFS服务器地址,需和valumes参数中配置的保持一致
              value: 172.16.106.205
            - name: NFS_PATH             ## NFS服务器数据存储目录,需和valumes参数中配置的保持一致
              value: /nfs/data
      volumes:
        - name: nfs-client-root
          nfs:
            server: 172.16.106.205     ## NFS服务器地址
            path: /nfs/data            ## NFS服务器数据存储目录

创建 NFS Provisioner:

# -n: 指定应用部署的 Namespace
kubectl apply -f nfs-provisioner-deploy.yaml

3、创建 NFS SotageClass

创建一个 StoageClass,声明 NFS 动态卷提供者名称为 “nfs-storage”。

nfs-storage.yaml:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
  annotations:
    storageclass.kubernetes.io/is-default-class: "false"  ## 是否设置为默认的storageclass
provisioner: nfs-client                                   ## 动态卷分配者名称,必须和上面创建的"provisioner"变量中设置的Name一致
parameters:
  archiveOnDelete: "true"                                 ## 设置为"false"时删除PVC不会保留数据,"true"则保留数据
mountOptions:
  - hard                                                  ## 指定为硬挂载方式
  - nfsvers=4                                             ## 指定NFS版本,这个需要根据NFS Server版本号设置

创建 StorageClass:

kubectl apply -f nfs-storage.yaml

4、创建 PVC 和 Pod 进行测试

1、创建测试 PVC

在 Namespace 下创建一个测试用的 PVC 并观察是否自动创建是 PV 与其绑定。

<font style="color:rgb(36, 41, 46);background-color:rgba(27, 31, 35, 0.05);">test-pvc.yaml</font>

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-pvc
spec:
  storageClassName: nfs-storage #---需要与上面创建的storageclass的名称一致
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Mi

创建 PVC:

kubectl apply -f test-pvc.yaml

查看 PVC 状态是否与 PV 绑定
利用 Kubectl 命令获取 pvc 资源,查看 STATUS 状态是否为 “Bound”。

$ kubectl get pvc test-pvc 
NAME       STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
test-pvc   Bound    pvc-105a5f32-e4dd-4b1d-943b-c4f2ca498f60   1Mi        RWO            nfs-storage-new   45m

2、创建测试 Pod 并绑定 PVC

创建一个测试用的 Pod,指定存储为上面创建的 PVC,然后创建一个文件在挂载的 PVC 目录中,然后进入 NFS 服务器下查看该文件是否存入其中。

<font style="color:rgb(36, 41, 46);background-color:rgba(27, 31, 35, 0.05);">test-pod.yaml</font>

kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  containers:
  - name: test-pod
    image: busybox:latest
    command:
      - "/bin/sh"
    args:
      - "-c"
      - "touch /mnt/SUCCESS && exit 0 || exit 1"  #创建一个名称为"SUCCESS"的文件
    volumeMounts:
      - name: nfs-pvc
        mountPath: "/mnt"
  restartPolicy: "Never"
  volumes:
    - name: nfs-pvc
      persistentVolumeClaim:
        claimName: test-pvc

创建 Pod:

# -n:指定创建 Pod 的 Namespace
kubectl apply -f test-pod.yaml

4、进入 NFS 服务器验证是否创建对应文件

进入 NFS 服务器的 NFS 挂载目录,查看是否存在 Pod 中创建的文件:

[root@nfs ~]# cd /nfs/data/
[root@nfs data]# ll
总用量 4
drwxrwxrwx 2 root root 4096 10月 17 12:29 default-test-pvc-pvc-e85690ac-311f-46fa-af88-9501e35f8582
[root@nfs data]# cd default-test-pvc-pvc-e85690ac-311f-46fa-af88-9501e35f8582/
[root@nfs default-test-pvc-pvc-e85690ac-311f-46fa-af88-9501e35f8582]# ll
总用量 0
-rw-r--r-- 1 root root 0 10月 17 12:29 SUCCESS
[root@nfs default-test-pvc-pvc-e85690ac-311f-46fa-af88-9501e35f8582]#

可以看到已经生成 SUCCESS 该文件,并且可知通过 NFS Provisioner 创建的目录命名方式为<font style="color:rgb(36, 41, 46);background-color:rgba(27, 31, 35, 0.05);">“namespace名称-pvc名称-pv名称”</font>,pv 名称是随机字符串,所以每次只要不删除 PVC,那么 Kubernetes 中的与存储绑定将不会丢失,要是删除 PVC 也就意味着删除了绑定的文件夹,下次就算重新创建相同名称的 PVC,生成的文件夹名称也不会一致,因为 PV 名是随机生成的字符串,而文件夹命名又跟 PV 有关,所以删除 PVC 需谨慎

📚 Ingress 配置完整教程

一、前置条件检查

1. 确认 Ingress Controller 已安装

  # 查看 ingress-nginx 的 Pod
  kubectl get pods -n ingress-nginx

  # 查看 Ingress Controller 的 Service(找到 NodePort)
  kubectl get svc -n ingress-nginx

输出示例:

  NAME                                 TYPE       CLUSTER-IP      EXTERNAL-IP
PORT(S)                      AGE
  ingress-nginx-controller             NodePort   10.100.126.142  <none>
80:32425/TCP,443:31292/TCP   145m

关键点:记住 80

/TCP,意思是外部访问 32425 端口,转发到内部的 80 端口。

二、创建 Ingress 资源

1. 编写 YAML 配置文件

  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    name: k8m-ingress                    # Ingress 名称
    namespace: k8m                       # 和后端 Service 同一个命名空间
    annotations:
      nginx.ingress.kubernetes.io/rewr ite-target: /          # URL 重写
      nginx.ingress.kubernetes.io/ssl- redirect: "false"      # 不强制 HTTPS
  spec:
    ingressClassName: nginx              # 指定使用 nginx Ingress Controller
    rules:
    - host: k8m.local                    # 访问域名
      http:
        paths:
        - path: /                        # 路径匹配
          pathType: Prefix               # 前缀匹配(还有
Exact、ImplementationSpecific)
          backend:                       # 后端服务
            service:
              name: k8m                  # Service 名称
              port:
                number: 3618             # Service 端口

2. 创建 Ingress

  kubectl apply -f k8m-ingress.yaml

3. 验证

  # 查看 Ingress
  kubectl get ing -n k8m

  # 查看详情
  kubectl describe ing -n k8m k8m-ingress

三、访问测试

1. 集群内测试

  # 通过 Ingress Controller 的 ClusterIP 测试
  curl -H "Host: k8m.local" http://10.100.126.142

  # 或通过节点 IP + NodePort 测试
  curl -H "Host: k8m.local" http://10.0.5.1:32425

2. 外部访问

在浏览器或本地 hosts 添加:

  10.0.5.1  k8m.local

然后访问:http://k8m.local

四、常用注解说明

当然,根据您提供的内容,下面是以表格形式整理的信息:

希望这符合您的需求!如果还有其他调整或进一步的帮助需要,请告诉我。

注解作用示例
rewrite-targetURL 重写/ 或 /$1
ssl-redirect强制 HTTPS”true” / “false”
nginx.ingress.kubernetes.io/proxy-body-size上传大小限制”100m”
nginx.ingress.kubernetes.io/affinitySession 保持”cookie”

五、进阶配置示例

1. 多路径路由(一个 Ingress 多个服务)

  spec:
    rules:
    - host: k8m.local
      http:
        paths:
        - path: /api
          pathType: Prefix
          backend:
            service:
              name: k8m-api
              port:
                number: 8080
        - path: /web
          pathType: Prefix
          backend:
            service:
              name: k8m-web
              port:
                number: 80

2. 配置 HTTPS

  spec:
    tls:
    - hosts:
      - k8m.local
      secretName: k8m-tls-secret   # TLS 证书 Secret
    rules:
    - host: k8m.local
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: k8m
              port:
                number: 3618

3. 多域名配置

  spec:
    rules:
    - host: k8m.example.com
      http:
        paths:
        - path: /
          backend:
            service:
              name: k8m
              port:
                number: 3618
    - host: admin.example.com
      http:
        paths:
        - path: /
          backend:
            service:
              name: k8m-admin
              port:
                number: 8080

六、排查问题的命令

  # 查看 Ingress 状态
  kubectl get ing -n k8m

  # 查看 Ingress 详细信息(包括 Events)
  kubectl describe ing -n k8m k8m-ingress

  # 查看 Ingress Controller 日志
  kubectl logs -n ingress-nginx -l app.kubernetes.io/component=cont roller --tail=50

  # 测试后端 Service 是否正常
  kubectl get svc -n k8m
  curl http://<Service-ClusterIP>:<Port >

七、完整操作流程总结

  1. 确认 Ingress Controller 已安装并运行

  2. 确认后端 Service 正常(ClusterIP + 端口)

  3. 编写 Ingress YAML(指定 host、path、backend)

  4. kubectl apply 创建 Ingress

  5. 通过 NodePort 或 LoadBalancer 访问

  6. 测试验证(curl 或浏览器)
Linux Docker Kubernetes LVM 网络 存储