首页 > 代码库 > kubernetes部署之创建TLS证书(2)
kubernetes部署之创建TLS证书(2)
研究过kubernetes的同事们都知道,kubernetes如果需要启用TLS认证,那么制作证书是必不可少的一步。然而,很多人在制作证书上遇到了很多的麻烦。今天主要记录一次我在部署kubernetes的过程中,是如何制作证书的。在整个过程中,将详细列出各组件的启动参数,给出配置文件,以及详解它们的含义和可能遇到的问题。
一、部署前准备
1.1 主机环境
环境参考ETCD集群部署,这里会增加一个VIP(192.168.15.200),用户实现kubernetes master高可用;
1.2 安装cfssl工具
cd /usr/src/
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
chmod +x cfssl_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
chmod +x cfssljson_linux-amd64
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl-certinfo_linux-amd64
mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
二、生成证书
2.1 创建CA证书
mkdir /root/ssl
cd /root/ssl
cat >> ca-config.json << EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
EOF
提示:
ca-config.json
:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数,后续在签名证书时使用某个profile;
signing
:表示该证书可用于签名其它证书,生成的ca.pem证书中CA=TRUE
;
server auth
:表示client可以用该CA对server提供的证书进行验证;
client auth
:表示server可以用该CA对client提供的证书进行验证;
创建CA证书签名请求配置:
cat >> ca-csr.json << EOF
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "system"
}
]
}
EOF
提示:
CN
即Common Name,kube-apiserver从证书中提取该字段作为请求的用户名;
O
即Organization,kube-apiserver从证书中提取该字段作为请求用户所属的组;
用cfssl生成CA证书以及颁发证书:
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
2.2 创建apiserver证书
cat >> apiserver-csr.json << EOF
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"192.168.15.131",
"192.168.15.132",
"192.168.15.133",
"192.168.15.200",
"10.96.0.1",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "system"
}
]
}
EOF
提示:注意上面配置hosts字段中制定授权使用该证书的IP和域名列表,因为现在要生成的证书需要被Kubernetes Master集群各个节点使用,所以这里指定了各个节点的IP和hostname。同时还要指定集群内部kube-apiserver的多个域名和IP地址10.96.0.1
(后边kube-apiserver-service-cluster-ip-range=10.96.0.0/12
参数的指定网段的第一个IP)。最后一点,如果你用到了VIP这里也是需要添加该IP地址的。
生成kube-apiserver的证书和私钥:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=frognew apiserver-csr.json | cfssljson -bare apiserver
2.3 创建kubernetes-admin证书以及私钥
cat >> admin-csr.json << EOF
{
"CN": "kubernetes-admin",
"hosts": [
"192.168.15.131",
"192.168.15.132",
"192.168.15.133",
"192.168.15.200"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "system:masters",
"OU": "system"
}
]
}
EOF
提示:kube-apiserver将提取CN
作为客户端的用户名,这里是kubernetes-admin
,将提取O
作为用户所属的组,这里是system:master
。 kube-apiserver预定义了一些 RBAC使用的ClusterRoleBindings,例如 cluster-admin将组system:masters与 ClusterRole cluster-admin绑定,而cluster-admin拥有访问kube-apiserver的所有权限,因此kubernetes-admin
这个用户将作为集群的超级管理员。(具体参考kubernetes 认证相关文档)
生成kubernetes-admin
的证书和私钥:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=frognew admin-csr.json | cfssljson -bare admin
2.4 创建kubernetes-controller-manager证书和私钥
cat >> controller-manager-csr.json << EOF
{
"CN": "system:kube-controller-manager",
"hosts": [
"192.168.15.131",
"192.168.15.132",
"192.168.15.133",
"192.168.15.200"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "system:kube-controller-manager",
"OU": "system"
}
]
}
EOF
提示:kube-apiserver将提取CN
作为客户端的用户名,这里是system:kube-controller-manager
。 kube-apiserver预定义的 RBAC使用的ClusterRoleBindings system:kube-controller-manager
将用户system:kube-controller-manager
与ClusterRole system:kube-controller-manager
绑定。
生成kubernetes-controller-manager证书及私钥:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=frognew controller-manager-csr.json | cfssljson -bare controller-manager
2.5 创建kubernetes-scheduler证书及私钥
cat >> scheduler-csr.json << EOF
{
"CN": "system:kube-scheduler",
"hosts": [
"192.168.15.131",
"192.168.15.132",
"192.168.15.133",
"192.168.15.200"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "system:kube-scheduler",
"OU": "system"
}
]
}
EOF
提示:kube-scheduler将提取CN
作为客户端的用户名,这里是system:kube-scheduler
。 kube-apiserver预定义的RBAC使用的ClusterRoleBindings system:kube-scheduler
将用户system:kube-scheduler
与ClusterRole system:kube-scheduler
绑定。
生成kubernetes-scheduler证书及私钥:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=frognew scheduler-csr.json | cfssljson -bare scheduler
至此,所有相关证书制作完成!
kubernetes部署之创建TLS证书(2)