如何使用默认 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?