.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.mzph.cn/news/310581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis流量控制策略

Reids 简单流控 流控是分布式领域一个被经常用到的一个计数,当系统承载能力有限的时候,如何组织计划外的请求继续对系统施加压力,这是一个需要解决的问题,在系统承载达到峰值的时候,我们需要弃车保帅,保证…

[剑指offer]面试题9:斐波那契数列

面试题9:斐波那契数列 题目一:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。斐波那契数列的定义如下: ❖ 效率很低的解法,挑剔的面试官不会喜欢 代码如下: long long fib(…

海底捞涨价,有错吗?

此前,有媒体报道,海底捞某些门店的菜品除了少部分维持原价,大部分都涨价了。随后,广大网民纷纷对此发表了看法。有人表示理解,理由是餐饮业在疫情期间损失巨大,此前也有一些餐饮业老板表达了资金链断裂的担…

Redis分布式锁奥义

分布式锁 分布式系统进行逻辑处理的时候,经常会遇到并发问题,例如直播场景中,用户需要连麦主播,当多个用户在同一个时刻一起连麦时候,应该保证只有一个用户能连麦成功,我们改怎么保证这种业务场景下保证数…

.NET Core + Kubernetes:Pod

在 .NET Core Kubernetes:快速体验 文章中,已经实现将一个 .NET Core API 服务部署在 Kubernetes 集群中,接下来将逐步了解 Kubernetes 中各核心模块。首先当然是 Pod,我相信 Pod 是在接触 Kubernetes 时听到较多的一个词语&…

[剑指offer]面试题10:二进制中1的个数

面试题10:二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。 ❖ 可能引起死循环的解法 代码如下: …

LBS解决方案

LBS解决方案 LBS(基于地理位置的服务)服务是现在移动互联网中比较常用的功能,例如外卖中我附近的店铺,通常是以客户位置坐标为中心,查询一定范围内的店铺信息,按照距离由近及原进行倒叙排序 方案一&#…

[剑指offer]面试题13:在O(1)时间删除链表结点

面试题13:在O(1)时间删除链表结点 题目:给定单向链表的头指针和一个结点指针,定义一个函数在 O(1)时间删除该结点。链表结点与函数的定义如下: struct ListNode {int value;ListNod…

长沙IT技术圈百万年薪大佬?是否存在?

作者:邹溪源,长沙资深互联网从业者,架构师社区特邀嘉宾!01引子不知不觉,IT技术圈开始流传起“百万年薪”的故事,有人问我,长沙有百万大佬么?其实我也不知道。02背景长沙自古以来就是…

网络编程-网络分层的意义

网络 我们生活在一个网络无处不在的一个虚拟世界中,网络中的每一个设备都是一个节点。大多是我们的计算机,但是他还可以连接其他设备,例如打印机,路由器,网关,你的手机,智能家居等。我们可以使…

网络编程-TCP/IP协议栈-IP协议

协议 协议就是约定的一种规则&#xff0c;例如扑克游戏中约定好的各种规则&#xff0c;2<3<4<5<…等&#xff0c;以此作为游戏规则。当所有人都遵循这个规则&#xff0c;那么久可以不需要任何多余的交流就可以进行游戏&#xff0c;这个方式形成的约定就是一种协议…

.NET项目升级手记:可为空引用

c# 8引入了新特性&#xff1a;“可为空引用”&#xff08;详情&#xff09;&#xff0c;这个功能个人觉得挺好的&#xff0c;能够非常明确的表现程序设计者的意图&#xff0c;编译器能够进行检查&#xff0c;尽最大可能减小NullReferenceException错误。如果是新项目&#xff0…

[剑指offer]面试题15:链表中倒数第k个结点

面试题15&#xff1a;链表中倒数第k个结点 题目&#xff1a;输入一个链表&#xff0c;输出该链表中倒数第 k 个结点。为了符合大多数人的习惯&#xff0c;本题从1 开始计数&#xff0c;即链表的尾结点是倒数第1 个结点。例如一个链表有6个结点&#xff0c;从头结点开始它们的值…

.NET与鲲鹏共展翅,昇腾九万里(一)

2019年1月7日&#xff0c;华为推出鲲鹏920处理器&#xff0c;便宣告了构建鲲鹏生态系统的开始。据官方介绍&#xff0c;鲲鹏是一个包含了鲲鹏计算单元、AI处理单元、智能管理、智能网卡的片上系统SoC&#xff0c;在此之上加上服务器操作系统&#xff0c;从而形成一个生态的闭环…

#define与const的区别

一:区别 &#xff08;1&#xff09;就起作用的阶段而言&#xff1a; #define是在编译的预处理阶段起作用&#xff0c;而const是在 编译、运行的时候起作用。 &#xff08;2&#xff09;就起作用的方式而言&#xff1a; #define只是简单的字符串替换&#xff0c;没有类型检查。…

网络编程-TCP/IP协议栈-TCP协议

TCP协议 TCP协议作用 TCP协议位于协议栈的传输层。当应用层向TCP层发送用于网间传输的&#xff0c;用8字节表示的数据流&#xff0c;TCP则吧数据流分割成适当长度的报文段&#xff0c;最大传输段大小&#xff08;MSS&#xff09;通常受到改计算机连接的网络数据链路层的最大传…

互联网10年,激战如梦

— 1 —1969年&#xff0c;美国国防部研究计划署第一次将互联网应用于军事连接。随后美国西南部四所名校的四台计算机通过这项技术连接起来。谁也没想到&#xff0c;这项计划会对人类的命运产生如此重大影响。1993年&#xff0c;互联网真正诞生。美国白宫宣布开始提供「在线服务…

[剑指offer]面试题16:反转链表

面试题16&#xff1a;反转链表 题目&#xff1a;定义一个函数&#xff0c;输入一个链表的头结点&#xff0c;反转该链表并输出反转后链表的头结点。链表结点定义如下&#xff1a; struct ListNode {int value;ListNode *next; };代码如下: ListNode *ReverseList(ListNode *p…

网络编程-TCP/IP协议栈-UDP/HTTP协议

UDP协议 UDP协议全称是用户数据报协议&#xff0c;在网络中她与TCP协议一样用于处理数据包&#xff0c;两个协议同处于协议栈的传输层&#xff0c;和TCP不同的是&#xff0c;UDP是一种无连接的协议栈。 因为UDP是无连接的&#xff0c;所以相对来说&#xff0c;UDP的报头比TCP要…

十问十答 Ms-PL 许可证

Microsoft 公共许可证&#xff08;The Microsoft Public License&#xff09;是微软为释出开源项目而编写和发布的自由开源软件许可证。如果你用 .NET 开发&#xff0c;你会经常碰见 Ms-PL。在微软的自由开源项目托管地 Codeplex&#xff08;已寿终正寝&#xff0c;微软已战略转…