Skip to content

Commit 40b9c46

Browse files
authored
feat(aisix-cloud): add AISIX private-deployment control-plane chart (#298)
1 parent f82a6e7 commit 40b9c46

19 files changed

Lines changed: 952 additions & 1 deletion

.github/workflows/ci.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ jobs:
3636
&& ct lint \
3737
--charts charts/api7 \
3838
--charts charts/gateway \
39-
--charts charts/ingress-controller'
39+
--charts charts/ingress-controller \
40+
--charts charts/aisix-cloud'
4041
4142
- name: Verify Chart.lock files
4243
run: |

AGENTS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ This repo (`api7/api7-helm-chart`) holds the Helm charts for API7 EE components
88
| `gateway` (Data Plane) | `charts/gateway` | yes — appVersion is the EE version |
99
| `api7-ingress-controller` | `charts/ingress-controller` | no — independent product version |
1010
| `developer-portal-fe` | `charts/developer-portal-fe` | no — independent product version |
11+
| `aisix-cloud` (AISIX private-deployment control plane) | `charts/aisix-cloud` | no — independent product version (source of truth: `api7/AISIX-Cloud` `helm/aisix-cloud`) |
1112

1213
## Multi-line maintenance model
1314

charts/aisix-cloud/.helmignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.git

charts/aisix-cloud/Chart.lock

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
dependencies:
2+
- name: postgresql
3+
repository: https://charts.bitnami.com/bitnami
4+
version: 12.12.10
5+
digest: sha256:3b8c03cf5b8742b8110494d29a4793f20920294a504bd85940d02bb00d0bc0ea
6+
generated: "2026-05-13T18:33:38.3659398+08:00"

charts/aisix-cloud/Chart.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
apiVersion: v2
2+
name: aisix-cloud
3+
description: Helm chart for AISIX-Cloud control plane (cp-api, dp-manager, dashboard)
4+
type: application
5+
version: 0.1.0
6+
appVersion: "0.1.0"
7+
8+
maintainers:
9+
- name: API7
10+
email: support@api7.ai
11+
url: https://api7.ai
12+
13+
dependencies:
14+
- name: postgresql
15+
condition: postgresql.builtin
16+
version: "12.12.10"
17+
repository: "https://charts.bitnami.com/bitnami"

charts/aisix-cloud/README.md

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
# aisix-cloud
2+
3+
![Version: 0.1.0](https://img.shields.io/badge/Version-0.1.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.1.0](https://img.shields.io/badge/AppVersion-0.1.0-informational?style=flat-square)
4+
5+
Helm chart for AISIX-Cloud control plane (cp-api, dp-manager, dashboard)
6+
7+
## Maintainers
8+
9+
| Name | Email | Url |
10+
| ---- | ------ | --- |
11+
| API7 | <support@api7.ai> | <https://api7.ai> |
12+
13+
## Requirements
14+
15+
| Repository | Name | Version |
16+
|------------|------|---------|
17+
| https://charts.bitnami.com/bitnami | postgresql | 12.12.10 |
18+
19+
## Values
20+
21+
| Key | Type | Default | Description |
22+
|-----|------|---------|-------------|
23+
| api.affinity | object | `{}` | |
24+
| api.dpImage | string | `""` | |
25+
| api.dpmgrBaseURL | string | `""` | |
26+
| api.extraEnvVars | list | `[]` | |
27+
| api.image.pullPolicy | string | `"IfNotPresent"` | |
28+
| api.image.repository | string | `"ghcr.io/api7/aisix-cp-api"` | |
29+
| api.image.tag | string | `""` | |
30+
| api.nodeSelector | object | `{}` | |
31+
| api.oauthEnabled | bool | `false` | |
32+
| api.podSecurityContext.fsGroup | int | `101` | |
33+
| api.podSecurityContext.runAsGroup | int | `101` | |
34+
| api.podSecurityContext.runAsNonRoot | bool | `true` | |
35+
| api.podSecurityContext.runAsUser | int | `10001` | |
36+
| api.podSecurityContext.seccompProfile.type | string | `"RuntimeDefault"` | |
37+
| api.publicBaseURL | string | `"http://localhost:8080"` | |
38+
| api.replicaCount | int | `1` | |
39+
| api.resources.limits.cpu | string | `"1"` | |
40+
| api.resources.limits.memory | string | `"512Mi"` | |
41+
| api.resources.requests.cpu | string | `"100m"` | |
42+
| api.resources.requests.memory | string | `"128Mi"` | |
43+
| api.securityContext.allowPrivilegeEscalation | bool | `false` | |
44+
| api.securityContext.capabilities.drop[0] | string | `"ALL"` | |
45+
| api.securityContext.readOnlyRootFilesystem | bool | `true` | |
46+
| api.service.port | int | `8080` | |
47+
| api.service.type | string | `"ClusterIP"` | |
48+
| api.tolerations | list | `[]` | |
49+
| dpm.affinity | object | `{}` | |
50+
| dpm.extraEnvVars | list | `[]` | |
51+
| dpm.image.pullPolicy | string | `"IfNotPresent"` | |
52+
| dpm.image.repository | string | `"ghcr.io/api7/aisix-cp-dpm"` | |
53+
| dpm.image.tag | string | `""` | |
54+
| dpm.nodeSelector | object | `{}` | |
55+
| dpm.podSecurityContext.fsGroup | int | `101` | |
56+
| dpm.podSecurityContext.runAsGroup | int | `101` | |
57+
| dpm.podSecurityContext.runAsNonRoot | bool | `true` | |
58+
| dpm.podSecurityContext.runAsUser | int | `10001` | |
59+
| dpm.podSecurityContext.seccompProfile.type | string | `"RuntimeDefault"` | |
60+
| dpm.replicaCount | int | `1` | |
61+
| dpm.resources.limits.cpu | string | `"1"` | |
62+
| dpm.resources.limits.memory | string | `"512Mi"` | |
63+
| dpm.resources.requests.cpu | string | `"100m"` | |
64+
| dpm.resources.requests.memory | string | `"128Mi"` | |
65+
| dpm.securityContext.allowPrivilegeEscalation | bool | `false` | |
66+
| dpm.securityContext.capabilities.drop[0] | string | `"ALL"` | |
67+
| dpm.securityContext.readOnlyRootFilesystem | bool | `true` | |
68+
| dpm.service.nodePort | string | `""` | |
69+
| dpm.service.port | int | `7944` | |
70+
| dpm.service.type | string | `"ClusterIP"` | |
71+
| dpm.tolerations | list | `[]` | |
72+
| externalDatabase.database | string | `"aisix_cloud"` | |
73+
| externalDatabase.existingSecret | string | `""` | |
74+
| externalDatabase.host | string | `""` | |
75+
| externalDatabase.password | string | `""` | |
76+
| externalDatabase.port | int | `5432` | |
77+
| externalDatabase.sslmode | string | `"disable"` | |
78+
| externalDatabase.username | string | `"aisix"` | |
79+
| global.imagePullSecrets | list | `[]` | |
80+
| global.storageClass | string | `""` | |
81+
| postgresql.auth.database | string | `"aisix_cloud"` | |
82+
| postgresql.auth.existingSecret | string | `""` | |
83+
| postgresql.auth.password | string | `"changeme"` | |
84+
| postgresql.auth.postgresPassword | string | `"changeme"` | |
85+
| postgresql.auth.usePostgresUserForAppConnections | bool | `true` | |
86+
| postgresql.auth.username | string | `"aisix"` | |
87+
| postgresql.builtin | bool | `true` | |
88+
| postgresql.fullnameOverride | string | `""` | |
89+
| postgresql.image.registry | string | `"docker.io"` | |
90+
| postgresql.image.repository | string | `"api7/postgresql"` | |
91+
| postgresql.image.tag | string | `"15.4.0-debian-11-r45"` | |
92+
| postgresql.primary.persistence.size | string | `"8Gi"` | |
93+
| postgresql.primary.service.ports.postgresql | int | `5432` | |
94+
| secrets.betterAuthSecret | string | `"CHANGE_ME_GENERATE_WITH_openssl_rand_-base64_48"` | |
95+
| secrets.masterKey | string | `"CHANGE_ME_GENERATE_WITH_openssl_rand_-base64_32"` | |
96+
| secrets.masterKeyID | string | `"env:default"` | |
97+
| serviceAccount.annotations | object | `{}` | |
98+
| serviceAccount.create | bool | `true` | |
99+
| serviceAccount.name | string | `""` | |
100+
| ui.affinity | object | `{}` | |
101+
| ui.defaultLocale | string | `"en"` | |
102+
| ui.extraEnvVars | list | `[]` | |
103+
| ui.image.pullPolicy | string | `"IfNotPresent"` | |
104+
| ui.image.repository | string | `"ghcr.io/api7/aisix-cp-ui"` | |
105+
| ui.image.tag | string | `""` | |
106+
| ui.nodeSelector | object | `{}` | |
107+
| ui.podSecurityContext.fsGroup | int | `65533` | |
108+
| ui.podSecurityContext.runAsGroup | int | `65533` | |
109+
| ui.podSecurityContext.runAsNonRoot | bool | `true` | |
110+
| ui.podSecurityContext.runAsUser | int | `1001` | |
111+
| ui.podSecurityContext.seccompProfile.type | string | `"RuntimeDefault"` | |
112+
| ui.replicaCount | int | `1` | |
113+
| ui.resources.limits.cpu | string | `"500m"` | |
114+
| ui.resources.limits.memory | string | `"256Mi"` | |
115+
| ui.resources.requests.cpu | string | `"50m"` | |
116+
| ui.resources.requests.memory | string | `"64Mi"` | |
117+
| ui.securityContext.allowPrivilegeEscalation | bool | `false` | |
118+
| ui.securityContext.capabilities.drop[0] | string | `"ALL"` | |
119+
| ui.securityContext.readOnlyRootFilesystem | bool | `true` | |
120+
| ui.service.port | int | `3000` | |
121+
| ui.service.type | string | `"ClusterIP"` | |
122+
| ui.tolerations | list | `[]` | |
123+
61.1 KB
Binary file not shown.
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
AISIX-Cloud control plane has been deployed.
2+
3+
Components:
4+
- cp-api: {{ include "aisix-cloud.fullname" . }}-api:{{ .Values.api.service.port }}
5+
- dp-manager: {{ include "aisix-cloud.fullname" . }}-dpm:{{ .Values.dpm.service.port }}
6+
- dashboard: {{ include "aisix-cloud.fullname" . }}-ui:{{ .Values.ui.service.port }}
7+
- PostgreSQL: {{ include "aisix-cloud.pgHost" . }}:{{ include "aisix-cloud.pgPort" . }}
8+
9+
Access the dashboard via cp-api (reverse proxy):
10+
kubectl port-forward svc/{{ include "aisix-cloud.fullname" . }}-api {{ .Values.api.service.port }}:{{ .Values.api.service.port }} -n {{ .Release.Namespace }}
11+
Then open http://localhost:{{ .Values.api.service.port }}
12+
13+
Connect a data-plane (managed mode):
14+
{{- if eq .Values.dpm.service.type "NodePort" }}
15+
DPM is exposed via NodePort.
16+
{{- if .Values.dpm.service.nodePort }}
17+
NodePort: {{ .Values.dpm.service.nodePort }}
18+
{{- else }}
19+
Get the assigned port:
20+
kubectl get svc/{{ include "aisix-cloud.fullname" . }}-dpm -n {{ .Release.Namespace }} -o jsonpath='{.spec.ports[0].nodePort}'
21+
{{- end }}
22+
23+
Run the DP container (replace <node-ip> and <node-port> with actual values):
24+
25+
docker run --rm \
26+
-e AISIX_CONFIG_PATH=/etc/aisix/config.managed.yaml \
27+
-e AISIX_MANAGED__CP_BASE_URL=https://<node-ip>:<node-port> \
28+
-e AISIX_MANAGED__CP_ETCD_ENDPOINT=<node-ip>:<node-port> \
29+
-e AISIX_MANAGED__CP_CERT_PEM='<client-cert-pem>' \
30+
-e AISIX_MANAGED__CP_KEY_PEM='<client-key-pem>' \
31+
-e AISIX_MANAGED__CP_CA_PEM='<ca-cert-pem>' \
32+
-v aisix-mtls:/var/lib/aisix \
33+
{{ .Values.api.dpImage | default (printf "ghcr.io/api7/aisix:%s" .Chart.AppVersion) }}
34+
{{- else }}
35+
DPM is a ClusterIP service. Expose it via Ingress, LoadBalancer, or port-forward:
36+
kubectl port-forward svc/{{ include "aisix-cloud.fullname" . }}-dpm {{ .Values.dpm.service.port }}:{{ .Values.dpm.service.port }} -n {{ .Release.Namespace }}
37+
{{- end }}

0 commit comments

Comments
 (0)