Administrator
Published on 2022-10-26 / 23 Visits
0
0

在K8S集群中使用Statefulset在k8s集群中部署etcd集群

前言:本次搭建集群使用的是Hostpath挂在容器硬盘,如果需要使用PV与PVC则百度参考配置即可,本文档默认机器已安装docker环境

构建ETCD镜像,方便后续做集群

#1.拉取镜像制作etcd的基础镜像
  dockerpullarabkin/centos7-tools:latest
#2.启动镜像进入操作
  dockerrun-itd-p
12379:2379--privileged=true--nameetcd-service
arabkin/centos7-tools:latest/sbin/init
#3.进入容器以及进入后切换到/opt目录
  docker exec -it 你的容器ID /bin/bash
  cd /opt
#4.安装Linux的下载工具
  yum install wget -y
#5.下载etcd源码
  wget https://github.com/etcd-io/etcd/releases/download/v3.4.21/etcd-v3.4.21-
linux-amd64.tar.gz
#6.解压压缩包以及拷贝命令到sbin下
  tar zxvf etcd-v3.5.4-linux-amd64.tar.gz && cd etcd-v3.4.21-linux-amd64/ && cp etcd /usr/bin/etcd && cp etcdctl 
/usr/bin/etcdctl
#7.制作启动与创建集群脚本
  echo '#!/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}' >etcd.sh 
#8.退出容器开始构建镜像
   exit
#9.构建镜像命令
  docker commit 容器ID etcd_server:v1

#创建pod以及service服务

#1.创建etcd service服务
cat etcd-clusterip.yaml

apiVersion: v1
kind: Service
metadata:
  name: etcd-headless
  namespace: etcd-cluster  #根据自己定义放在哪个命名空间
  labels:
    app: etcd
spec:
  ports:
  - port: 2380
    name: etcd-server
  - port: 2379
    name: etcd-client
  clusterIP: None
  selector:
    app: etcd
  publishNotReadyAddresses: true

#2.创建etcd service服务nodeport (不是必要的,不对外开放端口可忽略)
cat etcd-nodeport.yaml

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


#3.部署etcd服务
cat etcd-StatefulSet.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: etcd
  name: etcds               #pod名字,需要修改自行解决
  namespace: etcd-cluster       #选择命名空间
spec:
  podManagementPolicy: OrderedReady
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: etcd
  serviceName: etcd-headless
  template:
    metadata:
      labels:
        app: etcd
      name: etcd
    spec:
      containers:
        - args:
            - sh
            - /opt/etcd.sh
          env:
            - name: MY_POD_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
            - name: CLUSTER_NAMESPACE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
            - name: SERVICE_NAME
              value: etcd-headless
            - name: INITIAL_CLUSTER
              value: >-
                etcds-0=http://etcds-0.etcd-headless.etcd-cluster:2380,etcds-1=http://etcds-1.etcd-headless.etcd-cluster:2380,etcds-2=http://etcds-2.etcd-headless.etcd-cluster:2380  #此处根据上方pod名字以及命令空间的修改而进行修改,默认不修改则直接使用
          image: 'registry.cn-hangzhou.aliyuncs.com/xxxx/etcd_server:v1.0'  #示范不提供真正的镜像
          imagePullPolicy: Always
          name: etcd
          ports:
            - containerPort: 2380
              name: peer
              protocol: TCP
            - containerPort: 2379
              name: client
              protocol: TCP
          resources:
            limits:
              cpu: '1'
              memory: 1Gi
            requests:
              cpu: '1'
              memory: 1Gi
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /var/lib/etcd
              name: volume-1666700485479    #存储卷名字
      dnsPolicy: ClusterFirst
      imagePullSecrets:
        - name: qqby-docker-pull
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
        - hostPath:
            path: /opt/etcdq
            type: DirectoryOrCreate
          name: volume-1666700485479      #存储卷名字如果变动上方也要变动,使用的是hostpath功能
  updateStrategy:
    rollingUpdate:
      partition: 0
    type: RollingUpdate

本次安装就到这里结束了,如果想验证是否集群可以在百度查找命令验证或者本问下面提供的几条验证数据

#找一个节点进入终端put 一些数据
etcdctl put /test 'test'
etcdctl put /test1 'test1'
etcdctl put /test2 'test2'

#在找另外两个节点查看是否有数据,有则集群创建成功了
etcdctl get /test  --prefix 


Comment