我有一个通用的SSL证书*.domain.com 我想为 4 级域配置 HTTPS (my4.level.domain.com( 我在这个讨论中读到,我需要使用 --default-ssl-certificate
但是我不明白如何使用它
我应该如何更改此配置?
ingress:
enabled: true
annotations: {}
labels: {}
path: /
hosts:
- my4.level.domain.com
extraPaths: []
tls:
- secretName: tls-tierra-ingress
hosts:
- '*.level.domain.com'
- level.domain.com
- my4.level.domain.com
还是我必须运行特殊命令?
对于将来正在研究此问题的人:
TLDR
如果要使用 helm 安装 ingress-nginx,则需要使用 values.yaml 中的 controller.extraArgs 指定default-ssl-certificate
--set controller.extraArgs.default-ssl-certificate="__NAMESPACE__/_SECRET__"
非顶级域名
我的设置
- 证书管理器 + origin-ca-issuer(我正在使用
origin-ca-issuer
命名空间(- 创建 Cloudflare 密钥作为机密 + 源颁发者
- 创建证书
- Cloudflare 中的 DNS 区域 + 指向负载均衡器的 DNS 条目 + TLS 完整 + 严格
- Create Ingress-nginx with Helm
helm install ingress-nginx ingress-nginx/ingress-nginx
--version 4.2.5
--create-namespace
--namespace ingress-nginx
--set controller.admissionWebhooks.patch.image.registry=k8s.gcr.io
--set controller.admissionWebhooks.patch.image.image=ingress-nginx/kube-webhook-certgen
--set controller.admissionWebhooks.patch.image.tag=v1.1.1
--set controller.admissionWebhooks.patch.image.digest=""
--set controller.admissionWebhooks.patch.nodeSelector."kubernetes.io/os"=linux
--set controller.extraArgs.default-ssl-certificate="origin-ca-issuer/wildcard-domain-name-secret"
--set controller.image.registry=k8s.gcr.io
--set controller.image.image=ingress-nginx/controller
--set controller.image.tag=v1.3.1
--set controller.image.digest=""
--set controller.kind=DaemonSet
--set controller.nodeSelector."kubernetes.io/os"=linux
--set controller.service.annotations."service.beta.kubernetes.io/aws-load-balancer-healthcheck-path"=/
--set controller.service.externalTrafficPolicy=Local
此设置的好处是,它允许我避免在每个入口清单中写入tls
块。
--default-ssl-certificate
是Ingress controller
内部使用的参数。下面是入口控制器接受的所有命令行参数的列表。
要查看使用了哪些参数,您可以执行kubectl describe deployment/nginx-ingress-controller --namespace
您可能会看到:
Args:
--default-backend-service=$(POD_NAMESPACE)/default-http-backend
--tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
--annotations-prefix=nginx.ingress.kubernetes.io
您可以编辑控制器yaml
并放置设置所需的内容,如果您没有该文件,则可以使用以下方法将部署的入口另存为ingress-controller.yaml
: kubectl get deployment/nginx-ingress-controller --namespace -o yaml > ingress-controller.yaml
您也可以使用以下方法即时编辑ingress
: kubectl edit deployment/nginx-ingress-controller --namespace
至于4级域SSL证书,我还没有尝试过,很遗憾我无能为力。
我正在使用 Helm 部署我的入口,但无法设置controller.extraArgs
,所以我使用以下方法修补了 nginx 控制器:
kubectl patch deployment "nginx-ingress-ingress-nginx-controller"
-n "default"
--type "json"
--patch '[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--default-ssl-certificate=default/certificate"}]'
我没有 Kubernetes,但从这篇文章来看: https://kubernetes.github.io/ingress-nginx/user-guide/tls/
您需要在入口控制器中使用参数 --default-SSL-ceritifcate 指定默认密钥,然后只需删除 YALM 中的"secretName"选项,它应该使用默认证书。
https://certbot.eff.org/glossary#wildcard-certificate
对于子域,您必须在创建证书时指定子域,例如:
user$: certbot certonly --manual
--preferred-challenges=dns
--email your-email@gmil.com
--server https://acme-v02.api.letsencrypt.org/directory
--agree-tos
-d '*.level.domain.com' -d '*.domain.com' -d domain.com
然后,您必须进行DNS质询以验证它是您的域。 与 Certbot "* .* .example.com"是无效的,我不知道它是否适用于任何其他证书颁发机构,但如果您希望它是动态的,您最好使用 Kubernetes 证书管理器在创建入口规则时当场颁发证书。
您可以使用以下命令添加 --default-SSL-certificate:
Kubectl Edit Deployment ingress-nginx-controller
然后将其添加到spec.template.spec.containers.args下
如果您希望为所有人提供一个证书,那么在通过 DNS 质询并获取 .pem 文件后,首先创建一个 TLS 密钥:
apiVersion: v1
kind: Secret
metadata:
name: tls-secret
data:
# fullchain.pem converted to base64 (all 3 certificates dont remove line breaks before converting)
tls.crt: "LS0tLS1CRUdJTiBQLS0tLS1CRUdJTiBQ.......BTkJna3Foa2lHOXcwQkF=="
# privekey.pem converted to base64 (dont remove line breaks before converting)
tls.key: "LS0tLS1CRUd.......XcwQkFRRUZBQVN=="
type: kubernetes.io/tls
然后使用 TLS 创建入口规则:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
#ingress-nginx-controller has to be installed/created
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
rules:
- host: sub.domain.com
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: http-svc
port:
number: 8080
tls:
- hosts:
- sub.domain.com
secretName: tls-secret
就我而言,nginx 入口控制器是作为 rke2 安装的一部分安装的。 rke2-ingress-nginx-controller 作为 DaemonSet 安装,因此需要在 DaemonSet 上完成补丁。
scripts # kubectl get DaemonSet -A
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
calico-system calico-node 1 1 1 1 1 kubernetes.io/os=linux 23d
kube-system rke2-ingress-nginx-controller 1 1 1 1 1 kubernetes.io/os=linux 23d
scripts #
确保证书状态为"就绪">
scripts # kubectl get certificate -A
NAMESPACE NAME READY SECRET AGE
mynamespace default-ingress-tls-certificate True default-ingress-tls 108m
scripts #
补丁命令应为,
RESOURCE-NAME - 基于 kubectl get DaemonSet -A,可以是 etiher Deployment/DaemonSet
RNAMESPACE - 基于 kubectl get DaemonSet -A
CNAMESPACE,机密名称 - 基于命令 kubectl 获取证书 -A
KUBECTL 补丁 "RKE2-Ingress-nginx-controller"
-n "[RNAMESPACE]"
-type "json"
--patch '[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--default-SSL-certificate=[CNAMESPACE]/[SECRET-NAME]"}]'
例:
kubectl patch DaemonSet "rke2-ingress-nginx-controller"
-n "kube-system"
-type "json"
--patch '[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--default-ssl-certificate=mynamespace/default-ingress-tls"}]'
感谢@mirkw00d