zoukankan      html  css  js  c++  java
  • ASP.NET Core on K8S学习初探(3)部署API到K8S

    应用网址: https://www.cnblogs.com/edisonchou/p/aspnet_core_on_k8s_firststudy_part3.html

    本篇已加入《.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

    一、准备一个WebAPI

      这里准备一个空的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)。

      

    二、部署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

      

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

    kubectl get svc -n aspnetcore

      

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

    2.3 在K8S中验证WebAPI

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

    • /api/values

      

    • /api/values/1000

      

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

      

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

    三、在K8S中对WebAPI的伸缩

    3.1 通过Dashboard伸缩WebAPI

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

      

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

      

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

      

    3.2 通过Kubectl伸缩WebAPI

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

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

      

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

      

    3.2 自动伸缩WebAPI实例

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

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

      

    四、补充知识点

    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

      

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

    4.3 更多K8S基础知识?

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

       

    五、小结

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

    参考资料

  • 相关阅读:
    分而治之应该把握哪些原则呢
    什么事SOA
    SOA架构设计的案例分析课后 学习
    关于分层架构的知识学习
    从小编程,到架构师,我们应该具备什么
    基于MVC架构实例分析以校园知网校内论坛功能为例
    服务架构设计及其应用
    《一线架构师实践指南》阅读笔记03
    《一线架构师实践指南》阅读笔记02
    Pre-Architecture 阶段阅读笔记
  • 原文地址:https://www.cnblogs.com/bruce1992/p/15805783.html
Copyright © 2011-2022 走看看