• 如何在Kubernetes中使用cert-manager部署SSL


    前言

    目前大部分的网站已经升级到 HTTPS,使用 HTTPS 就需要向权威机构申请证书,需要付出一定的成本,如果需求数量多,也是一笔不小的开支。cert-manager 是 Kubernetes 上的全能证书管理工具,如果对安全级别和证书功能要求不高,可以利用 cert-manager 基于 ACME 协议与 Let’s Encrypt 来签发免费证书并自动续期,实现永久免费使用证书,本文主要来记录如在 k3s(单机版 k8s )部署 ssl。

    Helm

    heml官方文档

    Kubernetes部署一个应用,需要资源文件如 deployment、replicationcontroller、service 或 pod 等。这些k8s 资源过于分散,不方便进行管理,直接通过 kubectl 来管理一个应用,流程繁琐不方便。

    而对于一个复杂的应用,会有很多类似上面的资源描述文件,如果有更新或回滚应用的需求,可能要修改和维护所涉及的大量资源文件,且由于缺少对发布过的应用版本管理和控制,使 Kubernetes上的应用维护和更新等面临诸多的挑战,而Helm可以帮我们解决这些问题。

    • 统一管理、配置和更新分散的 k8s 的应用资源文件
    • 分发和复用一套应用模板
    • 应用的一系列资源当做一个软件包管理

    脚本安装

    curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
    
    • 1
    chmod 700 get_helm.sh
    
    • 1
    ./get_helm.sh
    
    • 1

    国内采用脚本安装时可能由于墙的原因无法安装,建议采用用二进制安装的方式。

    二进制版本安装

    tar -zxvf helm-v3.0.0-linux-amd64.tar.gz
    
    • 1
    • 在解压目中找到helm程序,移动到需要的目录中
    mv linux-amd64/helm /usr/local/bin/helm
    
    • 1

    cert-manager

    cert-manager 是什么,可以移步 官网 ,此处只讲如何安装。

    heml 安装

    • 添加 cert-manager helm 仓库:
    helm repo add jetstack https://charts.jetstack.io
    
    • 1
    • 为 cert-manager 创建命名空间:
    kubectl create namespace cert-manager
    
    • 1
    • 然后使用 Helm 安装 cert-manager。
    helm install  cert-manager jetstack/cert-manager --namespace cert-manager --version v1.10.1
    
    • 1

    过一会儿可以通过 kubectl get pods -n cert-manager -w查看是否部署成功。

    kubectl get pods --namespace cert-manager
    
    NAME                                            READY   STATUS      RESTARTS   AGE
    cert-manager-7cbdc48784-rpgnt                   1/1     Running     0          3m
    cert-manager-webhook-5b5dd6999-kst4x            1/1     Running     0          3m
    cert-manager-cainjector-3ba5cd2bcd-de332x       1/1     Running     0          3m
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    其他方式

    heml 安装嫌麻烦,可以直接安装 cert-manager 的 CustomResourceDefinitions。

    kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.10.1/cert-manager.crds.yaml
    
    
    • 1
    • 2

    创建、部署 ClusterIssuer

    资源配置文件

    ## cluster-issuer.yaml
    apiVersion: cert-manager.io/v1
    kind: ClusterIssuer
    metadata:
      name: letsencrypt-prod ## 自己定义
    spec:
      acme:
        server: https://acme-v02.api.letsencrypt.org/directory # 此处用的  Let’s Encrypt
        email: 197****qq.com # 自己的邮箱
        privateKeySecretRef:
          name: letsencrypt-prod  # 自己定义
        solvers:
          - http01:
              ingress:
                class: traefik  # ingress 类型,此处用的 traefik
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    部署

    kubectl apply -f cluster-issuer.yaml
    
    • 1

    创建、部署 ertificate

    资源配置文件

    ## b-cert.yaml
    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: canyuegongzi.xyz-tls # 自定义
    spec:
      secretName: canyuegongzi.xyz-tls # 自定义
      issuerRef:
        name: letsencrypt-prod # 上一步中定义的
        kind: ClusterIssuer
      dnsNames:
        - blog.canyuegongzi.xyz # 需要开启 HTTPS 的域名
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    部署

    kubectl apply -f  b-cert.yaml
    
    • 1

    使用

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: nginx-ingress
      namespace: default
      annotations:
        kubernetes.io/ingress.class: traefik # ingress 类型,此处用的 traefik
    spec:
      tls:
        - hosts:
            - blog.canyuegongzi.xyz               # TLS 域名
          secretName: canyuegongzi.xyz-tls  # 用于存储证书的Secret对象名字(上一步中自定义的
      rules:
        - host: blog.canyuegongzi.xyz
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                   serviceName: simple-blog-center-clinet-service
                   servicePort: 3002
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    【每日一题】 和为 K 的子数组
    如何处理Flutter应用在iOS平台上的兼容性问题
    2009-2021系统架构设计师(高级)历年论文题目
    一文速学-时间序列分析算法之一次移动平均法和二次移动平均法详解+实例代码
    整合生成型AI战略:从宏观思维到小步实践
    Leetcode799. 香槟塔
    人工智能:支持向量机SVM 练习题(带解析)
    Python:web框架之Tornado的Hello World示例
    STM32学习笔记一:开发环境
    vsftp新建用户及目录时遇到的坑
  • 原文地址:https://blog.csdn.net/qq_37262037/article/details/128168529