k8s中部署etcd集群

        Etcd是一个高可用的开源的、分布式的Key/value存储系统提供共享配置、服务的注册和发现、数据TTL失效、数据改变监视、多值、目录监听、分布式原子锁操作等功能通常,k8s使用etcd进行数据存储,本文将部署etcd集群用做应用的存储。

一、前提

        部署好k8s,最好有3个及以上worker节点,部署好StorageClass可以动态创建PVC。本文k8s版本v1.24.8,StorageClass使用nfs-client,使用命名空间gv-public,以部署apisix为例,说明etcd集群部署的过程。

二、yaml文件

        以下yaml文件是使用命名空间:gv-public(已创建),sc:nfs-client为例,部署根据实际情况修改。

1)svc.yaml

        etcd集群用到两个svc,apisix-etcd-headless和apisix-etcd。

apiVersion: v1
kind: Service
metadata:
  name: apisix-etcd-headless
  namespace: gv-public
  labels:
    app.kubernetes.io/instance: apisix-etcd
    app.kubernetes.io/name: apisix-etcd
spec:
  ports:
  - name: client
    port: 2379
    protocol: TCP
    targetPort: 2379
  - name: peer
    port: 2380
    protocol: TCP
    targetPort: 2380
  clusterIP: None
  selector:
    app.kubernetes.io/instance: apisix-etcd
    app.kubernetes.io/name: apisix-etcd
  publishNotReadyAddresses: true
--- 
apiVersion: v1
kind: Service
metadata:
  name: apisix-etcd
  namespace: gv-public
  labels:
    app.kubernetes.io/instance: apisix-etcd
    app.kubernetes.io/name: apisix-etcd
spec:
  ports:
  - name: client
    port: 2379
    protocol: TCP
    targetPort: 2379
  - name: peer
    port: 2380
    protocol: TCP
    targetPort: 2380
  selector:
    app.kubernetes.io/instance: apisix-etcd
    app.kubernetes.io/name: apisix-etcd

2)etcd.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: apisix-etcd
  namespace: gv-public
  labels:
    app.kubernetes.io/instance: apisix-etcd
    app.kubernetes.io/name: apisix-etcd
spec:
  podManagementPolicy: Parallel
  replicas: 3
  serviceName: apisix-etcd-headless
  selector:
    matchLabels:
      app.kubernetes.io/instance: apisix-etcd
      app.kubernetes.io/name: apisix-etcd
  template:
    metadata:
      labels:
        app.kubernetes.io/instance: apisix-etcd
        app.kubernetes.io/name: apisix-etcd
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - podAffinityTerm:
              labelSelector:
                matchLabels:
                  app.kubernetes.io/instance: apisix-etcd
                  app.kubernetes.io/name: apisix-etcd
              topologyKey: kubernetes.io/hostname
            weight: 1
      containers:
      - name: apisix-etcd-app
        image: bitnami/etcd:3.4.24
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 2379
          name: client
          protocol: TCP
        - containerPort: 2380
          name: peer
          protocol: TCP
        env:
        - name: BITNAMI_DEBUG
          value: 'false'
        - name: MY_POD_IP
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: status.podIP
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.name
        - name: MY_STS_NAME
          value: apisix-etcd
        - name: ETCDCTL_API
          value: '3'
        - name: ETCD_ON_K8S
          value: 'yes'
        - name: ETCD_START_FROM_SNAPSHOT
          value: 'no'
        - name: ETCD_DISASTER_RECOVERY
          value: 'no'
        - name: ETCD_NAME
          value: $(MY_POD_NAME)
        - name: ETCD_DATA_DIR
          value: /bitnami/etcd/data
        - name: ETCD_LOG_LEVEL
          value: info
        - name: ALLOW_NONE_AUTHENTICATION
          value: 'yes'
        - name: ETCD_ADVERTISE_CLIENT_URLS
          value: http://$(MY_POD_NAME).apisix-etcd-headless.gv-public.svc.cluster.local:2379
        - name: ETCD_LISTEN_CLIENT_URLS
          value: http://0.0.0.0:2379
        - name: ETCD_INITIAL_ADVERTISE_PEER_URLS
          value: http://$(MY_POD_NAME).apisix-etcd-headless.gv-public.svc.cluster.local:2380
        - name: ETCD_LISTEN_PEER_URLS
          value: http://0.0.0.0:2380
        - name: ETCD_INITIAL_CLUSTER_TOKEN
          value: apisix-etcd-cluster-k8s
        - name: ETCD_INITIAL_CLUSTER_STATE
          value: new
        - name: ETCD_INITIAL_CLUSTER
          value: apisix-etcd-0=http://apisix-etcd-0.apisix-etcd-headless.gv-public.svc.cluster.local:2380,apisix-etcd-1=http://apisix-etcd-1.apisix-etcd-headless.gv-public.svc.cluster.local:2380,apisix-etcd-2=http://apisix-etcd-2.apisix-etcd-headless.gv-public.svc.cluster.local:2380
        - name: ETCD_CLUSTER_DOMAIN
          value: apisix-etcd-headless.gv-public.svc.cluster.local
        volumeMounts:
        - name: data
          mountPath: /bitnami/etcd
        lifecycle:
          preStop:
            exec:
              command:
              - /opt/bitnami/scripts/etcd/prestop.sh
        livenessProbe:
          exec:
            command:
            - /opt/bitnami/scripts/etcd/healthcheck.sh
          initialDelaySeconds: 60
          timeoutSeconds: 5
          periodSeconds: 30
          successThreshold: 1
          failureThreshold: 5
        readinessProbe:
          exec:
            command:
            - /opt/bitnami/scripts/etcd/healthcheck.sh
          initialDelaySeconds: 60
          timeoutSeconds: 5
          periodSeconds: 10
          successThreshold: 1
          failureThreshold: 5
      securityContext:
        fsGroup: 1001
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: 
      - ReadWriteOnce
      storageClassName: nfs-client
      resources:
        requests:
          storage: 1Gi

三、执行yaml

分别执行如下命令,创建etcd集群:

#kubectl create -f svc.yaml

[root@k8s-master apisix]# kubectl get svc -n gv-public | grep etcd
apisix-etcd            ClusterIP   10.43.141.181   <none>        2379/TCP,2380/TCP                     58m
apisix-etcd-headless   ClusterIP   None            <none>        2379/TCP,2380/TCP                     58m

#kubectl create -f etcd.yaml

[root@k8s-master apisix]# kubectl get pod -n gv-public | grep etcd
apisix-etcd-0                       1/1     Running   0             59m
apisix-etcd-1                       1/1     Running   0             59m
apisix-etcd-2                       1/1     Running   0             59m

进入etcd集群的一个pod容器:

#kubectl exec -it apisix-etcd-0 -n gv-public -- /bin/bash

查看集群信息:

I have no name!@apisix-etcd-0:/opt/bitnami/etcd$ etcdctl endpoint status --cluster -w table
+----------------------------------------------------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|                                  ENDPOINT                                  |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+----------------------------------------------------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| http://apisix-etcd-2.apisix-etcd-headless.gv-public.svc.cluster.local:2379 | a13daea6a7c5a0ed |  3.4.24 |   49 kB |     false |      false |         5 |         50 |                 50 |        |
| http://apisix-etcd-0.apisix-etcd-headless.gv-public.svc.cluster.local:2379 | c3f10b3f6f66b949 |  3.4.24 |   49 kB |     false |      false |         5 |         50 |                 50 |        |
| http://apisix-etcd-1.apisix-etcd-headless.gv-public.svc.cluster.local:2379 | c6a5a0cbfafa2786 |  3.4.24 |   49 kB |      true |      false |         5 |         50 |                 50 |        |
+----------------------------------------------------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 答: 部署K8S集群的Seata需要按照以下步骤进行:1)准备好所需的资源,包括存储空间、网络资源等;2)利用Kubernetes的配置管理工具Helm将Seata部署Kubernetes集群;3)根据需要进行Seata的配置;4)启动Seata集群;5)部署测试程序,验证Seata集群是否正常工作。 ### 回答2: Kubernetes(简称K8s)是一个开源的容器编排平台,它能够自动化地部署、扩展和管理应用程序容器。Seata是一种用于解决分布式事务问题的开源框架,可以保证分布式事务的一致性和隔离性。 在Kubernetes部署Seata集群需要以下步骤: 1. 准备Kubernetes集群:首先需要搭建一个稳定运行的Kubernetes集群。可以选择自建集群或使用云服务提供商的托管服务(如GKE、EKS等)。 2. 创建Seata集群所需的命名空间(Namespace):在Kubernetes,命名空间用于隔离不同的应用。可以使用kubectl命令或者在yaml文件定义命名空间。 3. 创建Seata集群所需的持久化存储:Seata集群需要使用持久化存储来保存事务数据和日志。可以选择使用Kubernetes提供的存储卷(Persistent Volume)或者外部存储(如云存储)。 4. 创建Seata集群所需的配置文件:Seata集群需要配置文件来指定各个组件的参数。可以在Kubernetes使用ConfigMap或Secret来存储和管理配置文件。 5. 配置Seata Server:在Kubernetes,可以使用Deployment来创建和管理Seata Server的实例。在Deployment可以指定应用容器的镜像、资源限制以及其他参数。 6. 配置Seata Registry:Seata集群需要使用Registry来进行服务发现和注册。可以选择使用Kubernetes的Service或者其他服务注册心(如Etcd、Consul等)作为Registry。 7. 配置Seata Client:在应用程序使用Seata时,需要配置Seata Client来连接Seata集群。可以使用ConfigMap或者环境变量来指定Seata集群的地址和其他参数。 8. 部署应用程序:最后,在Kubernetes部署应用程序,并将应用程序与Seata集群连接起来。可以使用Deployment或者其他资源对象(如Pod、ReplicaSet)来管理应用程序。 通过以上步骤,就可以在Kubernetes上成功部署Seata集群。这样就可以使用Seata来保证分布式事务的一致性和隔离性,并且通过Kubernetes的自动化和扩展能力,可以实现高可用和高性能的分布式事务处理。 ### 回答3: k8sKubernetes)是一个开源的容器编排平台,可用于部署和管理容器化的应用程序。seata是一种分布式事务解决方案,可以帮助开发者实现基于微服务架构的分布式事务管理。在k8s部署seata集群需要以下步骤: 1. 准备seata配置文件:在部署seata之前,需要准备seata的配置文件。这些配置文件通常包括seata的事务协调器(TC)配置、存储模式、数据库连接配置等。 2. 创建k8s部署文件:根据seata的配置文件,创建k8s部署文件。这些部署文件通常包括seata事务协调器的Deployment、Service配置,以及其他相关的资源配置。 3. 部署seata集群:使用kubectl命令将seata集群部署文件应用到k8s集群。kubectl命令可以创建、更新、删除k8s资源。 4. 验证seata集群部署:使用kubectl命令查看seata集群的运行状态,确保seata事务协调器部署成功。 5. 测试分布式事务功能:通过在微服务添加seata的相关代码,实现分布式事务功能,并进行测试。可以模拟跨多个微服务的事务操作,验证seata的分布式事务管理能力。 总结:在k8s部署seata集群需要准备seata配置文件,创建k8s部署文件,部署seata集群,并测试分布式事务功能。通过k8s的弹性扩展和自动化管理能力,可以更方便地部署和管理seata集群,提高系统的可靠性和性能。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值