VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > c#编程 >
  • 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和内存使用率;
基础知识拓展

  1. Kubernetes核心组件
    控制面组件(Master节点):
    oAPI Server:集群管理的REST接口,所有资源操作的入口;
    oetcd:分布式键值存储,保存集群的所有配置数据;
    oController Manager:负责维护集群的状态,如故障检测、自动扩展;
    oScheduler:负责Pod的调度,选择合适的节点运行Pod;
    节点组件(Node节点):
    okubelet:负责维护容器的生命周期,确保容器按照预期运行;
    okube-proxy:负责节点的网络代理,实现Service的负载均衡;
    oContainer Runtime:容器运行时,如Docker、containerd;
  2. Kubernetes资源对象
资源类型 用途
Pod 最小的部署单元,包含一个或多个容器
Deployment 管理Pod的副本数和更新策略,实现无状态应用部署
StatefulSet 管理有状态应用,如数据库,保证Pod的顺序和唯一性
DaemonSet 在每个节点上运行一个Pod副本,如日志收集、监控代理
Service 为Pod提供稳定的网络访问入口和负载均衡
ConfigMap 管理应用配置,实现配置与镜像分离
Secret 管理敏感信息,如密码、密钥
PersistentVolume 持久化存储,为Pod提供持久化数据存储
  1. 容器网络模型
    Pod网络:每个Pod有独立的IP地址,Pod内的容器共享网络命名空间;
    Service网络:Service提供虚拟IP地址,通过负载均衡将请求分发到Pod;
    集群网络:所有Pod和Service在同一个网络平面,可直接通信;
  2. 滚动更新策略
    RollingUpdate:逐步替换旧Pod,默认策略,支持配置maxSurge(最多超出的副本数)和maxUnavailable(最多不可用的副本数);
    Recreate:先停止所有旧Pod,再启动新Pod,适合无状态应用的快速更新;
  3. 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


相关教程