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