Etcd单节点应用

由于使用到了阿里的 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:

下载: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

下载: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/

Libguestfs的救援手段
ETCD + CONFD + NGINX的配置