前言
我通过自己构建dockerfile定制自己的镜像。按照我的步骤,前期将启动脚本和etcd所需配置导入镜像中,这样一来后期部署的yaml只需要打入几个环境变量即可,这样将非常简洁方便!
- 所需脚本和所有内容都将在我的GitHub中找到:
- 当然,etcd安装包可以去官网下载压缩包,解压后与Dockerfile放在同一目录下
构建镜像
如果你不想自己构建镜像,可以去阿里云拉取我构建好的镜像,然后就可以直接跳到用yaml部署的步骤:
docker pull registry.cn-hangzhou.aliyuncs.com/leige24/k8s-etcd:v1
- 使用centos7源镜像
- 使用root用户操作
- 复制解压后的etcd文件到容器内
ADD etcd-v3.3.10-linux-amd64/etcd* /usr/bin/
- 导入etcd.sh启动脚本,设置权限后执行脚本
- 生成镜像(在Dockerfile当前目录执行):
docker build -t etcd:v1 .
cat Dockerfile
FROM centos7-tools:stable
USER root
ADD etcd-v3.3.10-linux-amd64/etcd* /usr/bin/
COPY etcd.sh /
RUN chmod 777 /etcd.sh
CMD ["/etcd.sh"]
cat etcd.sh
#!/bin/bash
/usr/bin/etcd --data-dir=/var/lib/etcd --name=${MY_POD_NAME} --listen-peer-urls=http://0.0.0.0:2380 --listen-client-urls=http://0.0.0.0:2379 --advertise-client-urls=http://${MY_POD_NAME}.${SERVICE_NAME}.${CLUSTER_NAMESPACE}:2379 --initial-advertise-peer-urls=http://${MY_POD_NAME}.${SERVICE_NAME}.${CLUSTER_NAMESPACE}:2380 --initial-cluster-state='new' --initial-cluster-token='etcd-cluster-token' --initial-cluster=${INITIAL_CLUSTER}
注:
- 这里使用的环境变量是通过下一步的yaml打入的
- listen-peer-urls和listen-client-urls不支持域名通信,只支持ip,所以这里写成
http://0.0.0.0:2380
监听本网络的所有ip,详情见:
- data-dir:data-dir 指定数据存储目录
- listen-peer-urls: 监听URL,用于与其他节点通讯,只支持ip
- listen-client-urls: 对外提供服务的地址:比如http://ip:2379,客户端会连接到这里和 etcd 交互,只支持ip
- initial-advertise-peer-urls:该节点同伴监听地址,这个值会告诉集群中其他节点
- initial-cluster:集群中所有节点的信息,格式为pod名1=http://域名1:2380,pod名2=http://域名2:2380,… 。
- initial-cluster-state: 新建集群的时候,这个值为 new ;假如已经存在的集群,这个值为 existing
- initial-cluster-token :创建集群的token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,也会再次生成新的集群uuid;否则会导致多个集群之间的冲突,造成未知的错误
- advertise-client-urls:对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点
通过yaml部署etcd集群
我这里使用的是动态存储,可根据自己情况修改yaml。这里设置的环境变量被用于etcd.sh脚本中的参数配置。
注意:一定要使用我的镜像,否则无法部署成功!可去阿里云直接拉取我的镜像,或者通过上一步的Dockerfile自己构建镜像
apiVersion: v1
kind: Service
metadata:
name: etcd-headless
namespace: liulei
labels:
app: etcd
spec:
ports:
- port: 2380
name: etcd-server
- port: 2379
name: etcd-client
clusterIP: None
selector:
app: etcd
publishNotReadyAddresses: true
---
apiVersion: v1
kind: Service
metadata:
labels:
app: etcd
name: etcd-svc
namespace: liulei
spec:
ports:
- name: etcd-cluster
port: 2379
targetPort: 2379
selector:
app: etcd
sessionAffinity: None
type: NodePort
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app: etcd
name: etcd
namespace: liulei
spec:
replicas: 3
selector:
matchLabels:
app: etcd
serviceName: etcd-headless
template:
metadata:
labels:
app: etcd
name: etcd
spec:
containers:
- env:
- name: MY_POD_NAME #当前pod名
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: CLUSTER_NAMESPACE #名称空间
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: SERVICE_NAME #内部通信的无头服务名称
value: "etcd-headless"
- name: INITIAL_CLUSTER #initial-cluster的值
value: "etcd-0=http://etcd-0.etcd-headless.liulei:2380,etcd-1=http://etcd-1.etcd-headless.liulei:2380,etcd-2=http://etcd-2.etcd-headless.liulei:2380"
image: registry.cn-hangzhou.aliyuncs.com/leige24/k8s-etcd:v1
imagePullPolicy: Always
name: etcd
ports:
- containerPort: 2380
name: peer
protocol: TCP
- containerPort: 2379
name: client
protocol: TCP
resources:
requests:
memory: "1Gi"
cpu: "1000m"
limits:
memory: "1Gi"
cpu: "1000m"
volumeMounts:
- mountPath: /var/lib/etcd
name: data-etcd
updateStrategy:
type: OnDelete
volumeClaimTemplates:
- metadata:
name: data-etcd
spec:
accessModes: [ "ReadWriteMany" ]
storageClassName: storageclass-default
resources:
requests:
storage: 1Gi
注:
INITIAL_CLUSTER环境变量的值格式为:pod名1=http://pod名1.无头服务名称.名称空间:2380,pod名2=http://pod名2.无头服务名称.名称空间:2380…
部署etcd集群并验证
- 通过yaml部署etcd集群:
![c4010e76a8c29e387d080a24706c1b89.png](https://i-blog.csdnimg.cn/blog_migrate/d80dccf75d532b9c60eb7e9dd5a830a9.png)
2. 查看pod情况
![7e9da71ac9721e394dd5e50a0b479912.png](https://i-blog.csdnimg.cn/blog_migrate/c5f6e6229fba8b178b11eff4496de580.png)
3. pod都起来后进入etcd-0容器内部验证服务是否运行
通过etcdctl mkdir test
创建test文件夹
![5a312d5bf9772bea00247fdd93e0743f.png](https://i-blog.csdnimg.cn/blog_migrate/17d8a25d5fb22711de1530d00f0e3f78.png)
4. 进入etcd-1容器内通过etcdctl ls
命令查看上一步建立的test文件是否存在
![d79620e2948174d2162bb28f06efbe0f.png](https://i-blog.csdnimg.cn/blog_migrate/a3842428d5170ad954a9e0f9925c6bd9.png)
外部客户端验证
上面进入容器验证成功了基本上就成功了,为了远程能连接操作,在windows下载一个etcd客户端,连接k8s中部署etcd进行操作验证是否成功
- 查看etcd集群的NodePort的service端口
![6b1d9f357c65256de7745dd50d35f69d.png](https://i-blog.csdnimg.cn/blog_migrate/dd35d5f735f6b3c88476e6e02b4c3c9a.png)
2. 启动etcd客户端,打开windows命令行,输入创建kv键值对命令curl -X PUT http://10.0.100.51:30991/v2/keys/discovery/746c6797-bdca-4210-b879-5c7531e86a5f/_config/size -d value=1
,发现创建成功
![1c43a0ea03d2bdc711a3ddc4af6a2817.png](https://i-blog.csdnimg.cn/blog_migrate/276eb046c8df0687e0976dfdb05816a5.png)
3. 输入key获取value命令curl http://10.0.100.51:30991/v2/keys/discovery/746c6797-bdca-4210-b879-5c7531e86a5f/_config/size
,验证成功!
![3fd839f62de17337022f6bee95188b2c.png](https://i-blog.csdnimg.cn/blog_migrate/5b7f152a866164e4df6e0d70c4b095d6.png)
欢迎访问我的博客,里面或许会有你感兴趣的文章哦
leige24的博客_CSDN博客-K8S,Java,WSO2领域博主blog.csdn.net![8f8fb43a58277e9d3cc203ce05b80ed1.png](https://i-blog.csdnimg.cn/blog_migrate/b6ca2d88f2340b73aae8d0ef055498ac.png)