Kubernetes Ingress 控制器配置
Kubernetes Ingress 是管理集群外部访问集群内服务的 API 对象,通常提供 HTTP/HTTPS 路由功能。Ingress Controller 是实际处理 Ingress 规则的组件,其中 Nginx Ingress Controller 是使用最广泛的实现。本文将介绍如何在搬瓦工 VPS 的 K8S 集群中配置 Ingress 控制器。
一、Ingress 基本概念
- Ingress:定义路由规则的 K8S 资源,指定域名、路径到 Service 的映射。
- Ingress Controller:监听 Ingress 资源变化并配置负载均衡器的控制器。
- IngressClass:当集群中有多个 Ingress Controller 时,用于指定使用哪个。
二、安装 Nginx Ingress Controller
2.1 使用 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 \
--set controller.service.type=NodePort \
--set controller.service.nodePorts.http=30080 \
--set controller.service.nodePorts.https=30443
在搬瓦工 VPS 上没有云厂商的 LoadBalancer,建议使用 NodePort 或 HostNetwork 模式。
2.2 使用 HostNetwork 模式
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.hostNetwork=true \
--set controller.service.type="" \
--set controller.kind=DaemonSet
HostNetwork 模式下 Ingress Controller 直接使用宿主机的 80/443 端口。
2.3 验证安装
kubectl get pods -n ingress-nginx
kubectl get svc -n ingress-nginx
三、创建 Ingress 规则
3.1 基于域名的路由
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: app.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app-service
port:
number: 80
- host: api.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8080
3.2 基于路径的路由
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: path-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: nginx
rules:
- host: yourdomain.com
http:
paths:
- path: /app(/|$)(.*)
pathType: ImplementationSpecific
backend:
service:
name: app-service
port:
number: 80
- path: /api(/|$)(.*)
pathType: ImplementationSpecific
backend:
service:
name: api-service
port:
number: 8080
四、配置 TLS/HTTPS
4.1 手动配置证书
# 创建 TLS Secret
kubectl create secret tls tls-secret \
--cert=fullchain.pem \
--key=privkey.pem \
-n default
在 Ingress 中引用:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx
tls:
- hosts:
- app.yourdomain.com
secretName: tls-secret
rules:
- host: app.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app-service
port:
number: 80
4.2 使用 cert-manager 自动管理证书
# 安装 cert-manager
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--set installCRDs=true
创建 ClusterIssuer:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: your@email.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
在 Ingress 中使用注解自动申请证书:
metadata:
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
五、常用注解
metadata:
annotations:
# 强制 HTTPS 跳转
nginx.ingress.kubernetes.io/ssl-redirect: "true"
# 上传文件大小限制
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
# 超时设置
nginx.ingress.kubernetes.io/proxy-connect-timeout: "60"
nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
# 限速
nginx.ingress.kubernetes.io/limit-rps: "10"
# CORS 配置
nginx.ingress.kubernetes.io/enable-cors: "true"
# WebSocket 支持
nginx.ingress.kubernetes.io/proxy-http-version: "1.1"
nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"
六、默认后端
配置当请求不匹配任何 Ingress 规则时的默认处理:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: default-backend
spec:
ingressClassName: nginx
defaultBackend:
service:
name: default-service
port:
number: 80
七、常见问题
Ingress 不生效
kubectl describe ingress app-ingress
kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
502 Bad Gateway
通常是后端 Service 或 Pod 不可用:
kubectl get svc app-service
kubectl get endpoints app-service
kubectl get pods -l app=myapp
证书不生效
kubectl describe certificate -A
kubectl get certificaterequest -A
kubectl logs -n cert-manager -l app=cert-manager
总结
Ingress Controller 是 Kubernetes 集群对外提供服务的核心组件,通过域名和路径路由可以在单一入口点管理多个服务。搭配 cert-manager 可以实现 TLS 证书的自动管理。选购搬瓦工 VPS 请参考 全部方案,使用优惠码 NODESEEK2026 享受 6.77% 折扣。