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

Emm*_*oza 10 kubernetes lets-encrypt cert-manager nginx-ingress microk8s

最近,我尝试在裸机服务器上使用 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/

Emm*_*oza 30

本指南旨在使用 Microk8s 和默认 Ingress 控制器通过 Kubernetes 设置 Letsencrypt。

使用的版本:

microk8s 版本 1.21/稳定

证书管理器 v1.3.1

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

安装 microk8s

snap install microk8s --classic --channel=1.21/stable
Run Code Online (Sandbox Code Playgroud)

启用 DNS 和入口

sudo microk8s enable dns ingress
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

应用配置文件

sudo microk8s kubectl apply -f webserver-depl-svc.yaml
Run Code Online (Sandbox Code Playgroud)

现在配置默认入口来为测试网络服务器提供服务

入口路由.yaml

snap install microk8s --classic --channel=1.21/stable
Run Code Online (Sandbox Code Playgroud)

应用入口路由

sudo microk8s kubectl apply -f ingress-routes.yaml
Run Code Online (Sandbox Code Playgroud)

当您访问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
Run Code Online (Sandbox Code Playgroud)

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

sudo microk8s kubectl get pods -n=cert-manager
Run Code Online (Sandbox Code Playgroud)

现在创建证书颁发者配置。需要注意的一个细节是,此配置中使用的类是公共的,而不是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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

应用两个发行者配置

sudo microk8s kubectl apply -f letsencrypt-staging.yaml

sudo microk8s kubectl apply -f letsencrypt-prod.yaml
Run Code Online (Sandbox Code Playgroud)

现在更新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: /
        pathType: Prefix
        backend:
          service:
            name: webserver-svc
            port:
              number: 80
Run Code Online (Sandbox Code Playgroud)

应用更新

sudo microk8s kubectl apply -f ingress-routes.yaml
Run Code Online (Sandbox Code Playgroud)

运行下一个命令以确认 Ready=True

sudo microk8s kubectl get certificate
Run Code Online (Sandbox Code Playgroud)

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

sudo microk8s kubectl describe certificate tls-secret
Run Code Online (Sandbox Code Playgroud)

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

apiVersion: networking.k8s.io/v1
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: /
        pathType: Prefix
        backend:
          service:
            name: webserver-svc
            port:
              number: 80
Run Code Online (Sandbox Code Playgroud)

应用更新

sudo microk8s kubectl apply -f ingress-routes.yaml
Run Code Online (Sandbox Code Playgroud)

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

sudo microk8s kubectl get certificate
Run Code Online (Sandbox Code Playgroud)

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

sudo microk8s kubectl describe certificate tls-secret
Run Code Online (Sandbox Code Playgroud)

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

  • 入口类“public”确实特定于“microk8s”。 (3认同)
  • 谢谢,这正是我一直在寻找的。 (2认同)