证书是网络通讯的安全的要素,是现代网络通讯的基本配置。各类远程调用的安全都离不开非对称加密提供的保障。node
cfssl 是 CloudFlare 开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具(cfssl, cfssljson)用于签名,验证而且捆绑TLS证书的 HTTP API 服务。 使用Go语言编写。与 OpenSSL 相比,cfssl 使用起来更简单。git
Github 地址: https://github.com/cloudflare...
官网地址: https://pkg.cfssl.org/github
若是有golang环境,用go安装很简单golang
$ go get -u github.com/cloudflare/cfssl/cmd/cfssl $ go get -u github.com/cloudflare/cfssl/cmd/cfssljson
cfssljson 实用程序shell
大部分 cfssl 的输出为 JSON 格式。cfssljson 能够将输出拆分出来为独立的key,certificate,CSR 和 bundle文件。该工具须要指定参数,-f
指定输入文件,后接一个参数,指定生成的文件的基本名称。若是输入文件名是 -
(默认值),则 cfssljson 从标准输入读取。它如下列方式将 JSON 文件中的键映射到文件名:json
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
证书分四类bootstrap
在生成证书过程当中须要有四类文件api
-----BEGIN CERTIFICATE REQUEST-----
标识cfssl
,json格式,大括号开始-----BEGIN RSA PRIVATE KEY-----
标识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
在配置好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