如何在 Azure 上的 Kubernetes 上设置 letsencrypt?

How to setup letsencrypt on kubernetes on azure?

我正在学习 kubernetes 并尝试为我的网络应用设置 letsencrypt。

我已经从 amazon route 53 买了一个域名。我们就叫它 example.com

然后我去在 azure 中创建一个集群,安装所有需要的应用程序:

  1. 安装 helm choco install kubernetes-helm
  2. helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
  3. helm repo update
  4. 应用deployment.yml文件
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp1-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp1
  template:
    metadata:
      name: myapp1-pod
      labels: # Dictionary 
        app: myapp1       
    spec:
      containers: # List
        - name: myapp1-container
          image: stacksimplify/kubenginx:1.0.0
          ports:
            - containerPort: 80
  1. 应用service.yml
apiVersion: v1
kind: Service
metadata:
  name: myapp1-loadbalancer
  labels: 
    app: myapp1
spec:  
  selector:
    app: myapp1
  ports: 
    - port: 80
      targetPort: 80
  1. 应用ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress-demo
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: cluster-issuer-name
    cert-manager.io/acme-challenge-type: http01
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:  
  rules:  
  - host: "example.com"
    http:
      paths:
      - path: /   
        pathType: Prefix     
        backend:
          service:
            name: myapp1-loadbalancer
            port:
              number: 80
  tls:
    - hosts:
      - example.com
      secretName: secret-name
  1. 在 Azure 门户中,查找与您在开始时创建的集群相关联的 public IP。默认情况下,当创建一个 k8 集群时,azure 会创建一个 public ip 关联到这个集群。找找,去前端配置,记下ip。

  2. 运行下面这个命令,替换你已有的ip

# Use Helm to deploy an NGINX ingress controller
helm install ingress-nginx ingress-nginx/ingress-nginx
    --set controller.replicaCount=2 \
    --set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \
    --set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux \
    --set controller.service.externalTrafficPolicy=Local \
    --set controller.service.loadBalancerIP="YOUR IP" 
9. If done correctly, you should have load balancer service running now. Verify it with kubernetes: `kubectl get svc`. Take note of this ip address for the load balancer
  1. 转到 Amazon Route 53 控制面板,为您在 ingress.yml

    中拥有的域名添加一条记录,其中包含您在第 9 步中拥有的 IP 地址
  2. 祝您工作愉快:)

谢谢

我已经用关于如何生成结果的步骤更新了我的问题。感谢 SOF 的大力支持。希望如果有人 运行 再次遇到这个问题,他们知道如何正确配置它。

您遗漏了一些您可能需要做的小事,请尝试再次更新。

URL 集群问题不适用于您正在使用暂存的 Prod,我建议仅在任何情况下使用 prod URL 而不是暂存。

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging  
spec:
  acme:
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    email: abc@abc.com
    privateKeySecretRef:
      name: letsencrypt-staging
    solvers:
    - http01:
        ingress:
          class: nginx

使用:https://acme-v02.api.letsencrypt.org/directory

第二个 :

您没有将您的秘密附加到入口,理想情况下它将存储您的 TLS 证书。

流程是怎样的,

cert-manager 获取证书并将其存储在 kubernetes 秘密中,在您的情况下,您在 [=41] 中提到的 letsencrypt-staging =]集群发行者.

这个秘密也应该附加到入口,这样当任何人访问端点入口时,将这个证书用于 HTTPS 流量。

完整参考示例:

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: cluster-issuer-name
  namespace: development
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: harsh@example.com
    privateKeySecretRef:
      name: secret-name
    solvers:
    - http01:
        ingress:
          class: nginx-class-name
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx-class-name
    cert-manager.io/cluster-issuer: cluster-issuer-name
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: example-ingress
spec:
  rules:
  - host: sub.example.com
    http:
      paths:
      - path: /api
        backend:
          serviceName: service-name
          servicePort: 80
  tls:
  - hosts:
    - sub.example.com
    secretName: secret-name

在上面的例子中我在 ingress 中使用了 annotatino : cert-manager.io/cluster-issuer: cluster-issuer-name

它会触发 clusterissuer 在创建入口时生成证书,一旦创建证书,它将存储在 K8s 秘密中。因此,为了将 SSL/TLS 证书机密附加到入口,我在入口 YAML 的最后添加了 TLS 块。

如果您正在应用我建议的更改,则不需要创建这个

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: ssl-cert-staging
  namespace: default
spec:
  secretName: ssl-cert-staging
  issuerRef:
    name: letsencrypt-staging
    kind: ClusterIssuer  
  dnsNames:
  - example.com

cert-manager 将为您 auto-create,您也可以删除它,只需应用上面的示例代码段,对名称等进行一些小的更改。