云计算
前言
在kubernetes群集安装和配置期间,会使用各种证书来增强群集的安全性,但许多初学者都有漏洞。
前期手动部署集群时,想知道集群组件的协作机制,各种不通,报告了很多奇怪的错误,大多是证书配置错误造成的。
建议在报告错误时仔细查看主节点和调试服务节点的日志。 基本上有用的错误日志、k8s打印的错误日志、指示的错误方向是可信的。
为了不踩漏洞,个人对集群配置中使用的证书信息进行了简单的整理。 详细情况如下。
群集使用证书
ETCD:ca.PEM、server-key.pem、server.pem;
使用kube-apiserver:ca.PEM、server-key.pem和server.pem;
使用Ubelet:ca.PEM;
kube-proxy:ca.PEM、kube-proxy-key.pem、kube-proxy.pem;
使用kubeCTL:ca.PEM、admin-key.pem和admin.pem;
kube-controller-manager:ca-key.PEM,使用ca.pem
注意:
所有证书生成操作都可以在主节点的主机上执行,并且只需创建一次证书。 然后,将证书copy添加到新的附加节点。
根据每个服务使用的证书分别构成即可。
其他几个类证书文件
token.csv
该文件是用户描述文件,基本形式为Token、用户名、UID、用户组; 此文件在apiserver启动时加载到apiserver中。
然后,在集群内创建了该用户; 你可以通过RBAC给他许可
bootstrap.kubeconfig
此文件包含Token.csv中用户的token和apiserver CA证书。 首次启动kubelet时将加载此文件。
使用apiserver CA证书建立与apiserver的TLS通信,使用其中的用户Token作为身份id,像apiserver一样发起CSR请求
证书生成过程概述
cfssl的安装
CFSSL是CloudFlare的开源PKI/TLS工具。 CFSSL包括命令行工具和用于捆绑签名、验证和TLS证书的HTTP API服务。
用Go语言写。
CFSSL包括以下内容:
用于生成自定义TLS PKI的一组工具;
cfssl程序、cfssl命令行工具;
multirootca程序是一种可以使用多个签名密钥的证书颁发机构服务
mkbundle程序用于构建证书池
cfssljson程序从cfssl和multirootca程序获取JSON输出并将证书、密钥、CSR和bundle写入磁盘;
PKI利用数字证书和公钥加密技术提供受信任的网络身份。 证书通常是包含身份信息的文件,例如:
证书中所有组织的信息
公钥
证书颁发组织信息
证书颁发组织授予的权限,包括证书的有效期、适用的主机名和用途
使用证书颁发组织的私钥创建的数字签名
下载
wget https://pkg.cf SSL.org/r 1.2/cf SSL _ Linux-amd64
wget https://pkg.cf SSL.org/r 1.2/cfssljson _ Linux-amd64
wget https://pkg.cf SSL.org/r 1.2/cf SSL-certinfo _ Linux-amd64
安装
chmodxcfssl _ Linux-amd64 cfssljson _ Linux-amd64 cf SSL-certinfo _ Linux-amd64
mvcfssl _ Linux-amd64/usr/local/bin/cf SSL
mvcfssljson _ Linux-amd64/usr/local/bin/cfssljson
mvcfssl-certinfo _ Linux-amd64/usr/bin/cf SSL-certinfo
演示证书生成过程
创建server ca证书
cat EOF | tee ca-config.json
{
signing: {
default: {
expiry: 87600h
(,
配置文件: {
服务器: { :
expiry: 87600h、
usages: [
信号,
密钥加密,
服务器自动、
客户端自动
]
}
}
}
}
EOF
字段说明:
expiry : 87600h 10年
ca-config.json :可以定义多个profiles,分别指定不同的有效期、使用场景等参数; 签名证书时使用配置文件
signing :表示此证书可用于签名其他证书。生成的ca.pem证书的CA=TRUE;
server auth :表示客户端可以使用此CA验证服务器提供的证书
client auth :表示服务器可以使用该CA验证client提供的证书
cat EOF | tee ca-csr.json
{
cn :服务器、
key: {
algo: rsa,
size: 2048
(,
names: [
{
( c ) cn、
l :北井,
ST :弹珠、
O: k8s,
OU: System
}
]
}
EOF
字段说明:
CN:Common Name,kube-apiserver从证书中提取此字段作为请求的用户名( User Name )。 浏览器使用此字段验证网站是否合法。
o :组织,kube-apiserver从证书中提取此字段作为请求用户所属的组( Group );
生成CA证书和私钥
cfsslgencert-init caca-CSR.JSON|cfssljson-bare ca -
验证ca证书
k8s-ssl]# ls
ca-config.json
ca-csr.json
ca.csr
ca-key.pem
ca.pem
创建服务器证书
cat EOF | tee server-csr.json
{
cn :服务器、
hosts: [
10.254.0.1、
127.0.0.1、
172.20.101.157、
172.20.101.165、
172.20.101.164、
172.20.101.160、
172.20.101.166、
172.20.101.167、
冲浪运动员、
server.default,
server.default.svc,
server.default.svc.cluster,
server.default.SVC.cluster.local
]、
key: {
algo: rsa,
size: 2048
(,
names: [
{
( c ) cn、
l :北井,
ST :弹珠、
O: k8s,
OU: System
}
]
}
EOF
字段说明:
如果" hosts "字段不为空,则必须提供允许使用证书的IP或域名列表。 证书将继续用于etcd群集和kubernetes master群集。
上面分别指定了etcd集群。
172.20.101.157、
172.20.101.165、
172.20.101.164、
kubernetes master群集的主机IP :
172.20.101.157、
172.20.101.165、
172.20.101.164、
kubernetes node节点IP :
172.20.101.160、
172.20.101.166、
172.20.101.167、
服务群集范围网段和第一个IP
10.254.0.1、
也可以写物理节点的主机名。
此外,还应填写使用集群配置高可用性vip的IP地址。
生成kubernetes证书和私钥
cfsslgencert-ca=ca.PEM-ca-key=ca-key.PEM-config=ca-config.JSON-profile=server server-CSR.JSON |
验证
ll server*
server.csr
server-csr.json
server-key.pem
server.pem
创建密钥代理证书
cat EOF | tee kube-proxy-csr.json
{
CN: system:kube-proxy,
hosts: [],
key: {
algo: rsa,
size: 2048
(,
names: [
{
( c ) cn、
l :北井,
ST :弹珠、
O: k8s,
OU: System
}
]
}
EOF
字段说明:
将CN证书的Use指定为system:kube-proxy;
kube-apiserver的预定义RoleBinding system:node-proxier将User system:kube-proxy与Role system:node-proxier联系起来,该Role将调用
创建kube-proxy证书
cfsslgencert-ca=ca.PEM-ca-key=ca-key.PEM-config=ca-config.JSON-profile=server kube-proxy-CSR .
验证
kube-*
kube-proxy.csr
kube-proxy-csr.json
kube-proxy-key.pem
kube-proxy.pem
创建管理员证书
cat admin-csr.jsonEOF
{
CN: admin
key: {
algo: rsa,
size: 2048
(,
names: [
{
( c ) cn、
ST :弹珠、
l :北井,
O: system:masters
OU: System
}
]
}
EOF
字段说明:
o如果将此证书的组指定为system:masters,并且kubelet使用此证书访问kube-apiserver,则证书由证书CA签名,从而通过验证。
此外,证书用户组是预批准的system:masters,因此被授予访问所有API的权限。
生成管理员证书
cfsslgencert-ca=ca.PEM-ca-key=ca-key.PEM-config=ca-config.JSON-profile=server admin-CSR.JSON |
验证
ll admin*
admin.csr
admin-csr.json
admin-key.pem
admin.pem
csr srl清理
find.- name *.CSR-o-name *.SRL|xargs RM-f
证书验证:
使用opsnssl命令验证key的内容
OpenSSL x509-noout-text-in server.PEM
cfssl-certinfo -cert server.pem
可以用生成的key文件替换后面的pem来检查key的内容。
集群比对key信息
集群构建完成。 命令:在kubectlgetclusterrolebindingcluster-admin-o YAML中,clusterrolebindingcluster-admin的子项目的kind为Group,name
也就是说,system:masters Group的用户或者serviceAccount都具有集群管理的作用。 因此,在使用kubectl命令时,
拥有整个集群的管理权限。 可以在kubectlgetclusterrolebindingcluster-admin-o YAML中显示。
参考文档:
3359 blog.51cto.com/looking dream/2176846
3359 jimmysong.io/kubernetes-handbook/practice/create-TLS-and-secret-key.html
详情请访问云服务器、域名注册、虚拟主机的问题,请访问西部数码代理商官方网站: www.chenqinet.cn