- 在k8s中,一个pod里面的容器与另外主机上的pod容器能够直接通信
- 因为k8s为每个pod都分配了唯一的IP地址称为pod ip
- 一个pod里的多个容器共享这个pod IP地址。
- k8s要求底层网络支持集群内任意两个pod之间的TCP/IP直接通信,采用虚拟机二层网络技术实现
- pod的ip加上容器端口(containerPort)组成一个新概念----endpoint
- 他代表此pod里的一个服务进程的对外通信地址
- 一个pod可以有多个endpoint 比如Tomcat定义为一个pod时,可以对外暴露管理端口和服务端口这两个endpoint
- endpoint=(pod ip + container port )
- k8s里面的event概念: event是一个事件的记录,记录了事件的最早产生时间、最后重现时间、重复次数、发起者、类型、以及导致该事件的原因等
- 通常会被关联到某个具体资源上,是排查故障的重要信息。命令: kubectl describe pod xxxx
- k8s中对于资源的配合限定有两个参数:
Requests:资源的最小申请量,系统必须满足
Limits: 该资源最大允许使用的量 不能被突破,当容器试图使用超过这个量的资源时,可能会被k8s杀掉而重启
- 通常会把requests设置成一个较小的数值 符合容器平时的工作负载情况下的资源需求 。
- limits设置成峰值负载情况下资源占用的最大量
spec:
containers:
resources:
limits: {cpu: 500m, memory: 100Mi}
requests: {cpu: 250m, memory: 30Mi}
该容器申请至少0.25个CPU和30M内存 运行过程中容器所能使用的资源配额为0.5个CPU和100M内存
- label(标签)
- 一个label是一个key=value的键值对
- key value可以由用户指定 可以附加到各种资源对象上,比如node、pod、server、rc
- 通过给指定的资源对象捆绑一个或者多个label 来实现多维度的资源分配管理功能
- 打上标签之后,我们就可以通过label selector(标签选择器)查询和筛选某些label的资源对象(类似于SQL那种简单又通用的对象查询机制)
Label selector可以类比成SQL语句中的where查询条件
- 比如kube-controller进行通过在资源对象rc上定义的label selector来筛选要监控的pod副本数量 达到副本数量始终符合预期的设定的全自动控制流程
例子:以nginx pod为例子 label被定义到metadata中:
apiVersion: v1
kind: pod
metadata:
name: nginx
labels:
app:nginx
在管理对象Rc 和service则通过selector字段设置需要关联pod的label:
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
- kind: pod 表示这是一个pod的定义
- metadata里面的name属性是pod的名称,在metadata里还能定义资源对象的标签
- 在pod中所包含的容器组的定义在spec一节中声明
- 我们可以采用yaml或者json格式声明(定义或者创建)一个kubernetes资源对象,每个资源对象都有自己的特定语法形式(可以理解为数据库中的一个特定的表)。