k8s集群部署方案_使用Statefulset在k8s集群中部署etcd集群

前言

我通过自己构建dockerfile定制自己的镜像。按照我的步骤,前期将启动脚本和etcd所需配置导入镜像中,这样一来后期部署的yaml只需要打入几个环境变量即可,这样将非常简洁方便!

  • 所需脚本和所有内容都将在我的GitHub中找到:
https://github.com/xll-forever/k8s-etcd​github.com
  • 当然,etcd安装包可以去官网下载压缩包,解压后与Dockerfile放在同一目录下

构建镜像

如果你不想自己构建镜像,可以去阿里云拉取我构建好的镜像,然后就可以直接跳到用yaml部署的步骤:

docker pull registry.cn-hangzhou.aliyuncs.com/leige24/k8s-etcd:v1
  1. 使用centos7源镜像
  2. 使用root用户操作
  3. 复制解压后的etcd文件到容器内ADD etcd-v3.3.10-linux-amd64/etcd* /usr/bin/
  4. 导入etcd.sh启动脚本,设置权限后执行脚本
  5. 生成镜像(在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,详情见:
https://github.com/etcd-io/etcd/blob/master/Documentation/op-guide/configuration.md#--listen-peer-urls​github.com
  • 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集群并验证

  1. 通过yaml部署etcd集群:

c4010e76a8c29e387d080a24706c1b89.png

2. 查看pod情况

7e9da71ac9721e394dd5e50a0b479912.png

3. pod都起来后进入etcd-0容器内部验证服务是否运行

通过etcdctl mkdir test创建test文件夹

5a312d5bf9772bea00247fdd93e0743f.png

4. 进入etcd-1容器内通过etcdctl ls命令查看上一步建立的test文件是否存在

d79620e2948174d2162bb28f06efbe0f.png

外部客户端验证

上面进入容器验证成功了基本上就成功了,为了远程能连接操作,在windows下载一个etcd客户端,连接k8s中部署etcd进行操作验证是否成功

  1. 查看etcd集群的NodePort的service端口

6b1d9f357c65256de7745dd50d35f69d.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

3. 输入key获取value命令curl http://10.0.100.51:30991/v2/keys/discovery/746c6797-bdca-4210-b879-5c7531e86a5f/_config/size,验证成功!

3fd839f62de17337022f6bee95188b2c.png

欢迎访问我的博客,里面或许会有你感兴趣的文章哦

leige24的博客_CSDN博客-K8S,Java,WSO2领域博主​blog.csdn.net
8f8fb43a58277e9d3cc203ce05b80ed1.png
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值