参考资料
- 假设已安装 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 满足已批准条件后再进行签名
- Cert-Manager 默认不会自动批准 step-issuer 的 CertificateReques
- 但 step-issuer 会生成 rolebinding 使其符合要求
kubectl get clusterrole step-issuer-approver-rolekubectl describe clusterrole step-issuer-approver-rolekubectl get clusterrolebinding step-issuer-approver-rolebindingkubectl 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
- Author:白鸟3
- URL:https://blog.kun2peng.top/operation/k8s_step_issuer
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
