Kubernetes 系列3 基本概念和术语

一.介绍

  k8s中的大部分概念如Node,Pod,Replication Controller, Service等都可以被看作一种资源对象,几乎所有资源对象都可以通过k8s提供的kubectl工具(或者api编程调用)执行增、删、改、查等操作并将其保存在etcd中执行化存储。

  在声明一个k8s资源对象的时候,需要注意一个关键属性:apiVersion。  以下面的pod声明为例,可以看到pod这种资源对象归属于v1这个核心api。

apiVersion: v1
kind: ReplicationController
metadata:
  name: k8swebapi
  labels:
    name: k8swebapi
spec:
  replicas: 2
  selector:
    name: k8swebapi
  template:
    metadata:
      labels: 
        name: k8swebapi
    spec:
      containers:
      - name: k8swebapi
        image: hushaoren/k8swebapi
        imagePullPolicy: Always
        ports:
        - containerPort: 5000
      tolerations:
      - key: "node-role.kubernetes.io/master"
        operator: "Equal"
        value: ""
        effect: "NoSchedule"

  k8s大部分常见的核心资源对象都归属于v1这个核心api, 比如node, pod, service,endpoints,namespace, rc,  persistentvolume等。在版本迭代过程中,k8s先后扩展了  extensions/v1beta1,  apps/v1beta1,  apps/v1beta2等api组,而在1.9版本之后引入了apps/v1这个正式的扩展api组,正式淘汰了extensions/v1beta1, apps/v1beta1,  apps/v1beta2这三个api组

  v1: 这是Kubernetes API的第一个稳定版本。 它包含许多核心对象。

  apps/v1: apps是Kubernetes中最常见的API组,其中包含许多核心对象和v1。 它包括与在Kubernetes上运行应用程序相关的功能,如Deployments,RollingUpdates和ReplicaSets。

  .....更加参考:Which Kubernetes apiVersion Should I Use? - Kubernetes Book

 下面介绍kubernetes中重要的资源对象。

 二.Master

  k8s里的master指的是集群控制节点,在每个k8s集群里都需要有一个master来负责集群的管理和控制,基本上k8s所有控制命令都发给它,它负责具体的执行过程。master通常会占据一个独立的服务器(高可用部署建议用3台服务器),主要原因是它太重要了,是整个集群的首脑,如果它宕机或者不可用,那么对集群内容器应用的管理都将失败。

  在master上运行着以下关键进程

  1.kube-apiserver:提供了http rest接口的关键服务进程,是k8s里所有资源的增、删、改、查等操作的唯一入口,也是集群控制的入口进程。

  2.kube-controller-manager:k8s里所有资源对象的自动化控制中心,可以将其理解为资源对象的“大总管”

  3.kue-scheduler:负责资源调度(pod调度)的进程

  另外,master上通常还需要部署etcd服务,因为k8s里的所有资源对象的数据都被保存在etcd中。

三.Node

  与master一样,node可以是一台物理主机,也可以是一台虚拟机。node是k8s集群中的工作负载节点,每个node都会被master分配一些工作负载(docker容器),某个node宕机时,其上的工作负载会被master自动转移到其他节点上。

  在每个node上都运行着以下关键进程:

  kubelet:负责Pod对应的容器的创建、启停等任务,同时与master密切协作,实现集群管理的基本功能。

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

  docker engine:  docker引擎,负责本机的容器创建和管理工作.

  node可以在运行期间动态增加到k8s集群中,前提是在这个节点上已经正确安装,配置和启动了上述关键进程。默认情况下kubelet会向Master注册自己,这也是k8s推荐的node管理方式。一旦node被纳入集群管理范围,kubectl进程会定时向master汇报自身情况,例如:操作系统,docker版本,机器的cpu和内存情况,以及当前有哪些pod在运行等。

  如果node在超过指定时间不上报消息时,会被master判定为“失联”,node的状态被标记为不可用(not ready),随后master会触发“工作负载大转移”的自动流程。

  下面在master上查看集群中有多少个node:

[root@k8s-host ~]# kubectl get  nodes
NAME       STATUS   ROLES    AGE   VERSION
k8s-host   Ready    master   10d   v1.17.3

        然后查查看每个node的详细信息:  

[root@k8s-host ~]# kubectl describe node k8s-host
Name:               k8s-host
Roles:              master
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=k8s-host
                    kubernetes.io/os=linux
                    node-role.kubernetes.io/master=
Annotations:        kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
                    node.alpha.kubernetes.io/ttl: 0
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Mon, 11 May 2020 14:59:34 +0800
Taints:             <none>
Unschedulable:      false
Lease:
  HolderIdentity:  k8s-host
  AcquireTime:     <unset>
  RenewTime:       Fri, 22 May 2020 13:00:14 +0800
Conditions:
  Type             Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----             ------  -----------------                 ------------------                ------                       -------
  MemoryPressure   False   Fri, 22 May 2020 13:00:19 +0800   Mon, 11 May 2020 14:59:30 +0800   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure     False   Fri, 22 May 2020 13:00:19 +0800   Mon, 11 May 2020 14:59:30 +0800   KubeletHasNoDiskPressure     kubelet has no disk pressure
  PIDPressure      False   Fri, 22 May 2020 13:00:19 +0800   Mon, 11 May 2020 14:59:30 +0800   KubeletHasSufficientPID      kubelet has sufficient PID available
  Ready            True    Fri, 22 May 2020 13:00:19 +0800   Mon, 11 May 2020 14:59:41 +0800   KubeletReady                 kubelet is posting ready status
Addresses:
  InternalIP:  192.168.0.108
  Hostname:    k8s-host
Capacity:
  cpu:                2
  ephemeral-storage:  41152736Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             3879868Ki
  pods:               110
Allocatable:
  cpu:                2
  ephemeral-storage:  37926361435
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             3777468Ki
  pods:               110
System Info:
  Machine ID:                 8f5b018f6eb344909f6cfec5ad0839ef
  System UUID:                D28071E8-8A99-4700-BF59-54912BB14BB4
  Boot ID:                    c62d8678-f7ea-4931-b046-04a4569f59c3
  Kernel Version:             3.10.0-1062.12.1.el7.x86_64
  OS Image:                   CentOS Linux 7 (Core)
  Operating System:           linux
  Architecture:               amd64
  Container Runtime Version:  docker://18.9.1
  Kubelet Version:            v1.17.3
  Kube-Proxy Version:         v1.17.3
Non-terminated Pods:          (13 in total)
  Namespace                   Name                                          CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                   ----                                          ------------  ----------  ---------------  -------------  ---
  default                     k8swebapi-cgcrq                               0 (0%)        0 (0%)      0 (0%)           0 (0%)         41h
  default                     k8swebapi-wkv29                               0 (0%)        0 (0%)      0 (0%)           0 (0%)         41h
  default                     mysql-rc-4cvzg                                0 (0%)        0 (0%)      0 (0%)           0 (0%)         5d22h
  kube-system                 coredns-7f9c544f75-czbjr                      100m (5%)     0 (0%)      70Mi (1%)        170Mi (4%)     10d
  kube-system                 coredns-7f9c544f75-hwjtb                      100m (5%)     0 (0%)      70Mi (1%)        170Mi (4%)     10d
  kube-system                 etcd-k8s-host                                 0 (0%)        0 (0%)      0 (0%)           0 (0%)         10d
  kube-system                 kube-apiserver-k8s-host                       250m (12%)    0 (0%)      0 (0%)           0 (0%)         10d
  kube-system                 kube-controller-manager-k8s-host              200m (10%)    0 (0%)      0 (0%)           0 (0%)         10d
  kube-system                 kube-proxy-ht6sb                              0 (0%)        0 (0%)      0 (0%)           0 (0%)         10d
  kube-system                 kube-scheduler-k8s-host                       100m (5%)     0 (0%)      0 (0%)           0 (0%)         10d
  kube-system                 storage-provisioner                           0 (0%)        0 (0%)      0 (0%)           0 (0%)         10d
  kubernetes-dashboard        dashboard-metrics-scraper-7b64584c5c-7tx44    0 (0%)        0 (0%)      0 (0%)           0 (0%)         10d
  kubernetes-dashboard        kubernetes-dashboard-79d9cd965-gp7t7          0 (0%)        0 (0%)      0 (0%)           0 (0%)         10d
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests    Limits
  --------           --------    ------
  cpu                750m (37%)  0 (0%)
  memory             140Mi (3%)  340Mi (9%)
  ephemeral-storage  0 (0%)      0 (0%)
Events:              <none>

   上述命令展示了node的如下关键信息:

    1. Node的基本信息:name名称, labels标签,CreationTimestamp创建时间

    2. node当前的运行状态:node启动后会做一系列的自检工作,比如磁盘空间是否不足(DiskPressure)、内存是否不足(MemoryPressure ),PID资源是否正常(PIDPressure)。在一切正常时设置Node为Ready状态(Ready=true),master将可以在其上调试新的任务了(如启动pod)

    3. node的Addresses包括:主机地址和主机名  

    4.node上的资源数量Capacity:描述node可用的系统资源,包括cpu,内存数量,最大可调度POD数量等

    5.node可分配的资源量Allocatable:描述Node当前可用于分配的资源量

    6.主机系统信息System Info:包括主机ID、docker版本号,Kubelet和kube-proxy的版本号等

    7. 当前运行的pod列表概要信息

    8. 已分配的资源使用概要信息Allocated,例如资源申请的最低,最大允许使用理占系统总量的百分比

    9. node相关的event信息

四. Pod

  pod是k8s最重要的基本概念,如下图所示,我们看到的每个pod都有一个特殊的被称为”根容器“的Pause容器,Pause容器对应的镜像属于k8s平台的一部分,除了pause容器,每个pod还包含了一个或多个紧密相关的用户业务容器。

   k8s为每个pod都分配了唯一的ip地址,称之为pod ip,一个pod里的多个容器共享pod ip地址。在k8s里一个pod里的容器与另外主机上的pod容器能够直接通信(这个在前面章节中webapi +mysql有演示)。

  pod有两种类型:普通的pod及静态pod(static pod),后者比较特殊,它并没有被存放在k8s的etcd存储里,而是被存放在某个具体的Node上的一个具体文件中,并且只在此Node上启动,运行。普通的Pod则会被存放在k8s的etcd存储,由master调度到某个node上并进行binding,然后该pod被对应的node上的kubelet进程实例化成一组相关的docker容器并启动。

  如果pod里的容器停止时,k8s会自动检测到这个问题并且重新启动这个pod(重启Pod里的所有容器),一般场景是一个pod对应一个容器。

  如果pod所在的node宕机,就会将这个node上所有的pod重新调度到其他节点上。

五. Label

  Label(标签)是k8s系统中另外一个核心概念。一个Label是一个key=value的键值对,其中key与value由用户自己指定。Label可以被附加到各种资源对象上,例如Node,Pod,Service,RC等,一个资源对象可以定义任意数量的Label。label通常是在资源对象定义时确定,也可以在对象创建后动态添加或者删除。 

  通过给指定资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理功能,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。

  给某个资源对象定义一个label,就相当于给它打了一个标签,随后可以通过label selector(标签选择器)查询和筛选拥有某些Lable的资源对象。 

  label selector可以被类比为sql语句中的where查询条件,例如: name=mysql 这个label selector作用于pod时,可以被类比为:

    select * from pod where pod's name='mysql'   这样的语句

  有两种label表达式:基于等式的(equality-based)和基于集合的(set-based)。

    1.基于基于等式的例子:

      name=mysql   :匹配所有具有标签name=mysql的资源对象。

      env!=production  :匹配所有不具有标签env=production的资源对象。

    2. 基于集合的例子:

      name   in  (mysql-master,  mysql-slave)  :匹配所有具有标签name=mysq-master或者name=mysql-lavel的资源对象。

      name   not  in(php-fronted):匹配所有不具有标签name=php-fronted的资源对象。

  结合ymal文件介绍篇一起看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值