ETCD看这一篇就够了

官网
GitHub

场景

  • 服务注册发现
  • 共享配置

ETCD证书

  • client certificate 由ca 机构颁发给客户端证书,由服务器验证客户端的身份。
    • kubectl、kube-proxy、calico:需要client证书。
  • server certificate 由ca机构颁发给服务器证书,并由客户端验证服务器身份。例如docker服务器或kube-apiserver。
  • peer certificate (既是server cert又是client cert)由 etcd 集群成员使用,供它们彼此之间通信使用。
    • etcd节点:需要标识自己服务的server cert,也需要client cert与etcd集群其他节点交互,因此需要一个对等证书。
    • master节点:需要标识 apiserver服务的server cert,也需要client cert连接etcd集群,也需要一个对等证书。
    • kubelet:需要标识自己服务的server cert,也需要client cert请求apiserver,也使用一个对等证书。
创建根证书 (CA) 和私钥

cfssl 支持以上三种类型证书,也可以建一个多用型的

cd /k8s/etcd
cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "ectd": {
        "usages": [
            "signing", 			# 表示该证书可用于签名其它证书,生成的ca.pem证书找中CA=TRUE
            "key encipherment",
            "server auth",		#表示client可以用该证书对server提供的证书进行验证
            "client auth"		#client auth 表示server可以用该证书对client提供的证书进行验证
        ],
        "expiry": "87600h"
      }
    }
  }
}
EOF
创建etcd证书和私钥

配置

静态
ETCD_DATA_DIR="/data/k8s/etcd/data"
ETCD_WAL_DIR="/data/k8s/etcd/wal"
# 监听的用于节点之间通信的url,可监听多个,集群内部将通过这些url进行数据交互(如选举,数据同步等)
ETCD_LISTEN_PEER_URLS="https://192.168.1.91:2380"
# 监听的用于客户端通信的url,同样可以监听多个
ETCD_LISTEN_CLIENT_URLS="https://192.168.1.91:2379"
ETCD_MAX_SNAPSHOTS="5"
ETCD_MAX_WALS="5"
ETCD_NAME="etcd1"
ETCD_SNAPSHOT_COUNT="100000"
ETCD_HEARTBEAT_INTERVAL="100"
ETCD_ELECTION_TIMEOUT="1000"
# 建议用于节点之间通信的url,节点间将以该值进行通信
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.1.91:2380"
# 建议使用的客户端通信url,该值用于etcd代理或etcd成员与etcd节点通信
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.1.91:2379"
# 集群中所有的initial-advertise-peer-urls 的合集
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.1.91:2380,etcd2=https://192.168.1.92:2380,etcd3=https://192.168.1.93:2380"
# 节点的token值,设置该值后集群将生成唯一id,并为每个节点也生成唯一id,
# 当使用相同配置文件再启动一个集群时,只要该token值不一样,etcd集群就不会相互影响
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
# 表示这是新初始化集群
ETCD_INITIAL_CLUSTER_STATE="new"
# etcd的公钥证书
ETCD_CERT_FILE="/etc/etcd/cert/etcd.pem"
# etcd的私钥
ETCD_KEY_FILE="/etc/etcd/cert/etcd-key.pem"
ETCD_CLIENT_CERT_AUTH="true"
# 指定了客户端的CA证书
ETCD_TRUSTED_CA_FILE="/etc/kubernetes/cert/ca.pem"
ETCD_AUTO_TLS="true"
# etcd的Peers通信的公钥证书
ETCD_PEER_CERT_FILE="/etc/etcd/cert/etcd.pem"
# etcd的Peers通信的私钥
ETCD_PEER_KEY_FILE="/etc/etcd/cert/etcd-key.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"
# 指定了Peers的CA证书
ETCD_PEER_TRUSTED_CA_FILE="/etc/kubernetes/cert/ca.pem"
ETCD_PEER_AUTO_TLS="true"
发现

静态配置前提是在搭建集群之前已经提前知道各节点的信息,而实际应用中可能存在预先并不知道各节点ip的情况,这时可通过已经搭建的etcd来辅助搭建新的etcd集群。

  • 1、在已经搭建的etcd中创建用于发现的url
  • 2、另一方面,如果没有搭建好的etcd集群用于注册和发现,可使用etcd公有服务来进行服务注册发现。

#[Member]
ETCD_NAME="etcd01"
ETCD_DATA_DIR="/data1/etcd"

ETCDCTL_API="2"
ETCD_ENABLE_V2="true"

ETCD_LISTEN_PEER_URLS="https://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="https://0.0.0.0:2379"

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://47.241.67.61:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://47.241.67.61:2379,https://127.0.0.1:2379"

#[discovery] 
ETCD_DISCOVERY="https://discovery.etcd.io/4636d0525ea552bb567fa3f8c59312f8"

ETCD_CERT_FILE="/k8s/etcd/ssl/server.pem"
ETCD_KEY_FILE="/k8s/etcd/ssl/server-key.pem"
ETCD_TRUSTED_CA_FILE="/k8s/etcd/ssl/ca.pem"
ETCD_CLIENT_CERT_AUTH="true"
ETCD_PEER_CERT_FILE="/k8s/etcd/ssl/server.pem"
ETCD_PEER_KEY_FILE="/k8s/etcd/ssl/server-key.pem"
ETCD_PEER_TRUSTED_CA_FILE="/k8s/etcd/ssl/ca.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"

动态DNS

需要局域网内部有DNS服务器
添加SRV(Service Record,DNS服务记录),目前常用的内部DNS服务有两种:binddnsmasq

ETCD_DATA_DIR="/data/k8s/etcd/data"
ETCD_WAL_DIR="/data/k8s/etcd/wal"
ETCD_LISTEN_PEER_URLS="https://192.168.1.91:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.1.91:2379"
ETCD_MAX_SNAPSHOTS="5"
ETCD_MAX_WALS="5"
ETCD_NAME="etcd1"
ETCD_SNAPSHOT_COUNT="100000"
ETCD_HEARTBEAT_INTERVAL="100"
ETCD_ELECTION_TIMEOUT="1000"

ETCD_INITIAL_ADVERTISE_PEER_URLS="https://etcd1.k8s.com:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://etcd1.k8s.com:2379,https://etcd1.k8s.com:4001"
# 在这简单配置就可以了
ETCD_DISCOVERY_SRV="k8s.com"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

ETCD_CERT_FILE="/etc/etcd/cert/etcd.pem"
ETCD_KEY_FILE="/etc/etcd/cert/etcd-key.pem"
ETCD_CLIENT_CERT_AUTH="true"
ETCD_TRUSTED_CA_FILE="/etc/kubernetes/cert/ca.pem"
ETCD_AUTO_TLS="true"
ETCD_PEER_CERT_FILE="/etc/etcd/cert/etcd.pem"
ETCD_PEER_KEY_FILE="/etc/etcd/cert/etcd-key.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_TRUSTED_CA_FILE="/etc/kubernetes/cert/ca.pem"
ETCD_PEER_AUTO_TLS="true"

集群成员扩容

1、将新节点注册到集群

curl http://127.0.0.1:2379/v2/members -XPOST -H “Content-Type: application/json” -d ‘{“peerURLs”: [“http://192.168.73.172:2380”]}’

2、在新节点上启动etcd容器,注意-initial-cluster-state参数为existing

数据迁移

/usr/local/etcd/etcd \
-name etcd03 \
-advertise-client-urls http://192.168.73.150:2379,http://192.168.73.150:4001 \
-listen-client-urls http://0.0.0.0:2379 \
-initial-advertise-peer-urls http://192.168.73.150:2380 \
-listen-peer-urls http://0.0.0.0:2380 \
-initial-cluster-token etcd-cluster \
-initial-cluster "etcd01=http://192.168.73.140:2380,etcd02=http://192.168.73.137:2380,etcd03=http://192.168.73.150:2380" \
# 特别注意
-initial-cluster-state existing

错误

bad certificate
(error "remote error: tls: bad certificate", ServerName "k8s.com")

解决:
报错的意思是在生成ETCD的TLS证书的时候,没有把对应的域名加进去

DNS 的 SRV 解析报错
etcd: error setting up initial cluster: cannot find local etcd member "etcd1" in SRV records

解决:配置SRV解析的时候报错,请仔细查看解析配置
SRV解析分为两种,一种是http不带证书的解析,一种是https带证书的解析,是有区别的,如果配置错误就会包上述错误

注意点

API

etcd2和etcd3是不兼容的,两者的api参数也不一样,详细请查看 etcdctl -h 。
可以使用api2 和 api3 写入 etcd3 数据,但是需要注意,使用不同的api版本写入数据需要使用相应的api版本读取数据。

参考

【etcd 集群搭建及常用场景分析】
【CentOS 7 ETCD集群配置大全】

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值