前言:

 之前文章 对Kubernetes 的一些基础概念及在windows下的环境搭建,接下来把.Net Core 运行到Kubernetes 中,在实际的操作中,对Kubernetes 的进一步学习了解。

一、程序准备

 1、创建.net core 项目,修改Index页面显示当前ip和机器名:

public class IndexModel : PageModel
{
public string HostName { get; set; } public string HostIP { get; set; }
/// <summary>
/// 获取机器名和IP地址
/// </summary>
public void OnGet()
{
HostName = Dns.GetHostName();
HostIP = Dns.GetHostEntry(HostName).AddressList.FirstOrDefault(x => x.AddressFamily == AddressFamily.InterNetwork).ToString();
}
}

 2、运行效果如下:

 3、创建创建镜像并推送到docker hub中:

  

  接下来,就开始将该镜像部署到k8s中

二、部署到Kubernetes

 1、在部署前先介绍个重要概念:Pod

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。

Pod 是一组(一个或多个)容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。 Pod 所建模的是特定于应用的“逻辑主机”,其中包含一个或多个应用容器, 这些容器是相对紧密的耦合在一起的。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于 在同一逻辑主机上运行的云应用。

除了应用容器,Pod 还可以包含在 Pod 启动期间运行的 Init 容器。 你也可以在集群中支持临时性容器 的情况下,为调试的目的注入临时性容器。

 

Pod 的共享上下文包括一组 Linux 名字空间、控制组(cgroup)和可能一些其他的隔离 方面,即用来隔离 Docker 容器的技术。 在 Pod 的上下文中,每个独立的应用可能会进一步实施隔离。

就 Docker 概念的术语而言,Pod 类似于共享名字空间和文件系统卷的一组 Docker 容器。

  a)创建Pod,运行镜像:k8sdemoweb Pod定义文件:k8sdeomweb-pod.yaml

apiVersion: v1
kind: Pod # 定义Kubernetes资源的类型为Pod
metadata:
name: k8sdemoweb # 定义资源的名称
labels: # 为Pod贴上标签(用于Services选择)
app: k8sdemoweb
spec: # 定义资源的状态,对于Pod来说,最重要属性就是containers
containers: # containers一个数组类型,如果你希望部署多个容器,可以添加多项
- name: web # 定义本Pod中该容器的名称
image: cwsheng/k8sdemoweb # 定义Pod启动的容器镜像地址
ports:
- containerPort: 80 # 定义容器监听的端口(与Dockerfile中的EXPOSE类似,只是为了提供文档信息)

  b)创建Pod,进入命令行执行:

kubectl create -f k8sdeomweb-pod.yaml

# 输出
# pod/k8sdeomweb created

  c)查看Pod列表:

kubectl get pods

# 输出
# NAME READY STATUS RESTARTS AGE
# k8sdemoweb 1/1 Running 0 40s

  d)本地访问:端口转发(端口转发的方式只能在本机访问,为了从外部访问应用程序,我们需要创建Kubernetes中的另外一种资源:Service。

kubectl port-forward k8sdemoweb 8180:80

# 输出
# Forwarding from 127.0.0.1:8180 -> 80

  

 2、支持外部访问应用,Service 实现

将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。

使用 Kubernetes,你无需修改应用程序即可使用不熟悉的服务发现机制。 Kubernetes 为 Pods 提供自己的 IP 地址,并为一组 Pod 提供相同的 DNS 名, 并且可以在它们之间进行负载均衡。

  a)定义Service:为k8sdemoweb pod创建Service

apiVersion: v1
kind: Service # 定义Kubernetes资源的类型为Service
metadata:
name: k8sdemoweb-service # 定义资源的名称
spec:
selector: # 指定对应的Pod
app: k8sdemoweb # 指定Pod的标签为k8sdemoweb
ports:
- protocol: TCP # 协议类型
port: 80 # 指定Service访问的端口
targetPort: 80 # 指定Service转发请求的端口
nodePort: 31000
type: NodePort # 指定Service的类型,在这里使用NodePort来对外访问

  b)执行命令:

kubectl create -f k8sdemoweb-service.yaml

#输出:
#service/k8sdemoweb-service created

 3、Pod自动创建实现:Deployment

Deployment表示用户对Kubernetes集群的一次更新操作。可以是创建一个新的服务或是更新一个新的服务,也可以是滚动升级一个服务。

Deployment可以帮助每一个应用程序的生命都保持相同的一点:那就是变化。此外,只有挂掉的应用程序才会一尘不变,否则,新的需求会源源不断地涌现,更多代码会被开发出来、打包以及部署,这个过程中的每一步都有可能出错。

Deployment可以自动化应用程序从一版本升迁到另一版本的过程,并保证服务不间断,如果有意外发生,它可以让我们迅速回滚到前一个版本。

  a)创建:Deployment。添加文件:k8sdemoweb-deployment.yaml

apiVersion: apps/v1
kind: Deployment # 定义Kubernetes资源的类型为Deployment
metadata:
name: k8sdemoweb-deployment # 定义资源的名称
labels:
app: k8sdemoweb-deployment
spec: # 定义资源的状态。
replicas: 2 # 定义我们想运行多少个Pod,在这里我们希望运行2个
selector:
matchLabels: # 定义该部署匹配哪些Pod
app: k8sdemoweb
minReadySeconds: 5 # 可选,指定Pod可以变成可用状态的最小秒数,默认是0
strategy: # 指定更新版本时,部署使用的策略
type: RollingUpdate # 策略类型,使用RollingUpdate可以保证部署期间服务不间断
rollingUpdate:
maxUnavailable: 1 # 部署时最大允许停止的Pod数量(与replicas相比)
maxSurge: 1 # 部署时最大允许创建的Pod数量(与replicas相比)
template: # 用来指定Pod的模板,与Pod的定义类似
metadata:
labels: # 根据模板创建的Pod会被贴上该标签,与上面的matchLabels对应
app: k8sdemoweb
spec:
containers:
- name: web
image: cwsheng/k8sdemoweb
imagePullPolicy: Always # 默认是IfNotPresent,如果设置成Always,则每一次部署都会重新拉取容器映像(否则,如果本地存在指定的镜像版本,就不会再去拉取)
ports:
- containerPort: 80

  b)执行命令:

kubectl create -f k8sdemoweb-deployment.yaml

  c)查看Pod列表:

PS F:\coding\project\k8s.demo\k8s> kubectl get pod
NAME READY STATUS RESTARTS AGE
k8sdemoweb 1/1 Running 0 98m
k8sdemoweb-deployment-8678f7975c-cq2cq 1/1 Running 0 34s
k8sdemoweb-deployment-8678f7975c-jwnlf 1/1 Running 0 34s

总结:

 以上简单的使用了k8s中:Pod、Service、Deployment实现了.net core 部署到k8s中。本次使用也是相对简单的,但k8s还有很多有用的功能等着解锁。如:不停机升级部署、服务间调用。

 

入门Kubernetes - .Net Core 运行的更多相关文章

  1. .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

    作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.html 本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新 ...

  2. 基于 Vue.js 之 iView UI 框架非工程化实践记要 使用 Newtonsoft.Json 操作 JSON 字符串 基于.net core实现项目自动编译、并生成nuget包 webpack + vue 在dev和production模式下的小小区别 这样入门asp.net core 之 静态文件 这样入门asp.net core,如何

    基于 Vue.js 之 iView UI 框架非工程化实践记要   像我们平日里做惯了 Java 或者 .NET 这种后端程序员,对于前端的认识还常常停留在 jQuery 时代,包括其插件在需要时就引 ...

  3. [转帖]新手必读,16个概念入门 Kubernetes

    新手必读,16个概念入门 Kubernetes https://www.kubernetes.org.cn/5906.html 2019-09-29 22:13 中文社区 分类:Kubernetes教 ...

  4. net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第二章 入门篇-快速入门ASP.NET Core看这篇就够了

    .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了   原文链接:https://www.cnblogs.com/yilezhu/p/9985451.ht ...

  5. 实例演示:如何在Kubernetes上大规模运行CI/CD

    本周四晚上8:30,第二期k3s在线培训如约开播!本期课程将介绍k3s的核心架构,如高可用架构以及containerd.一起来进阶探索k3s吧! 报名及观看链接:http://z-mz.cn/PmwZ ...

  6. ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)

    ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件) Startup Class 1.Startup Constructor(构造函数) 2.Configure ...

  7. ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行

    ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行 核心框架 ASP.NET Core APP 创建与运行 总结 之前两篇文章简析.NET Core 以及与 .NET Framew ...

  8. ASP.NET Core 运行原理解剖[1]:Hosting

    ASP.NET Core 是新一代的 ASP.NET,第一次出现时代号为 ASP.NET vNext,后来命名为ASP.NET 5,随着它的完善与成熟,最终命名为 ASP.NET Core,表明它不是 ...

  9. ASP.NET Core 运行原理解剖[2]:Hosting补充之配置介绍

    在上一章中,我们介绍了 ASP.NET Core 的启动过程,主要是对 WebHost 源码的探索.而本文则是对上文的一个补充,更加偏向于实战,详细的介绍一下我们在实际开发中需要对 Hosting 做 ...

随机推荐

  1. 关于MDI多文档程序的一些思考

    MDI程序的框架 客户窗口是一个预定义的窗口类(MDICLIENT),它是框架窗口的子窗口同时也是各个子文档窗口的父窗口.框架窗口和各个子文档窗口都是自定义的窗口类. MDI程序中的一些要点 窗口中的 ...

  2. C++ primer plus读书笔记——第17章 输入、输出和文件

    第17章 输入.输出和文件 1. 对键盘进行输入缓冲可以让用户在将输入传输给程序之前返回并更正.C++程序通常在用户按下回车键时刷新输入缓冲区. 2. 一些I/O类 streambuf类为缓冲区提供了 ...

  3. C++ primer plus读书笔记——第1章 预备知识

    第1章 预备知识 1. Ritchie希望有一种语言能将低级语言的效率.硬件访问能力和高级语言的通用性.可移植性融合在一起,于是他在旧语言的基础上开发了C语言. 2. 在C++获得一定程度的成功后,S ...

  4. [BUAA2021软工助教]个人阅读作业#2小结

    作业链接 见个人阅读作业#2 优秀作业推荐 Shaun_Yao ✍️ 道法之间--软工第2次博客作业 Potassium ✍️ 构之有道,建之有法--软工个人阅读作业#2 MarkDay ✍️ < ...

  5. slickgrid ( nsunleo-slickgrid ) 8 区域选择与复制粘贴

    区域选择 区域选择是通过插件CellRangeSelector实现的,默认不支持跨冻结列进行选择,修正了选择,支持跨冻结列,代码如下,通过判断选择的起点和终点所落在的冻结范围进行计算,如从左往右进行复 ...

  6. mysql注入getshell

    0x00 利用条件 root权限 secure_file_priv=为空或者在网站根目录下(网站根目录为d:\www,secure_file_priv=d:\也可以) 知道绝对路径 gpc关闭,这个应 ...

  7. centos7安装powershell和powercli

    poershell github https://github.com/PowerShell/PowerShell/releases 本次采用github下载对应的rpm进行安装 windows下安装 ...

  8. Chm文件阅读软件测试需求

    转发: .Chm文件阅读软件测试需求 . xchm问题太多就不考虑了: kchm是问题少一些 windows打开是乱码就不去考虑 必须在windows打开正常的再在龙芯上打开 1windows打开是乱 ...

  9. SpringBoot2 单元测试类的报错问题

    问题描述 执行 SpringBoot2 测试时报错,提示找不到 SsmApplicationTests 主类 原因分析 Junit5 升级了框架没有兼容 问题解决 <!--测试模块--> ...

  10. Java求余%引发的一连串故事

    C1 RCE对%的处理 HotSpot VM的C1有个RCE(Range Check Elimination,范围检查消除)优化,所谓范围检查消除,就是为了正确的抛出数组越界异常,虚拟机需要在数组访问 ...