当前位置: 首页 > news >正文

.NET Core + Kubernetes:快速体验

Kubernetes[1] 是目前非常主流的容器编排工具,在应用创建、应用部署、应用扩容、应用更新等方面都非常的方便,而且在应用故障时,也可以快速自愈。所以基于微服务架构下的产品,了解 Kubernetes 的使用是非常必要的,我猜测很多人都曾经多次打算自己搭建 Kubernetes 环境,部署个服务试试效果,但却因为很多原因一次次从入门到放弃,这里应该有部分原因是因  Kubernetes 的入门成本相对较高,概念较多,搭建略复杂,所以往往一开始就死在了环境搭建上,导致很多预定的目标都没能实现。

关于 Kubernetes 概念上的内容这里不再赘述,但概念的部分又是在使用中必须优先掌握的知识,所以建议先通过查看资料对整体架构和使用方式有一定了解后再动手实际操作。

集群搭建

这里将搭建 Kubernetes 集群环境来进行测试,3 台 Linux 服务器(1个Master,2个Node)。网上有很多 Kubernetes 集群搭建的文章,找了很多最终发现还是李振良的基于 kubeadm 30分钟部署一个Kubernetes集群[2] 视频教程对初学者来说较为靠谱,虽然有些操作命令在实际生产环境需要调整,但作为学习来说问题不大,更多细节的优化还是交给更专业的运维人员吧。

为了省去操作系统的安装我直接在腾讯云购买了 3台 2C4G 的机器,选择按量计费模式大半天也就几块钱(不是广告,只是人懒)。基于云服务器搭建需提前在控制台的安全组设置好以下几点:

  1. 3台服务器内网互通;

  2. 允许服务器访问外网,需要下载相关依赖内容;

  3. 允许客户端机器通过服务器外网IP访问;

具体安装操作步骤完全参考视频教程即可,但我能肯定有些人还是可能会出各种奇葩问题,只能祝你好运了,以下几点这里备注一下:

  • kubeadm init 和 pod 网络插件只需要在 Master 节点操作;

  • kubeadm init 中的 --apiserver-advertise-address 设置为内网地址;

  • 通过 hostname k8s-master 可修改 hostname 名称;

最终通过命令 kubectl get nodes 查看集群中各节点是否已全部 Ready。

构建 .NET Core 服务镜像

接下来将直接在 Windows  环境(镜像构建基于 Windows 还是 Linux 理论上是没有区别的)下构建 .NET Core 服务的 Docker 镜像,所以首先需要安装 Docker for Windows[3],安装成功后启动 Docker。

创建一个 API 类型 ASP.NET Core  Web 应用程序,启用 Docker 支持,会在项目下自动生成 Dockerfile 文件,命令主要涉及 dotnet restoredotnet publish

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["K8SDemo/K8SDemo.csproj", "K8SDemo/"]
RUN dotnet restore "K8SDemo/K8SDemo.csproj"
COPY . .
WORKDIR "/src/K8SDemo"
RUN dotnet build "K8SDemo.csproj" -c Release -o /app/buildFROM build AS publish
RUN dotnet publish "K8SDemo.csproj" -c Release -o /app/publishFROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "K8SDemo.dll"]

在 Dockerfile 文件右键菜单点击生成 Docker 镜像,这与直接在 sln 解决方案文件所在的目录下执行 docker build -f .\K8SDemo\Dockerfile . 本质是一样的,只是 VS 已内置好了,执行成功后在 cmd 窗口中通过 docker images 查看当前存在的 Docker 镜像。

为了能在 Kubernetes 集群中能获取到这个镜像,现将 k8sdemo 镜像推送到个人 docker hub 公开仓库(实际开发中应该是公司的私有镜像仓库)。

  1. 如果还没有 docker hub 账号,需要先 注册[4]

  2. cmd 窗口通过命令 docker login -u 用户名 -p 密码 登录;

  3. 设置 Tag docker tag k8sdemo:latest 用户名/k8sdemo:1.0.0,因为推送目标只能是当前用户下;

  4. 推送到 docker hub 仓库 docker push 用户名/k8sdemo:1.0.0

部署

以下操作在 Master 节点进行

  1. 创建服务配置文件 k8sdemo.yaml,配置暂且不详细介绍,后续再针对性说明,先简单理解为通过镜像 beckjin/k8sdemo:1.0.0 创建了服务,并将容器内 80 端口映射到服务器某个端口上(NodePort 方式映射的端口会在 30000~32767 范围内随机一个):

    apiVersion: apps/v1
    kind: Deployment
    metadata:name: k8sdemo
    spec:replicas: 1selector:matchLabels:name: k8sdemotemplate:metadata:labels:name: k8sdemospec:containers:- name: k8sdemoimage: beckjin/k8sdemo:1.0.0ports:- containerPort: 80imagePullPolicy: IfNotPresent
    ---
    kind: Service
    apiVersion: v1
    metadata:name: k8sdemo
    spec:type: NodePortports:- port: 80targetPort: 80selector:name: k8sdemo
    
  2. 通过命令 kubectl apply -f k8sdemo.yaml 创建服务

    配置中指定了当依赖的镜像不存在时会自动拉取,但如果拉取资源的速度较慢,启动完成的时间可能会比较久,可通过命令 kubectl get podskubectl describe pod 名称 查看具体 pod 详细描述。

  3. 通过命令 kubectl get pod,svc 查看服务运行的端口

    接着就可以通过 http://${外网IP}:31741/WeatherForecast 调用 API 接口查看效果。

  4. 如果需要扩容或缩容,调整配置文件中的  replicas 节点值,重新 kubectl apply -f k8sdemo.yaml 即可;

  5. 通过命令 kubectl delete -f k8sdemo.yaml 可删除服务;

总结

其实很长一段时间都在尝试自己把玩一下 Kubernetes,说实话阻力确实不少,特别是看到很多基于二进制文件的搭建介绍,简直了。所以好的指导教程确实可以给我们带来事半功倍的效果,作为入门学习我们并不需要多么强大和安全的测试环境,基本套路都是先玩起来,再深入研究。

参考资料

[1]

Kubernetes: https://kubernetes.io/

[2]

30分钟部署一个Kubernetes集群: https://edu.51cto.com/course/17256.html

[3]

Docker for Windows: https://docs.docker.com/docker-for-windows/

[4]

注册: https://hub.docker.com/signup


http://www.taodudu.cc/news/show-911435.html

相关文章:

  • 3ds Max与Maya不同之处?两者哪个更适合云渲染?
  • 每日两题 / 437. 路径总和 III 105. 从前序与中序遍历序列构造二叉树(LeetCode热题100)
  • VBA在Excel中登录页面的应用—动态密码设置
  • 科技查新中医学科研项目查新点如何确立与提炼?案例讲解
  • mysql NDBcluster数据库集群介绍、部署及配置
  • Java多线程基础
  • 海底捞涨价,有错吗?
  • .NET Core + Kubernetes:Pod
  • .NET项目升级手记:可为空引用
  • .NET与鲲鹏共展翅,昇腾九万里(一)
  • 十问十答 Ms-PL 许可证
  • 从案例角度解析建模平台动态规则引擎
  • 想基于K8s按需扩展应用程序,可从这几方面入手
  • EntityFramework Core 3.x上下文构造函数可以注入实例呢?
  • IO 模型知多少
  • 让 .NET 轻松构建中间件模式代码
  • 从编码层面对比java和c#
  • 红帽借“订阅”模式成开源一哥,首创者升任总裁
  • C#两大知名Redis客户端连接哨兵集群的姿势
  • dotNET Core 3.X 请求处理管道和中间件的理解
  • 了解.NET中的垃圾回收
  • 数字化演化历史
  • 如何查找,修复和避免C#.NET中内存泄漏的8个最佳实践
  • ASP.NET Core技术研究-探秘依赖注入框架
  • 从项目到产品: 软件时代需要价值流架构师 | IDCF
  • 推荐一个集录屏、截图、音频于一体的软件给大家
  • WebAssembly增加Go语言绑定
  • .NET中的内存管理
  • .Net微服务实战之技术架构分层篇
  • .NET 下基于动态代理的 AOP 框架实现揭秘
  • Blazor WebAssembly 3.2.0 Preview 4 如期发布
  • C#/.Net Core/WPF框架初建(国际化、主题色)
  • ASP.NET Core 日志框架:Serilog
  • 树莓派销量突然猛增
  • C#黔驴技巧之实现统计结果排名
  • Istio Pilot架构解析