k8s 证书配置大全

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 证书是网络通信的安全的要素,是现代网络通信的基本配置。各种远程调用的安全都离不开非对称加密提供的保障。

Kubernetes 证书配置大全


证书是网络通信的安全的要素,是现代网络通信的基本配置。各种远程调用的安全都离不开非对称加密提供的保障。


下载证书工具

cfssl 是 CloudFlare 开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具(cfssl, cfssljson)用于签名,验证并且捆绑TLS证书的 HTTP API 服务。 使用Go语言编写。与 OpenSSL 相比,cfssl 使用起来更简单。

Github 地址: https://github.com/cloudflare...

官网地址: https://pkg.cfssl.org/

如果有golang环境,用go安装很简单

$ go get -u github.com/cloudflare/cfssl/cmd/cfssl
$ go get -u github.com/cloudflare/cfssl/cmd/cfssljson


cfssljson 实用程序

大部分 cfssl 的输出为 JSON 格式。cfssljson 可以将输出拆分出来为独立的key,certificate,CSR 和 bundle文件。该工具需要指定参数,-f 指定输入文件,后接一个参数,指定生成的文件的基本名称。如果输入文件名是 -(默认值),则 cfssljson 从标准输入读取。它以下列方式将 JSON 文件中的键映射到文件名:

  • 如果指定了cert或certificate, 将生成basename.pem。
  • 如果指定了key 或private_key,则将生成basename-key.pem。
  • 如果指定了csr 或certificate_request,则将生成basename.csr。
  • 如果 指定了bundle, 则将生成basename-bundle.pem。
  • 如果指定了ocspResponse, 则将生成basename-response.der。
    您可以传递-stdout输出编码内容到标准输出,而不是保存到文件。


验证证书有效期

cfssl certinfo -cert /etc/kubernetes/ssl/ca.pem |grep not_after
cfssl certinfo -cert  /etc/kubernetes/ssl/admin.pem |grep not_after
cfssl certinfo -cert /etc/kubernetes/ssl/kubernetes.pem |grep not_after
cfssl certinfo -cert /etc/kubernetes/ssl/kube-proxy.pem  |grep not_after


生成新证书

证书分四类

  • ca.pem - 私有CA根证书
  • kubernetes.pem - 与 node 通信的,
  • kube-proxy.pem - k8s 与容器通信的
  • admin.pem - kubectl 管理用

生成证书请求


在生成证书过程中需要有四类文件

  • *.csr - 证书请求文件,base64格式,有-----BEGIN CERTIFICATE REQUEST-----标识
  • *csr.json - 证书请求文件,是上面格式的再封装,便于传给cfssl,json格式,大括号开始
  • *-key.pem - 私匙文件,base64格式,有-----BEGIN RSA PRIVATE KEY-----标识
  • *.pem - 证书文件,base64格式,可以用cfssl certinfo -cert 文件名查看有效期,有-----BEGIN CERTIFICATE-----标识

以上四种文件,前两类是中间产物,过后可以不保留,后两个需要配置到系统中 (通常是主从结点的/etc/kubernetes/ssl目录下)。

中间文件和生成的文件最好放在一起

cat > ca-csr.json << 'HERE'
{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
HERE

部分字段说明:

“CN”:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;

“O”:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);

其他几类证书请求类似


用证书请求生成证书

cfssl gencert -initca ca-csr.json | cfssljson -bare ca


配置证书,使其生效

需要把生成的证书复制到全部 master和 node 结点。

scp *.pem yourname@yournode:/etc/kubernetes/ssl/

在 master 结点上生成~/.kube/config便于kubectl日常交互使用

KUBE_APISERVER="https://192.168.122.100:6443"  #这里换成你的 master 结点 IP
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER}
kubectl config set-credentials admin \
--client-certificate=/etc/kubernetes/ssl/admin.pem \
--embed-certs=true \
--client-key=/etc/kubernetes/ssl/admin-key.pem
kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=admin
kubectl config use-context kubernetes
ls ~/.kube/config


结点间通信用的证书配置


cd /etc/kubernetes
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=bootstrap.kubeconfig
kubectl config set-credentials kubelet-bootstrap \
--token=${BOOTSTRAP_TOKEN} \
--kubeconfig=bootstrap.kubeconfig
kubectl config set-context default \
--cluster=kubernetes \
--user=kubelet-bootstrap \
--kubeconfig=bootstrap.kubeconfig
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=kube-proxy.kubeconfig
kubectl config set-credentials kube-proxy \
--client-certificate=/etc/kubernetes/ssl/kube-proxy.pem \
--client-key=/etc/kubernetes/ssl/kube-proxy-key.pem \
--embed-certs=true \
--kubeconfig=kube-proxy.kubeconfig
kubectl config set-context default \
--cluster=kubernetes \
--user=kube-proxy \
--kubeconfig=kube-proxy.kubeconfig
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap


bootstrap方式给节点颁发证书

在配置好kubelet-bootstrap.kubeconfig后,重启结点,结点会向master申请证书。

master结点上运行

kubectl get certificatesigningrequests

会发现以下类似的输出

NAME                 AGE       REQUESTOR           CONDITION
node-csr-dAxCUJNZ4   22m       kubelet-bootstrap   Pending

通过以下命令,授权颁发给节点证书

kubectl certificate approve node-csr-dAxCUJNZ4

通过后正常后会输出

certificatesigningrequest "node-csr-dAxCUJNZ4" approved
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
JSON Kubernetes API
深入理解Kubernetes配置:编写高效的YAML文件
深入理解Kubernetes配置:编写高效的YAML文件
|
2天前
|
Kubernetes 监控 Java
如何在Kubernetes中配置镜像和容器的定期垃圾回收
如何在Kubernetes中配置镜像和容器的定期垃圾回收
|
1月前
|
负载均衡 Kubernetes 区块链
随机密码生成器+阿里k8s负载均衡型服务加证书方法+移动终端设计+ico生成器等
随机密码生成器+阿里k8s负载均衡型服务加证书方法+移动终端设计+ico生成器等
50 1
|
6月前
|
Kubernetes 负载均衡 应用服务中间件
深入理解 Kubernetes Ingress:路由流量、负载均衡和安全性配置
深入理解 Kubernetes Ingress:路由流量、负载均衡和安全性配置
1055 1
|
3月前
|
Kubernetes Go 网络安全
Kubernetes 中使用consul-template渲染配置
Kubernetes 中使用consul-template渲染配置
56 1
Kubernetes 中使用consul-template渲染配置
|
3月前
|
Kubernetes 网络性能优化 调度
在K8S中,Kubernets资源限制是如何配置的,是否根据Qos?
在K8S中,Kubernets资源限制是如何配置的,是否根据Qos?
|
3月前
|
Kubernetes 调度 Perl
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
|
3月前
|
存储 Kubernetes Linux
Kubernetes 的配置资源 ConfigMap(01部分)
Kubernetes 的配置资源 ConfigMap(01部分)
|
3月前
|
Kubernetes 容器
查看k8s secrets证书有效期
查看k8s secrets证书有效期
|
3月前
|
Kubernetes API 网络架构
【Azure APIM】APIM self-host 部署在K8S中,如何更换证书呢?
【Azure APIM】APIM self-host 部署在K8S中,如何更换证书呢?
下一篇
无影云桌面