zoukankan      html  css  js  c++  java
  • 入门Kubernetes

    前言:

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

     

  • 相关阅读:
    《JavaScript设计模式与开发》笔记 7.单例模式
    Linux常用命令
    elasticsearch mysql logstash 同步 简单配置【环境centos7 elasticsearch 6.0 mysql 5.7 logstash 6.0】
    解决 VUE 微信登录验证 【感谢原文:https://segmentfault.com/a/1190000009493199】
    mycat 1.6 配置【仅学习测试配置使用】
    《JavaScript设计模式与开发》笔记 6.高阶函数
    《JavaScript设计模式与开发》笔记 5.关于正确写一个闭包
    《JavaScript设计模式与开发》笔记 4.闭包
    visualSVN server库迁移
    sql 数字排序问题
  • 原文地址:https://www.cnblogs.com/cwsheng/p/14907144.html
Copyright © 2011-2022 走看看