我正在尝试将 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
中安装了 oauth2-proxy
hello-kubernetes
用于测试目的对于
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
吗?
我明白了。
这个问题帮助了我:通过 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>