k8s 证书配置大全

栏目: 编程工具 · 发布时间: 6年前

内容简介:证书是网络通信的安全的要素,是现代网络通信的基本配置。各种远程调用的安全都离不开非对称加密提供的保障。cfssl 是 CloudFlare 开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具(cfssl, cfssljson)用于签名,验证并且捆绑TLS证书的 HTTP API 服务。 使用Go语言编写。与 OpenSSL 相比,cfssl 使用起来更简单。Github 地址:

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

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Is Parallel Programming Hard, And, If So, What Can You Do About

Is Parallel Programming Hard, And, If So, What Can You Do About

Paul E. McKenney

The purpose of this book is to help you understand how to program shared-memory parallel machines without risking your sanity.1 By describing the algorithms and designs that have worked well in the pa......一起来看看 《Is Parallel Programming Hard, And, If So, What Can You Do About 》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具