K8S基础-资源对象

Posted by YaPi on January 12, 2018

Kubernetes基本概念和术语

Kubernetes中几乎所有的资源对象都可以通过kubectl执行CURD操作,并在etcd中持久化保存。它通过跟踪对比etcd库里保存的资源期望状态与当前世纪资源状态的差异来实现自动控制和自动纠错的功能。

Master

每个集群都有一个Master节点负责整个集群的管理和控制,基本上所有的命令都是发给它。其运行着如下关键进程

  • Kubernets API Server(kube-apiserver)

    提供了HTTP Rest接口的关键服务进程,是所有资源CURD等操作的唯一入口

  • Kubernets Controller Manager(kube-controller-manager) (kube-controller-manager),Kubernetes里所有资源对象的自动控制中心
  • Kubernets Scheduler(kube-scheduler),负责资源调度(Pod调度)的进程
Node

除Master节点外,集群中其他机器被称为Node节点。其运行着如下关键进程

  • kubelet

    负责Pod对应的容器的创建、启停等任务,同时与Master节点密切协作,实现集群管理

  • kube-proxy

    实现kubernetes service的通信与负载均衡机制的重要租金

  • Docker Engine

    负责本机容器创建和管理

Node可以在运行期间动态增加到集群中。

Pod

Pod是kubernets最基本最重要的概念,每个Pod都有一个特殊的被称为根容器的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,还包含其他的用户业务容器

引入Pod概念的原因

  1. 在一组容器作为一个单元时,很难判断整体的存亡,比如一个容器死了算整体死亡了?还是死亡的容器占的比例达到一定就算死亡了?因此,引入了Pause容器,以它的状态来确定整体的状态
  2. Pod里的多个业务容器共享Pause容器的IP,共享Pause容器挂接的Volume。

kubeernets为每个pod都分配了唯一的IP,称为PodIP,一个Pod里的多个容器共享此IP。其,Kubernetes要求底层网络支持集群内任意两个Pod之间的TCP/IP直接通信,通常采用虚拟二层网络技术来实现,通常框架,fiannel等。总的来说,在Kubernetes里,一个Pod里的容器与另外主机上的Pod容器能够直接通信。

Pod其实有两种类型,静态和普通,静态的在具体某一个NOde上的一个具体文件中,并且只在此Node上启动运行。普通Pod一旦创建就会被放入到etcd中存储,随后会被kubernetes master调度到某个具体的node上并进行绑定,随后该pod被对应node上的kubelet进程实例化一组相关的docker容器并启动。当pod某个容器停止时,kubernetes会检测这个问题并重新启动这个pod(重启所有容器)。若node宕机,会将此node上所有pod重新调度到其他节点上。

apiVersion: v1
kind: Pod
metadata:
  name: myweb
  labels:
    name:myweb
spec:
  containers:
  - name: myweb
    image: xxxximage
    ports:
    - containerPort: 8080
    env:
    - name: MYSQL_SERVICE_HOST
      value: 'mysql'
    - name: MYSQL_SERVICE_PORT
      value: '3306'
Label

Label是kubernets系统中另一个概念。其中key和value由用户自己指定。Label可以附加到各种资源对象上。如:Node,RC,POD,Service。一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去。Label通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除。

使用场景

  1. kube-controller进程通过资源对象RC上定义的Label Selector来筛选要监控的Pod副本的数量,从而实现Pod副本的数量始终符合预期设定的全自动控制流程
  2. kube-proxy进程通过service的Label Selector 来选择对应的Pod,自动建立起每个Service到对应Pod的请求转发路由表,从而实现Service的智能负载均衡机制。
  3. 通过对某些Node定义特定的Label,并且在Pod定义文件中国呢使用NodeSelector这种标签调度策略,kube-schedule进程可以实现od定向调度的特性。
Replication Controller(RC)

RC声明某种POD的副本数量在任意时刻都符合某个预期值,RC的定义包括如下几个部分:

  • Pod期待的副本数
  • 用语言筛选目标Pod的Label Selector
  • 当Pod的副本数量小于预期数量的时候,用于创建新Pod的Pod模版。

当使用命令创建一个RC过后,kubernetes的Controller Manager就得到通知了,定期巡检系统中当前存活的目标POD,若当前POD数量多余定义的数量,则停掉一些,若少于则根据模板新建一些POD。

在运行的时候,可以动态的修改RC副本数量来实现POD的动态缩放

kubectl scale rc xxxxx --replicas=3

删除RC并不会影响通过该RC创建好的POD,为了删除所有POD,可以设置replicas的值为0。

Deployment

Deployment是kubernetes1.2引入的新概念,内部使用Replica Set来实现。无论从Deployment的作用与目的、他的Yaml定义还是具体命令行操作来看,都可以把它看成RC的一次升级。

Deployment相对于RC的一个最大升级是我们可以随时知道当前POD部署的进度。

Service

kubernets里的每个Service其实就是微服务架构中的一个微服务,之前建立的pod、rc等资源都是为此服务。