项目地址
- 教程作者:
- 教程地址:
- 代码仓库地址:
- 所用到的框架和插件:
dbt
airflow
一、程序部署微服务
- App Services(单体架构可自动伸缩)
- Container Apps
- Kubernetes services
1.1 App Services
1.2 Azure Container Registry
1. 创建Registry
2. 上传image
- 查看当前registry的所有images
az acr list --output table
- 登录ACR
az acr login --name harshacontainerregistry
- 创建docker image 指定docker file的路径,并创建到当前目录
docker build -t demowebapp:latest -f ./DemoWebaaplication/Dockerfile .
- 给image添加tag
docker tag demowebapp:latest harshacontinerregistry.azurecr.io/demowebapp:latest
- 由于已经登录过了ACR所以直接push image
dokcer push harshacontainerregistry.azurecr.io/demowebapp:latest
- 上传成功可以看到
1.3 K8s
- 流程
1.创建k8s
- 创建resource group
- 创建k8s所需的服务
- 创建aks
- 获取crendentials用于本地登录
- 绑定container registry到k8s项目,这样他就会自动拉去images
2. 常用命令
- 获取当前所有的node
kubectl get nodes
- 获取namespace
kubectl get namespaces
二、程序部署K8S
- 课程地址
Udemy:Develop and Deploy Cloud Native Applications at Scale with Kubernetes(Jose Portilla)
2.1 Pod 和 Service
字段 | 含义 |
---|---|
port | Service 暴露的端口(K8s 集群内访问时使用) |
targetPort | 实际容器(Pod)监听的端口 |
nodePort | 每个节点暴露的端口(供集群外部访问) |
- 实际工作流程
外部访问: http://<NodeIP>:32000
│
▼
NodePort: 32000 (node port)
│
▼
ClusterIP Service: port 5001 (port)
│
▼
Pod: containerPort 5001 (target port)
- 后端服务:由于是后端服务,端口3000用于服务内容,前端访问后端用3000接口;serice使用selector通过lables进行选择时,必须和pod里的labels完全一样才行
- 前端服务
- 前端服务的env:前端可以直接
http://{GRAGE_SERVICE_HOST}:3000
直接访问
2.2 Deployments和Pod Replicas
- 使用了Deployments就不需要pod了
2.3 Rolling updates and Rollbacks
1. Rolling updates
- 滚动更新:为了解决更新时候的停机时间
参数 | 作用 | 举例(副本数 4) |
---|---|---|
maxUnavailable | 最多多少个 Pod 暂时不可用 | 如果是 1 ,表示更新过程中最多可以下线 1 个旧 Pod |
maxSurge | 最多临时额外启动多少个新 Pod | 如果是 1 ,表示更新时可以临时多建 1 个新 Pod |
2. rollback
kubectl rollout undo deployment/grade-submission-api -n grade-submission
2.4 Liveness and Readiness probe
-
可以根据自定义的方式进行self-healing
-
Kubernetes 中的 livenessProbe 正是用来定期检查你的 .NET Web API 是否还“活着”的(即:是否还健康、还在响应请求),通常会配置去访问你服务的 健康检查接口(Health Check Endpoint)
2.5 Storage orchestration
- 对MongoDB进行持久化,这里只是用一个replicates,如果直接使用多副本,需要解决数据库主从一致问题
mongodb-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongodb
namespace: grade-submission
spec:
selector:
matchLabels:
app.kubernetes.io/instance: mongodb
serviceName: mongodb ## mongodb-0 mongodb-1
replicas: 1
template:
metadata:
labels:
app.kubernetes.io/name: grade-submission
app.kubernetes.io/component: database
app.kubernetes.io/instance: mongodb
spec:
containers:
- name: mongodb
image: mongo:4.4
env:
- name: MONGO_INITDB_ROOT_USERNAME
value: "admin"
- name: MONGO_INITDB_ROOT_PASSWORD
value: "password123"
ports:
- containerPort: 27017
volumeMounts:
- name: mongodb-persistent-storage
mountPath: /data/db
volumeClaimTemplates:
- metadata:
name: mongodb-persistent-storage
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
mongodb-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mongodb
namespace: grade-submission
spec:
selector:
app.kubernetes.io/instance: mongodb
ports:
- port: 27017
targetPort: 27017
2.6 Secret and ConfigMap
Secret
实际上使用azure key-value 进行管理
2.6 Horizontal Pod Autoscalar
- 自动水平扩容
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: grade-submission-portal-hpa
namespace: grade-submission
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment # 指定要扩缩容的目标对象
name: grade-submission-portal # 目标对象的名称
minReplicas: 1 # 最小副本数
maxReplicas: 10 # 最大副本数
metrics:
- type: Resource
resource:
name: cpu # 指标类型为资源
target:
type: Utilization
averageUtilization: 50 # 如果使用率 > 50%,开始扩容。
2.7 Helm
1. 使用helm打包
- 将之前写死的,重复的配置替换为模板
- 创建
Chart.yaml
用于helm包的信息管理
apiVersion: v2
name: grade-submission-api
description: A Helm chart for deploying the Grade Submission API, a backend service for managing grade data.
version: 1.0.1
- 控制台进行预编译
helm template .
4. 对templates的所有k8s进行打包
helm package .
- 使用helm 部署
helm install grade-submission-api grade-submission-api-1.0.1.tgz
- 查看Node
kubectl get pods -n grade-submission
2. 更新helm包
- 修改之前使用账号密码登录mongoDB的方式
- 更新之前的内容,进入到发生更改的文件夹
grade-submission-api
heml upagrad grade-submission-api . -n grade-submission
3. Helm Package Manager
- 添加 Helm Repository
helm repo add bitnami https://charts.bitnami.com/bitnami
- 查找MongoDB
helm search repo bitnami/mongodb --versions
- 获取bitnami的默认
values
helm show values bitnami/mongodb >default_values.yaml
- 安装bitnami里我们需要的mongoDB的版本
helm install mongodb bitnami/mongodb --version 15.6.4
- 编辑
value.yaml
useStatefulSet: true
auth:
enabled: false
image:
registry: docker.io
repository: mongo
tag: 6.0.4-jammy
persistence:
mountPath: /data/db