Kubernetes 入口 如何设置默认 ssl-certificate?



我有一个通用的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命名空间(
    1. 创建 Cloudflare 密钥作为机密 + 源颁发者
    2. 创建证书
  • 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-certificateIngress 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.yamlkubectl get deployment/nginx-ingress-controller --namespace -o yaml > ingress-controller.yaml

您也可以使用以下方法即时编辑ingresskubectl 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 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

最新更新