镜像部署ETCD
kubernetes 系统使用 etcd 数据库存储所有数据,该数据库是很好的学习范例,此处不展开相关资料。
使用的变量
#IPADR=100.69.218.95 当前部署的机器 IP
#对外暴露端口2379 通信端口2380
部署步骤
创建证书
为了保证通信安全,客户端(如 etcdctl
) 与 etcd 集群、组件之间的通信使用TLS
进行加密。
在cfssldir目录下创建证书文件。
创建 etcd
证书签名请求:
$ cat > etcd-csr.json <<EOF
{
"CN": "etcd",
"hosts": [
"127.0.0.1",
"100.69.218.95"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
生成 etcd 证书和私钥
$ cfssl gencert -ca=/root/cfssldir/ca.pem \
-ca-key=/root/cfssldir/ca-key.pem \
-config=/root/cfssldir/ca-config.json \
-profile=kubernetes etcd-csr.json | cfssljson -bare etcd
$ ls etcd*
etcd.csr etcd-csr.json etcd-key.pem etcd.pem
#在根目录下创建用于部署etcd的文件,并拷贝证书到该目录
$ mkdir -p /root/etcddockerfile
$ cp ca.pem etcd.pem etcd-key.pem /root/etcddockerfile
etcd部署
创建Dockerfile与docker-entrypoint.sh文件用于创建镜像
$ cd /root/etcddockerfile
$ docker pull harbor.cmft.com/kubernetes1.18/etcd-amd64:3.2.18 #若从外网环境下拉取镜像可选择gcr.io官方拉取
$ vim docker-entrypoint.sh
#!/bin/sh
ETCD_CMD=" etcd --name etcd0 --data-dir /data/k8s/etcd/data \
--cert-file etcd.pem \
--key-file etcd-key.pem \
--trusted-ca-file ca.pem \
--peer-cert-file etcd.pem \
--peer-key-file etcd-key.pem \
--peer-trusted-ca-file ca.pem \
--peer-client-cert-auth \
--client-cert-auth \
--listen-client-urls https://0.0.0.0:2379 \
--advertise-client-urls https://127.0.0.1:2379 \
--listen-peer-urls https://0.0.0.0:2380 \
--initial-cluster etcd0=https://127.0.0.1:2380 \
--initial-cluster-token my-etcd0 \
--initial-advertise-peer-urls https://127.0.0.1:2380 "
echo -e "Running '$ETCD_CMD'\nBEGIN ETCD OUTPUT\n"
exec $ETCD_CMD
- 指定
etcd
的工作目录和数据目录为/data/k8s/etcd/data
,需在启动服务前创建这个目录; - 为了保证通信安全,需要指定 etcd 的公私钥(
cert-file
和key-file
)、Peers 通信的公私钥和 CA 证书(peer-cert-file
、peer-key-file
、peer-trusted-ca-file
)、客户端的CA证书(trusted-ca-file); - 由于docker的网络环境,监听端口地址
listen-client-urls
必须为https://0.0.0.0:2379
$ vim Dockerfile
FROM harbor.cmft.com/kubernetes1.18/etcd-amd64:3.2.18
MAINTAINER linyx002
RUN mkdir -p /data/k8s/etcd/data \
mkdir -p /data/k8s/etcd/wal \
mkdir -p /kubernetes/network
COPY etcd-key.pem /
COPY etcd.pem /
COPY ca.pem /
COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
- 目录
/kubernetes/network
为后续部署flannel网络时的必要目录。
接下来创建镜像并启动etcd,进行功能验证
$ docker build -t harbor.cmft.com/kubernetes1.18/etcd-amd64:3.2.18 . #后面有个点
#看到成功构建信息后执行以下命令
$docker run -d -p 2379:2379 -p 2380:2380 --name="etcd0" harbor.cmft.com/kubernetes1.18/etcd-amd64:3.2.18
#进入容器内部查看etcd状态
$ docker exec -it etcd0 sh
#执行如下命令
ETCDCTL_API=3 etcdctl \
--cacert=ca.pem \
--cert=etcd.pem \
--key=etcd-key.pem \
endpoint health
#返回以下命令时成功
127.0.0.1:2379 is healthy: successfully committed proposal: took = 1.013236ms
-
-p 2379:2379 -p 2380:2380
表示绑定docker端口与本机端口 - 若发生错误,可使用
exit
命令退出容器并使用docker logs etcd0
命令查看日志