在备考CKA认证过程中,Ingress-Nginx的部署与配置是必考的重点内容。我在Ubuntu 22.04环境下使用Kubernetes 1.32版本进行练习时,遇到了Ingress服务无法获取Address的典型问题。这个问题看似简单,实则涉及版本兼容性、网络配置和部署细节等多个关键因素。
首先需要全面检查基础环境配置,这是排查问题的第一步:
bash复制# 检查Kubernetes集群版本一致性
kubectl version --short
kubectl get nodes -o wide
在我的环境中,各组件版本如下:
重要提示:版本一致性是Kubernetes集群稳定运行的基础。虽然小版本差异通常不会导致严重问题,但在认证考试环境中,建议保持所有组件版本完全一致。
Ingress-Nginx与Kubernetes版本存在严格的兼容性要求。通过查阅官方GitHub仓库的兼容性矩阵,我确定了适合Kubernetes 1.32的Ingress-Nginx版本为v1.13.2。
版本选择依据:
bash复制# 获取官方部署清单
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.13.2/deploy/static/provider/cloud/deploy.yaml
由于国内网络环境限制,直接使用registry.k8s.io的镜像可能无法正常拉取。需要将部署文件中的镜像地址替换为国内镜像源:
bash复制# 替换镜像地址为阿里云镜像
sed -i 's|registry.k8s.io/ingress-nginx/|registry.aliyuncs.com/google_containers/|g' deploy.yaml
修改前后的关键变化:
registry.k8s.io/ingress-nginx/controller:v1.13.2registry.aliyuncs.com/google_containers/controller:v1.13.2执行部署命令前,建议先检查默认命名空间下的资源占用情况:
bash复制kubectl get pods -n kube-system
kubectl get svc -n kube-system
确认无冲突后,执行部署:
bash复制# 应用部署清单
kubectl apply -f deploy.yaml
# 验证部署状态
kubectl get pods -n ingress-nginx -w
预期输出应显示所有Pod状态为Running:
code复制NAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7c489dc6b5-2xg4l 1/1 Running 0 2m
默认部署可能不会自动分配外部IP,这是导致Address为空的主要原因。需要根据环境选择合适的服务类型:
yaml复制# 修改Service配置部分
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
type: NodePort # 或LoadBalancer如果有云提供商支持
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
- name: https
port: 443
targetPort: 443
protocol: TCP
selector:
app.kubernetes.io/name: ingress-nginx
根据CKA考试题目要求,首先创建专用命名空间:
bash复制kubectl create ns sound-repeater
kubectl get ns | grep sound-repeater
创建基本的Deployment和Service作为Ingress的后端:
yaml复制# echo-server.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo-server
namespace: sound-repeater
spec:
replicas: 2
selector:
matchLabels:
app: echo
template:
metadata:
labels:
app: echo
spec:
containers:
- name: echo
image: k8s.gcr.io/echoserver:1.10
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: echo-service
namespace: sound-repeater
spec:
selector:
app: echo
ports:
- protocol: TCP
port: 80
targetPort: 8080
应用配置并验证:
bash复制kubectl apply -f echo-server.yaml
kubectl get pods,svc -n sound-repeater
关键步骤是创建正确的Ingress资源定义:
yaml复制# ingress-resource.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: echo-ingress
namespace: sound-repeater
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: echo.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: echo-service
port:
number: 80
应用Ingress配置:
bash复制kubectl apply -f ingress-resource.yaml
kubectl get ingress -n sound-repeater -w
当Ingress资源无法获取Address时,需要系统性地检查以下方面:
Ingress控制器状态:
bash复制kubectl get pods -n ingress-nginx
kubectl logs -n ingress-nginx <controller-pod-name>
Service配置:
bash复制kubectl get svc -n ingress-nginx
网络插件兼容性:
bash复制kubectl get pods -n kube-system | grep -E 'calico|flannel'
根据我的实践经验,以下方法通常有效:
明确指定Ingress类:
yaml复制spec:
ingressClassName: nginx
检查控制器日志:
bash复制kubectl logs -n ingress-nginx <controller-pod-name> | grep -i error
验证网络策略:
bash复制kubectl get networkpolicy -A
临时解决方案(仅限测试环境):
bash复制# 修改控制器Service为NodePort
kubectl patch svc ingress-nginx-controller -n ingress-nginx -p '{"spec":{"type":"NodePort"}}'
对于生产环境,建议调整控制器资源限制:
yaml复制# deploy.yaml部分修改
resources:
limits:
cpu: 1000m
memory: 1Gi
requests:
cpu: 500m
memory: 512Mi
配置Prometheus监控指标采集:
yaml复制metrics:
enabled: true
serviceMonitor:
enabled: true
namespace: monitoring
启用HTTPS:
yaml复制tls:
- hosts:
- echo.example.com
secretName: example-tls
限制访问IP:
yaml复制nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.1.0/24"
请求速率限制:
yaml复制nginx.ingress.kubernetes.io/limit-rpm: "100"
时间管理:
命令速查:
bash复制# 快速验证Ingress状态
kubectl describe ingress -n <namespace> <ingress-name>
# 查看控制器日志
kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
常见错误规避:
环境重置技巧:
bash复制# 快速清理测试资源
kubectl delete -f deploy.yaml
kubectl delete ns sound-repeater
在实际考试环境中,遇到问题时不要慌张。我的经验是,90%的Ingress相关问题都可以通过检查控制器日志和验证网络连通性来解决。记住考试允许查阅官方文档,合理利用kubectl explain命令快速获取字段定义。