K8s 多主集群部署实战指南
00 角色分配与环境清单(建议方案)
| 角色 | 数量 | 推荐主机名 | 建议配置 | 关键组件 |
|---|---|---|---|---|
| Master | 3 | k8s-master-01/02/03 | 2C/4G | API Server, Etcd, Controller, Scheduler |
| Worker | 3 | k8s-node-01/02 | 2C/4G | Kubelet, Containerd/Docker, Proxy |
| Load Balancer | 2 | k8s-lb-01/02 | 1C/1G | HAProxy, Keepalived |
| VIP | 1 | - | - | 虚拟 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
EOF02-负载均衡层部署 (HAProxy)
适用机器:k8s-lb-01 (10.0.5.6), k8s-lb-02 (10.0.5.7)
1. 安装 HAProxy
yum install -y haproxy2. 生成配置文件
注意:已经根据你的规划补全了 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 haproxy02-负载均衡层部署 (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 keepalived2. 配置 Keepalived
注意: 请先执行 ip add 查看你的网卡名称(如 ens33 或 eth0),如果不是 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.iocontainerd配置镜像加速
- 配置文档:github.com/containerd/…
- 镜像源收集地址:github.com/DaoCloud/pu…
1.修改/etc/containerd/config.toml配置文件
指定config_path的目录
sed -i 's|config_path = .*|config_path = "/etc/containerd/certs.d"|' /etc/containerd/config.toml2.创建目录
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"]
EOFsed -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 kubelet05-集群高可用初始化
适用机器:仅在 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 nodes4. 提取并保存加入命令
由于是高可用集群,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.txt06-网络插件部署 (Calico )
适用机器:仅在 k8s-master-01 执行
1. 下载 Calico 配置文件
不要直接应用远程 URL,先下载到本地进行修改。
Bash
wget https://raw.githubusercontent.com/projectcalico/calico/v26.1/manifests/calico.yaml2. 修改 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.io 和 quay.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.yaml4. 应用配置
Bash
kubectl apply -f calico.yaml5. 验证安装状态
你提供的验证命令非常正确,通过 watch 可以实时观察进度。
Bash
watch kubectl get pods -n kube-system -l k8s-app=calico-node预期结果: 当所有 calico-node 变为 Running 状态,且 READY 为 1/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=4m0s2 命令自动补全
yum install -y bash-completion
echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc3 为 <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 ~/.bashrc09 最终验证清单
# 集群状态检查
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,pv10 部署 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.yaml2、部署 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.yaml3、创建 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.yaml4、创建 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 45m2、创建测试 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.yaml4、进入 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.yaml3. 验证
# 查看 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:324252. 外部访问
在浏览器或本地 hosts 添加:
10.0.5.1 k8m.local然后访问:http://k8m.local
四、常用注解说明
当然,根据您提供的内容,下面是以表格形式整理的信息:
希望这符合您的需求!如果还有其他调整或进一步的帮助需要,请告诉我。
| 注解 | 作用 | 示例 |
|---|---|---|
| rewrite-target | URL 重写 | / 或 /$1 |
| ssl-redirect | 强制 HTTPS | ”true” / “false” |
| nginx.ingress.kubernetes.io/proxy-body-size | 上传大小限制 | ”100m” |
| nginx.ingress.kubernetes.io/affinity | Session 保持 | ”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: 802. 配置 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: 36183. 多域名配置
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 或浏览器)