#作者:任少近
文章目录
- 一、背景
- 二、部署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 获取配置。
-
command: ["/bin/bash", "-c"]
-
args:
-
- |
-
set -eo pipefail
-
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、监控系统等。