k3s+traefik+cert-manager+letsencrypt实现web服务全https

简介

随着 HTTPS 不断普及,越来越多的网站都在从 HTTP 升级到 HTTPS,使用 HTTPS 就需要向权威机构申请证书,需要付出一定的成本,如果需求数量多,也是一笔不小的开支。cert-manager 是 Kubernetes 上的全能证书管理工具,如果对安全级别和证书功能要求不高,可以利用 cert-manager 基于 ACME 协议与 Let’s Encrypt 来签发免费证书并自动续期,实现永久免费使用证书。

Cert-Manager 是一个云原生证书管理开源项目,用于在 Kubernetes 集群中提供 HTTPS 证书并自动续期,支持 Let’s Encrypt / HashiCorp / Vault 这些免费证书的签发。在 Kubernetes 中,可以通过 Kubernetes Ingress 和 Let’s Encrypt 实现外部服务的自动化 HTTPS。

解释下几个关键的资源:

  • Issuer/ClusterIssuer: 用于指示 cert-manager 用什么方式签发证书,本文主要讲解签发免费证书的 ACME 方式。ClusterIssuer 与 Issuer 的唯一区别就是 Issuer 只能用来签发自己所在 namespace 下的证书,ClusterIssuer 可以签发任意 namespace 下的证书。
  • Certificate: 用于告诉 cert-manager 我们想要什么域名的证书以及签发证书所需要的一些配置,包括对 Issuer/ClusterIssuer 的引用。

K3S是啥?

这里借助中文官网,对K3S进行一个简单的介绍。如果感兴趣可以自行访问它的中文官网:K3s | 轻量级Kubernetes | 物联网及边缘计算K8S解决方案 | Rancher


K3S的应用场景


K3S的工作原理


K3S是轻量级的Kubernetes,程序本身大小以及运行资源占用情况都非常小,但又可几乎像使用Kubernettes一样的使用各种编排命令,甚至命令格式都是完全兼容的(官方文档指出k3s可以替代k8s)同时安装使用又非常简单。

如果你有多台云服务器或者对kubernetes有一定研究和使用经验,这里非常建议尝试一下k3s。

------ 至此,关于K3S的介绍到此为止,别忘了,我们的主要内容是:K3s+Traefik+Cert-manager+LetsEncrypt实现web服务全Https。

准备

  • k3s集群环境
  • 有效的域名(如果是国内云服务器还需要备案)
  • 一个可登录的邮箱

部署

部署Cert-manager

安装Cert-manager的方法很多,有Helm的,也有kubectl方式的,这里使用kubectl方式(注:如果你边做边看这篇文章,建议严格按照本文内容操作)

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.7.1/cert-manager.yaml

检查Cert-manager安装状态

# 运行如下命令kubectl get pods --namespace cert-manager# 返回类似下方的结果,都为Running状态则安装成功NAME                                      READY   STATUS    RESTARTS   AGEcert-manager-54f645f7d6-2gld5             1/1     Running   0          9m4scert-manager-cainjector-79b7fc64f-m9b62   1/1     Running   0          9m5scert-manager-webhook-6484955794-5zrm6     1/1     Running   0          9m4s

配置ClusterIssuer

新建一个yml文件,内容如下:

apiVersion: cert-manager.io/v1kind: ClusterIssuermetadata:  name: letsencrypt-prodspec:  acme:    email: 【此处修改为你的邮箱】    privateKeySecretRef:      name: letsencrypt-prod    server: https://acme-v02.api.letsencrypt.org/directory    solvers:      - http01:          ingress:            class: traefik

保存后,执行如下命令:

kubectl apply -f clusterIssuer.yml

至此,基本配置已完成,接下来我们建立一个deployment,service,traefik进行测试。

测试

创建Nginx Deployment

创建一个Deployment资源,nginx.yml

apiVersion: apps/v1kind: Deploymentmetadata:  name: nginx-deploymentspec:  selector:    matchLabels:      app: nginx  replicas: 2 # tells deployment to run 2 pods matching the template  template:    metadata:      labels:        app: nginx    spec:      containers:      - name: nginx        image: nginx:1.14.2        ports:        - containerPort: 80

执行如下命令:

kubectl apply -f nginx.yml

创建Nginx Service

nginxservice.yml

apiVersion: v1kind: Servicemetadata:  labels:    app: video-nginx  name: video-nginx  namespace: defaultspec:  ports:    - port: 8888      protocol: TCP      name: nginx      targetPort: 80  type: ClusterIP  selector:    app: nginx

执行如下命令:

kubectl apply -f nginxservice.yml

创建Ingress(重点)

本文使用的是Traefik作为Ingress

workingress.yml

apiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name: work-ingress  namespace: default  annotations:    kubernetes.io/ingress.class: traefik    cert-manager.io/cluster-issuer: letsencrypt-prod  # letsencrypt-prod为ClusterIssuer名称 spec:  tls:    - secretName: test-tls # 证书名      hosts:        - your domain # 域名  rules:    - host: your domain # 域名      http:        paths:          - path: /            pathType: ImplementationSpecific            backend:              service:                name: video-nginx # 服务名                port:                   number: 80 # 服务的端口号 service port,非pod port

执行如下命令:

kubectl apply -f workingress.yml

至此,测试配置已准备完毕,接下来我们只需要在浏览器输入https://你的域名,即可看到网站已经支持HTTPS了。

但是,当我们在浏览器上输入http://域名时,没有自动跳转到Https://域名,该如如何实现这个特性呢?继续往下看。

Http自动重定向到Https

本人对K3S、K8S了解的并不是很深入,主要以使用为主,所以本人算是“面向百度使用K3S、K8S”,下面便是本人搜索到的解决方案:

如原文所述操作:

  • 创建一个Middleware.
apiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata:name: redirect-httpsspec:redirectScheme:scheme: httpspermanent: true
  • 在Ingress中添加注解`traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd`注意`default`是命名空间即可


原文格式更佳

k3s+traefik+cert-manager+letsencrypt实现web服务全https|NGUP的个人技术博客

k3s   traefik   cert
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章