Kubernetes 证书配置
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
CA 可以用来签发证书。比如用于k8s的用户及组件的认证,CA 需要一个CA证书及私钥,私钥可以用于签发证书。
cfssl来自cloudflare。可以生成CA,签发证书
使用cfssl需要两个文件:
- 创建自己的内部服务使用的CA认证中心
-
运行认证中心需要一个CA证书和相应的私钥。后者是极其敏感的数据。任何知道私钥的人都可以充当CA颁发证书。因此,私钥的保护至关重要
ca-config.json CA的配置文件
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"kubernetes": {
"usages": ["signing", "key encipherment", "server auth", "client auth"],
"expiry": "8760h"
}
}
}
}
EOF
- profiles:是证书的类型,本例中该证书用于签名,且是双向对等证书(server auth, client auth)
- ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
- signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;(:表示可以签发证书)
- server auth:服务端证书;表示client可以用该 CA 对server提供的证书进行验证;server 由服务器使用,并由客户端验证服务器身份
- client auth:客户端证书;表示server可以用该CA对client提供的证书进行验证;client用于通过服务器验证客户端。
- peer 对等证书;就是server auth、client auth都有的。成员之间共用,供它们彼此之间通信使用
第二个文件是证书的签名请求文件(certificate signing request) ca-csr.json
cat > ca-csr.json <<EOF
{
"CN": "Kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "China",
"O": "Kubernetes",
"OU": "CA",
"ST": "Zhejiang"
}
]
}
EOF
#生成运行CA所必需的文件ca-key.pem(私钥)和ca.pem(证书),还会生成ca.csr(证书签名请求),用于交叉签名或重新签名。 #请保持ca-key.pem文件的安全。此密钥允许在CA中创建任何类型的证书。*.csr 文件在整个过程中不会使用
CN 是请求用户的用户名 O:是请求用户的组名
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
上述命令会生成一个证书 ca.pem ,一个私钥 ca-key.pem,以及ca.csr (证书签名请求).
openssl x509 -in ca.pem -text -noout
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 通信的,及APIServer的证书
- 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
相关文章
- 无缝融入 Kubernetes 生态 | 云原生网关支持 Ingress 资源
- 在阿里巴巴,我们如何先于用户发现和定位 Kubernetes 集群问题?
- kubernetes-v1.20.4 二进制部署-Calico网络组件、Dashboard和CoreDNS
- Kubernetes ConfigMap对应用程序配置
- Kubernetes PV 动态供给
- kubernetes 服务发现 Node_Exporter 监控 Kubernetes 集群节点
- 【云原生 | Kubernetes 系列】--Gitops持续交付 Tekton Pipeline使用进阶(pvc和Results)
- 【云原生 | Kubernetes 系列】---Kafka 集群安装配置手册
- 【云原生 | Kubernetes 系列】--Envoy高级路由配置
- 【云原生 | Kubernetes 系列】---altermanager消息配置和pushgateway
- 【云原生 | Kubernetes 系列】---Prometheus Blackbox_exporter监控
- 【云原生之kubernetes实战】使用docker作为运行时部署Kubernetes集群
- Kubernetes集群Pod资源基于pod反亲和性调度配置(十九)
- Kubernetes集群Pod资源node主机亲和性调度配置(十七)
- Kubernetes web界面kubernetes-dashboard安装【h】
- 【云原生 • Kubernetes】kubernetes 核心技术 - Label 和 Selector
- 在Kubernetes 1.20版本中不推荐使用Docker !
- Kubernetes 深入理解kubernetes(一)
- 【云原生 | Kubernetes 系列】---altermanager消息配置和pushgateway
- kubernetes_sd_configs可配置元标签详解