Lazy loaded image
K8s cert-manager 搭配 step-issuer 签发 step-ca 证书
Words 972Read Time 3 min
2025-10-10
2025-11-10
date
related_level
slug
k8s_step_issuer
type
Post
relate_date
summary
cert-manager 通过 step-issuer 实现 K8s 集群签发 step-ca TLS 证书并自动续签
status
Published
tags
k8s
TLS
实用教程
最新推荐
category
运维管理
last_updated
Nov 10, 2025 10:02 PM
是否已更新
orginal_page
是否推荐
参考资料
  • 假设已安装 step-ca 服务,可以是外部也可以是 K8s 内部服务
    • 这里以外部 step-ca 为例,k8s 安装 step-certificates 参考资料里的步骤
安装 cert-manager
  • helm repo add jetstack https://charts.jetstack.io --force-update
  • helm upgrade --install \ cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --version v1.19.0 \ --set crds.enabled=true
    • 不要更改命名空间,否则会有 rolebinding 会出问题
安装 step-issuer
使用外部已有的 step-ca 服务器配置 step-issuer
  • 如果节点未初始化过 step ca 配置
    • step ca bootstrap -f --ca-url <ca_url> --fingerprint <ca_fingerprint> --install
  • 获取 provisioner 配置
    • step ca provisioner list | jq .[0]
      • 假设用到的是第一个 provisioner
    • 官方建议为 cert-manager 单独配置一个 provisioner
映射外部配置到环境变量
  • CA_ROOT_B64=$(cat ~/.step/certs/root_ca.crt | step base64)
  • CA_URL=$(jq -r '."ca-url"' ~/.step/config/defaults.json)
  • CA_PROVISIONER_NAME=$(step ca provisioner list | jq .[0].name)
  • CA_PROVISIONER_KID=$(step ca provisioner list | jq -r .[0].key.kid)
创建 Secret 用于存储密码
  • read -s "pw?Enter password: " && \ kubectl -n step create secret generic step-certificates-provisioner-password --from-literal=password="$pw" && \ unset pw
    • step ca provisioner add 时提供的密码
  • kubectl -n step get secret step-certificates-provisioner-password -o jsonpath='{.data.password}' | base64 -d
创建 step-issuer value 文件
  • kind: StepIssuer 仅可以签署同一命名空间下的证书, 即同 step 命名空间下
    • 这里用 StepClusterIssuer 可以签署跨命名空间进行集群级别签发
  • passwordRef 引用之前的 Secret
  • helm repo add smallstep https://smallstep.github.io/helm-charts --force-update
  • helm install step-issuer smallstep/step-issuer \ --namespace step \ --create-namespace
  • kubectl apply -f ~/.config/helm/value/step-issuer.yaml
    • 配置 step-issuer
  • 查看是否创建了 issuer
    • kubectl get stepclusterissuer.certmanager.step.sm step-issuer -o yaml
查看运行情况
  • kubectl get pod -n step -l app.kubernetes.io/name=step-issuer
  • kubectl get svc -n step -l app.kubernetes.io/name=step-issuer
  • kubectl logs --since=1h -n step $(kubectl get pod -n step -l app.kubernetes.io/name=step-issuer -o jsonpath='{.items[0].metadata.name}')
  • kubectl get pod -n cert-manager -l app.kubernetes.io/name=cert-manager
  • kubectl get svc -n cert-manager -l app.kubernetes.io/name=cert-manager
  • kubectl logs --since=1h -n cert-manager $(kubectl get pod -n cert-manager -l app.kubernetes.io/name=cert-manager -o jsonpath='{.items[0].metadata.name}')
创建通配符证书作为 traefik 默认证书
vim ~/.step/cert.traefik.k8s.yaml
创建 Certificate 资源
  • kubectl apply -f ~/.step/cert.traefik.k8s.yaml
查看 Certificate 签发情况
  • kubectl get Certificate -n kube-system common-traefik-cluster-local-cert -o yaml
  • kubectl get secret -n kube-system traefik-tls-secret
traefik 使用该 secret 中的证书作为默认 TLS 证书
vim ~/.config/helm/value/traefik.tls.yaml
  • 名称必须为 default
  • 确保和 Secert 在同一命名空间
  • kubectl apply -f ~/.config/helm/value/traefik.tls.yaml
  • kubectl get tlsstore -A
  • kubectl rollout restart deployment traefik -n kube-system
    • 重启 traefik 以生效
    • secret 发生变化后会自动重新加载
curl 测试证书
假设已开启 traefik dashboard
  • 如果是 k3s 内置的 traefik 参考另一文章进行配置
  • vim ~/.config/helm/value/traefik.yaml
添加 DNS 记录到 /etc/hosts
  • kubectl -n kube-system get svc -l app.kubernetes.io/name=traefik -o wide
    • 获取 external-ip
  • curl -kv https://dboard.traefik.cluster.local/ 2>&1 | grep -A10 "Server certificate"
(可选)创建证书 CSR,具体证书需要从 CSR 中进一步提取
外部 step 创建 base64 编码 CSR
  • step certificate create --csr "*.traefik.cluster.local" traefik.k8s.csr traefik.k8s.key
    • 如果应用不支持加密密钥可以添加 --no-password --insecure
  • CSR_B64=$(cat traefik.k8s.csr | step base64)
配置 CertificateRequest 资源文件
  • 使用 StepClusterIssuer 跨命名空间签发
创建 CertificateRequest 资源
  • kubectl apply -f ~/.step/csr.traefik.k8s.yaml
查看 CSR 签发情况
kubectl get certificaterequests -n kube-system common-traefik-cluster-local -o yaml
  • step-issuer 会等待 CertificateReques 满足已批准条件后再进行签名
  • 但 step-issuer 会生成 rolebinding 使其符合要求
    • kubectl get clusterrole step-issuer-approver-role
    • kubectl describe clusterrole step-issuer-approver-role
    • kubectl get clusterrolebinding step-issuer-approver-rolebinding
    • kubectl describe clusterrolebinding step-issuer-approver-rolebinding
获取 CSR 中的证书
  • kubectl get certificaterequests -n kube-system common-traefik-cluster-local -o jsonpath='{.status.certificate}'| base64 -d > cert.crt
 
上一篇
K8s 部署轻量级私有制品库
下一篇
debian 裸机安装 notionNext 搭建个人博客

Comments
Loading...