Kubernetes ingress 如何设置default-ssl-certificate?

问题描述 投票:0回答:6

我有一个通用 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

或者我必须运行特殊命令吗?

kubernetes-helm kubernetes-ingress
6个回答
5
投票

对于将来研究这个问题的人:

TLDR

如果您要使用 helm 安装 ingress-nginx,则需要使用values.yaml 中的

controller.extraArgs 来指定 
default-ssl-certificate

  --set controller.extraArgs.default-ssl-certificate="__NAMESPACE__/_SECRET__" \

非 TLDR

我的设置

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
块。


4
投票

--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证书,我还没有尝试过,遗憾的是我无法提供帮助。


3
投票

我正在使用 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"}]'

1
投票

我没有 kubernetes,但从这篇文章来看: https://kubernetes.github.io/ingress-nginx/user-guide/tls/

您需要在入口控制器中使用参数 --default-ssl-ceritifcate 指定默认密钥,然后只需删除 yalm 中的“secretName”选项,它应该使用默认证书。


0
投票

首先确保您有通配符证书,然后看看 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

0
投票

在我的例子中,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

© www.soinside.com 2019 - 2024. All rights reserved.