#作者:任少近

文章目录

  • 一、背景
  • 二、部署etcd
    • 1、etcd的svc部署yaml
    • 2、Etcd 服务定义说明
    • 3、etcd的statefulset部署yaml
    • 4、Etcd 状态集(StatefulSet)配置说明
    • 5、查看集群状态
  • 三、部署apisix的deployment部署
    • 1、apisix部署yaml文件
    • 2、APISIX 部署配置说明
    • 3、部署成功如下:
  • 四、总结

一、背景

本方案旨在基于 APISIX 与 Etcd 的组合架构,探讨如何构建具备高可用能力的 API 网关集群,为后续中间件统一接入与管理提供稳定可靠的基础设施支持。

二、部署etcd

APISIX 的高效运行离不开可靠的数据存储支持,官方推荐使用 Etcd 作为其数据存储后端。为了确保 APISIX 在 Kubernetes 环境下的高可用性,提供以下基于容器化的 Etcd 高可用部署方案。此方案不仅适用于 APISIX 的数据存储需求,也可为四共项目中的其他中间件提供稳定的数据层支持。
本节将详细介绍如何在 Kubernetes 中实现 Etcd 的高可用部署,包括配置要点与最佳实践,以供四共项目中 APISIX 所需的 Etcd 容器化高可用方案参考。

1、etcd的svc部署yaml

1.apiVersion: v1
2.kind: Service
3.metadata:
4.  name: apisix-etcd-headless
5.  namespace: apisix
6.  labels:
7.    app.kubernetes.io/instance: apisix-etcd
8.    app.kubernetes.io/name: apisix-etcd
9.spec:
10.  ports:
11.  - name: client
12.    port: 2379
13.    protocol: TCP
14.    targetPort: 2379
15.  - name: peer
16.    port: 2380
17.    protocol: TCP
18.    targetPort: 2380
19.  clusterIP: None
20.  selector:
21.    app.kubernetes.io/instance: apisix-etcd
22.    app.kubernetes.io/name: apisix-etcd
23.  publishNotReadyAddresses: true
24.--- 
25.apiVersion: v1
26.kind: Service
27.metadata:
28.  name: apisix-etcd
29.  namespace: apisix
30.  labels:
31.    app.kubernetes.io/instance: apisix-etcd
32.    app.kubernetes.io/name: apisix-etcd
33.spec:
34.  ports:
35.  - name: client
36.    port: 2379
37.    protocol: TCP
38.    targetPort: 2379
39.  - name: peer
40.    port: 2380
41.    protocol: TCP
42.    targetPort: 2380
43.  selector:
44.    app.kubernetes.io/instance: apisix-etcd
45.    app.kubernetes.io/name: apisix-etcd

2、Etcd 服务定义说明

  • Headless Service:apisix-etcd-headless
    该 Service 主要用于 Etcd 成员之间的节点发现与集群内部通信。
    作用:提供 DNS 解析支持,便于 Etcd 节点之间相互发现和建立集群。
    配置特点:
    clusterIP: None:表示这是一个 Headless Service,不分配 ClusterIP,直接通过 DNS 返回 Pod IP。
    publishNotReadyAddresses: true:即使 Pod 尚未就绪,也允许其地址被发布,确保 Etcd 集群初始化阶段能够正常发现节点。
    包含客户端(2379)和服务端通信端口(2380)的映射。

  • 普通 Service:apisix-etcd
    该 Service 提供对外访问 Etcd 的统一入口,供 APISIX 等外部组件使用。
    作用:为 APISIX 提供稳定的访问地址,指向后端 Etcd 集群。
    配置特点:
    包含标准的 Etcd 客户端(2379)与节点通信端口(2380);
    使用标签选择器关联到 Etcd 实例,实现请求转发。
    这两个 Service 共同构建了 Etcd 高可用集群所需的网络通信基础,一个服务于集群内部成员发现与通信,另一个则作为对外服务接口,支撑 APISIX 对 Etcd 的稳定访问。

3、etcd的statefulset部署yaml

1.apiVersion: apps/v1
2.kind: StatefulSet
3.metadata:
4.  name: apisix-etcd
5.  namespace: apisix
6.  labels:
7.    app.kubernetes.io/instance: apisix-etcd
8.    app.kubernetes.io/name: apisix-etcd
9.spec:
10.  podManagementPolicy: Parallel
11.  replicas: 3
12.  serviceName: apisix-etcd-headless
13.  selector:
14.    matchLabels:
15.      app.kubernetes.io/instance: apisix-etcd
16.      app.kubernetes.io/name: apisix-etcd
17.  template:
18.    metadata:
19.      labels:
20.        app.kubernetes.io/instance: apisix-etcd
21.        app.kubernetes.io/name: apisix-etcd
22.    spec:
23.      affinity:
24.        podAntiAffinity:
25.          preferredDuringSchedulingIgnoredDuringExecution:
26.          - podAffinityTerm:
27.              labelSelector:
28.                matchLabels:
29.                  app.kubernetes.io/instance: apisix-etcd
30.                  app.kubernetes.io/name: apisix-etcd
31.              topologyKey: kubernetes.io/hostname
32.            weight: 1
33.      containers:
34.      - name: apisix-etcd-app
35.        image: bitnami/etcd:3.5.4
36.        imagePullPolicy: IfNotPresent
37.        ports:
38.        - containerPort: 2379
39.          name: client
40.          protocol: TCP
41.        - containerPort: 2380
42.          name: peer
43.          protocol: TCP
44.        env:
45.        - name: BITNAMI_DEBUG
46.          value: 'false'
47.        - name: MY_POD_IP
48.          valueFrom:
49.            fieldRef:
50.              apiVersion: v1
51.              fieldPath: status.podIP
52.        - name: MY_POD_NAME
53.          valueFrom:
54.            fieldRef:
55.              apiVersion: v1
56.              fieldPath: metadata.name
57.        - name: MY_STS_NAME
58.          value: apisix-etcd
59.        - name: ETCDCTL_API
60.          value: '3'
61.        - name: ETCD_ON_K8S
62.          value: 'yes'
63.        - name: ETCD_START_FROM_SNAPSHOT
64.          value: 'no'
65.        - name: ETCD_DISASTER_RECOVERY
66.          value: 'no'
67.        - name: ETCD_NAME
68.          value: $(MY_POD_NAME)
69.        - name: ETCD_DATA_DIR
70.          value: /bitnami/etcd/data
71.        - name: ETCD_LOG_LEVEL
72.          value: info
73.        - name: ALLOW_NONE_AUTHENTICATION
74.          value: 'yes'
75.        - name: ETCD_ADVERTISE_CLIENT_URLS
76.          value: http://$(MY_POD_NAME).apisix-etcd-headless.apisix.svc.cluster.local:2379
77.        - name: ETCD_LISTEN_CLIENT_URLS
78.          value: http://0.0.0.0:2379
79.        - name: ETCD_INITIAL_ADVERTISE_PEER_URLS
80.          value: http://$(MY_POD_NAME).apisix-etcd-headless.apisix.svc.cluster.local:2380
81.        - name: ETCD_LISTEN_PEER_URLS
82.          value: http://0.0.0.0:2380
83.        - name: ETCD_INITIAL_CLUSTER_TOKEN
84.          value: apisix-etcd-cluster-k8s
85.        - name: ETCD_INITIAL_CLUSTER_STATE
86.          value: new
87.        - name: ETCD_INITIAL_CLUSTER
88.          value: apisix-etcd-0=http://apisix-etcd-0.apisix-etcd-headless.apisix.svc.cluster.local:2380,apisix-etcd-1=http://apisix-etcd-1.apisix-etcd-headless.apisix.svc.cluster.local:2380,apisix-etcd-2=http://apisix-etcd-2.apisix-etcd-headless.apisix.svc.cluster.local:2380
89.        - name: ETCD_CLUSTER_DOMAIN
90.          value: apisix-etcd-headless.apisix.svc.cluster.local
91.        volumeMounts:
92.        - name: data
93.          mountPath: /bitnami/etcd
94.        lifecycle:
95.          preStop:
96.            exec:
97.              command:
98.              - /opt/bitnami/scripts/etcd/prestop.sh
99.        livenessProbe:
100.          exec:
101.            command:
102.            - /opt/bitnami/scripts/etcd/healthcheck.sh
103.          initialDelaySeconds: 60
104.          timeoutSeconds: 5
105.          periodSeconds: 30
106.          successThreshold: 1
107.          failureThreshold: 5
108.        readinessProbe:
109.          exec:
110.            command:
111.            - /opt/bitnami/scripts/etcd/healthcheck.sh
112.          initialDelaySeconds: 60
113.          timeoutSeconds: 5
114.          periodSeconds: 10
115.          successThreshold: 1
116.          failureThreshold: 5
117.      securityContext:
118.        fsGroup: 1001
119.  volumeClaimTemplates:
120.  - metadata:
121.      name: data
122.    spec:
123.      accessModes: 
124.      - ReadWriteOnce
125.      storageClassName: nfs-client
126.      resources:
127.        requests:
128.          storage: 1Gi

4、Etcd 状态集(StatefulSet)配置说明

为了在 Kubernetes 中部署高可用的 Etcd 集群,需使用 StatefulSet 控制器来管理 Etcd Pod。与无状态应用不同,Etcd 作为分布式一致性存储系统,要求每个节点具有稳定的网络标识和持久化存储。

  • 基本定义
    名称:apisix-etcd
    命名空间:apisix
    副本数(replicas):3,表示部署一个三节点的 Etcd 高可用集群
    关联服务(serviceName):apisix-etcd-headless,通过 Headless Service 实现 Pod 的 DNS 解析与发现
    标签选择器(selector):匹配标签 app.kubernetes.io/name: apisix-etcd 和 app.kubernetes.io/instance: apisix-etcd

  • Pod 管理策略
    podManagementPolicy: Parallel
    表示所有 Pod 可并行启动或终止,提升部署效率(默认为 OrderedReady)

  • 反亲和策略(Affinity)
    podAntiAffinity
    使用 preferredDuringSchedulingIgnoredDuringExecution 设置软反亲和规则:
    同一宿主机上尽量避免调度多个 Etcd Pod;
    提升集群容灾能力,防止单节点故障影响整个 Etcd 集群。

  • 容器配置
    镜像:bitnami/etcd:3.5.4
    端口映射:
    2379: 客户端通信端口(client)
    2380: 节点间通信端口(peer)

  • 探针配置(Probe)
    livenessProbe(存活探针)
    检查脚本:/opt/bitnami/scripts/etcd/healthcheck.sh
    初始延迟:60 秒
    超时时间:5 秒
    检查周期:30 秒
    失败阈值:5 次失败后重启容器
    readinessProbe(就绪探针)
    检查方式相同,但更频繁地检查以确保流量只转发到健康节点
    检查周期:10 秒

  • 生命周期钩子(Lifecycle)
    preStop
    在容器停止前执行 /opt/bitnami/scripts/etcd/prestop.sh 脚本,进行优雅关闭,避免数据丢失或集群异常。

  • 安全上下文(Security Context)
    fsGroup: 1001
    设置文件系统组 ID,确保容器对挂载卷有正确读写权限。

  • 持久化存储(Volume Claim Templates)
    模板名称:data
    访问模式:ReadWriteOnce,即每个 PVC 只能被一个节点挂载
    存储类:nfs-client,使用 NFS 作为共享存储方案
    存储容量请求:每个 Pod 请求 1Gi 存储空间

5、查看集群状态

在这里插入图片描述

三、部署apisix的deployment部署

APISIX 作为一个动态、实时、高性能的 API 网关,为用户提供了一系列强大的功能,如负载均衡、动态路由、限流限速、身份验证等,极大地简化了 API 的管理和保护工作。为了确保 APISIX 能够在 Kubernetes 环境中实现高效、稳定运行,提供以下基于容器化的高可用部署方案。

1、apisix部署yaml文件

为了在 Kubernetes 环境下实现 APISIX 的高可用部署,需通过 ConfigMap、Deployment 和 Service 三类资源对象进行定义和管理。以下将逐一说明其作用与关键配置项。

1.apiVersion: v1
2.kind: ConfigMap
3.metadata:
4.  name: apisix-conf
5.  namespace: apisix
6.  labels:
7.    app: apisix
8.data:
9.  config.yaml: |
10.    etcd:
11.      host:
12.        - "http://apisix-etcd-0.apisix-etcd-headless.apisix.svc.cluster.local:2379"
13.        - "http://apisix-etcd-1.apisix-etcd-headless.apisix.svc.cluster.local:2379"
14.        - "http://apisix-etcd-2.apisix-etcd-headless.apisix.svc.cluster.local:2379"
15.      prefix: "/apisix"
16.    deployment:
17.      role: data_plane
18.      role_data_plane:
19.        config_provider: etcd
20.---
21.apiVersion: apps/v1
22.kind: Deployment
23.metadata:
24.  name: apisix
25.  namespace: apisix
26.  labels:
27.    app: apisix
28.spec:
29.  replicas: 3
30.  selector:
31.    matchLabels:
32.      app: apisix
33.  template:
34.    metadata:
35.      labels:
36.        app: apisix
37.    spec:
38.      containers:
39.      - name: apisix
40.        image: registry.cn-hangzhou.aliyuncs.com/ali_cloud_images/apisix:latest
41.        imagePullPolicy: IfNotPresent
42.        env:
43.        - name: APISIX_STAND_ALONE
44.          value: "false"  # 若使用 standalone 模式,改为 "true"
45.        command: ["/bin/bash", "-c"]
46.        args:
47.          - |
48.            set -eo pipefail
49.            exec apisix start -c /usr/local/apisix/conf/config.yaml
50.          #        - name: APISIX_CONFIG_PATH
51.          #          value: "/usr/local/apisix/conf/config.yaml"
52.          #        command: ["/bin/bash", "-c"]
53.          #        args:
54.          #          - |
55.          #            set -eo pipefail
56.          #            /docker-entrypoint.sh docker-start
57.        ports:
58.        - containerPort: 9080  # HTTP
59.        - containerPort: 9443  # HTTPS
60.        - containerPort: 9091  # Prometheus
61.        volumeMounts:
62.        - name: apisix-conf
63.          mountPath: /usr/local/apisix/conf/config.yaml
64.          subPath: config.yaml
65.      volumes:
66.      - name: apisix-conf
67.        configMap:
68.          name: apisix-conf
69.          items:
70.          - key: config.yaml
71.            path: config.yaml
72.---
73.apiVersion: v1
74.kind: Service
75.metadata:
76.  name: apisix-service
77.  namespace: apisix
78.spec:
79.  type: NodePort
80.  selector:
81.    app: apisix
82.  ports:
83.    - name: http
84.      port: 9080
85.      targetPort: 9080
86.      nodePort: 31080

2、APISIX 部署配置说明

  • ConfigMap:apisix-conf
    该 ConfigMap 定义了 APISIX 的核心配置文件 config.yaml,主要用于指定数据源(Etcd)、部署模式等运行时参数。
    主要配置项说明:
87.etcd:
88.      host:
89.        - "http://apisix-etcd-0.apisix-etcd-headless.apisix.svc.cluster.local:2379"
90.        - "http://apisix-etcd-1.apisix-etcd-headless.apisix.svc.cluster.local:2379"
91.        - "http://apisix-etcd-2.apisix-etcd-headless.apisix.svc.cluster.local:2379"
92.      prefix: "/apisix"
etcd.host:指向 Etcd 集群中的各个节点地址,确保 APISIX 可以连接到 Etcd 并获取路由、插件等动态配置。
etcd.prefix:APISIX 在 Etcd 中使用的键前缀,避免与其他服务冲突。93.    deployment:
94.      role: data_plane
95.      role_data_plane:
96.        config_provider: etcd

role: 指定当前部署角色为 data_plane,即数据面网关节点;
config_provider: 表示使用 Etcd 作为配置中心,支持动态更新。

  • Deployment:apisix
    该 Deployment 控制器负责部署多个 APISIX 实例,确保其稳定运行并具备高可用性。
    replicas: 设置副本数为 3,提升服务可用性和负载处理能力。
97. selector:
98.    matchLabels:
99.      app: apisix
100.  template:
101.    metadata:
102.      labels:
103.        app: apisix

通过标签 app: apisix 匹配 Pod,用于后续 Service 路由转发。

104.        - name: APISIX_STAND_ALONE
105.          value: "false"  # 若使用 standalone 模式,改为 "true"

设置 APISIX 不使用 Standalone 模式(即非文件配置模式),而是通过 Etcd 获取配置。

  1.    command: ["/bin/bash", "-c"]
    
  2.    args:
    
  3.      - |
    
  4.        set -eo pipefail
    
  5.        exec apisix start -c /usr/local/apisix/conf/config.yaml
    

自定义启动命令,显式指定加载挂载的 config.yaml 文件;
保证容器启动时正确读取自定义配置。

111.        volumeMounts:
112.        - name: apisix-conf
113.          mountPath: /usr/local/apisix/conf/config.yaml
114.          subPath: config.yaml
115.      volumes:
116.      - name: apisix-conf
117.        configMap:
118.          name: apisix-conf

将前面定义的 ConfigMap 挂载为 /usr/local/apisix/conf/config.yaml,实现配置注入;
使用 subPath 保证只挂载单个文件,不覆盖整个目录。

  • Service:apisix-service
    该 Service 提供对外访问入口,允许外部流量访问 APISIX 网关服务。

3、部署成功如下:

在这里插入图片描述

四、总结

以上资源配置完成了 APISIX 在 Kubernetes 环境下的高可用部署,具备以下特点:

**高可用性:**通过多副本部署结合 Kubernetes 的自动重启、调度机制,保障服务持续可用;
**动态配置:**依赖 Etcd 提供实时配置同步能力,无需重启即可生效变更;
**标准化部署:**通过 ConfigMap 统一管理配置,提升可维护性;
**可扩展性强:**可根据业务需求轻松扩展副本数量或接入 Ingress、监控系统等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84524.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84524.shtml
英文地址,请注明出处:http://en.pswp.cn/web/84524.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel常用公式大全

资源宝整理分享:https://www.httple.net Excel常用公式大全可以帮助用户提高工作效率,掌握常用的Excel公式,让数据处理和计算工作更加便捷高效。了解公式学习方法、用途,不再死记硬背,拒绝漫无目的。 命令用途注释说…

什么是Seata?

深入解析Seata:分布式事务的终极解决方案 什么是Seata? Seata(Simple Extensible Autonomous Transaction Architecture)是一款开源的分布式事务解决方案,由阿里巴巴中间件团队于2019年1月发起并开源(最初…

【系统规划与管理师第二版】1.3 新一代信息技术及发展

一、物联网 物联网(IoT)是指通过信息传感设备,按约定的协议将任何物品与互联网相连接,进行信息交换和通信,以实现智能化识别、定位、跟踪、监控和管理的网络。物联网主要解决物品与物品(T2T)、人…

在Spring Boot中自定义JSON返回日期格式的指南

在开发Spring Boot应用时,很多时候需要在返回的JSON数据中以特定格式显示日期和时间。例如,使用LocalDateTime、Date等类型的字段时,默认的序列化格式可能不是你期望的路径。本文将介绍如何在Spring Boot中实现控制返回JSON数据的日期格式&am…

【大数据高并发核心场景实战】 - 数据持久化之冷热分离

大数据高并发核心场景实战 - 数据持久化之冷热分离 当云计算平台的业务后台处理工单突然接入客服系统的请求洪流,每日新增10万工单,3000万主表1.5亿明细表的数据库开始呻吟——是时候请出「冷热分离」这剂退烧药了! 一、业务场景:…

【AI Study】第四天,Pandas(6)- 性能优化

文章概要 本文详细介绍 Pandas 的性能优化技术,包括: 内存优化计算优化大数据处理实际应用示例 内存优化 数据类型优化 # 查看数据类型 df.dtypes# 查看内存使用情况 df.memory_usage(deepTrue)# 优化数值类型 # 将 float64 转换为 float32 df[floa…

c++系列之智能指针的使用

💗 💗 博客:小怡同学 💗 💗 个人简介:编程小萌新 💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞 智能指针的使用及原理 AII(Resource Acquisition Is Initializatio…

知识蒸馏(Knowledge Distillation, KD)

知识蒸馏(Knowledge Distillation, KD)是一种模型压缩与知识迁移技术,通过让小型学生模型(Student)模仿大型教师模型(Teacher)的行为(如输出概率分布或中间特征表示)&…

chatGPT 会扩大失业潮吗?

击上方关注 “终端研发部” 设为“星标”,和你一起掌握更多数据库知识 对于部分人而言,失业是必然趋势。 这不,身后的一测试大哥,自从公司解散之后,已经在家待业半年了。。。 自打OpenAI推出了chatGPT3.0之后&#xff…

FPGA基础 -- Verilog行为级建模之时序控制

Verilog 行为级建模(Behavioral Modeling)中“时序控制”机制的系统化由浅入深培训内容,适用于初学者到进阶 FPGA 设计工程师的学习路径。 🎯 一、行为级建模的定位 行为级建模(Behavioral Modeling)是 Ve…

设计模式精讲 Day 7:桥接模式(Bridge Pattern)

【设计模式精讲 Day 7】桥接模式(Bridge Pattern) 文章简述 在软件系统中,类的继承关系往往会导致类爆炸,尤其是在需要组合多种功能或行为时。桥接模式(Bridge Pattern)通过将抽象部分与其实现部分分离&am…

Apipost 签约锐捷网络:AI赋能,共推 ICT 领域 API 生态智能化升级

日前,北京北极狐信息科技有限公司(简称 “北极狐科技”)与锐捷网络股份有限公司(简称 “锐捷网络”)正式签署合作协议,双方将聚焦 ICT 基础设施及解决方案领域,围绕 API 全链路管理与智能化研发…

RK3568笔记八十三:RTMP推流H264和PCM

若该文为原创文章,转载请注明原文出处。 前面有通过勇哥,实现了RTMP推流,但一直想加上音频,所以经过测试,写了一个demo, ffmpeg是使用ubuntu下安装测试的。 安装参考:Ubuntu20.4下x264、x265、fdk-aac和FFmpeg4.3源码编译安装_ubuntu安装libx264-CSDN博客 记录:实现从…

产业园智慧化升级中 DDC 楼宇自控系统的集成应用优势:多业态协同与能源可视化管控​

摘要​ 在产业园智慧化升级浪潮中,直接数字控制(DDC)系统凭借强大的集成能力,成为实现多业态协同与能源可视化管控的核心技术。本文深入剖析 DDC 系统在整合园区多元业态、优化能源管理方面的独特优势,通过系统集成打…

Vue 3瀑布流组件实现详解 - 图片展示方案

引言:瀑布流布局的魅力与应用场景 在当今富媒体内容主导的网络环境中,瀑布流布局已成为展示图片商品等内容的流行方式。它通过动态布局算法在有限空间内最大化内容展示,提供视觉连续性和流畅浏览体验。本文将深入探讨如何使用Vue 3实现一个功…

如何确保邮件内容符合反垃圾邮件规范?

一、遵守相关法规 美国《CAN-SPAM法案》规定,邮件头信息必须真实准确,要标明广告性质、提供有效地址,并在 10 个工作日内响应退订请求。 欧盟《通用数据保护条例》(GDPR)强调获得用户明确同意,数据使用要…

MQ解决高并发下订单问题,实现流量削峰

文章目录 示例:电商秒杀系统中的流量削峰1. 依赖引入(Maven)2. 消息队列配置(RabbitMQ)3. 生产者:订单服务(接收高并发请求)4. 消费者:库存服务(按系统容量处…

【二进制安全作业】250616课上作业2 - 栈溢出漏洞利用

文章目录 前言一、使用环境二、程序源码1. C语言源码2. 编译方式 三、源码分析四、反汇编分析1. 检查文件安全性2. 查找目标函数3. 计算偏移量4. 绕过 strlen5. 绕过 if 五、编写EXP结语 前言 直接进入正题 一、使用环境 处理器架构:x86_64 操作系统:U…

Python类型处理与推导式

欢迎来到啾啾的博客🐱。 记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。 有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。 目录 1 引言2 类型处理3 高效操作AI开发常见数据结构3…