私有云etcd集群TLS设置
在部署 私有云架构 体系中,需要构建 私有云etcd服务 为私有k8s集群提供基础服务。部署参考并基于 etcd集群TLS设置 改进。
etcd支持通过TLS协议进行加密通讯,要使用自签名证书启动一个集群,集群的每个成员需要有有一个唯一密钥对( member.crt
和 member.key
)被一个共享的集群CA证书( ca.crt
)签名过,这个密钥对用于彼此通讯和客户端连接。
通过 私有云KVM环境 构建3台虚拟机:
主机IP |
主机名 |
---|---|
192.168.6.204 |
z-b-data-1 |
192.168.6.205 |
z-b-data-2 |
192.168.6.206 |
z-b-data-3 |
etcd集群证书生成
发行版安装cfssl
在 私有云架构 所使用的数据层3台虚拟机都是使用 Ubuntu Linux ,ubuntu发行版提供了 golang-cfssl
软件包,直接提供了 Cloudflare 的 cfssl
工具,所以直接安装非常方便:
sudo apt install golang-cfssl -y
证书生成
在设置etcd集群时需要使用3种证书:
Client certificate
是服务器用于认证客户端的证书,例如, etcdctl, etcd proxy 或者 docker客户端都需要使用Server certificate
是服务器使用,客户端用来验证服务器真伪的。例如 docker服务器或者kube-apiserver使用这个证书。Peer certificate
是etcd服务器成员彼此通讯的证书。
初始化证书认证
之前在 etcd集群TLS设置 实践中是产生默认
cfssl
选项,然后在此基础上修订。不过,我们既然有基础了,就直接配置ca-config.json
(有效期限10年):
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"server": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
},
"client": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
},
"peer": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
备注
这里CA配置中, "server"
段落必须要添加 "client auth"
,否则高版本etcd启动时会提示连接错误。详见 部署TLS认证的etcd集群
配置CSR(Certificate Signing Request)配置文件
ca-csr.json
:
{
"CN": "priv k8s etcd",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Shanghai",
"O": "huatai.me",
"ST": "cloud-atlas",
"OU": "staging"
}
]
}
使用上述配置定义生成CA:
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
这样将获得3个文件:
ca-key.pem
ca.csr
ca.pem
警告
请确保 ca-key.pem
文件安全,该文件是CA可以创建任何证书
生成服务器证书: 直接编辑
server.json
:
{
"CN": "priv k8s etcd",
"hosts": [
"etcd.staging.huatai.me",
"192.168.6.204",
"192.168.6.205",
"192.168.6.206",
"127.0.0.1"
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "CN",
"L": "Shanghai",
"ST": "cloud-atlas"
}
]
}
现在可以生成服务器证书和私钥:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server.json | cfssljson -bare server
这样获得3个文件:
server-key.pem
server.csr
server.pem
peer certificate (每个服务器一个,按对应主机名):
{
"CN": "z-b-data-1",
"hosts": [
"z-b-data-1.staging.huatai.me",
"z-b-data-1",
"192.168.6.204",
"127.0.0.1"
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "CN",
"L": "Shanghai",
"ST": "cloud-atlas"
}
]
}
{
"CN": "z-b-data-2",
"hosts": [
"z-b-data-2.staging.huatai.me",
"z-b-data-2",
"192.168.6.205",
"127.0.0.1"
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "CN",
"L": "Shanghai",
"ST": "cloud-atlas"
}
]
}
{
"CN": "z-b-data-3",
"hosts": [
"z-b-data-3.staging.huatai.me",
"z-b-data-3",
"192.168.6.206",
"127.0.0.1"
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "CN",
"L": "Shanghai",
"ST": "cloud-atlas"
}
]
}
对应生成3个主机的服务器证书:
for sn in `seq 3`; do
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer z-b-data-${sn}.json | cfssljson -bare z-b-data-${sn}
done
此时获得对应文件是:
z-b-data-1-key.pem
z-b-data-1.csr
z-b-data-1.pem
...
客户端证书
client.json
(主要是主机列表保持空):
{
"CN": "private k8s etcd client",
"hosts": [""],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "CN",
"L": "Shanghai",
"ST": "cloud-atlas"
}
]
}
现在可以生成客户端证书:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client.json | cfssljson -bare client
获得了以下文件:
client-key.pem
client.csr
client.pem
参考
Setting up Etcd Cluster with TLS Authentication Enabled 这篇文档非常详细指导了如何使用cfssl工具来生成etcd服务器证书,以及签名客户端证书
Generate self-signed certificates CoreOS官方(etcd开发公司)提供的指导文档