私有云etcd集群TLS设置

在部署 私有云架构 体系中,需要构建 私有云etcd服务 为私有k8s集群提供基础服务。部署参考并基于 etcd集群TLS设置 改进。

etcd支持通过TLS协议进行加密通讯,要使用自签名证书启动一个集群,集群的每个成员需要有有一个唯一密钥对( member.crtmember.key )被一个共享的集群CA证书( ca.crt )签名过,这个密钥对用于彼此通讯和客户端连接。

通过 私有云KVM环境 构建3台虚拟机:

私有云KVM虚拟机

主机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 工具,所以直接安装非常方便:

ubuntu发行版提供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年):

修订证书有效期10年 ca-config.json
{
    "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 :

修订CSR 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:

生成CA
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -

这样将获得3个文件:

ca-key.pem
ca.csr
ca.pem

警告

请确保 ca-key.pem 文件安全,该文件是CA可以创建任何证书

  • 生成服务器证书: 直接编辑 server.json :

修订 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 (每个服务器一个,按对应主机名):

服务器 z-b-data-1.staging.huatai.me 点对点证书
{
    "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"
        }
    ]
}
服务器 z-b-data-2.staging.huatai.me 点对点证书
{
    "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"
        }
    ]
}
服务器 z-b-data-3.staging.huatai.me 点对点证书
{
    "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个主机的服务器证书:

生成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 (主要是主机列表保持空):

修订 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

参考