如何让 Istio 识别 k8s Ingress?

问题描述 投票:0回答:1

我正在尝试将 cert-manager 与 Let's Encrypt 结合使用,通过 HTTP-01 质询来颁发证书。

看起来像路由问题 - 证书卡在域控制验证上并出现错误:

Waiting for HTTP-01 challenge propagation: wrong status code '304', expected '200'
。到应用程序的路由 (oauth2-proxy) 正在运行,因此它会以
403
进行响应 -
oauth2-proxy
的标准。

软件堆栈:

  • 使用
    helm
    版本 1.19.3 安装 Istio(
    base
    +
    istiod
    位于命名空间
    istio-system
    gateway
    位于单独的
    istio-ingress-public
    - 就像 Istio 文档中一样)
  • 使用
  • helm
     版本 1.13.2 在命名空间 
    cert-manager
     中安装了 
  • cert-manager
  • 命名空间中的应用程序本身(oauth2-proxy)
    oauth2-proxy
  • hello-kubernetes
    用于测试目的
  • k8s版本1.26.4

对于

oauth2-proxy
hello-kubernetes
,我在其命名空间中都有原生 Istio
Gateway
VirtualService
,并且它可以工作。

为了

cert-manager
,我创造了
Issuer

我在命名空间

Certificate
中创建了
oauth2-proxy
,并且证书管理器创建了
CertificateRequest
Order
Challenge
Ingress
Service
Pod
来处理验证。

我为 Istio 创建了

IngressClass

kubectl get IngressClass -o yaml
apiVersion: v1
items:
- apiVersion: networking.k8s.io/v1
  kind: IngressClass
  metadata:
    creationTimestamp: "2023-11-03T12:12:09Z"
    generation: 1
    name: istio
    resourceVersion: "4756892"
    uid: cd6205b9-e818-48dd-8882-59c6d038e28e
  spec:
    controller: istio.io/ingress-controller
kind: List
metadata:
  resourceVersion: ""

Ingress
.spec.ingressClassName
设置为
istio
:

kubectl get Ingress -o yaml -n oauth2-proxy
apiVersion: v1
items:
- apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    annotations:
      nginx.ingress.kubernetes.io/whitelist-source-range: 0.0.0.0/0,::/0
    creationTimestamp: "2023-11-03T14:03:42Z"
    generateName: cm-acme-http-solver-
    generation: 1
    labels:
      acme.cert-manager.io/http-domain: "1390741491"
      acme.cert-manager.io/http-token: "1315376821"
      acme.cert-manager.io/http01-solver: "true"
    name: cm-acme-http-solver-4z6kk
    namespace: oauth2-proxy
    ownerReferences:
    - apiVersion: acme.cert-manager.io/v1
      blockOwnerDeletion: true
      controller: true
      kind: Challenge
      name: oauth2-proxy-cert-staging-1-2829224423-1571648249
      uid: 95daf075-ee7e-465e-b129-9d99218addf1
    resourceVersion: "4774848"
    uid: e6a15d62-e010-4b16-8ee0-86bf809e5365
  spec:
    ingressClassName: istio
    rules:
    - host: apps.mydomain.com
      http:
        paths:
        - backend:
            service:
              name: cm-acme-http-solver-spkrv
              port:
                number: 8089
          path: /.well-known/acme-challenge/************
          pathType: ImplementationSpecific
  status:
    loadBalancer: {}
kind: List
metadata:
  resourceVersion: ""

我按照文档将 Istio 与 cert-manager 集成:Istio / cert-manager 以及如何处理 k8s

Ingress
Istio / Kubernetes Ingress

我也尝试使用

kubernetes.io/ingress.class
注释获得相同的结果 - 没有新路线。

我做错了什么?从文档看来,将

Ingress
设置为
.spec.ingressClassName
istio
应该在没有任何其他配置的情况下进行处理。是否需要像以前的 Istio 版本一样设置任何标志?我在
helm
值中没有找到它...

创建

Ingress
后会发生什么?我假设应该使用
istioctl
创建并显示新路线。 Istio 应该创建新的
VirtualService
吗?

istio lets-encrypt cert-manager istio-gateway
1个回答
0
投票

我明白了。

这个问题帮助了我:通过 Helm 安装时,Istio + Istio Gateway 的证书挑战失败 · 问题 #37329 · istio/istio (github.com)

Istio 配置取决于您的安装方式。如果使用 helm 安装,则需要配置几个值才能使其工作。当然,值可能会根据您的环境而变化 - 但如果不设置它们,Istio 就无法识别

Ingress
资源。

  set {
    name  = "meshConfig.ingressService"
    value = "istio-ingress"
  }
  set {
    name  = "meshConfig.ingressSelector"
    value = "ingress"
  }

正确配置后,Istio 将创建

VirtualService
来处理挑战,您应该能够使用
istioctl
调试 Istio 配置:

// list ingress gateways
$ istioctl proxy-status

// show routes
$ istioctl proxy-config routes -n <ingress_gateway_namespace> <ingress_gateway_name_from_previous_command>
© www.soinside.com 2019 - 2024. All rights reserved.