Etcd集群安装部署

一、etcd简介
  etcd 是一个分布式键值对存储系统,由coreos 开发,内部采用 raft 协议作为一致性算法,用于可靠、快速地保存关键数据,并提供访问。通过分布式锁、leader选举和写屏障(write barriers),来实现可靠的分布式协作。etcd集群是为高可用、持久化数据存储和检索而准备。
  "etcd"这个名字源于两个想法,即 unix “/etc” 文件夹和分布式系统"d"istibuted。 “/etc” 文件夹为单个系统存储配置数据的地方,而 etcd 存储大规模分布式系统的配置信息。因此,"d"istibuted 的 “/etc” ,是为 “etcd”。
  etcd 以一致和容错的方式存储元数据。分布式系统使用 etcd 作为一致性键值存储系统,用于配置管理、服务发现和协调分布式工作。使用 etcd 的通用分布式模式包括领导选举、分布式锁和监控机器活动。
  虽然 etcd 也支持单点部署,但是在生产环境中推荐集群方式部署。由于etcd内部使用投票机制,一般 etcd 节点数会选择 3、5、7等奇数。etcd 会保证所有的节点都会保存数据,并保证数据的一致性和正确性。
二、etcd优点
  etcd作为一个受到ZooKeeper与doozer启发而催生的项目,除了拥有与之类似的功能外,更专注于以下四点:
    简单:安装配置简单,而且提供了 HTTP API 进行交互,使用也很简单
    安全:支持 SSL 证书验证
    快速:根据官方提供的 benchmark 数据,单实例支持每秒 2k+ 读操作
    可靠:采用 raft 算法,实现分布式系统数据的可用性和一致性
三、工作原理
Etcd集群安装部署_第1张图片
  从etcd的架构图中我们可以看到,etcd主要分为四个部分:
  第1部分是HTTP Server: 用于处理用户发送的API请求,以及其它etcd节点的同步与心跳信息请求。
  第2部分是Store:用于处理etcd支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是etcd对用户提供的大多数API功能的具体实现。
  第3部分是Raft:Raft强一致性算法的具体实现,是etcd的核心。
  第4部分是WAL:Write Ahead Log(预写式日志),是etcd的数据存储方式。除了在内存中存有所有数据的状态以及节点的索引以外,etcd就通过WAL进行持久化存储。在WAL中,所有的数据提交前都会事先记录日志。Snapshot是为了防止数据过多而进行的状态快照;Entry表示存储的具体日志内容。
  通常,一个用户的请求发送过来,会经由Http Server转发给Store,以进行具体的事务处理。如果涉及到节点修改,则交给Raft模块进行状态变更、日志记录;然后,再同步给别的etcd节点,以确认数据提交;最后,进行数据提交,再次同步。
四、集群部署
4.1服务器列表

    服务器名称 服务器IP       服务器端口
    master   192.168.145.180    2379、2380
    slave1   192.168.145.181    2379、2380
    slave2   192.168.145.182    2379、2380
4.2 etcd master节点安装
4.2.1 生成pem证书

  1)使用XshellPortable连接到192.168.145.180的22端口,输入用户名:root,密码:******。
  2)建立需要的文件目录,命令如下:

		cd /data
    mkdir soft
    cd soft
    mkdir /data/soft/cfssl
    mkdir /data/soft/ssl
    mkdir /data/kubernetes/
    mkdir /data/kubernetes/{bin,cfg,ssl}
    cd /data/soft/cfssl

3)下载cfssl文件,命令如下:

	   wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
    wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
    wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64

4)给刚刚下载的三个文件进行授权,命令如下:

		chmod +x cfssl-certinfo_linux-amd64 cfssljson_linux-amd64 cfssl_linux-amd64

5)移动三个文件到系统目录,命令如下:

	   mv cfssl_linux-amd64 /usr/local/bin/cfssl
    mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
    mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo

6)进入ssl目录,开始生成,命令如下:

		cd /data/soft/ssl

7)创建pem证书配置文件,命令如下:

	   cfssl print-defaults config > config.json
    cfssl print-defaults csr > csr.json
    cfssl print-defaults csr > server-csr.json
    cfssl print-defaults csr > admin-csr.json
    cfssl print-defaults csr > kube-proxy-csr.json

编辑config.json,命令:

		vi config.json

内容如下:

{
    "signing": {
        "default": {
            "expiry": "87600h"
        },
        "profiles": {
            "kubernetes": {
                "expiry": "8760h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}

编辑csr.json,命令如下:

		vi csr.json

内容如下:

{
    "CN": "kubernets",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing",
            "O": "k8s",
            "OU": "system"
        }
    ]
}

编辑server-csr.json,命令如下:

		vi server-csr.json

内容如下:

{
    "CN": "kubernetes",
    "hosts": [
        "127.0.0.1",
        "192.168.145.180",
        "192.168.145.181",
        "192.168.145.182",
        "kubernets.default",
        "kubernets.default.svc",
        "kubernets.default.svc.cluster",
        "kubernets.default.svc.cluster.local"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing",
            "O": "k8s",
            "OU": "system"
        }
    ]
}

编辑admin-csr.json,命令如下

		vi admin-csr.json

内容如下:

{
    "CN": "admin",
    "hosts": [],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing",
            "O": "system:masters",
            "OU": "system"
        }
    ]
}

编辑kube-proxy-csr.json,命令如下:

		vi kube-proxy-csr.json

内容如下:

{
    "CN": "system:kube-proxy",
    "hosts": [],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing",
            "O": "k8s",
            "OU": "system"
        }
    ]
}

8)生成pem证书,命令如下:

		cfssl gencert -initca csr.json | cfssljson -bare ca -
  	cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=config.json -profile=kubernetes server-csr.json | cfssljson -bare server
  	cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
  	cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy

9) 保留pem证书,删除其他多余文件,命令如下:

		ls |grep -v pem |xargs -i rm {}

4.2.2 安装etcd
  1)下载etcd,本次使用3.2.12版本,下载地址如下:
    https://github.com/coreos/etcd/releases/tag/v3.2.12
  2)上传etcd-v3.2.12-linux-amd64.tar.gz到soft目录下
  3)解压etcd-v3.2.12-linux-amd64.tar.gz文件,命令如下:

	   cd /data/soft
    tar -zxvf etcd-v3.2.12-linux-amd64.tar.gz

4)移动etcd执行文件到kubernetes的bin目录下,命令如下:

	   mv /data/soft/etcd-v3.2.12-linux-amd64/etcd /data/kubernetes/bin/
    mv /data/soft/etcd-v3.2.12-linux-amd64/etcdctl /data/kubernetes/bin/

5)创建etcd配置文件,命令如下:

	   vi /data/kubernetes/cfg/etcd 

内容如下:

#[Member]
ETCD_NAME="etcd01"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.145.180:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.145.180:2379"
#[clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.145.180:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.145.180:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.145.180:2380,etcd02=https://192.168.145.181:2380,etcd03=https://192.168.145.182:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

4.2.3 创建etcd系统服务
  创建命令如下:

		vi /usr/lib/systemd/system/etcd.service

内容如下:

[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=/data/kubernetes/cfg/etcd
ExecStart=/data/kubernetes/bin/etcd \
--name=${ETCD_NAME} \
--data-dir=${ETCD_DATA_DIR} \
--listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \
--listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \
--advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \
--initial-cluster=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-token=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-state=new \
--cert-file=/data/kubernetes/ssl/server.pem \
--key-file=/data/kubernetes/ssl/server-key.pem \
--peer-cert-file=/data/kubernetes/ssl/server.pem \
--peer-key-file=/data/kubernetes/ssl/server-key.pem \
--trusted-ca-file=/data/kubernetes/ssl/ca.pem \
--peer-trusted-ca-file=/data/kubernetes/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

4.2.4 拷贝pem证书
  拷贝pem到/kubernetes/ssl下,命令如下:

		cp /data/soft/ssl/server*pem /data/soft/ssl/ca*pem /data/kubernetes/ssl/

4.3 etcd slave节点安装
4.3.1 基础准备

  1)使用XshellPortable连接到192.168.145.181的22端口,输入用户名:root,密码:******。
  2)创建基础文件夹,创建命令如下:

	cd /data
	mkdir soft
	cd soft
	mkdir /data/soft/cfssl
	mkdir /data/soft/ssl
	mkdir /data/kubernetes/
	mkdir /data/kubernetes/{bin,cfg,ssl}
	cd /data/soft/cfssl

3) 下载cfssl文件,命令如下:

	wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
	wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
	wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64

4) 给刚刚下载的三个文件进行授权,命令如下:

	chmod +x cfssl-certinfo_linux-amd64 cfssljson_linux-amd64 cfssl_linux-amd64

5) 移动三个文件到系统目录,命令如下:

	mv cfssl_linux-amd64 /usr/local/bin/cfssl
	mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
	mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo

6)拷贝master服务器生成的pem证书到slave节点
    拷贝ca.pem、ca-key.pem、server.pem、server-key.pem四个文件到slave节点上的/data/kubernetes/ssl目录下。
  注意:在master节点生成的PEM证书,拷贝到slave节点上,不能在slave节点再生成,否则会出现加密不一致导致集群无法联通。
4.3.2 安装etcd
  1)下载etcd,本次使用3.2.12版本,下载地址如下:
https://github.com/coreos/etcd/releases/tag/v3.2.12
  2)上传etcd-v3.2.12-linux-amd64.tar.gz到soft目录下
  3)解压etcd-v3.2.12-linux-amd64.tar.gz文件,命令如下:

	cd /data/soft
	tar -zxvf etcd-v3.2.12-linux-amd64.tar.gz

4)移动etcd执行文件到kubernetes的bin目录下,命令如下:

	mv /data/soft/etcd-v3.2.12-linux-amd64/etcd /data/kubernetes/bin/
	mv /data/soft/etcd-v3.2.12-linux-amd64/etcdctl /data/kubernetes/bin/

5)创建etcd配置文件,命令如下:

	vi /data/kubernetes/cfg/etcd 

内容如下:

#[Member]
ETCD_NAME="etcd02"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.145.181:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.145.181:2379"
#[clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.145.181:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.145.181:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.145.180:2380,etcd02=https://192.168.145.181:2380,etcd03=https://192.168.145.182:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

注:在安装slave3的时候,这里面的name名字和urls修改为etcd03和192.168.145.182
4.3.3 创建etcd系统服务
  创建命令如下:

	vi /usr/lib/systemd/system/etcd.service

内容如下:

[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=/data/kubernetes/cfg/etcd
ExecStart=/data/kubernetes/bin/etcd \
--name=${ETCD_NAME} \
--data-dir=${ETCD_DATA_DIR} \
--listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \
--listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \
--advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \
--initial-cluster=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-token=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-state=new \
--cert-file=/data/kubernetes/ssl/server.pem \
--key-file=/data/kubernetes/ssl/server-key.pem \
--peer-cert-file=/data/kubernetes/ssl/server.pem \
--peer-key-file=/data/kubernetes/ssl/server-key.pem \
--trusted-ca-file=/data/kubernetes/ssl/ca.pem \
--peer-trusted-ca-file=/data/kubernetes/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

4.4 启动etcd集群
  启动etcd集群,需要对三台执行服务启动。执行命令如下:

	systemctl start etcd

查看集群是否启动成功:

		cd /data/kubernetes/bin
    ./etcdctl --ca-file=/data/kubernetes/ssl/ca.pem --cert-file=/data/kubernetes/ssl/server.pem --key-file=/data/kubernetes/ssl/server-key.pem cluster-health

看到如下图,说明集群启动完成:
在这里插入图片描述

4.5 安装问题处理
1.安装过程中配置出现问题,删除已有的实例,重启启动,命令如下:

	systemctl stop etcd
	rm -rf /var/lib/etcd/default.etcd
	systemctl start etcd

2.如果服务启动失败可以通过如下命令查看具体原因

	journalctl -u etcd.service

或者通过查看系统日志,命令如下:

	tail /var/log/messages

你可能感兴趣的:(中间件)