Skip to content

Commit 0b6e6b4

Browse files
bxy4543claude
andauthored
feat(account): migrate account-service deployment to Helm chart (#6646)
- Replace manifest-based deployment with Helm chart structure - Add Helm chart with standard templates (deployment, service, configmap) - Create account-service-entrypoint.sh for Helm installation - Update Kubefile to use Helm chart instead of manifests - Simplify deployment by reusing account-controller-manager service account - Remove unnecessary components (no webhook, RBAC, metrics, certificates) - Use compatible selector labels for seamless migration from manifests - Add comprehensive README.md with configuration examples and troubleshooting guide 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <noreply@anthropic.com>
1 parent ac42609 commit 0b6e6b4

File tree

10 files changed

+562
-7
lines changed

10 files changed

+562
-7
lines changed

service/account/deploy/Kubefile

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
FROM scratch
2+
COPY charts charts
23
COPY registry registry
3-
COPY manifests manifests
4-
COPY scripts scripts
4+
COPY account-service-entrypoint.sh account-service-entrypoint.sh
55

6-
ENV DEFAULT_NAMESPACE account-system
7-
ENV cloudDomain="127.0.0.1.nip.io"
8-
ENV cloudPort=""
9-
ENV certSecretName="wildcard-cert"
6+
ENV RELEASE_NAMESPACE=account-system
7+
ENV RELEASE_NAME=account-service
108

11-
CMD ["bash scripts/init.sh"]
9+
CMD ["bash account-service-entrypoint.sh"]

service/account/deploy/README.md

Lines changed: 264 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,264 @@
1+
# account-service
2+
3+
## 说明
4+
sealos run 镜像时会在目标节点执行 Kubefile,本镜像通过 Helm 安装/升级 account-service Deployment。
5+
6+
## 必填参数
7+
8+
****
9+
10+
## 如何运行
11+
12+
```shell
13+
# 最简配置
14+
sealos run labring/account-service:latest
15+
16+
# 自定义命名空间
17+
sealos run labring/account-service:latest \
18+
--env RELEASE_NAMESPACE=my-account-system
19+
20+
# 自定义镜像
21+
sealos run labring/account-service:latest \
22+
--env HELM_OPTS="--set image=ghcr.io/labring/sealos-account-service:v1.0.0"
23+
24+
# 自定义副本数
25+
sealos run labring/account-service:latest \
26+
--env HELM_OPTS="--set replicaCount=3"
27+
```
28+
29+
## 可选参数
30+
31+
- RELEASE_NAMESPACE: Helm 安装命名空间,默认 `account-system`
32+
- RELEASE_NAME: Helm release 名称,默认 `account-service`
33+
- HELM_OPTS: 透传 Helm 参数(例如 `--set replicaCount=3 --set image.tag=latest`
34+
- CHART_PATH: Helm chart 路径,默认 `./charts/account-service`
35+
36+
## Helm Chart 可配置参数
37+
38+
可通过 `HELM_OPTS` 传递以下参数:
39+
40+
### 基础配置
41+
42+
- `replicaCount`: 副本数,默认 `1`
43+
- `image`: 容器镜像,默认 `ghcr.io/labring/sealos-account-service:latest`
44+
- `imagePullPolicy`: 镜像拉取策略,默认 `Always`
45+
- `imagePullSecrets`: 镜像拉取密钥,默认 `[]`
46+
47+
### 服务配置
48+
49+
- `service.type`: 服务类型,默认 `ClusterIP`
50+
- `service.port`: 服务端口,默认 `2333`
51+
52+
### 资源配置
53+
54+
- `resources.limits.cpu`: CPU 限制,默认 `500m`
55+
- `resources.limits.memory`: 内存限制,默认 `256Mi`
56+
- `resources.requests.cpu`: CPU 请求,默认 `50m`
57+
- `resources.requests.memory`: 内存请求,默认 `25Mi`
58+
59+
### 健康检查
60+
61+
- `livenessProbe.httpGet.path`: 存活探针路径,默认 `/health`
62+
- `livenessProbe.httpGet.port`: 存活探针端口,默认 `2333`
63+
- `livenessProbe.initialDelaySeconds`: 存活探针初始延迟,默认 `3`
64+
- `livenessProbe.periodSeconds`: 存活探针周期,默认 `10`
65+
- `readinessProbe.httpGet.path`: 就绪探针路径,默认 `/health`
66+
- `readinessProbe.httpGet.port`: 就绪探针端口,默认 `2333`
67+
- `readinessProbe.initialDelaySeconds`: 就绪探针初始延迟,默认 `3`
68+
- `readinessProbe.periodSeconds`: 就绪探针周期,默认 `5`
69+
- `readinessProbe.failureThreshold`: 就绪探针失败阈值,默认 `6`
70+
71+
### 调度配置
72+
73+
- `nodeSelector`: 节点选择器,默认 `{}`
74+
- `tolerations`: 容忍度配置,默认 `[]`
75+
- `affinity`: 亲和性配置,默认 `{}`
76+
77+
### 自动伸缩
78+
79+
- `autoscaling.enabled`: 是否启用自动伸缩,默认 `false`
80+
- `autoscaling.minReplicas`: 最小副本数,默认 `1`
81+
- `autoscaling.maxReplicas`: 最大副本数,默认 `1`
82+
- `autoscaling.targetCPUUtilizationPercentage`: 目标 CPU 利用率,默认 `80`
83+
84+
### 其他配置
85+
86+
- `serviceAccountName`: 服务账户名称,默认 `account-controller-manager`
87+
- `envConfigMapName`: 环境 ConfigMap 名称,默认 `account-manager-env`
88+
- `paymentSecretName`: 支付密钥名称,默认 `payment-secret`
89+
- `regionInfoConfigMapName`: 区域信息 ConfigMap 名称,默认 `region-info`
90+
- `nameOverride`: 名称覆盖,默认 `""`
91+
- `fullnameOverride`: 完全限定名称覆盖,默认 `account-service`
92+
93+
## 示例
94+
95+
```shell
96+
# 1. 最简配置
97+
sealos run labring/account-service:latest
98+
99+
# 2. 自定义命名空间
100+
sealos run labring/account-service:latest \
101+
--env RELEASE_NAMESPACE=my-account-system
102+
103+
# 3. 自定义镜像和标签
104+
sealos run labring/account-service:latest \
105+
--env HELM_OPTS="--set image=ghcr.io/labring/sealos-account-service:v1.0.0"
106+
107+
# 4. 自定义副本数和资源限制
108+
sealos run labring/account-service:latest \
109+
--env HELM_OPTS="--set replicaCount=3 --set resources.limits.cpu=1000m --set resources.limits.memory=512Mi"
110+
111+
# 5. 自定义服务端口
112+
sealos run labring/account-service:latest \
113+
--env HELM_OPTS="--set service.port=8080"
114+
115+
# 6. 配置节点选择器
116+
sealos run labring/account-service:latest \
117+
--env HELM_OPTS="--set nodeSelector.node-role.kubernetes.io/worker="
118+
119+
# 7. 启用自动伸缩
120+
sealos run labring/account-service:latest \
121+
--env HELM_OPTS="--set autoscaling.enabled=true --set autoscaling.minReplicas=2 --set autoscaling.maxReplicas=5"
122+
123+
# 8. 完整配置示例
124+
sealos run labring/account-service:latest \
125+
--env RELEASE_NAMESPACE=production-account \
126+
--env HELM_OPTS="--set replicaCount=3 \
127+
--set image=ghcr.io/labring/sealos-account-service:v1.0.0 \
128+
--set resources.limits.cpu=1000m \
129+
--set resources.limits.memory=512Mi \
130+
--set resources.requests.cpu=100m \
131+
--set resources.requests.memory=50Mi \
132+
--set livenessProbe.initialDelaySeconds=10 \
133+
--set readinessProbe.initialDelaySeconds=10"
134+
```
135+
136+
## 架构说明
137+
138+
### 组件说明
139+
140+
- **Deployment**: account-service 的无状态应用部署
141+
- **Service**: 提供集群内部服务发现
142+
- **ConfigMap**: 存储配置信息(region-info、account-manager-env)
143+
- **Secret**: 存储敏感信息(payment-secret)
144+
145+
### 服务账户
146+
147+
使用现有的 `account-controller-manager` service account,与 account-controller 共享权限。
148+
149+
### 依赖组件
150+
151+
- **account-controller**: 提供 account-manager-env ConfigMap 和 service account
152+
- **payment-secret**: 支付配置密钥(可选)
153+
154+
## 部署流程
155+
156+
1. **Adopt 现有资源**: 如果是从旧版本 manifest 部署迁移,会将现有资源标记为 Helm 管理
157+
2. **创建命名空间**: 如果命名空间不存在,Helm 会自动创建(通过 `--create-namespace` 参数)
158+
3. **安装/升级 Helm Release**: 使用 Helm chart 部署或更新应用
159+
160+
## 故障排查
161+
162+
### 检查 Pod 状态
163+
164+
```shell
165+
kubectl get pods -n account-system
166+
kubectl describe pod -n account-system -l app=account-service
167+
```
168+
169+
### 查看日志
170+
171+
```shell
172+
kubectl logs -n account-system deployment/account-service
173+
kubectl logs -n account-system deployment/account-service --tail=100 -f
174+
```
175+
176+
### 检查 Helm Release
177+
178+
```shell
179+
helm status account-service -n account-system
180+
helm get all account-service -n account-system
181+
```
182+
183+
### 检查配置
184+
185+
```shell
186+
# 查看 ConfigMap
187+
kubectl get configmap account-manager-env -n account-system -o yaml
188+
kubectl get configmap region-info -n account-system -o yaml
189+
190+
# 查看 Secret
191+
kubectl get secret payment-secret -n account-system -o yaml
192+
```
193+
194+
### 重启服务
195+
196+
```shell
197+
kubectl rollout restart deployment/account-service -n account-system
198+
```
199+
200+
### 卸载
201+
202+
```shell
203+
helm uninstall account-service -n account-system
204+
```
205+
206+
## 从旧版本迁移
207+
208+
如果之前使用 manifest 部署(`manifests/deploy.yaml`),entrypoint 脚本会自动:
209+
210+
1. Adopt 现有的 Deployment、Service、ConfigMap 资源
211+
2. 为资源添加 Helm 管理标签
212+
3. 使用 Helm 接管这些资源
213+
214+
无需手动删除旧资源,直接运行新的 sealos run 命令即可。
215+
216+
## 与 account-controller 的区别
217+
218+
| 特性 | account-service | account-controller |
219+
|------|-----------------|-------------------|
220+
| 类型 | 无状态服务(HTTP API) | Kubernetes 控制器 |
221+
| Webhook || 有(validating webhook) |
222+
| RBAC | 复用 controller 的 SA | 独立的完整 RBAC |
223+
| Metrics || 有(可选启用) |
224+
| Certificates || 需要 cert-manager 证书 |
225+
| 功能 | 提供 Account API 服务 | 管理 Account CRD 和计费逻辑 |
226+
227+
## 开发指南
228+
229+
### 本地测试
230+
231+
```shell
232+
# 模板渲染测试
233+
helm template account-service ./charts/account-service
234+
235+
# 干跑安装
236+
helm install account-service ./charts/account-service --dry-run --debug
237+
238+
# Lint 检查
239+
helm lint ./charts/account-service
240+
```
241+
242+
### 构建镜像
243+
244+
```shell
245+
# 在 deploy 目录下执行
246+
cd service/account/deploy
247+
sealos build -t labring/account-service:latest .
248+
```
249+
250+
### 本地运行测试
251+
252+
```shell
253+
# 直接运行 entrypoint 脚本(需要 kubectl 访问权限)
254+
bash account-service-entrypoint.sh
255+
```
256+
257+
## 贡献指南
258+
259+
修改 Chart 时请注意:
260+
261+
1. 更新 `Chart.yaml` 中的版本号
262+
2. 在 README.md 中记录新增的配置参数
263+
3. 使用 `helm template``helm lint` 验证模板
264+
4. 测试升级流程:从旧版本升级到新版本
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#!/bin/bash
2+
set -ex
3+
4+
HELM_OPTS=${HELM_OPTS:-""}
5+
RELEASE_NAME=${RELEASE_NAME:-"account-service"}
6+
RELEASE_NAMESPACE=${RELEASE_NAMESPACE:-"account-system"}
7+
CHART_PATH=${CHART_PATH:-"./charts/account-service"}
8+
9+
adopt_namespaced_resource() {
10+
local kind="$1"
11+
local name="$2"
12+
if kubectl -n "${RELEASE_NAMESPACE}" get "${kind}" "${name}" >/dev/null 2>&1; then
13+
kubectl -n "${RELEASE_NAMESPACE}" label "${kind}" "${name}" app.kubernetes.io/managed-by=Helm --overwrite >/dev/null 2>&1 || true
14+
kubectl -n "${RELEASE_NAMESPACE}" annotate "${kind}" "${name}" meta.helm.sh/release-name="${RELEASE_NAME}" meta.helm.sh/release-namespace="${RELEASE_NAMESPACE}" --overwrite >/dev/null 2>&1 || true
15+
fi
16+
}
17+
18+
# Adopt existing resources if this is a fresh helm install
19+
if ! helm status "${RELEASE_NAME}" -n "${RELEASE_NAMESPACE}" >/dev/null 2>&1; then
20+
if kubectl get namespace "${RELEASE_NAMESPACE}" >/dev/null 2>&1; then
21+
kubectl label namespace "${RELEASE_NAMESPACE}" app.kubernetes.io/managed-by=Helm --overwrite >/dev/null 2>&1 || true
22+
kubectl annotate namespace "${RELEASE_NAMESPACE}" meta.helm.sh/release-name="${RELEASE_NAME}" meta.helm.sh/release-namespace="${RELEASE_NAMESPACE}" --overwrite >/dev/null 2>&1 || true
23+
fi
24+
25+
adopt_namespaced_resource configmap account-manager-env
26+
adopt_namespaced_resource configmap region-info
27+
adopt_namespaced_resource service account-service
28+
adopt_namespaced_resource deployment account-service
29+
fi
30+
31+
helm upgrade -i "${RELEASE_NAME}" -n "${RELEASE_NAMESPACE}" --create-namespace "${CHART_PATH}" ${HELM_OPTS}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
apiVersion: v2
2+
name: account-service
3+
description: Helm chart for the sealos account service
4+
type: application
5+
version: 0.1.0
6+
appVersion: "0.1.0"
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
Thank you for installing {{ .Chart.Name }}!
2+
3+
Your release is named {{ .Release.Name }}.
4+
5+
To learn more about the release, try:
6+
7+
$ helm status {{ .Release.Name }}
8+
$ helm get all {{ .Release.Name }}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
{{/*
2+
Expand the name of the chart.
3+
*/}}
4+
{{- define "account-service.name" -}}
5+
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
6+
{{- end }}
7+
8+
{{/*
9+
Create a default fully qualified app name.
10+
*/}}
11+
{{- define "account-service.fullname" -}}
12+
{{- if .Values.fullnameOverride }}
13+
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
14+
{{- else }}
15+
{{- $name := default .Chart.Name .Values.nameOverride }}
16+
{{- if contains $name .Release.Name }}
17+
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
18+
{{- else }}
19+
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
20+
{{- end }}
21+
{{- end }}
22+
{{- end }}
23+
24+
{{/*
25+
Create chart name and version as used by the chart label.
26+
*/}}
27+
{{- define "account-service.chart" -}}
28+
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
29+
{{- end }}
30+
31+
{{/*
32+
Common labels
33+
*/}}
34+
{{- define "account-service.labels" -}}
35+
helm.sh/chart: {{ include "account-service.chart" . }}
36+
{{ include "account-service.selectorLabels" . }}
37+
{{- if .Chart.AppVersion }}
38+
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
39+
{{- end }}
40+
app.kubernetes.io/managed-by: {{ .Release.Service }}
41+
{{- end }}
42+
43+
{{/*
44+
Selector labels
45+
*/}}
46+
{{- define "account-service.selectorLabels" -}}
47+
app.kubernetes.io/name: {{ include "account-service.name" . }}
48+
app.kubernetes.io/instance: {{ .Release.Name }}
49+
{{- end }}
50+
51+
{{/*
52+
Create the name of the service account to use
53+
*/}}
54+
{{- define "account-service.serviceAccountName" -}}
55+
{{- if .Values.serviceAccount.create }}
56+
{{- default (include "account-service.fullname" .) .Values.serviceAccount.name }}
57+
{{- else }}
58+
{{- default "default" .Values.serviceAccount.name }}
59+
{{- end }}
60+
{{- end }}

0 commit comments

Comments
 (0)