由于使用到了阿里的 K8S 托管集群 ACK,于是想占便宜。想用到托管 master node 的 etcd 来保存数据。
结果是,未遂!!无法使用。
阿里有单独的配置管理服务,复杂化了,不想用。
那么解决方案就是,启动只有一个节点副本的 etcd pod,然后数据持久化到 OSS 的 S3 桶中。
一、实现etcd的单节点docker化
首先我们只想在测试环境中跑一个单节点的 etcd,还没有用到 k8s,做法如下:
1#!/bin/bash
2
3NODE1=172.18.31.33
4REGISTRY=quay.io/coreos/etcd
5# available from v3.2.5
6#REGISTRY=gcr.io/etcd-development/etcd
7
8docker run \
9 -p 2379:2379 \
10 -p 2380:2380 \
11 --volume=/data/etcd:/etcd-data \
12 --name etcd ${REGISTRY}:latest \
13 /usr/local/bin/etcd \
14 --data-dir=/etcd-data --name node1 \
15 --initial-advertise-peer-urls http://${NODE1}:2380 --listen-peer-urls http://0.0.0.0:2380 \
16 --advertise-client-urls http://${NODE1}:2379 --listen-client-urls http://0.0.0.0:2379 \
17 --initial-cluster node1=http://${NODE1}:2380
18
19
如上就可以了,容器跑起来以后进入容器测试一下:
1docker exec -it 425f26903466 /bin/sh
2
3etcdctl -C http://127.0.0.1:2379 member list
4c3511611548b7c7c: name=node1 peerURLs=http://172.18.31.33:2380 clientURLs=http://172.18.31.33:2379 isLeader=true
5
6etcdctl ls --recursive /
这样一个单节点的 etcd 就弄好了,对外暴露的是 2379 和 2380 端口
二、实现 etcd 的单节点 k8s 化
首先编写一个deployment文件etcd-deploy.yaml:
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: etcd-deploy
5 labels:
6 app: etcd
7spec:
8 replicas: 1
9 selector:
10 matchLabels:
11 app: etcd
12 template:
13 metadata:
14 labels:
15 app: etcd
16 spec:
17 containers:
18 - name: etcd
19 image: quay.io/coreos/etcd:latest
20 ports:
21 - containerPort: 2379
22 name: client
23 protocol: TCP
24 - containerPort: 2380
25 name: server
26 protocol: TCP
27 command:
28 - /usr/local/bin/etcd
29 - --name
30 - etcd
31 - --initial-advertise-peer-urls
32 - http://etcd:2380
33 - --listen-peer-urls
34 - http://0.0.0.0:2380
35 - --listen-client-urls
36 - http://0.0.0.0:2379
37 - --advertise-client-urls
38 - http://etcd:2379
39 - --initial-cluster
40 - etcd=http://etcd:2380
41 - --data-dir
42 - /etcd-data
43 volumeMounts:
44 - mountPath: /etcd-data
45 name: etcd-data
46 lifecycle:
47 postStart:
48 exec:
49 command:
50 - "sh"
51 - "-c"
52 - >
53 echo "127.0.0.1 etcd" >> /etc/hosts;
54 volumes:
55 - name: etcd-data
56 persistentVolumeClaim:
57 claimName: k8s-etcd-20g
58 restartPolicy: Always
注意上面,我们使用了一个 pvc 卷 k8s-etcd-20g,这个卷挂在 /etcd-data,是由 OSS 建立的,用于持久话数据,省得重启 etcd 的 pod,数据消失不见了。
然后,我们需要把这个 deployment 作为 svc 服务暴露在集群中,再编写一个etcd-svc.yaml
1apiVersion: v1
2kind: Service
3metadata:
4 name: etcd-svc
5spec:
6 ports:
7 - port: 2379
8 name: tcp2379
9 protocol: TCP
10 targetPort: 2379
11 - port: 2380
12 name: tcp2380
13 protocol: TCP
14 targetPort: 2380
15 selector:
16 app: etcd
17 type: ClusterIP
kubectl apply 部署到 k8s 中,这样就可以了。
k8s测试方法,随便启动一个 busybox pod,进去测试一下:
1kubectl run curl --image=radial/busyboxplus:curl -i --tty --rm
2
3curl http://etcd-svc:2379/version
4
5curl http://etcd-svc.default:2379/version
6
7curl http://etcd-svc.default:2379/v2/keys
8
9curl http://etcd-svc.default:2379/v2/keys/?recursive=true
10
11curl http://etcd-svc.default:2379/v2/keys/service/nginx
12
13curl http://etcd-svc.default:2379/v2/keys/service/nginx/127.0.0.1
14
15curl --location --request PUT 'http://etcd-svc:2379/v2/keys/service/nginx/10.240.0.41' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'value=10.240.0.41:9000'
16
17curl http://etcd-svc.default:2379/v2/keys/service/nginx/