前言:
之前文章 对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:codingprojectk8s.demok8s> 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还有很多有用的功能等着解锁。如:不停机升级部署、服务间调用。