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