Már*_*tek 6 ssl nginx kubernetes-helm azure-aks cert-manager
自从我开始学习和实验以来,我对 Kubernetes 的体验相对较少,大约一个月左右。我正在将我的设置从 azure 应用程序服务迁移到 AKS,并且在 nginx 入口控制器和证书管理器协同工作时遇到了一些问题。也许是 dns 记录更改的时间或我安装软件包的方法导致了我的问题
我的一般方法是,我有一个网络图表和一个应用程序图表,这意味着我必须安装网络图表的一个实例/版本,并且我可以安装应用程序图表的多个实例/版本(暂存、质量保证、生产环境)。
我的网络图表如下所示:
图表.yaml:
apiVersion: v2
name: networking
description: A Helm chart for Kubernetes
type: application
version: 0.0.1
appVersion: "1.1.0"
icon: <<I have iconurl here>>
dependencies:
- name: nginx-ingress
version: 0.14.0
repository: https://helm.nginx.com/stable
alias: nginx-ingress
- name: cert-manager
version: 1.8.2
repository: https://charts.jetstack.io
Run Code Online (Sandbox Code Playgroud)
值.yaml:
replicaCount: 1
cert-manager:
installCRDs: true
nginx-ingress:
controller:
service:
annotations:
"service.beta.kubernetes.io/azure-load-balancer-health-probe-request-path": /healthz
Run Code Online (Sandbox Code Playgroud)
我此图表中没有模板
应用程序图表具有给定环境的发行者和入口资源,如下所示:
入口.yaml:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress
{{ if eq .Values.environment "Release" }}
namespace: release
{{ else if eq .Values.environment "ReleaseQA" }}
namespace: release-qa
{{ else if eq .Values.environment "ReleaseProd" }}
namespace: release-prod
{{ else }}
{{ required "value for .Values.environment is not as expected" .Values.environment }}
{{ end }}
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "false"
# ingress.kubernetes.io/ssl-redirect: "false" # I tried these various options
cert-manager.io/issuer: letsencrypt-nginx
# acme.cert-manager.io/http01-ingress-class: "nginx-cert-controller" # I tried these various options
spec:
tls:
{{ if eq .Values.environment "Release" }}
- hosts:
- core.staging.foo.com
secretName: core-cert-nginx
- hosts:
- portal.staging.foo.com
secretName: portal-cert-nginx
- hosts:
#more tsl definitions here for other environments
#and the rules later in the file:
ingressClassName: nginx
rules:
{{ if eq .Values.environment "Release" }}
- host: core.staging.foo.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: core-service
port:
number: 80
- host: portal.staging.foo.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: portal-service
port:
number: 80
Run Code Online (Sandbox Code Playgroud)
发行者.yaml
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt-nginx
{{ if eq .Values.environment "Release" }}
namespace: release
{{ else if eq .Values.environment "ReleaseQA" }}
namespace: release-qa
{{ else if eq .Values.environment "ReleaseProd" }}
namespace: release-prod
{{ else }}
{{ required "value for .Values.environment is not as expected" .Values.environment }}
{{ end }}
spec:
acme:
email: <<my-valid-acme-email>>
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-nginx-private-key
solvers:
# Use the HTTP-01 challenge provider
- http01:
ingress:
class: nginx
Run Code Online (Sandbox Code Playgroud)
所有内部服务和应用程序 Pod 也已创建且运行良好。
所以问题是为什么我的 http01 挑战总是失败?我还在集装箱码头中使用过,并描述了 kubectl 的挑战,但我得到了相同的结果,即无法达到 cert-manager 创建的挑战,换句话说,在配置之间切换时,我得到 302,404,502 代码或只是路由到我的应用程序。
我还遇到了一种奇怪的行为,我无法正确诊断,如果挑战在第一次尝试时没有失败,它就可以通过,并且我可以使用 cet-manager kubectl 扩展来更新它。在这里我应该提到,我正在使用外部域提供商,并且我必须以最短的停机时间重新路由流量,因此在完成挑战之前,在将域地址设置为新 IP 之前,它们可能会失败很多时间。
我可能应该提到我正在使用的 kubernetes 环境详细信息:
平台:Azure AKS
库伯内特版本:1.23.5
nginx-ingress 图表版本:0.14.0
证书管理器图表版本:1.8.2
Pod 中运行的应用程序有:
如果您需要令人上瘾的信息来帮助,请在评论/答案中告诉我。
我通过acme.cert-manager.io/http01-edit-in-place: "true"
在入口处添加注释解决了这个问题。由于某种原因,两种不同的入口资源使我的入口控制器感到困惑。但从那时起,我转向了 dns01 挑战,因为它们提供了更好的多功能性。
归档时间: |
|
查看次数: |
175 次 |
最近记录: |