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% 折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。