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

563次阅读
没有评论

共计 2551 个字符,预计需要花费 7 分钟才能阅读完成。

前言

目前大部分的网站已经升级到 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
chmod 700 get_helm.sh
./get_helm.sh

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

二进制版本安装

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

cert-manager

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

heml 安装

  • 添加 cert-manager helm 仓库:
helm repo add jetstack https://charts.jetstack.io
  • 为 cert-manager 创建命名空间:
kubectl create namespace cert-manager
  • 然后使用 Helm 安装 cert-manager。
helm install  cert-manager jetstack/cert-manager --namespace cert-manager --version v1.10.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

其他方式

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

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

创建、部署 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

部署

kubectl apply -f cluster-issuer.yaml

创建、部署 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 的域名 

部署

kubectl apply -f  b-cert.yaml

使用

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

正文完
 
评论(没有评论)