当前位置: 首页 > 知识库问答 >
问题:

使用cert-manager istio-ingress和LetsEncrypt在kubernetes中配置SSL证书

尹小云
2023-03-14

我正在尝试用cert-manager、istio ingress和LetsEncrypt在kubernetes中配置SSL证书。我已经安装了istio和helm,cert-manager,创建了ClusterIssuer,然后我试图创建一个证书。acme挑战无法验证,我正在尝试使用http01进行验证,但无法解决如何使用istio ingress进行验证的问题。Istio部署有以下选项:

helm install --name istio install/kubernetes/helm/istio `
--namespace istio-system `
--set global.controlPlaneSecurityEnabled=true `
--set grafana.enabled=true`
--set tracing.enabled=true 
--set kiali.enabled=true `
--set ingress.enabled=true

证书配置:

apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: example.com
  namespace: istio-system
spec:
  secretName: example.com
  issuerRef:
    name: letsencrypt-staging
    kind: ClusterIssuer
  commonName: 'example.com'
  dnsNames:
  - example.com
  acme:
    config:
    - http01:
        ingress: istio-ingress
      domains:
      - example.com

在尝试这种方式时,由于某些原因,无法找到istio-ingress,但当尝试指定ingressClass:some名称而不是ingress:istio-ingress时,我得到了404,因为example.com/。无法访问众所周知的/acme挑战/令牌。如何解决这一问题?非常感谢。

共有2个答案

江宏伟
2023-03-14

解决方案是将DNS移动到azure,并使用DNS验证来生成证书。我还使用了istio-1.1.0-rc。3,并按以下方式配置网关:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: mygateway
spec:
  selector:
    istio: ingressgateway # use istio default ingress gateway
  servers:
  - hosts:
    - 'mydomain.com'
    port:
      name: http-bookinfo
      number: 80
      protocol: HTTP
    tls:
      httpsRedirect: true
  - hosts:
    - 'mydomain.com'
    port:
      name: https-bookinfo
      number: 443
      protocol: HTTPS
    tls:      
      mode: SIMPLE
      serverCertificate: "use sds" #random string, because serverCertificate and 
      #privateKey are required for tls.mode=SIMPLE
      privateKey: "use sds" 
      credentialName: "istio-bookinfo-certs-staging" #this must match the secret name 
      #from the certificate
谢正初
2023-03-14

Istio入口已被否决,您可以使用带有DNS质询的入口网关。

定义通用公共入口网关:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: public-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - "*"
      tls:
        httpsRedirect: true
    - port:
        number: 443
        name: https
        protocol: HTTPS
      hosts:
        - "*"
      tls:
        mode: SIMPLE
        privateKey: /etc/istio/ingressgateway-certs/tls.key
        serverCertificate: /etc/istio/ingressgateway-certs/tls.crt

使用证书管理器支持的 DNS 提供程序之一创建颁发者。以下是 GCP CloudDNS 的配置

apiVersion: certmanager.k8s.io/v1alpha1
kind: Issuer
metadata:
  name: letsencrypt-prod
  namespace: istio-system
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: email@example.com
    privateKeySecretRef:
      name: letsencrypt-prod
    dns01:
      providers:
      - name: cloud-dns
        clouddns:
          serviceAccountSecretRef:
            name: cert-manager-credentials
            key: gcp-dns-admin.json
          project: my-gcp-project

创建一个通配符证书:

apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: istio-gateway
  namespace: istio-system
spec:
  secretname: istio-ingressgateway-certs
  issuerRef:
    name: letsencrypt-prod
  commonName: "*.example.com"
  acme:
    config:
    - dns01:
        provider: cloud-dns
      domains:
      - "*.example.com"
      - "example.com"

证书管理器发布证书需要几分钟时间:

kubectl -n istio-system describe certificate istio-gateway

Events:
  Type    Reason         Age    From          Message
  ----    ------         ----   ----          -------
  Normal  CertIssued     1m52s  cert-manager  Certificate issued successfully

您可以在此处找到使用Let's Encrypt在GKE上设置Istio入口的分步指南https://docs.flagger.app/install/flagger-install-on-google-cloud#cloud-dns设置

 类似资料:
  • 我们在裸机服务器上设置了库伯内特斯集群。 我们部署应用程序,其中每个命名空间都是最终客户的应用程序。即customer1.mydomain.com- 我们不断获得库伯内特斯入口控制器假证书。 我们购买了自己的通配符证书*。mydomain。通用域名格式 进入。亚马尔 https://cust1.mydomain.com连接库伯内特斯入口控制器假证书

  • 申请 Domain Name 首先就是申请一个你要的网域, 这边网路上资源很多都可以查一下哪个网域商或是一些相关的建议, 这边我就先不去多做介绍了, 文章中会以 sam.nctu.me 来作范例 用 Letsencrypt 来签发凭证 这边我们用手动的把它先签下来, 上 Letsencrypt 去安装 certbot, 手动签的方式也可以参考签 letsencrpyt 凭证 文章, 输入以下指令来

  • 我对 Kubernetes 很陌生。但到目前为止,能够配置AKS(Azure Kubernetes Services)群集。我的服务有多个命名空间(开发、阶段、生产)。并使用nginx配置了一个入口服务(进入它自己的命名空间“ingress-nginx”)。该设置与HTTP完美配合。 当我试图使用HTTPS时,我的问题就开始了。使用此脚本首次安装证书管理器。它再次创建了自己的名称空间:“cert-

  • 我对保护服务器不太熟悉,所以我对这方面不太了解,但我需要让运行在数字海洋水滴上的Spring Boot应用程序使用HTTPS。 我的想法是注册一个letsencrypt证书,然后告诉Spring使用它。 然而,我不知道如何做到这一点。 谢谢。

  • 问题内容: 我正在尝试从使用用户名和密码登录到我的MySQL数据库服务器的未加密JDBC连接转移到使用SSL和基于证书的身份验证的连接。我在Spring MVC中使用Hibernate。我的WebAppConfig文件如下所示: 而我的属性配置文件(application.properties)如下: 我已经在/ etc / mysql / certs内部生成了正确的证书,并编辑了my.cnf以指

  • 我们正在GKE上的k8s集群上运行一个应用程序。 我们正在使用一个nginx入口控制器作为外部负载平衡器服务,比如说,https://12.345.67.98 . 我们面临的一个问题是,当我们直接访问上述URL上的负载平衡器时,我们会收到一个证书警告,因为使用了自签名的“Kubernetes入口控制器假证书”。 我们只有将我们的域(例如app.our company.com)映射到Kubernet