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