如何使用默认 Ingress 使用 Kubernetes microk8s 设置 Letsencrypt?

Posted

技术标签:

【中文标题】如何使用默认 Ingress 使用 Kubernetes microk8s 设置 Letsencrypt?【英文标题】:How to setup Letsencrypt with Kubernetes microk8s using default Ingress? 【发布时间】:2021-07-29 12:07:07 【问题描述】:

最近,我尝试在裸机服务器上使用 microk8s 和默认入口控制器设置letsencrypt。

我在网上找到了一些非常有用的指南,但似乎最近对 microk8s 的更新改变了入口控制器的配置方式。

为了节省你们的时间,我把我做了什么写了出来。

如果您遇到困难或更好地理解,这里有一些有用的资源。

https://cert-manager.io/docs/installation/kubernetes/

https://cert-manager.io/docs/tutorials/acme/ingress/

此链接对故障排除非常有用

https://cert-manager.io/docs/faq/acme/

【问题讨论】:

【参考方案1】:

本指南是使用 Microk8s 和默认 Ingress 控制器在 Kubernetes 中设置 Letsencrypt。

使用的版本:

microk8s 版本 1.21/stable

证书管理器 v1.3.1

先决条件:将端口 80 和 443 转发到您的服务器。设置一个指向您的服务器的域名。

安装 microk8s

snap install microk8s --classic --channel=1.21/stable

启用 dns 和入口

sudo microk8s enable dns ingress

我们将使用 nginx 网络服务器映像创建一个测试网络服务器部署/服务来测试网络流量

webserver-depl-svc.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: webserver-depl
spec:
  selector:
    matchLabels:
      app: webserver-app
  template:
    metadata:
      labels:
        app: webserver-app
    spec:
      containers:
        - name: webserver-app
          image: nginx:1.8
---
apiVersion: v1
kind: Service
metadata:
  name: webserver-svc
spec:
  selector:
    app: webserver-app
  ports:
  - name: webserver-app
    protocol: TCP
    port: 80
    targetPort: 80

应用配置文件

sudo microk8s kubectl apply -f webserver-depl-svc.yaml

现在配置默认入口以服务于测试网络服务器

ingress-routes.yaml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-routes
spec:
  rules:
#change yourdomain.com to your domain
  - host: yourdomain.com
    http:
      paths:
        - path: /
          backend:
            serviceName: webserver-svc
            servicePort: 80

应用入口路由

sudo microk8s kubectl apply -f ingress-routes.yaml

当您访问 yourdomain.com 时,您应该会看到默认的“欢迎使用 nginx!”启动画面。

现在安装 cert-manager https://cert-manager.io/docs/installation/kubernetes/

sudo microk8s kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.3.1/cert-manager.yaml

下一个命令应该显示 3 个 pod 以确认 cert-manager 已安装并正在运行

sudo microk8s kubectl get pods --n=cert-manager

现在创建证书颁发者配置。需要注意的一个细节是,此配置中使用的类是 public 而不是 nginx。这可能是 microk8s 特有的。 https://cert-manager.io/docs/tutorials/acme/ingress/

letsencrypt-staging.yaml

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
#change to your email
    email: youremail@gmail.com
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-staging
    solvers:
    - http01:
        ingress:
          class: public

letsencrypt-prod.yaml

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
#change to your email
    email: youremail@gmail.com
    privateKeySecretRef:
       name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: public

应用两个发行者配置

sudo microk8s kubectl apply -f letsencrypt-staging.yaml

sudo microk8s kubectl apply -f letsencrypt-prod.yaml

现在更新 ingress-routes.yaml 以使用暂存证书。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-routes
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-staging"
spec:
  tls:
  - hosts:
#change to your domain
    - yourdomain.com
    secretName: tls-secret
  rules:
#change to your domain
  - host: yourdomain.com
    http:
      paths:
        - path: /
          backend:
            serviceName: webserver-svc
            servicePort: 80

应用更新

sudo microk8s kubectl apply -f ingress-routes.yaml

运行下一条命令确认Ready=True

sudo microk8s kubectl get certificate

如果返回 true,则表示 HTTP-01 质询成功。 您可以在运行下一个命令的输出末尾看到更多详细信息

sudo microk8s kubectl describe certificate tls-secret

现在更改 ingress-routes.yaml 以使用生产证书。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-routes
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
  tls:
  - hosts:
#change to your domain
    - yourdomain.com
    secretName: tls-secret
  rules:
#change to your domain
  - host: yourdomain.com
    http:
      paths:
        - path: /
          backend:
            serviceName: webserver-svc
            servicePort: 80

应用更新

sudo microk8s kubectl apply -f ingress-routes.yaml

现在是关键时刻。运行下一个命令以确认已生成证书。就绪=真

sudo microk8s kubectl get certificate

运行下一个命令并查看最终输出以验证证书是否已颁发。

sudo microk8s kubectl describe certificate tls-secret

现在,如果您访问您的域。你应该看到成功的小锁! :-)

【讨论】:

没有snap会好很多 谢谢,这正是我想要的。 Ingress 类 public 确实特定于 microk8s 2021 年 12 月更新:我必须更新 ingress-routes.yaml 才能使其正常工作。请参阅下面的修改后的 yaml。【参考方案2】:

2021 年 12 月更新: 我必须更新 ingress-routes.yaml 才能让它工作:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-routes
spec:
  rules:
#change yourdomain.com to your domain
  - host: yourdomain.com
    http:
      paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: webserver-svc
              port:
                number: 80

【讨论】:

以上是关于如何使用默认 Ingress 使用 Kubernetes microk8s 设置 Letsencrypt?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用默认 Ingress 使用 Kubernetes microk8s 设置 Letsencrypt?

无缝融入 Kubernetes 生态 | 云原生网关支持 Ingress 资源

入口控制器与 api 网关

如何解决nginx ingress的路径冲突?

k8s修改ingress默认80端口为其他端口

使用nginx-ingress-controller,同时配置http和https访问应用