kube-ingress如何配置

联启 网络工具 13

本文目录导读:

kube-ingress如何配置-第1张图片-电脑手机工具软件下载 - 免费实用工具合集 | 联启科技

  1. 第一步:部署 Ingress Controller
  2. 第二步:创建 Ingress 资源
  3. 第三步:访问验证
  4. 常用调试命令
  5. 常见错误排查
  6. 补充:使用 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 类型通常是 LoadBalancerNodePort


第二步:创建 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:匹配的域名(不写则匹配所有域名)
  • pathTypePrefix(前缀匹配)或 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"           # 限速

第三步:访问验证

本地测试(无域名时)

  1. 获取 Ingress Controller 的 NodePort:
    kubectl get svc -n ingress-nginx
  2. 修改本地 hosts 文件(Linux/Mac:/etc/hosts,Windows:C:\Windows\System32\drivers\etc\hosts):
    <NodeIP> example.com
  3. 访问:http://example.com:NodePort/app

云环境(有 LoadBalancer)

  1. 获取 External IP:
    kubectl get svc -n ingress-nginx

    输出类似:EXTERNAL-IP: xxx.xxx.xxx.xxx

  2. 将域名 DNS 的 A 记录指向此 IP
  3. 直接访问: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

抱歉,评论功能暂时关闭!