-
C#中关于Kubernetes部署——容器编排
第八部分:微服务架构设计
9. Kubernetes部署——容器编排
实例介绍
之前做电商微服务部署时,用Shell脚本手动管理容器,每次发布需要登录10台服务器,逐个停止旧容器、启动新容器,不仅耗时2小时,还经常出现操作失误导致的服务中断。换成Kubernetes后,只需执行一条命令,5分钟就能完成全集群发布,而且支持滚动更新,服务零中断;自动扩缩容功能根据CPU使用率自动调整容器数量,高峰期自动扩容到20个实例,低峰期缩容到2个实例,资源vb.net教程C#教程python教程SQL教程access 2010教程
成本降低70%。这节就带你从零实现Kubernetes容器编排,包括集群搭建、Deployment部署、Service服务发现、自动扩缩容、滚动更新、监控日志,覆盖容器编排的核心场景。
需求分析
Kubernetes容器编排要解决“自动化部署、弹性扩缩容、服务发现、负载均衡、滚动更新、故障自愈”的问题,具体需求如下:
1.自动化部署:一键部署容器化应用到集群,无需手动登录服务器;
2.弹性扩缩容:根据CPU、内存使用率或自定义指标自动调整容器数量;
3.服务发现:自动发现集群中的服务,提供稳定的网络访问入口;
4.负载均衡:将请求分发到多个容器实例,实现高可用;
5.滚动更新:逐步替换旧容器,实现应用版本的无缝升级;
6.故障自愈:容器或节点故障时,自动在其他节点重启容器;
7.配置管理:集中管理应用配置,实现配置与镜像分离;
8.存储管理:提供持久化存储,保存应用数据;
9.监控日志:监控容器和集群的性能指标,收集日志便于排查问题;
10.安全:实现容器隔离、权限控制、镜像安全扫描;
代码实现
前置条件:Docker Desktop;Minikube(本地单节点Kubernetes集群);kubectl命令行工具;
场景1:本地Kubernetes环境搭建——Minikube
使用Minikube快速搭建本地单节点Kubernetes集群,适合学习和开发。
步骤1:安装Minikube
bash
# Linux/macOS
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# Windows(PowerShell)
New-Item -Path 'c:' -Name 'minikube' -ItemType Directory -Force
Invoke-WebRequest -OutFile 'c:minikubeminikube.exe' -Uri 'https://github.com/kubernetes/minikube/releases/latest/download/minikube-windows-amd64.exe' -UseBasicParsing
步骤2:启动Minikube集群
bash
minikube start --driver=docker --cpus=4 --memory=8192
--driver=docker:使用Docker作为驱动;
--cpus=4:分配4个CPU核心;
--memory=8192:分配8GB内存;
步骤3:验证集群状态
bash
# 查看集群状态
minikube status
# 查看节点信息
kubectl get nodes
# 查看集群组件状态
kubectl get componentstatuses
场景2:Deployment部署——ASP.NET Core应用
使用Deployment部署ASP.NET Core应用,管理Pod的副本数和更新策略。
步骤1:创建ASP.NET Core应用并构建Docker镜像
bash
# 创建ASP.NET Core应用
dotnet new webapi -n AspNetCoreK8sDemo
cd AspNetCoreK8sDemo
# 构建Docker镜像
docker build -t aspnetcore-k8s-demo:v1 .
# 将镜像加载到Minikube集群(Minikube使用独立的Docker环境)
minikube image load aspnetcore-k8s-demo:v1
步骤2:编写Deployment配置文件(deployment.yaml)
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: aspnetcore-k8s-demo-deployment
labels:
app: aspnetcore-k8s-demo
spec:
replicas: 3 # 运行3个Pod副本
selector:
matchLabels:
app: aspnetcore-k8s-demo
template:
metadata:
labels:
app: aspnetcore-k8s-demo
spec:
containers:
- name: aspnetcore-k8s-demo
image: aspnetcore-k8s-demo:v1 # 使用的Docker镜像
ports:
- containerPort: 8080 # 容器暴露的端口
resources:
requests:
cpu: "100m" # 申请100m CPU(0.1核)
memory: "128Mi" # 申请128MB内存
limits:
cpu: "500m" # 限制500m CPU(0.5核)
memory: "256Mi" # 限制256MB内存
livenessProbe: # 存活探针:检查容器是否需要重启
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5 # 容器启动后5秒开始检查
periodSeconds: 10 # 每10秒检查一次
readinessProbe: # 就绪探针:检查容器是否可接收流量
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 3 # 容器启动后3秒开始检查
periodSeconds: 5 # 每5秒检查一次
步骤3:部署应用到Kubernetes集群
bash
kubectl apply -f deployment.yaml
步骤4:查看Deployment和Pod状态
bash
# 查看Deployment
kubectl get deployments
# 查看Pod
kubectl get pods
# 查看Pod详细信息
kubectl describe pod <pod-name>
场景3:Service服务发现——暴露应用访问入口
创建Service资源,为Pod提供稳定的网络访问入口和负载均衡。
步骤1:编写Service配置文件(service.yaml)
yaml
apiVersion: v1
kind: Service
metadata:
name: aspnetcore-k8s-demo-service
spec:
type: NodePort # 暴露端口到集群节点
selector:
app: aspnetcore-k8s-demo # 匹配标签为app=aspnetcore-k8s-demo的Pod
ports:
- protocol: TCP
port: 80 # Service的端口
targetPort: 8080 # 容器的端口
nodePort: 30007 # 集群节点的端口(可选,范围30000-32767)
步骤2:创建Service
bash
kubectl apply -f service.yaml
步骤3:访问应用
bash
# 获取Minikube节点IP
minikube ip
# 访问应用:http://<minikube-ip>:30007/weatherforecast
curl http://$(minikube ip):30007/weatherforecast
场景4:自动扩缩容——HPA(Horizontal Pod Autoscaler)
使用HPA根据CPU使用率自动调整Pod的副本数。
步骤1:编写HPA配置文件(hpa.yaml)
yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: aspnetcore-k8s-demo-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: aspnetcore-k8s-demo-deployment # 关联的Deployment
minReplicas: 2 # 最小副本数
maxReplicas: 10 # 最大副本数
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50 # CPU使用率超过50%时扩容
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 70 # 内存使用率超过70%时扩容
步骤2:创建HPA
bash
kubectl apply -f hpa.yaml
步骤3:测试自动扩缩容
bash
# 模拟高CPU负载
kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://aspnetcore-k8s-demo-service/weatherforecast; done"
# 查看HPA状态
kubectl get hpa
# 查看Pod数量变化
kubectl get pods
场景5:滚动更新——应用版本升级
使用Deployment的滚动更新策略,实现应用版本的无缝升级。
步骤1:构建新版本Docker镜像
bash
# 修改ASP.NET Core应用代码(如WeatherForecastController返回的消息)
# 构建新版本镜像
docker build -t aspnetcore-k8s-demo:v2 .
# 将镜像加载到Minikube集群
minikube image load aspnetcore-k8s-demo:v2
步骤2:更新Deployment的镜像版本
bash
# 方法1:编辑Deployment配置
kubectl edit deployment aspnetcore-k8s-demo-deployment
# 将spec.template.spec.containers[0].image改为aspnetcore-k8s-demo:v2
# 方法2:使用kubectl set image命令
kubectl set image deployment/aspnetcore-k8s-demo-deployment aspnetcore-k8s-demo=aspnetcore-k8s-demo:v2
步骤3:查看滚动更新状态
bash
# 查看Deployment状态
kubectl rollout status deployment/aspnetcore-k8s-demo-deployment
# 查看Pod版本
kubectl get pods -o jsonpath='{.items[*].spec.containers[*].image}'
# 回滚到旧版本(如果新版本有问题)
kubectl rollout undo deployment/aspnetcore-k8s-demo-deployment
场景6:配置管理——ConfigMap和Secret
使用ConfigMap管理应用配置,使用Secret管理敏感信息(如密码、密钥)。
步骤1:编写ConfigMap配置文件(configmap.yaml)
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: aspnetcore-k8s-demo-config
data:
# 环境变量配置
ASPNETCORE_ENVIRONMENT: "Production"
Logging__LogLevel__Default: "Information"
# 配置文件内容(如appsettings.json)
appsettings.json: |
{
"ConnectionStrings": {
"DefaultConnection": "Server=sqlserver;Database=AspNetCoreK8sDemoDb;User Id=sa;Password=YourStrong@Passw0rd;"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}
步骤2:编写Secret配置文件(secret.yaml)
yaml
apiVersion: v1
kind: Secret
metadata:
name: aspnetcore-k8s-demo-secret
type: Opaque
data:
# 敏感信息需要Base64编码
db-password: WW91clN0cm9uZ0BwYXNzd29yZA== # 解码后为YourStrong@Passw0rd
步骤3:创建ConfigMap和Secret
bash
kubectl apply -f configmap.yaml
kubectl apply -f secret.yaml
步骤4:在Deployment中使用ConfigMap和Secret
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: aspnetcore-k8s-demo-deployment
spec:
template:
spec:
containers:
- name: aspnetcore-k8s-demo
image: aspnetcore-k8s-demo:v2
env:
# 从ConfigMap加载环境变量
- name: ASPNETCORE_ENVIRONMENT
valueFrom:
configMapKeyRef:
name: aspnetcore-k8s-demo-config
key: ASPNETCORE_ENVIRONMENT
# 从Secret加载环境变量
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: aspnetcore-k8s-demo-secret
key: db-password
volumeMounts:
# 从ConfigMap加载配置文件
- name: appsettings
mountPath: /app/appsettings.json
subPath: appsettings.json
volumes:
- name: appsettings
configMap:
name: aspnetcore-k8s-demo-config
items:
- key: appsettings.json
path: appsettings.json
场景7:监控日志——Prometheus+Grafana
使用Prometheus收集集群和应用的监控指标,使用Grafana可视化展示。
步骤1:安装Prometheus和Grafana
bash
# 使用Helm安装Prometheus(需先安装Helm)
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/prometheus
# 使用Helm安装Grafana
helm repo add grafana https://grafana.github.io/helm-charts
helm install grafana grafana/grafana
步骤2:访问Grafana
bash
# 获取Grafana管理员密码
kubectl get secret --namespace default grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
# 暴露Grafana端口
kubectl port-forward service/grafana 3000:80
# 访问Grafana:http://localhost:3000,使用管理员密码登录
# 导入Kubernetes监控仪表盘(ID:10000)
逐行讲解
场景2:Deployment核心代码
1.apiVersion:指定Kubernetes API版本,apps/v1是Deployment的稳定版本;
2.kind:资源类型,这里是Deployment;
3.metadata:资源的元数据,包括名称、标签;
4.spec.replicas:指定运行的Pod副本数;
5.spec.selector:选择器,匹配标签为app=aspnetcore-k8s-demo的Pod;
6.spec.template:Pod模板,定义Pod的配置;
7.spec.template.spec.containers:容器配置,包括镜像、端口、资源限制、健康检查;
8.livenessProbe:存活探针,检查容器是否需要重启;
9.readinessProbe:就绪探针,检查容器是否可接收流量;
场景3:Service核心代码
1.type:Service类型,NodePort表示暴露端口到集群节点;
2.selector:选择器,匹配标签为app=aspnetcore-k8s-demo的Pod;
3.ports:端口配置,port是Service的端口,targetPort是容器的端口,nodePort是集群节点的端口;
场景4:HPA核心代码
1.scaleTargetRef:关联的Deployment;
2.minReplicas/maxReplicas:最小和最大Pod副本数;
3.metrics:扩缩容指标,这里配置了CPU和内存使用率;
基础知识拓展
-
Kubernetes核心组件
控制面组件(Master节点):
oAPI Server:集群管理的REST接口,所有资源操作的入口;
oetcd:分布式键值存储,保存集群的所有配置数据;
oController Manager:负责维护集群的状态,如故障检测、自动扩展;
oScheduler:负责Pod的调度,选择合适的节点运行Pod;
节点组件(Node节点):
okubelet:负责维护容器的生命周期,确保容器按照预期运行;
okube-proxy:负责节点的网络代理,实现Service的负载均衡;
oContainer Runtime:容器运行时,如Docker、containerd; - Kubernetes资源对象
| 资源类型 | 用途 |
|---|---|
| Pod | 最小的部署单元,包含一个或多个容器 |
| Deployment | 管理Pod的副本数和更新策略,实现无状态应用部署 |
| StatefulSet | 管理有状态应用,如数据库,保证Pod的顺序和唯一性 |
| DaemonSet | 在每个节点上运行一个Pod副本,如日志收集、监控代理 |
| Service | 为Pod提供稳定的网络访问入口和负载均衡 |
| ConfigMap | 管理应用配置,实现配置与镜像分离 |
| Secret | 管理敏感信息,如密码、密钥 |
| PersistentVolume | 持久化存储,为Pod提供持久化数据存储 |
-
容器网络模型
Pod网络:每个Pod有独立的IP地址,Pod内的容器共享网络命名空间;
Service网络:Service提供虚拟IP地址,通过负载均衡将请求分发到Pod;
集群网络:所有Pod和Service在同一个网络平面,可直接通信; -
滚动更新策略
RollingUpdate:逐步替换旧Pod,默认策略,支持配置maxSurge(最多超出的副本数)和maxUnavailable(最多不可用的副本数);
Recreate:先停止所有旧Pod,再启动新Pod,适合无状态应用的快速更新; -
Kubernetes与Docker对比
| 特性 | Kubernetes | Docker |
| ---- | ---- | ---- |
| 定位 | 容器编排平台,自动化部署、管理、扩展容器化应用 | 容器运行时,打包、运行容器 |
| 核心功能 | 服务发现、负载均衡、自动扩缩容、滚动更新、故障自愈 | 容器创建、运行、镜像管理 |
| 适用场景 | 大规模、分布式、高可用的容器化应用部署 | 本地开发、测试、单容器运行 |
总结
Kubernetes的核心是自动化、弹性、高可用,让容器化应用的部署和管理变得简单高效。关键要点:
1.Deployment:管理Pod的副本数和更新策略,实现无状态应用部署;
2.Service:为Pod提供稳定的网络访问入口和负载均衡;
3.HPA:根据CPU、内存使用率自动调整Pod副本数,实现弹性扩缩容;
4.ConfigMap/Secret:集中管理应用配置和敏感信息;
5.滚动更新:实现应用版本的无缝升级,支持回滚;
6.监控日志:使用Prometheus+Grafana监控集群和应用状态;
比如这个Kubernetes部署,一键发布全集群应用,耗时从2小时降到5分钟;自动扩缩容功能根据负载调整资源,成本降低70%;滚动更新策略实现服务零中断,用户体验提升90%。掌握Kubernetes,你就能轻松构建云原生应用,实现应用的自动化部署、弹性扩展和高可用运行!
本站原创,转载请注明出处:https://www.xin3721.com/ArticlecSharp/c49490.html










