etcd 集群部署+SSL(yum)

关闭防火墙和SELINUX

systemctl stop firewalld
systemctl disable firewalld

sed -i 's/#SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

安装etcd

在这里插入图片描述
etcd10

vi /etc/etcd/etcd.conf 
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/etcd10.etcd"  #数据目录
ETCD_WAL_DIR="/var/lib/etcd/etcd10/wal"    #日志及快照目录
ETCD_LISTEN_PEER_URLS="http://192.168.12.10:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.12.10:2379,http://127.0.0.1:2379" #127.0.0.1需要加上,不然etcdctl客户端命令报错
ETCD_NAME="etcd10"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.12.10:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.12.10:2379"
ETCD_INITIAL_CLUSTER="etcd10=http://192.168.12.10:2380,etcd11=http://192.168.12.11:2380,etcd12=http://192.168.12.12:2380"

etcd11

#[Member]
#ETCD_CORS=""
ETCD_DATA_DIR="/var/lib/etcd/etcd11.etcd"
ETCD_WAL_DIR="/var/lib/etcd/etcd11/wal"
ETCD_LISTEN_PEER_URLS="http://192.168.12.11:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.12.11:2379,http://127.0.0.1:2379"
ETCD_NAME="etcd11"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.12.11:2380"
ETCD_INITIAL_CLUSTER="etcd10=http://192.168.12.10:2380,etcd11=http://192.168.12.11:2380,etcd12=http://192.168.12.12:2380"

etcd12

#[Member]
#ETCD_CORS=""
ETCD_DATA_DIR="/var/lib/etcd/etcd12.etcd"
ETCD_WAL_DIR="/var/lib/etcd/etcd12/wal"
ETCD_LISTEN_PEER_URLS="http://192.168.12.12:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.12.12:2379,http://127.0.0.1:2379"
ETCD_NAME="etcd12"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.12.12:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.12.12:2379"
ETCD_INITIAL_CLUSTER="etcd10=http://192.168.12.10:2380,etcd11=http://192.168.12.11:2380,etcd12=http://192.168.12.12:2380"
name:etcd集群中的节点名,这里可以随意,可区分且不重复就行
listen-peer-urls:监听的用于节点之间通信的url,可监听多个,集群内部将通过这些url进行数据交互(如选举,数据同步等)
initial-advertise-peer-urls:建议用于节点之间通信的url,节点间将以该值进行通信。
listen-client-urls:监听的用于客户端通信的url,同样可以监听多个。
advertise-client-urls:建议使用的客户端通信 url,该值用于 etcd 代理或 etcd 成员与 etcd 节点通信。
initial-cluster-token: etcd-cluster-1,节点的 token 值,设置该值后集群将生成唯一 id,并为每个节点也生成唯一 id,当使用相同配置文件再启动一个集群时,只要该 token 值不一样,etcd 集群就不会相互影响。
initial-cluster:也就是集群中所有的initial-advertise-peer-urls 的合集。
initial-cluster-state:new,新建集群的标志

参考:https://zhuanlan.zhihu.com/p/146296088

配置API版本为3,默认为2

vi  /etc/profile
export ETCDCTL_API=3

source /etc/profile
#系统环境变量生效

在这里插入图片描述

常见使用命令

设置环境变量,便于查询

HOST_1=192.168.12.10
HOST_2=192.168.12.11
HOST_3=192.168.12.12
ENDPOINTS=$HOST_1:2379,$HOST_2:2379,$HOST_3:2379
etcdctl --endpoints=$ENDPOINTS endpoint health 
#查看集群状态
etcdctl --endpoints=$ENDPOINTS member list
#查看集群成员列表

etcdctl put d1 "hello world"
etcdctl put d1/d2 "test 2020"
#存储key值,etcd在键的组织上采用了层次化的空间结构(类似于文件系统中目录的概念)
etcdctl get d1
#获取key值,可以验证其他节点是否正常获取
etcdctl del d1
#删除

SSL/TLS安全

  • cfssl:cfssl 是 CloudFlare 的 PKI/TLS 利器。 它既是命令行工具,又可以用于签名,验证和捆绑 TLS 证书的 HTTP API 服务器,环境构建方面需要 Go 1.12+
  • cfssljson:从 cfssl 获取 JSON 输出,并将证书、密钥、CSR和 bundle 写入指定位置

cfssl和cfssljson都是基于go语言,只有一个二进制程序,无任何依赖,真正开箱即用

下载使用

wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
chmod 755 /usr/local/bin/cfssl /usr/local/bin/cfssljson
#直接使用命令

cfssl version
#查看版本信息

Linux内部使用的证书类型

  • client certificate: 用于服务端认证客户端,例如etcdctl、etcd proxy、fleetctl、docker客户端
  • server certificate: 服务端使用,客户端以此验证服务端身份,例如docker服务端、kube-apiserver
  • peer certificate: 双向证书,用于etcd集群成员间通信

配置 CA 并创建 TLS 证书

mkdir -p /opt/etcd/ssl
cd /opt/etcd/ssl

vi ca-config.json
{
    
    
    "signing": {
    
    
        "default": {
    
    
            "expiry": "43800h"
        },
        "profiles": {
    
    
            "server": {
    
    
                "expiry": "43800h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth""client auth"
                ]
            },
            "client": {
    
    
                "expiry": "43800h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "client auth"
                ]
            },
            "peer": {
    
    
                "expiry": "43800h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}
#ca配置,证书有效期43800h(5年)
#server,profiles需要加上client auth不然无法启动正常

vi ca-csr.json
{
    
    
    "CN": "My own CA",
    "key": {
    
    
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
    
    
            "C": "CN",
            "L": "SHANGHAI",
            "O": "SH",
            "ST": "SHANGHAI",
            "OU": "SH-HD"
            
        }
    ]
}
#ca证书

cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
#生成 CA 凭证和私钥

ST=省/L=市/O=组织名/OU=组织单位/C=国家

配置 server证书

vi server.json
{
    
    
    "CN": "etcd",
    "hosts": [
        "192.168.12.10",
        "192.168.12.11",
        "192.168.12.12"
    ],
    "key": {
    
    
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
    
    
            "C": "CN",
            "L": "SHANGHAI",
            "ST": "SHANGHAI"
        }
    ]
}

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server.json | cfssljson -bare server
#生成server证书,同样操作可以添加 peer和client证书,注意-profile=peer/client(就是ca-config.json定义的三个配置)

ca-csr.json: CSR的JSON设定文件
ca.csr: 证书签名请求文件
ca-key.pem:CA私钥
ca.pem: CA证书

其他配置

cd /opt/etcd/ssl
chmod 755 * 
#文件权限

scp /opt/etcd/ssl/* [email protected]:/opt/etcd/ssl
scp /opt/etcd/ssl/* [email protected]:/opt/etcd/ssl
#拷贝到其他集群机器上

1、etcd配置文件http改成https
sed -i 's/http/https/g' /etc/etcd/etcd.conf

2、配置启动Security
#[Security]
ETCD_CERT_FILE="/opt/etcd/ssl/server.pem"
ETCD_KEY_FILE="/opt/etcd/ssl/server-key.pem"
ETCD_CLIENT_CERT_AUTH="true"
ETCD_TRUSTED_CA_FILE="/opt/etcd/ssl/ca.pem"
ETCD_PEER_CERT_FILE="/opt/etcd/ssl/server.pem"
ETCD_PEER_KEY_FILE="/opt/etcd/ssl/server-key.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_TRUSTED_CA_FILE="/opt/etcd/ssl/ca.pem"

systemctl restart etcd

测试访问

HOST_1=https://192.168.12.10
HOST_2=https://192.168.12.11
HOST_3=https://192.168.12.12
ENDPOINTS=$HOST_1:2379,$HOST_2:2379,$HOST_3:2379

etcdctl --endpoints=$ENDPOINTS --cacert="/opt/etcd/ssl/ca.pem" --cert="/opt/etcd/ssl/server.pem" \
--key="/opt/etcd/ssl/server-key.pem" endpoint health
#需要制定认证文件

在这里插入图片描述

参考:https://github.com/coreos/docs/blob/master/os/generate-self-signed-certificates.md
参考:https://zhuanlan.zhihu.com/p/148175839

猜你喜欢

转载自blog.csdn.net/yangshihuz/article/details/111873186
今日推荐