Kubernetes初探[1]:部署你的第一个ASP.NET Core应用到k8s集群
Kubernetes初探[1]部署你的第一个ASP.NET Core应用到k8s集群引言为什么需要Kubernetes在传统的应用部署中我们通常在单一服务器上运行ASP.NET Core应用使用IIS或Nginx作为反向代理。但随着微服务架构的流行我们需要管理多个容器化应用手动部署变得低效且容易出错。Kubernetesk8s正是解决这一问题的利器——它是一个自动化容器编排平台能帮助我们管理应用的部署、扩展和运维。本文将带领你从零开始将一个简单的ASP.NET Core Web API部署到本地Kubernetes集群中。我们假设你已经安装了Docker Desktop并启用了Kubernetes功能或者拥有Minikube环境。## 第一步创建最小化的ASP.NET Core应用首先我们创建一个最简单的ASP.NET Core Web API项目。这个应用将返回一个JSON响应用于验证部署是否成功。### 项目准备在终端中执行以下命令bash# 创建新项目dotnet new webapi -n HelloK8s# 进入项目目录cd HelloK8s# 修改默认的WeatherForecast控制器简化输出修改Controllers/WeatherForecastController.cs文件替换为以下内容csharp// Controllers/WeatherForecastController.csusing Microsoft.AspNetCore.Mvc;namespace HelloK8s.Controllers;[ApiController][Route([controller])]public class WeatherForecastController : ControllerBase{ [HttpGet] public IActionResult Get() { // 返回一个简单的JSON对象用于验证服务运行 return Ok(new { message Hello from Kubernetes!, timestamp DateTime.UtcNow }); }}## 第二步Docker化你的ASP.NET Core应用Kubernetes管理的是容器化的应用所以我们需要先将ASP.NET Core应用打包成Docker镜像。### 创建Dockerfile在项目根目录创建Dockerfile文件dockerfile# Dockerfile# 使用.NET 8 SDK作为构建环境FROM mcr.microsoft.com/dotnet/sdk:8.0 AS buildWORKDIR /app# 复制项目文件并恢复依赖COPY *.csproj .RUN dotnet restore# 复制所有源代码并发布COPY . .RUN dotnet publish -c Release -o out# 使用运行时镜像作为最终镜像FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtimeWORKDIR /appCOPY --frombuild /app/out .# 暴露端口5000Kestrel默认端口EXPOSE 5000# 设置启动命令ENTRYPOINT [dotnet, HelloK8s.dll]### 构建并测试镜像bash# 构建Docker镜像docker build -t hello-k8s:latest .# 运行容器测试docker run -d -p 5000:5000 --name hello-test hello-k8s:latest# 访问测试应该看到JSON响应curl http://localhost:5000/weatherforecast# 停止并删除测试容器docker stop hello-test docker rm hello-test## 第三步理解Kubernetes核心概念在部署到Kubernetes之前我们需要了解几个关键概念1.PodKubernetes的最小部署单元包含一个或多个容器。2.Deployment管理Pod的声明式更新确保指定数量的Pod副本运行。3.Service为Pod提供稳定的网络访问入口支持负载均衡。4.YAML清单用于描述Kubernetes资源的配置文件。## 第四步创建Kubernetes部署清单我们将编写两个YAML文件一个用于创建Deployment另一个用于创建Service。### 创建Deployment清单创建deployment.yaml文件yaml# deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: hello-k8s-deployment labels: app: hello-k8sspec: replicas: 2 # 运行两个Pod副本确保高可用 selector: matchLabels: app: hello-k8s template: metadata: labels: app: hello-k8s spec: containers: - name: hello-k8s-container image: hello-k8s:latest imagePullPolicy: IfNotPresent # 优先使用本地镜像 ports: - containerPort: 5000 # 容器内部暴露的端口 resources: requests: memory: 64Mi cpu: 250m limits: memory: 128Mi cpu: 500m### 创建Service清单创建service.yaml文件yaml# service.yamlapiVersion: v1kind: Servicemetadata: name: hello-k8s-servicespec: selector: app: hello-k8s # 匹配Deployment中的标签 ports: - protocol: TCP port: 80 # 外部访问端口 targetPort: 5000 # 转发到Pod的5000端口 type: LoadBalancer # 使用负载均衡器暴露服务## 第五步部署到Kubernetes集群现在我们可以将应用部署到本地Kubernetes集群中。### 加载Docker镜像到集群由于我们使用本地镜像需要确保Kubernetes能访问到它bash# 如果使用Docker Desktop镜像会自动可用# 如果使用minikube则需要执行minikube image load hello-k8s:latest# 验证镜像是否存在minikube image ls | grep hello-k8s### 应用YAML清单bash# 应用Deploymentkubectl apply -f deployment.yaml# 应用Servicekubectl apply -f service.yaml# 查看部署状态kubectl get podskubectl get deploymentskubectl get services### 访问应用bash# 获取服务的外部IP对于Docker Desktop通常是localhostkubectl get service hello-k8s-service# 访问应用假设外部IP为localhostcurl http://localhost/weatherforecast# 应该看到类似输出# {message:Hello from Kubernetes!,timestamp:2024-01-15T10:30:00Z}## 第六步扩展和管理应用Kubernetes的优势在于可以轻松扩展和管理应用。让我们尝试一些基本操作### 扩展Pod数量bash# 将副本数扩展到5个kubectl scale deployment hello-k8s-deployment --replicas5# 验证Pod数量kubectl get pods# 查看滚动更新过程kubectl rollout status deployment hello-k8s-deployment### 更新镜像版本bash# 假设我们构建了新版本镜像docker build -t hello-k8s:v2 .# 更新Deployment使用新镜像kubectl set image deployment/hello-k8s-deployment hello-k8s-containerhello-k8s:v2# 查看更新历史kubectl rollout history deployment/hello-k8s-deployment### 清理资源bash# 删除所有创建的资源kubectl delete -f deployment.yamlkubectl delete -f service.yaml# 或者使用标签删除kubectl delete deployment,service -l apphello-k8s## 常见问题与调试技巧### 查看Pod日志bash# 获取Pod名称kubectl get pods# 查看日志kubectl logs pod-name# 实时查看日志kubectl logs -f pod-name### 进入Pod内部bash# 进入Pod的shellkubectl exec -it pod-name -- /bin/bash# 测试内部网络连接curl localhost:5000/weatherforecast### 检查Pod状态bash# 查看详细描述kubectl describe pod pod-name# 查看事件kubectl get events --sort-by.lastTimestamp## 总结通过本文的实践我们完成了一个完整的ASP.NET Core应用部署到Kubernetes集群的流程。我们从创建最小化的Web API应用开始将其容器化然后编写Kubernetes部署清单Deployment和Service最后成功部署并访问了应用。关键收获包括-容器化使用Docker打包应用是Kubernetes部署的基础。-声明式配置通过YAML清单描述应用状态Kubernetes负责维护期望状态。-服务抽象Service为Pod提供稳定的网络入口支持负载均衡。-弹性扩展通过简单的命令即可调整副本数量实现水平扩展。这是Kubernetes入门的起点后续可以探索更高级的功能如ConfigMap配置管理、Ingress路由、持久化存储、自动伸缩等。掌握这些基础概念后你将能够构建更复杂的微服务架构并享受Kubernetes带来的自动化运维优势。

相关新闻

基于bq51003的无线充电接收端设计:从Qi标准到PCB布局实战

基于bq51003的无线充电接收端设计:从Qi标准到PCB布局实战

1. 项目概述:从Qi标准到bq51003芯片选型无线充电这玩意儿,现在几乎成了手机和智能手表的标配,但真到自己动手设计一个接收端,才发现里面门道不少。我最早接触无线充电设计,是为了给一个定制化的智能穿戴设备供电&#…

2026/10/28 6:35:51 阅读更多 →
对抗EDR的利器:Inline-Execute-PE在进程注入场景下的高级应用

对抗EDR的利器:Inline-Execute-PE在进程注入场景下的高级应用

对抗EDR的利器:Inline-Execute-PE在进程注入场景下的高级应用 【免费下载链接】Inline-Execute-PE Execute unmanaged Windows executables in CobaltStrike Beacons 项目地址: https://gitcode.com/gh_mirrors/in/Inline-Execute-PE Inline-Execute-PE是Co…

2026/10/25 18:28:05 阅读更多 →
Hooper API完全手册:掌握所有自定义选项与事件处理

Hooper API完全手册:掌握所有自定义选项与事件处理

Hooper API完全手册:掌握所有自定义选项与事件处理 【免费下载链接】hooper 🎠 A customizable accessible carousel slider optimized for Vue 项目地址: https://gitcode.com/gh_mirrors/ho/hooper Hooper 是一个为 Vue 优化的可定制无障碍轮播…

2026/10/24 22:53:09 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/27 17:33:32 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/27 7:21:53 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/27 18:20:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 13:55:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 7:21:50 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 19:19:37 阅读更多 →