1. 项目概述与背景
最近在准备CKA认证考试时,发现2025年新版考纲增加了不少关于Ingress-Nginx的实操题目。作为Kubernetes中最重要的流量入口组件,Ingress-Nginx的部署和配置确实是每个云原生工程师必须掌握的硬技能。我在自己的实验环境中反复测试了各种部署方案,整理出这份兼顾考试要求和生产实践的操作指南。
这个练习环境特别针对CKA考试中可能出现的几种典型场景:
- 基础Ingress资源创建与路由规则配置
- TLS证书管理与HTTPS终结点设置
- 流量切分与金丝雀发布实现
- 自定义错误页面与重定向规则
注意:所有操作均在Kubernetes 1.28+版本验证通过,与CKA 2025考试环境保持一致。建议使用至少2个Worker节点的集群进行练习。
2. 环境准备与前置检查
2.1 集群基础配置
首先确认集群节点满足最低要求:
bash复制kubectl get nodes -o wide
输出应显示至少1个Control Plane和2个Worker节点,且所有节点状态为Ready。如果使用Minikube或Kind等单节点工具,需要额外配置:
bash复制minikube addons enable ingress
2.2 网络插件兼容性检查
不同CNI插件可能影响Ingress功能,建议使用这些经过验证的组合:
- Calico 3.25+
- Flannel v0.22+
- Cilium 1.14+
验证网络策略是否允许Ingress流量:
bash复制kubectl get networkpolicy --all-namespaces
3. Ingress-Nginx部署方案选择
3.1 官方Helm Chart部署(推荐方案)
这是目前最稳定的部署方式,支持灵活的定制参数:
bash复制helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.type=NodePort \
--set controller.admissionWebhooks.enabled=false
关键参数说明:
controller.service.type: 考试环境通常用NodePort,生产环境用LoadBalancercontroller.admissionWebhooks.enabled: 关闭准入控制可简化考试环境controller.ingressClassResource.default: 设为true可省略ingressClassName指定
3.2 裸Manifest部署(备选方案)
适合需要深度定制控制器的场景:
bash复制kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml
部署后验证控制器状态:
bash复制kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
4. 核心功能配置实战
4.1 基础路由规则配置
创建测试Deployment和Service:
yaml复制# echo-server.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo-server
spec:
replicas: 2
selector:
matchLabels:
app: echo
template:
metadata:
labels:
app: echo
spec:
containers:
- name: nginx
image: k8s.gcr.io/echoserver:1.10
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: echo-service
spec:
selector:
app: echo
ports:
- protocol: TCP
port: 80
targetPort: 8080
配置Ingress路由:
yaml复制# basic-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: basic-ingress
spec:
ingressClassName: nginx
rules:
- host: echo.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: echo-service
port:
number: 80
验证路由生效:
bash复制curl -H "Host: echo.example.com" http://<NODE_IP>:<NODE_PORT>
4.2 TLS证书配置
生成自签名证书(考试环境用):
bash复制openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout tls.key -out tls.crt \
-subj "/CN=echo.example.com"
创建Secret:
bash复制kubectl create secret tls echo-tls --cert=tls.crt --key=tls.key
更新Ingress配置:
yaml复制# tls-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-ingress
spec:
ingressClassName: nginx
tls:
- hosts:
- echo.example.com
secretName: echo-tls
rules:
- host: echo.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: echo-service
port:
number: 80
HTTPS访问测试:
bash复制curl -k https://echo.example.com
5. 高级功能与调试技巧
5.1 流量切分配置
实现按权重分流:
yaml复制# canary-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: canary-ingress
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "30"
spec:
ingressClassName: nginx
rules:
- host: echo.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: canary-service
port:
number: 80
5.2 日志分析与问题排查
查看控制器日志:
bash复制kubectl logs -n ingress-nginx \
-l app.kubernetes.io/name=ingress-nginx \
--tail=100
启用详细日志模式:
yaml复制# patch-log.yaml
data:
log-level: "4"
bash复制kubectl patch configmap -n ingress-nginx ingress-nginx-controller --patch-file patch-log.yaml
kubectl rollout restart deploy -n ingress-nginx ingress-nginx-controller
6. 典型问题解决方案
6.1 常见错误代码处理
502 Bad Gateway:
- 检查后端Service是否存在且Endpoints正常:
bash复制
kubectl get endpoints echo-service - 验证网络策略是否放行流量
404 Not Found:
- 检查Ingress中pathType设置(Prefix/Exact)
- 确认IngressClass是否正确指定
6.2 性能调优参数
调整Worker进程数:
yaml复制# patch-worker.yaml
data:
worker-processes: "4"
增加Keepalive连接:
yaml复制# patch-keepalive.yaml
data:
keep-alive-requests: "100"
upstream-keepalive-connections: "200"
7. CKA考试特别注意事项
-
时间管理技巧:
- Ingress创建后需要30-60秒生效,建议先创建基础资源
- 使用
kubectl get ingress -w监控状态
-
必会命令速查:
bash复制# 查看Ingress详情 kubectl describe ingress basic-ingress # 获取Nginx配置 kubectl exec -n ingress-nginx ingress-nginx-controller-xxx -- cat /etc/nginx/nginx.conf -
考试环境限制:
- 可能没有互联网访问,提前下载所需镜像
- NodePort范围通常限制在30000-32767
我在实际搭建环境时发现,考试中最容易出错的是pathType的配置。很多同学会忽略这个字段,导致路由规则不生效。记住:在v1版本的Ingress中,pathType是必填字段,且需要根据实际需求选择Prefix或Exact匹配模式。