本文目录导读:

- 第一步:部署 Ingress Controller
- 第二步:创建 Ingress 资源
- 第三步:访问验证
- 常用调试命令
- 常见错误排查
- 补充:使用 cert-manager 自动签发 Let‘s Encrypt 证书
在 Kubernetes 中配置 Ingress 主要分为三个步骤:部署 Ingress Controller、创建 Ingress 资源、配置 DNS 或 hosts 文件。
下面以最常用的 Nginx Ingress Controller 为例,给出完整配置指南。
第一步:部署 Ingress Controller
Ingress 只是一个 API 对象,需要 Ingress Controller(如 Nginx、Traefik)来实际处理流量。
使用官方 YAML 部署 Nginx Ingress Controller
# 适用于 Kubernetes 1.19+ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.1/deploy/static/provider/cloud/deploy.yaml # 或者使用 Helm(推荐) helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update helm install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --create-namespace
验证部署
kubectl get pods -n ingress-nginx kubectl get svc -n ingress-nginx
你会看到 ingress-nginx-controller 的 Service 类型通常是 LoadBalancer 或 NodePort。
第二步:创建 Ingress 资源
假设你已经部署了两个 Service:
my-app-service(端口 80)my-api-service(端口 80)
最简单的单域名配置
# ingress-basic.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx # 指定 Ingress Controller
rules:
- host: example.com # 你的域名
http:
paths:
- path: /app
pathType: Prefix
backend:
service:
name: my-app-service
port:
number: 80
- path: /api
pathType: Prefix
backend:
service:
name: my-api-service
port:
number: 80
解释:
host:匹配的域名(不写则匹配所有域名)pathType:Prefix(前缀匹配)或Exact(精确匹配)nginx.ingress.kubernetes.io/rewrite-target: /:将路径重写为 ,避免路径丢失
HTTPS 配置(使用 TLS 证书)
先创建 Secret 存放证书:
kubectl create secret tls my-tls-secret \ --cert=path/to/tls.crt \ --key=path/to/tls.key
然后在 Ingress 中引用:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: https-ingress
spec:
ingressClassName: nginx
tls:
- hosts:
- example.com
secretName: my-tls-secret # 上面创建的 Secret
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-service
port:
number: 80
使用 Annotation 自定义行为
Nginx Ingress 支持大量 Annotation 来定制功能:
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/ssl-redirect: "true" # 强制 HTTPS
nginx.ingress.kubernetes.io/cors-allow-origin: "*" # CORS
nginx.ingress.kubernetes.io/proxy-body-size: "50m" # 上传大小限制
nginx.ingress.kubernetes.io/limit-rps: "10" # 限速
第三步:访问验证
本地测试(无域名时)
- 获取 Ingress Controller 的 NodePort:
kubectl get svc -n ingress-nginx
- 修改本地 hosts 文件(Linux/Mac:
/etc/hosts,Windows:C:\Windows\System32\drivers\etc\hosts):<NodeIP> example.com - 访问:
http://example.com:NodePort/app
云环境(有 LoadBalancer)
- 获取 External IP:
kubectl get svc -n ingress-nginx
输出类似:
EXTERNAL-IP: xxx.xxx.xxx.xxx - 将域名 DNS 的 A 记录指向此 IP
- 直接访问:
http://example.com/app
常用调试命令
# 查看 Ingress 是否正常 kubectl describe ingress my-ingress # 查看 Ingress Controller 日志 kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx # 检查 Service 端点 kubectl get endpoints my-app-service
常见错误排查
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 404 错误 | 路径未重写 | 添加 rewrite-target annotation |
| TLS 证书无效 | Secret 格式错误 | 检查证书是否 Base64 编码正确 |
| 无法访问 | 未指定 ingressClassName |
确保 ingressClassName: nginx |
| 连接超时 | Service 端口错误 | 确认 Service 的 targetPort 正确 |
补充:使用 cert-manager 自动签发 Let‘s Encrypt 证书
生产环境推荐使用 cert-manager 自动管理 HTTPS 证书:
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: your-email@example.com
privateKeySecretRef:
name: letsencrypt-prod-key
solvers:
- http01:
ingress:
class: nginx
然后在 Ingress 中添加 annotation:
annotations: cert-manager.io/cluster-issuer: "letsencrypt-prod"
如果需要更复杂的场景(如金丝雀发布、自定义错误页面、多 Controller 共存),可以进一步提问,我会为你详细讲解。
标签: ingress