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


    1. 简介

    随着 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 的引用。

    2.准备

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

    3.开始部署
    3.1部署cert-manager
    本文直接使用kubectl安装,未使用Helm.

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

     运行如下命令可看到创建了3个pod,并STATUS为:Running

    kubectl get pods --namespace cert-manager
    
    

    3.2 配置ClusterIssuer

    创建clusterIssuer.yml,内容如下

    1. apiVersion: cert-manager.io/v1
    2. kind: ClusterIssuer
    3. metadata:
    4. name: letsencrypt-prod
    5. spec:
    6. acme:
    7. email: 【此处修改为你的邮箱】
    8. privateKeySecretRef:
    9. name: letsencrypt-prod
    10. server: https://acme-v02.api.letsencrypt.org/directory
    11. solvers:
    12. - http01:
    13. ingress:
    14. class: traefik

    应用该配置

    kubectl apply -f clusterIssuer.yml
    
    

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

    4.测试
    4.1创建nginx Deployment
    创建一个Deployment资源,nginx.yml

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: nginx-deployment
    5. spec:
    6. selector:
    7. matchLabels:
    8. app: nginx
    9. replicas: 2 # tells deployment to run 2 pods matching the template
    10. template:
    11. metadata:
    12. labels:
    13. app: nginx
    14. spec:
    15. containers:
    16. - name: nginx
    17. image: nginx:1.14.2
    18. ports:
    19. - containerPort: 80

    4.2创建Nginx Service
    nginxservice.yml

    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. labels:
    5. app: video-nginx
    6. name: video-nginx
    7. namespace: default
    8. spec:
    9. ports:
    10. - port: 8888
    11. protocol: TCP
    12. name: nginx
    13. targetPort: 80
    14. type: ClusterIP
    15. selector:
    16. app: nginx

    5.创建Ingress (重点)
    workingress.yml

    1. apiVersion: networking.k8s.io/v1
    2. kind: Ingress
    3. metadata:
    4. name: work-ingress
    5. namespace: default
    6. annotations:
    7. kubernetes.io/ingress.class: traefik
    8. cert-manager.io/cluster-issuer: letsencrypt-prod # letsencrypt-prod为ClusterIssuer名称
    9. spec:
    10. tls:
    11. - secretName: test-tls # 证书名
    12. hosts:
    13. - your domain # 域名
    14. rules:
    15. - host: your domain # 域名
    16. http:
    17. paths:
    18. - path: /
    19. pathType: ImplementationSpecific
    20. backend:
    21. service:
    22. name: video-nginx # 服务名
    23. port:
    24. number: 80 # 服务的端口号 service port,非pod port

    至此,测试程序已经部署完成,接下来,在浏览器输入https://你的域名,即可看到你的网站已经使用HTTPS协议了。

    6.Http自动重定向到Https

    6.1创建一个Middleware

    1. apiVersion: traefik.containo.us/v1alpha1
    2. kind: Middleware
    3. metadata:
    4. name: redirect-https
    5. spec:
    6. redirectScheme:
    7. scheme: https
    8. permanent: true

    6.2在Ingress中添加注解traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd注意default是命名空间,redirect-https为Middleware的name

    免费在线流程图、思维导图、专业强大的作图工具,支持多人实时在线协作,可用于原型图、UML、BPMN、网络拓扑图等多种图形绘制 感觉真不错推荐给大家!

  • 相关阅读:
    相机与相机模型(针孔/鱼眼/全景相机)
    v-if条件判断及v-show
    ABC253EX (fzt子集计数+矩阵树定理)
    【JavaScript&&Threejs】判断路径在二维平面上投影的方向顺逆时针
    【Kotlin】初识Kotlin(二)
    JVM类加载机制
    算法题:牛牛的三元组问题
    maven
    Matlab在同一张图中如何加入多个图例
    数据结构-链式二叉树
  • 原文地址:https://blog.csdn.net/j610152753/article/details/127581375