我有一个通用 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
或者我必须运行特殊命令吗?
对于将来研究这个问题的人:
如果您要使用 helm 安装 ingress-nginx,则需要使用values.yaml 中的
controller.extraArgs 来指定
default-ssl-certificate
--set controller.extraArgs.default-ssl-certificate="__NAMESPACE__/_SECRET__" \
我的设置
origin-ca-issuer
命名空间)
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
内部使用的参数。 这里是 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”选项,它应该使用默认证书。
首先确保您有通配符证书,然后看看 certbot 是如何完成的:
https://certbot.eff.org/glossary#wildcard-certificate
对于子子域,您必须在创建证书时指定子域,例如:
user$: certbot certonly --manual \
--preferred-challenges=dns \
--email [email protected] \
--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 编辑部署 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 #
确保证书状态为 Ready
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,可以是 Deployment/DaemonSet
RNAMESPACE - 基于 kubectl get DaemonSet -A
CNAMESPACE,SECRET-NAME - 基于命令 kubectl 获取证书 -A
kubectl 补丁“rke2-ingress-nginx-controller”
-n“[RNAMESPACE]”
--输入“json”
--patch '[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--default-ssl-certificate=[CNAMESPACE ]/[秘密名称]"}]'
示例:
kubectl 补丁 DaemonSet“rke2-ingress-nginx-controller”
-n“kube 系统”
--输入“json”
--patch '[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--default-ssl-certificate=mynamespace/默认入口-tls"}]'
感谢@mirkw00d