0%

K3s证书管理

手动管理证书

生成证书

参考 OpenSSL生成自签名证书

导入证书

1
kubectl create secrets tls example-io-tls --key example.io.key --cert example.io.crt

手动管理证书可忽略下边的安装过程,跳转到证书配置

使用cert-manager管理证书

部署cert-manager

方式一: 使用Helm部署(推荐)

1
2
3
4
5
6
7
8
9
10
11
# 添加镜像源
helm repo add jetstack https://charts.jetstack.io

#获取配置文件
helm show values jetstack/cert-manager > cert-manager-values.yaml

# 部署cert-mangaer
helm upgrade cert-manager jetstack/cert-manager \
--namespace cert-manager \
--install --create-namespace \
--set crds.enabled=true

方式二: 使用kubectl部署

1
2
3
4
5
6
7
8
9
# Kubernetes 1.16+
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.0/cert-manager.yaml
# Kubernetes <1.16
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.1.0/cert-manager-legacy.yaml

# Kubernetes 1.15+
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.16.1/cert-manager.yaml
# Kubernetes <1.15
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.16.1/cert-manager-legacy.yaml

创建ClusterIssuer/Issuer

公网域名证书

Issuer 与 ClusterIssuer 的区别是 ClusterIssuer 可跨命名空间使用,而 Issuer 需在每个命名空间下配置后才可使用。这里我们使用 ClusterIssuer,其类型选择 Let‘s Encrypt。

正式环境速率限制(每个注册域名可签发的证书数量(每周 50 份)),使用测试环境测试一切正常后再切换正式环境。

letsencrypt-issuer-staging.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
email: <YOUR EMAIL> # replice this
server: https://acme-staging-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-staging
solvers:
- http01:
ingress:
class: traefik
selector: {}

letsencrypt-issuer-prod

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: <YOUR EMAIL> # replice this
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: traefik
selector: {}

说明:

metadata.name 创建的签发机构的名称,创建证书的时候会引用
spec.acme.email 邮箱,证书快过期的时候会有邮件提醒,不过cert-manager会利用acme协议自动给我们重新颁发证书来续期
spec.acme.server acme 协议的服务端,由官方给出
spec.acme.privateKeySecretRef 指示此签发机构的私钥将要存储到哪个Secret对象中
spec.acme.solvers.http01 指示签发机构使用HTTP-01的方式进行acme协议 (还可以用DNS方式,acme协议的目的是证明这台机器和域名都是属于你的,然后才准许给你颁发证书)

自签名证书

selfsigned-issuer.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: selfsigned-cluster-issuer
spec:
selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: selfsigned-ca
spec:
isCA: true
commonName: selfsigned-ca
secretName: root-secret
privateKey:
algorithm: ECDSA
size: 256
subjects:
organizations:
-
issuerRef:
name: selfsigned-cluster-issuer
kind: ClusterIssuer
group: cert-manager.io
#---
## 使用自定义根证书
## 导入根证书 kubectl create secret tls ca-secret --key root-ca.key --cert root-ca.crt
#apiVersion: cert-manager.io/v1
#kind: ClusterIssuer
#metadata:
# name: selfsigned-cluster-issuer
#spec:
# ca:
# secretName: ca-secret

spec.subjects.organizations:

创建域名证书

公网域名证书

example-io-tls.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: example-io-tls
spec:
secretName: example-io-secret #
issuerRef:
name: letsencrypt-staging # 使用自签名证书时替换为 selfsigned-cluster-issuer
kind: ClusterIssuer
duration: 2160h
renewBefore: 360h
dnsNames:
- example.io
ipAddresses:
- 192.168.1.1

生产环境使用建议

实际生产环境中使用cert-manager可以考虑以下建议:

  1. 将CA的SecretIssuer放在某个独立的命名空间中,与其它业务的命名空间隔离起来。
  2. 如果是CA类型的Issuer,要记得定期更新根CA证书。
  3. 如果服务可被公网访问,同时又不想花钱买域名证书,可以采用Letsencrypt类型的Issuer,目前支持两种方式验证域名的所有权,基于DNS记录的验证方案和基于文件的HTTP验证方案
  4. cert-manager还提供ingress-shim方式,自动为Ingress资源生成证书,只需要在Ingress资源上打上一些标签即可,详细可参考这里

spec.secretName 指示证书最终存到哪个 Secret 中

spec.issuerRef.kind 值为 ClusterIssuer 说明签发机构不在本 namespace 下,而是在全局

spec.issuerRef.name 我们创建的签发机构的名称 (ClusterIssuer.metadata.name)

spec.duration 证书过期时间

spec.renewBefore 在过期前自动更新

spec.dnsNames 指示该证书的可以用于哪些域名

spec.acme.config.http01.domains 指示该证书的可以用于哪些域名

Traefik配置证书

终端安装证书

获取CA证书,root-ca.crt,k3s导出证书 参考 K3s导出证书


k8s中使用cert-manager玩转证书-腾讯云开发者社区-腾讯云 (tencent.com)

k8s 使用cert-manager证书管理自签-CSDN博客

k8s部署cert-manager实现证书自动化_cert-manager.yaml-CSDN博客

Cert-Manager 实现 K8s 服务域名证书自动化续签 - 知乎 (zhihu.com)

手把手教你使用 cert-manager 签发免费证书 - 腾讯云原生 - 博客园 (cnblogs.com)

在 k3s 内使用 cert-manager 管理证书 (bowser1704.github.io)

用 k3s 轻松管理 SSL 证书 | Linux 中国 - 知乎

k8s中级篇-cert-manager+Let‘s Encrypt自动证书签发_cert-manager let’s encrypt-CSDN博客

容器服务 使用 cert-manager 签发免费证书-实践教程-文档中心-腾讯云 (tencent.com)

内网证书

cert-manager管理内网k8s开发环境证书 - hueidou163 - 博客园 (cnblogs.com)

SelfSigned - cert-manager (k8s-docs.github.io)

k8s 使用cert-manager证书管理自签-CSDN博客

k8s中使用cert-manager玩转证书-腾讯云开发者社区-腾讯云 (tencent.com)

k8s ingress配置自签名证书,并解决Kubernetes Ingress Controller Fake Certificate-CSDN博客

K8s & K3s 集群中应用自动签发 Https 证书 - 流雨声 - 博客园 (cnblogs.com)

Kubernetes (K8S) 中Traefik自动申请证书-腾讯云开发者社区-腾讯云