ASP.NET Core on K8S学习初探(3)部署API到K8S 一、准备一个WebAPI 二、部署WebAPI到K8S 三、在K8S中对WebAPI的伸缩 四、补充知识点 五、小结 参考资料

本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。

在上一篇《基本概念快速一览》中,我们把基本的一些概念快速地简单地不求甚解地过了一下,本篇开始我们会将ASP.NET Core WebAPI部署到K8S,从而结束初探的旅程。

Section 1 - ASP.NET Core on K8S学习初探(1)K8S单节点环境搭建

Section 2 - ASP.NET Core on K8S学习初探(2)K8S基本概念快速一览

Section 3 - ASP.NET Core on K8S学习初探(3)部署API到K8S

  这里准备一个空的ASP.NET Core WebAPI项目,使用默认自带的ValuesController控制器,具体代码见这里

  Dockerfile如下:

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY . .

RUN dotnet restore
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "EDC.K8S.Demo.WebApi.dll"]

  我们可以事先在自己的Docker环境构建这样的一个镜像,看看能否正常使用。

  由于后面会使用到这个镜像,因此可以将此镜像push到Docker Hub上。

docker push your-image-name:tagname

  当然你也可以直接使用我上传的这个镜像(edisonsaonian/k8s-demo)。

  ASP.NET Core on K8S学习初探(3)部署API到K8S
一、准备一个WebAPI
二、部署WebAPI到K8S
三、在K8S中对WebAPI的伸缩
四、补充知识点
五、小结
参考资料

二、部署WebAPI到K8S

2.1 准备Deployment YAML

  在上一篇中我们知道Deployment主要负责Pod的编排,那么我们这里就通过一个YAML来创建一个Deployment。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8s-demo
  namespace: aspnetcore
  labels:
    name: k8s-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      name: k8s-demo
  template:
    metadata:
      labels:
        name: k8s-demo
    spec:
      containers:
      - name: k8s-demo
        image: edisonsaonian/k8s-demo
        ports:
        - containerPort: 80
        imagePullPolicy: Always

---

kind: Service
apiVersion: v1
metadata:
  name: k8s-demo
  namespace: aspnetcore
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
  selector:
    name: k8s-demo

  这里这个deploy.yaml就会告诉K8S关于你的API的所有信息,以及通过什么样的方式暴露出来让外部访问。

  需要注意的是,这里我们提前为要部署的ASP.NET Core WebAPI项目创建了一个namespace,叫做aspnetcore,因此这里写的namespace : aspnetcore。

  K8S中通过标签来区分不同的服务,因此这里统一name写成了k8s-demo。

  在多实例的配置上,通过replicas : 2这个设置告诉K8S给我启动2个实例起来,当然你可以写更大的一个数量值。

  最后,在spec中告诉K8S我要通过NodePort的方式暴露出来公开访问,因此端口范围从上一篇可以知道,应该是 30000-32767这个范围之内。

2.2 通过kubectl部署到K8S

  首先,确保你的Docker for Windows以及Kubernetes都启动起来了。

  然后,在Powershell中通过kubectl完成API的部署,只需要下面这一句命令行即可:

kubectl create -f deploy.yaml

  ASP.NET Core on K8S学习初探(3)部署API到K8S
一、准备一个WebAPI
二、部署WebAPI到K8S
三、在K8S中对WebAPI的伸缩
四、补充知识点
五、小结
参考资料

  看到上面的提示"service created",就可以知道已经创建好了,这里我们再通过下面这个命令来验证一下:

kubectl get svc -n aspnetcore

  ASP.NET Core on K8S学习初探(3)部署API到K8S
一、准备一个WebAPI
二、部署WebAPI到K8S
三、在K8S中对WebAPI的伸缩
四、补充知识点
五、小结
参考资料

  可以看到,在命名空间aspnetcore下,就有了一个k8s-demo的服务运行起来了,并通过端口号31435向外部提供访问。

2.3 在K8S中验证WebAPI

  首先,我们可以通过浏览器来访问一下这个API接口,看看是否能正常访问到。

  • /api/values

  ASP.NET Core on K8S学习初探(3)部署API到K8S
一、准备一个WebAPI
二、部署WebAPI到K8S
三、在K8S中对WebAPI的伸缩
四、补充知识点
五、小结
参考资料

  • /api/values/1000

  ASP.NET Core on K8S学习初探(3)部署API到K8S
一、准备一个WebAPI
二、部署WebAPI到K8S
三、在K8S中对WebAPI的伸缩
四、补充知识点
五、小结
参考资料

  其次,还记得在第一篇中部署的Dashboard吗?我们通过Dashboard来看看我们的k8s-demo的状态:

  ASP.NET Core on K8S学习初探(3)部署API到K8S
一、准备一个WebAPI
二、部署WebAPI到K8S
三、在K8S中对WebAPI的伸缩
四、补充知识点
五、小结
参考资料

  从Dashboard中可以看到更为详细的信息,包括运行的Deployment、容器组(由于我们设置的replicas=2,因此会有2个容器运行起来)、副本集等等,也可以通过Dashboard实时初步地监控我们的API的运行情况。

三、在K8S中对WebAPI的伸缩

3.1 通过Dashboard伸缩WebAPI

  在Dashboard中,我们可以可视化地对我们的Deployment进行容器实例的伸缩,如下图所示:

  ASP.NET Core on K8S学习初探(3)部署API到K8S
一、准备一个WebAPI
二、部署WebAPI到K8S
三、在K8S中对WebAPI的伸缩
四、补充知识点
五、小结
参考资料

  在弹出的伸缩选项对话框中输入个数,例如我们这里从2个缩减为1个,然后确定。

  ASP.NET Core on K8S学习初探(3)部署API到K8S
一、准备一个WebAPI
二、部署WebAPI到K8S
三、在K8S中对WebAPI的伸缩
四、补充知识点
五、小结
参考资料

  再次观看Dashboard,可以看到已经从原来的2个容器实例变为1个了。

  ASP.NET Core on K8S学习初探(3)部署API到K8S
一、准备一个WebAPI
二、部署WebAPI到K8S
三、在K8S中对WebAPI的伸缩
四、补充知识点
五、小结
参考资料

3.2 通过Kubectl伸缩WebAPI

  除了在Dashboard中可视化地操作进行伸缩,也可以通过kubectl来进行,例如下面这句命令,将容器实例扩展到3个。需要注意的是,由于我们的k8s-demo所在的命名空间是在aspnetcore下,因此也需要指明--namespace=aspnetcore。

kubectl scale deployment k8s-demo --replicas=3 --namespace=aspnetcore

  ASP.NET Core on K8S学习初探(3)部署API到K8S
一、准备一个WebAPI
二、部署WebAPI到K8S
三、在K8S中对WebAPI的伸缩
四、补充知识点
五、小结
参考资料

  再到Dashboard中来验证一下,是否扩展到了3个容器实例:

  ASP.NET Core on K8S学习初探(3)部署API到K8S
一、准备一个WebAPI
二、部署WebAPI到K8S
三、在K8S中对WebAPI的伸缩
四、补充知识点
五、小结
参考资料

3.2 自动伸缩WebAPI实例

  在K8S中,提供了一个autoscale接口来实现服务的自动伸缩,它会采用默认的自动伸缩策略(例如根据CPU的负载情况)来帮助我们实现弹性伸缩的功能。例如下面这句命令可以实现我们的k8s-demo可以伸缩的范围是1~3个,根据负载情况自己伸缩,在没有多少请求量压力很小时收缩为一个,在压力较大时启动另一个实例来降低负载。

kubectl autoscale deployment k8s-demo --min=1 --max=3 --namespace=aspnetcore

  ASP.NET Core on K8S学习初探(3)部署API到K8S
一、准备一个WebAPI
二、部署WebAPI到K8S
三、在K8S中对WebAPI的伸缩
四、补充知识点
五、小结
参考资料

四、补充知识点

4.1 常用Kubectl命令

kubectl get svc -n kube-system  //获取指定命名空间的服务
kubectl cluster-info // 获取集群信息
kubectl get nodes // 获取集群节点信息
kubectl delete node 192.168.2.152  //删除节点 192.168.2.152
kubectl get namespaces // 获取所有命名空间
kubectl create namespace aspnetcore // 创建一个命名空间“aspnetcore”

  更多kubectl命令参考:

  (1)https://jimmysong.io/kubernetes-handbook/guide/kubectl-cheatsheet.html

  (2)https://www.jianshu.com/p/fb5c0d115421

4.2 YAML文件解析

   关于YAML文件各个节点的解释,可以通过下面这个命令去了解:

kubectl explain deployment.metadata

  ASP.NET Core on K8S学习初探(3)部署API到K8S
一、准备一个WebAPI
二、部署WebAPI到K8S
三、在K8S中对WebAPI的伸缩
四、补充知识点
五、小结
参考资料

  更多YAML文件的节点参考:https://www.kubernetes.org.cn/1414.html

4.3 更多K8S基础知识?

  推荐阅读《18张插画了解Kubernetes背景与概念

   ASP.NET Core on K8S学习初探(3)部署API到K8S
一、准备一个WebAPI
二、部署WebAPI到K8S
三、在K8S中对WebAPI的伸缩
四、补充知识点
五、小结
参考资料

五、小结

  本文简单的介绍了一下在Docker for Windows环境下,通过kubectl部署一个ASP.NET Core WebAPI到K8S中,并初步使用了K8S的伸缩特性对Deployment进行实例的伸缩,体验了一下所谓的容器的编排。当然,笔者也是初玩,有很多还没学习,这也只是K8S的冰山一角,后续我会学习在Linux下部署K8S的生产级集群环境,深入学习K8S的各种概念并实践,最后会学习阿里云ACK服务(容器服务Kubernetes版)或腾讯云TKE服务(基于Kubernetes的容器服务)去部署和实践公司的生产环境,相信到时也会有很多的分享的!

参考资料

作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。