` k8s(一) | 听云轩

k8s(一)

关于k8s

官方文档:

Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。

k8s相关概念

参考于《kubernetes权威指南》(小声逼逼:贼tm厚,看崩了)

1、master

它的主要职责是调度,它决定了将应用放在哪里去运行,为了实现高可用,可以运行多个master。在master节点上运行着下面一组关键进程:

  • kubernetes API server(kube-apiserver):提供HTTP Restful接口的关键服务进程,是kubernetes 里所有资源的增、删、改、查等操作的唯一入口,也是集群控制的入口。
  • kubernetes controller manager(kube-controller-manager):所有资源对象的控制中心。
  • kubernetes schedule(kube-schedule):负责(pod)调度的进程。
  • etcd:分布式的存储系统,用于配置共享和服务发现。在这里,kubernetes里的所有资源对象的数据都保存在etcd中。

2、node

node的职责是运行容器应用,它由master管理,它负责监控并汇报容器的状态,同时根据master的要求去管理容器的生命周期。它也运行着一些关键的进程:

  • kubelet:负责pod对应的容器的创建、启停等,同时与master紧密联系,实现集群管理的基本功能。默认情况下,它会向master注册自己。
  • kube-proxy:实现kubernetes service的通信与负载均衡机制的重要组件。
  • docker engine:负责本机的容器创建和管理工作。
1
2
kubectl get nodes   //查看节点
kubectl describe node node1 //查看某一节点的详细信息

VSAEkt.png

VSEg5q.md.png

VSA4HA.md.png

VSAjBj.md.png

如图,我们获取node1节点的详细信息,其中包含了以下信息:

  • node基本信息:名称、标签,创建时间
  • node当前的运行状态,当node启动后会进行一系列的自检,包括磁盘满了没有呀(满了就标记OutOfDisk=True ),然后检查内存够不够呀(不够就标记MemoryPressure=True),一直检查完如果没啥故障就标记Ready=True
  • node的主机名和主机地址
  • node上的资源总量(在capacity里):包括CPU、内存数量、最大可调度的pod数量等等
  • node上可分配的资源(Allocatable)
  • 主机系统的信息,包括UUID号,系统、内核、docker版本、kubelet版本等等
  • 当前运行的pod简单的信息
  • 已经分配的资源(CPU的分配是以千分之一的配额为单位,用m表示;内存是用字节数为单位)
  • node相关的event信息(也就是日志信息)

3、pod

容器提供了强大的隔离功能,所以有必要把为service提供服务的这组进程放入容器中进行隔离。为此,k8s设计了pod对象,它是一组容器的集合,通常会将紧密相关的一些容器放入到pod中,同一个pod中所有的容器共享IP地址和port空间,也就是说它们在同一个namespace里面,pod是k8s最小的调度单位,在同一个pod中的容器始终被一起调度。

pod运行在一个node节点中,可以是物理机,也可以是私有云或者公有云中的一个虚拟机,通常在一个节点上运行上百个pod,其次,每个pod里运行着一个特殊的被称作为pause的容器,用它的状态来代表整个容器组的状态;其他容器则为业务容器,这些业务容器共享pause容器的网络栈(如IP)和volume挂载卷。

此外,k8s为每个pod都分配了唯一的IP(pod IP),底层网络通过虚拟二层网络(flannel,open vswitch)来实现集群内的任意两个pod之间进行TCP/IP通信 。

  • static pod:不存放在etcd中,而是放在具体node上一个文件里面,只在这个node上运行
  • 普通pod:一旦被创建,就放进etcd里面,然后被调度到某一个node上去binding,接着会被kubelet给实例化成一组docker。如果说它的其中一个docker挂了,k8s会自动去检测,并重启整个pod;如果是node挂了,则node所在的所有pod都会被调度给其他的node。
  • endpoint:pod IP加上容器端口,用来代表pod里的一个服务进程对外提供的一个通信地址。

4、label标签

一个label是一个key=value的键值对,我们可以通过给指定的资源对象捆绑一个或者多个label来实现多维度的资源分组管理,这样可以很灵活的进行资源的管理、分配、调度等等。

比如:

1
2
3
4
* 版本标签:“release”:“stable”,“release”:“canary”
* 环境标签:“enviroment”:“dev”,“enviroment”:“production”
* 架构标签:“tier”:“backend”,“tier”:“middleware”
* 分区标签:“partition”:“customerA”

当给某个资源打了标签以后我们可以通过label selector进行查询和筛选,可以将它类比于sql语句中的where条件句。

比如:

1
2
3
4
5
6
7
8
9
10
基于等式的:
* name=redis-slave //匹配所有具有标签为name=redis-slave的资源对象
* env!=production //匹配所有不具有标签env=production的资源对象

基于集合的:
* name in (redis-master,redis-slave) //匹配所有具有标签为name=redis-master或者name=redis-slave的资源对象
* env not in production //匹配所有不具有标签env=production的资源对象

可以通过表达式的组合实现复杂的条件选择,用逗号隔开:
name=redis-slave,env!=production

5、controller

k8s并不会直接创建pod,而是通过controller来管理pod,controller中定义了pod的部署特性,比如有几个副本,在什么样的node上运行等。

  • deployment:最常用的controller,它可以管理pod的多个副本,并确保pod按照期望的状态运行。

  • replicaset:实现了pod的多副本管理。使用deployment时会自动创建replicaset,也就是说deployment时通过它来管理副本的。(后面可能会详细的讲一下这个)

  • daemonset:用于每个node最多只运行一个pod副本,通常用于daemon。

  • statefulset:能够保证pod的每个副本在整个生命周期中保持名称不变,而其他controller不提供这个功能。当某个pod发生故障的时候需要删除并且重新启动,pod的名称会发生变化,同时statefulset会保证副本按照固定的顺序启动、更新或者删除。

  • job:用于运行结束就删除的应用,而其他controller中的pod通常是长期持续运行。

6、service

在kubernetes中,service是分布式集群架构的核心,一个service对象拥有如下特征:

  • 拥有一个唯一指定的名字

  • 拥有一个虚拟IP和端口号

  • 能够提供某种远程服务能力

  • 被映射到了提供这种服务能力的一种容器应用上

  • service的服务进程目前都基于socket通信方式对外提供服务

7、集群管理

k8s将集群中的机器划分为一个master节点和一群工作节点(node),其中,在master节点上运行着集群管理相关的一组进程kube-apiserver、kube-controller-manager、kube-scheduler,这些进程是实现整个集群的资源管理、pod调度、弹性伸缩、安全控制、系统监控和纠错的功能,并且都是全自动生成的。node作为集群中的工作节点,运行真正的应用程序,node上运行着k8s的kubelet、kube-proxy服务进程,这些进程负责pod的创建、启动、监控、重启、销毁以及实现软件模式的负载均衡器。

8、namespace

通过namespace将物理的cluster逻辑上划分成多个虚拟的cluster,每个cluster就是一个namespace,不同的namespace里面的资源就是完全隔离的。k8s在启动以后,会创建一个名为“default”的namespace,我们可以通过kubectl get namespaces查看存在的namespace有哪些。如果不特别指出namespace,则我们所创建的pod、RC、service都将被放进这里面。

------ 本文结束 ------
您的支持将鼓励我继续创作