k8s-证书配置大全

42次阅读

共计 3875 个字符,预计需要花费 10 分钟才能阅读完成。

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

正文完
 0