首页> DevOps> Kubernetes部署应用

[文章]Kubernetes部署应用

收藏
0 538 0

Kubernetes部署应用


【摘要】

 IT 圈都是说kubernetes很火,到底kubernetes是什么呢?

 Kubernetesk8s)是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。通过Kubernetes可以快速部署应用,快速扩展应用,节省资源,优化硬件资源的使用。

为什么要容器化,要容器集群?下面通过一张图对比就可以知道优势与劣势


传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。

 

新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。

容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在buildrelease 的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚机轻量、更透明,这更便于监控和管理。

(一)       k8s概念

1.1       master节点以及node节点

k8s集群的管理节点,负责管理集群,提供集群的资源数据访问入口。拥有Etcd存储服务(可选),运行Api Server进程,Controller Manager服务进程及Scheduler服务进程,关联工作节点NodeKubernetes API server提供HTTP Rest接口的关键服务进程,是Kubernetes里所有资源的增、删、改、查等操作的唯一入口。也是集群控制的入口进程;Kubernetes Controller ManagerKubernetes所有资源对象的自动化控制中心;Kubernetes Schedule是负责资源调度(Pod调度)的进程

 

NodeKubernetes集群架构中运行Pod的服务节点(亦叫agentminion)。NodeKubernetes集群操作的单元,用来承载被分配Pod的运行,是Pod运行的宿主机。关联Master管理节点,拥有名称和IP、系统资源信息。运行docker eninge服务,守护进程kunelet及负载均衡器kube-proxy.

每个Node节点都运行着以下一组关键进程

kubelet:负责对Pod对于的容器的创建、启停等任务

kube-proxy:实现Kubernetes Service通信与负载均衡机制的重要组件

Docker EngineDocker):Docker引擎,负责本机容器的创建和管理工作

 

master节点上执行如下命令:kubectl get node 

 

如下图显示:这个k8s集群的节点机器ip以及master节点 node节点相关信息


1.2       kubernetes组件

k8s的组件概念涉及很多,这里主要介绍几个重要的节点概念,其它组件自行了解。

 Kubernetes Master控制组件,调度管理整个系统(集群),包含如下组件:

  1.Kubernetes API Server

    作为Kubernetes系统的入口,其封装了核心对象的增删改查操作,以RESTful API接口方式提供给外部客户和内部组件调用。维护的REST对象持久化到Etcd中存储。

  2.Kubernetes Scheduler

    为新建立的Pod进行节点(node)选择(即分配机器),负责集群的资源调度。组件抽离,可以方便替换成其他调度器。

  3.Kubernetes Controller

    负责执行各种控制器,目前已经提供了很多控制器来保证Kubernetes的正常运行。

  4. Replication Controller

    管理维护Replication Controller,关联Replication ControllerPod,保证Replication Controller定义的副本数量与实际运行Pod数量一致。

  5. Node Controller

    管理维护Node,定期检查Node的健康状态,标识出(失效|未失效)Node节点。

  6. Namespace Controller

    管理维护Namespace,定期清理无效的Namespace,包括Namesapce下的API对象,比如PodService等。

  7. Service Controller

    管理维护Service,提供负载以及服务代理。

  8.EndPoints Controller

    管理维护Endpoints,关联ServicePod,创建EndpointsService的后端,当Pod发生变化时,实时更新Endpoints

  9. Service Account Controller

    管理维护Service Account,为每个Namespace创建默认的Service Account,同时为Service Account创建Service Account Secret

  10. Persistent Volume Controller

    管理维护Persistent VolumePersistent Volume Claim,为新的Persistent Volume Claim分配Persistent Volume进行绑定,为释放的Persistent Volume执行清理回收。

  11. Daemon Set Controller

    管理维护Daemon Set,负责创建Daemon Pod,保证指定的Node上正常的运行Daemon Pod

  12. Deployment Controller

    管理维护Deployment,关联DeploymentReplication Controller,保证运行指定数量的Pod。当Deployment更新时,控制实现Replication Controller和 Pod的更新。

  13.Job Controller

    管理维护Job,为Jod创建一次性任务Pod,保证完成Job指定完成的任务数目

  14. Pod Autoscaler Controller

    实现Pod的自动伸缩,定时获取监控数据,进行策略匹配,当满足条件时执行Pod的伸缩动作。

 

Kubernetes Node运行节点,运行管理业务容器,包含如下组件:

  1.Kubelet

    负责管控容器,Kubelet会从Kubernetes API Server接收Pod的创建请求,启动和停止容器,监控容器运行状态并汇报给Kubernetes API Server

  2.Kubernetes Proxy

    负责为Pod创建代理服务,Kubernetes Proxy会从Kubernetes API Server获取所有的Service信息,并根据Service的信息创建代理服务,实现ServicePod的请求路由和转发,从而实现Kubernetes层级的虚拟转发网络。

  3.Docker

    Node上需要运行容器服务

 

(二)       k8s创建deployment以及service

1.1          deployment

     首先我们来了解下deploymentyaml整体文件内容及功能注解。例子如下:

apiVersion: apps/v1    #必选,版本号

kind: Deployment     #必选,类型

metadata:           #必选,元数据

  name: project-deploy   #必选,deployment名称

  namespace: default    #必选,deployment所属的命名空间

spec:                  #必选,deploymentPod中容器的详细定义

  replicas: 1            #必选,副本数量

  template:          

    metadata:

      labels:

        app: project   #必选,deploy的唯一主键 service选择

        release: dev

    spec:

      containers:     #必选,Pod中容器列表

      - name: project-containers  #必选,容器名称

        image: project:latest     #必选,容器的镜像名称

        imagePullPolicy: IfNotPresent  [Always | Never | IfNotPresent] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像

        ports:

        - name: http   #端口号名称

          containerPort: 8065  #容器需要监听的端口号

        env:  #容器运行前需设置的环境变量列表

        - name: SERVICE_NAME  #环境变量名称

          value: project   #环境变量的值

       

执行如下命令:

kubectl create -f projectDeployment.yaml

 


显示如上图则创建deployment成功

接着执行: kubectl get pods

 


可以看到这个projectpod运行在k8s集群里面了。

如果想外界能访问到这个pod的业务,那么必须建立k8sservice并暴露,外界才能访问到。

 

 

1.2         Service

 

首先我们来了解下serviceyaml整体文件内容及功能注解。例子如下:

 

apiVersion: v1   #必选,版本号

kind: Service    #必选,类型

metadata:

  name: project-service   #必选,服务名称

  namespace: default      #必选,命名空间

spec:

  type: NodePort    #必选,服务类型

  ports:

  - name: http

    port: 8065      #必选,deployment容器监听的端口

    targetPort: 8065  #必选,serivice监听的端口

    nodePort: 30000  #必选,serivice暴露母机的端口

    protocol: TCP

  selector:

app: project     #必选,deployment的标签选择器 必须对应deployment的定义标签lable

 

 

执行如下命令:

kubectl create -f projectService.yaml

 

如上图显示 服务创建成功

 

执行如下命令:

kubectl get svc


从上图看到这个project微服务以及部署到k8s的集群里面了,下面通过外界的swagger直接访问k8s随便一台node节点的30000端口就可以看到效果了,如下图:

 


DevOps
最近热帖
{{item.Title}} {{item.ViewCount}}
近期热议
{{item.Title}} {{item.PostCount}}