文章目录
场景
- 服务注册发现
- 共享配置
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服务有两种:bind、dnsmasq
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版本读取数据。