核心概念

containers

docker等容器,提供docker镜像运行的环境。docker利用namespace、cgroup等linux提供的能力,来使运行在同一机器上的各个container互不影响。各container都认为自己拥有独立的文件、进程等系统,同时,机器的cpu、内存等资源也被划分给不同的container。

pods

一个container正常来说只应该包含一个进程,因为这样能更好的监控container的状态,可以理解为k8s监控的最小粒度就是container;而一个pod会包含一个或多个紧密相关的container,一个pod下的container会部署在一个物理节点,也就意味着一个pod下不同container的交互是可以通过localhost进行的。

一般来说,一个pod中只会有一个container,存在多个container的情况一般是一个为主container,其他container负责辅助做一些事情,比如说log agent负责上报主container生产的日志。

labels

所有k8s的资源,比如pod、node,都可以被打上标,label为kv形式,且一个资源上能打上多种标签。打完标签后,可以通过label selectors来筛选出打上特定label的资源。

比方说可以将不同版本的pod通过label打上不同的标签:version=v1/v2/…,然后利用label selectors就可以将version=v1的pod全部取出。label还可以标示node资源,举个例子:如果某些node底层是gpu,可以将这些nodes搭上label:gpu=true,然后在部署需要在gpu上运行的服务时,便可通过label selectors来指定特定的pods需要部署在gpu=true的nodes上。

namespace

一个pod可能会有多个label,但只会有一个namespace。namespace的概念可以类比于租户,通过namespace可以指定到不同的租户的命名空间。但需要注意的是,namespace仅仅是个逻辑上的分类,在你指定了某个namespace后,你只能看到对应namespace的pod,但并不作其他方面的区分,比方说不同namespace的pod仍可以互相调用

replication

replicationController

监控正在运行的pods,并确保pods的数量是和配置好的数量是一样的。replicationController通过label selector来指明需要关注的pods,如果某个pod在运行期间修改了label,导致特定的replicationController通过label selector找不到该pod了,那么replicationController会根据配置重新建立pod

replicaSets

用来替代replicationController,本质上比replicationController支持更丰富的label selector的匹配规则

liveness probe

用来检测pod是否还能正常对外提供服务,k8s会定期执行probe来看pod是否正常工作,如果probe运行失败,则会重启container。probe主要有以下三种方式:

1. http get
2. tcp socket
3. 任意脚本,看返回值是否为0

daemonSet

有些pod需要在所有node、或者在所有打了某些标签的node上运行,比如每个node都需要有pod来上报日志、或者k8s集群上的每个node都需要部署kube-proxy进程

job

job:一次性跑完的任务,不是持续性的服务

cronjob:周期性的服务

Service

service可以理解为就是psm,提供了一类服务的入口。本质上,replicaSets等负责管理pod,而service负责pod与内外部服务的交互。在service定义时需要定义port和targetport,port代表service正在监听的端口,收到请求后,service会将请求转发到对应pod的targetport上。

Endpoint

在service和pod中间,有名为Endpoint的资源,记录了符合条件的pod的ip,service在进行路由时,先通过endpoint挑选一个pod的ip和port,再路由过去。加这么一层抽象的原因是,可以将service与pod进行解耦,能在endpoint中申明想要连接的pod的ip和port,然后将service与endpoint关联起来

service type:

  1. NodePort:相比于普通service的port和targetport,新增了nodeport的配置,指的是每个node节点的该port上的请求,都会被路由到该service
  1. LoadBalancer:外部请求会先于lb进行通信,再由lb进行路由