0%

共享ETCD的Kubernetes集群

部署独立的ETCD

部署一个独立的ETCD服务,为多个K8s集群提供存储服务。

生成TLS需要的证书

为了更好的配置TLS访问,这里手工创建CA证书。

  • 生成ca证书,在pki目录内

    1
    2
    3
    $ cd pki
    $ openssl genrsa -out ca.key 2048
    $ openssl req -x509 -new -nodes -key ca.key -days 3650 -out ca.crt -subj "/CN=root-ca"
  • etcd的request配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ cat << EOF > etcd-req.cnf
    [req]
    req_extensions = v3_req
    distinguished_name = req_distinguished_name

    [req_distinguished_name]

    [v3_req]
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    subjectAltName = @alt_names

    [alt_names]
    DNS.1 = *.sslip.io
    IP.1 = 127.0.0.1
    EOF
  • 生成etcd证书

    1
    2
    3
    4
    5
    $ openssl genrsa -out etcd.key 2048
    $ openssl req -new -sha256 -key etcd.key -out etcd.csr -subj "/CN=etcd-ca" -config etcd-req.cnf
    $ openssl x509 -req -sha256 -in etcd.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out etcd.crt -days 3650 -extensions v3_req -extfile etcd-req.cnf
    Certificate request self-signature ok
    subject=CN=etcd-ca
  • 通过docker镜像启动etcd服务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ docker run -d --name etcd \
    --publish 2379:2379 \
    --publish 2380:2380 \
    --volume $PWD/pki:/etc/etcd/ssl:Z \
    --volume $PWD/etcd:/var/lib/etcd:Z \
    --env ETCD_TRUSTED_CA_FILE=/etc/etcd/ssl/ca.crt \
    --env ETCD_KEY_FILE=/etc/etcd/ssl/etcd.key \
    --env ETCD_CERT_FILE=/etc/etcd/ssl/etcd.crt \
    --env ETCD_LISTEN_CLIENT_URLS="https://0.0.0.0:2379" \
    --env ETCD_ADVERTISE_CLIENT_URLS="https://0.0.0.0:2380" \
    quay.io/coreos/etcd:v3.5.16
  • 访问etcd

    1
    2
    3
    4
    5
    6
    $ etcdctl --cacert pki/ca.crt --cert pki/etcd.crt --key pki/etcd.key member list -w table
    +------------------+---------+---------+-----------------------+-----------------------+
    | ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS |
    +------------------+---------+---------+-----------------------+-----------------------+
    | 8e9e05c52164694d | started | default | http://localhost:2380 | http://127.0.0.1:2379 |
    +------------------+---------+---------+-----------------------+-----------------------+

可以配置alias简化命令行操作

1
2
3
$ alias et='etcdctl --cacert pki/ca.crt --cert pki/etcd.crt --key pki/etcd.key'
$ et member list
8e9e05c52164694d, started, default, http://localhost:2380, http://127.0.0.1:2379
  • 导出etcd存储的原始数据(调试用)
    1
    2
    $ etcd-dump-db iterate-bucket etcd/default.etcd cluster
    key="clusterVersion", value="3.5.0"

工具etcd-dump-db需要自己下载代码编译,源码在etcd项目的tools目录下。

kind部署Kubernetes集群使用外部ETCD

通过kind部署K8s集群,配置使用外部的ETCD。

Kubernetes数据存储配置namespace

为每个K8s集群在ETCD内的数据增加namespace前缀(相当于集群名称),用以隔离不同集群的数据。