Lab Deploying Multi-container Applications
Lab: Deploying Multi-container Applications
实验目标
本实验旨在通过 Helm 与 Kustomize 的结合使用,掌握多容器应用的模板化部署与多环境管理方法。
实验目标包括:
- 基于 Helm Chart 构建可复用的多容器应用部署包;
- 利用 Kustomize 在不同环境(如测试、生产)中自定义和管理应用配置,实现统一的版本控制与灵活的环境差异化部署。
实验
说明
- 本实验将基于 Helm Chart 创建一个名为
flask-demo
的多容器应用,该应用依赖自建的 PostgreSQL 数据库。 - 您将使用实验中提供的示例文件构建 Helm Chart,并通过
helm template
命令生成渲染结果。 - 在生成的资源清单基础上,利用 Kustomize 进行多环境配置管理,实现应用在不同环境下的参数化和差异化部署。
- 实验过程中,所有操作均在本地执行,不依赖远程 Helm 仓库。
前提条件
在开始本实验前,请确保以下环境与配置已准备就绪:
- kubectl-acp 已配置完成
您的本地环境已正确安装并配置了kubectl-acp
命令行工具,可正常访问 ACP 集群。 - 命名空间已创建并授权
管理员已在do288
项目中创建命名空间do288-chapter7
、do288-satging
和do288-production
,并为命名空间配置了合理的资源配额(ResourceQuota)。 - 存储类可用
集群中已存在至少一个可用的StorageClass
,并且上述命名空间有权限使用该存储类来创建 PVC。
实验步骤
-
登录ACP平台
1.1 在本地通过
kubectl-acp
使用 do288-user 用户登录 ACP 平台(密码为:Do288@123)kubectl acp login https://192.168.183.246
1.2 切换到目标集群的
do288-chapter7
命名空间kubectl acp set-cluster region -n do288-chapter7
-
基于下面的 flask-demo 应用和 PostgreSQL 数据库资源文件,构建对应的 Helm Chart 包。
2.1 通过将应用的 Kubernetes 资源定义(如 Deployment、Service、ConfigMap、Secret、StatefulSet 等)模板化,并结合
values.yaml
文件对关键参数进行可配置化管理,实现应用的快速安装与版本化发布。./flask-demo-chart ├── Chart.yaml ├── NOTES.txt ├── templates │ ├── flask-app │ │ ├── deployment.yaml │ │ └── service.yaml │ ├── _helpers.tpl │ ├── namespace.yaml │ ├── postgres │ │ ├── service.yaml │ │ └── statefulset.yaml │ └── secret.yaml └── values.yaml3 directories, 10 files
2.2 分析 Helm Chart 的模板结构,显示所有模板文件的来源和层次关系。
[root@region-master1 flask-demo-chart]# helm template ./ | grep "# Source:" | sort# Source: flask-demo/templates/flask-app/deployment.yaml # Source: flask-demo/templates/flask-app/service.yaml # Source: flask-demo/templates/namespace.yaml # Source: flask-demo/templates/postgres/service.yaml # Source: flask-demo/templates/postgres/service.yaml # Source: flask-demo/templates/postgres/statefulset.yaml # Source: flask-demo/templates/secret.yaml
-
使用 Helm 渲染模板并生成基础配置文件
3.1 使用
helm template
命令对 Chart 进行本地渲染(模板解析),生成对应的 Kubernetes 资源清单文件。渲染完成的结果将输出至指定目录下的
kustomized-flask/base/app.yaml
文件中,作为后续 Kustomize 配置管理的基础文件。helm template --skip-tests ./ > ../kustomized-flask/base/app.yaml
-
手动定义并创建
kustomized-flask
目录结构4.1 将所需的文件添加到
kustomized-flask
目录,以便于统一管理不同环境的部署配置。完整的目录结构如下,其中base/app.yaml
配置文件是由helm template
渲染的完整的部署文件。./kustomized-flask ├── base │ ├── app.yaml │ └── kustomization.yaml └── overlays├── production│ ├── kustomization.yaml│ └── patches│ ├── deployment.yaml│ ├── flask-service.yaml│ └── postgres-service.yaml└── staging├── kustomization.yaml└── patches└── deployment.yaml6 directories, 8 files
4.2 参考下列内容补充
base/kustomization.yaml
配置内容。apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomizationresources: - app.yamllabels: - pairs:app.kubernetes.io/name: flask-demoapp.kubernetes.io/instance: flask-demo-baseapp.kubernetes.io/version: "v4"app.kubernetes.io/component: web-applicationapp.kubernetes.io/part-of: flask-demo-projectcommonAnnotations:note: "Base configuration for Flask Demo Application"managed-by: "kustomize"environment: "base"images: - name: 192.168.183.215:30010/do288/flask-pg-demonewTag: v4 - name: 192.168.183.215:30010/do288/postgresnewTag: "10.0"
4.3 参考下列内容补充
overlays/staging/
配置内容。overlays/staging/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomizationnamespace: do288-stagingresources: - ../../basepatches: - path: patches/deployment.yamltarget:kind: Deploymentname: demo-app
overlays/staging/patches/deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata:name: demo-app spec:replicas: 2template:spec:containers:- name: demo-appenv:- name: ENVIRONMENTvalue: "staging"- name: DEBUGvalue: "true"
4.4 参考下列内容补充
overlays/production/
配置内容。overlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomizationnamespace: do288-productionresources: - ../../basepatches: - path: patches/deployment.yamltarget:kind: Deploymentname: demo-app - path: patches/postgres-service.yamltarget:kind: Servicename: postgres - path: patches/flask-service.yamltarget:kind: Servicename: demo-app
**overlays/production/patches/deployment.yaml **
apiVersion: apps/v1 kind: Deployment metadata:name: demo-app spec:replicas: 2template:spec:containers:- name: demo-appimage: 192.168.183.215:30010/do288/flask-pg-demo:v5env:- name: ENVIRONMENTvalue: "staging"- name: DEBUGvalue: "true"
overlays/production/patches/flask-service.yaml
piVersion: v1 kind: Service metadata:name: demo-app spec:ports:- port: 5000targetPort: 5000nodePort: 30501
overlays/production/patches/postgres-service.yaml
apiVersion: v1 kind: Service metadata:name: postgres spec:ports:- name: postgresport: 5432protocol: TCPtargetPort: tcp-postgresnodePort: 30008
-
通过上述 Kustomize 进行快速部署 staging 环境应用
5.1 运行以下命令,快速部署应用
[root@region-master1 kustomized-flask]# kubectl kustomize overlays/staging/ | kubectl apply -n do288-staging -f - secret/postgres-secret created service/demo-app created service/postgres created service/postgres-headless created deployment.apps/demo-app created statefulset.apps/postgres created
5.2 查看应用创建状态是否正常
[root@region-master1 kustomized-flask]# kubectl get pods,svc -n do288-staging NAME READY STATUS RESTARTS AGE pod/demo-app-6c8fb7c654-mll9q 1/1 Running 0 53s pod/demo-app-6c8fb7c654-pxw5j 1/1 Running 0 54s pod/postgres-0 1/1 Running 0 54sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/demo-app NodePort 10.4.142.21 <none> 5000:30500/TCP 54s service/postgres NodePort 10.4.152.83 <none> 5432:30007/TCP 54s service/postgres-headless ClusterIP None <none> 5432/TCP 54s
5.3 通过 ACP Web 控制台或者
kubectl exec
命令进入到容器中并创建创建测试表。# 进入 postgres-0 容器中 kubectl exec -it postgres-0 -- psql -U postgres -d test# 创建users表 CREATE TABLE users (id SERIAL PRIMARY KEY,name VARCHAR(50) );
5.4 通过
ip + nodePort
调用 flask-demo 应用来验证对 postgresql 数据库的读写操作。# 测试服务是否可用 curl http://192.168.183.245:30500# 获取列表中的应用 curl http://192.168.183.245:30500/users# 通过 curl 命令向数据库中写数据 curl -X POST http://192.168.183.245:30500/users -H "Content-Type: application/json" -d '{"name":"David"}'
5.5 手动清理 flask-demo 应用
[root@region-master1 kustomized-flask]# kubectl kustomize overlays/staging/ | kubectl delete -n do288-staging -f - secret "postgres-secret" deleted service "demo-app" deleted service "postgres" deleted service "postgres-headless" deleted deployment.apps "demo-app" deleted statefulset.apps "postgres" deleted
-
参考 staging 环境部署方式,进行 production 环境应用的部署