一、资源清单格式

在 k8s 中,一般使用 yaml (或者json)格式的文件来创建符合我们预期期望的 pod ,这样的 yaml 文件我们一般称为资源清单

资源清单:描述资源进行实例化的文件

apiVersion: group/apiversion  # 指定当前的组和版本(写的资源清单具体去哪个路径下调代码)。如果没有给定 group 名称,那么默认为 core,可以使用 kubectl api-versions # 获取当前 k8s 版本上所有的 apiVersion 版本信息( 每个版本可能不同 )
kind:       #资源类别
metadata:  #资源元数据
   name: pod-demo      #资源对象名称;
   namespace: default   #使用名称级别的资源才需要填写; #处于default名称空间下;
   lables:      #标签,筛选操作;一般用于集群内部的筛选功能;
      app: myapp                #标签
   annotations:   # 主要目的是方便用户阅读查找
spec:  # 期望的状态(disired state)
  containers:                    #代表mainC;
  - name: myapp-1            #mainC子对象1名称;列表开头使用   -开头
    image: wangyanglinux/myapp:v1
  - name: busybox-1            #mainC子对象2名称;
    image: busybox:1.35.0
    command:                #此处代表的是ENTRYPOINT;
    - "/bin/sh"
    - "-c"
    - "sleep 3600"
status: # 当前状态,本字段有 Kubernetes 自身维护,用户不能去定义

二、字段配置格式

apiVersion <string>          #表示字符串类型
metadata <Object>            #表示需要嵌套多层字段
labels <map[string]string>   #表示由k:v组成的映射
finalizers <[]string>        #表示字串列表
ownerReferences <[]Object>   #表示对象列表
hostPID <boolean>            #布尔类型
priority <integer>           #整型
name <string> -required-     #如果类型后面接 -required-,表示为必填字段

三、常用资源清单格式定义

Object :对象,下方是对象的属性

list:类别,下方包含多个数组,每个数组是一个对象

String:字符串 后边直接跟value的值

1、通用字段

参数名字段类型说明
versionString这里是指的是K8S API的版本,目前基本上是v1,可以用kubectl apiversions命令音询
kindString这里指的是yamI文件定义的资源类型和角色,比如: Pod
metadataObject元数据对象,固定值就写metadata
SpecObject详细定义对象,固定值就写Spec

2、metadate相关字段

参数名字段类型说明
metadataObject元数据对象,固定值就写metadata
mmetadata.nameString元数据对象的名字,这里由我们编写,比如命名Pod的名字
mmetadata.lableslist标签列表。有key=value组成

3、pod相关字段

参数名字段类型说明
spec.restartPolicyString定义Pod的重启策略,可选值为Always、OnFailure,默认值为Always。1.Always: Pod一旦终止运行,则无论容器是如何终止的,kubelet服务都将重启它。2.OnFailure: 只有Pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常结束 (退出码为0) ,则kubelet将不会重启它3.Never: Pod终止后,kubelet将退出码报告给Master,不会重启该Pod.
spec.nodeSelectorObject定义Node的Label过滤标签,以key:value格式指定
spec.imagePullSecretsObject定义pull镜像时使用secret名称,以name:secretkey格式指定
spec.hostNetworkBoolean定义是否使用主机网络模式,默认值为false。设置true表示使用宿主机网络,不使用docker网桥,同时设置了true将无法在同一台宿主机上启动第二个副本。
sepc.NodeNamestring定义pod要调度的节点,可以忽略污点,还是要预选、优选。

1)mainC字段

参数名字段类型说明
spec.containers[]list这里是Spec对象的容器列表定义,是个列表
spec.containers[].nameString这里定义容器的名字
spec.containers[].imageString这里定义要用到的镜像名称
spec.containers[].imagePullPolicyString定义镜像拉取策略,有Always、Never、lfNotPresent三个值可选 (1) Aways: 意思是每次都尝试重新拉取镜像 (2) Never: 表示仅使用本地镜像 (3) lfNotPresent: 如果本地有镜像就使用本地镜像,没有就拉取在线镜像。上面三个值都没设置的话,默认是Always。
spec.containers[].command[]List指定容器启动命令,因为是数组可以指定多个,不指定则使用镜像打包时使用的启动命令
spec.containers[].args[]List指定容器启动命令参数,因为是数组可以指定多个。
spec.containers[].workingDirstring指定容器的工作目录
spec.containers[].volumeMounts[]List指定容器内部的存储卷配置
spec.containers[].volumeMounts[].nameString指定可以被容器挂载的存储卷的名称
spec.containers[].volumeMounts[].mountPathstring指定可以被容器挂载的存储卷的路径
spec.containers[].volumeMounts[].readOnlystring设置存储卷路径的读写模式,ture 或者false默认为读写模式
spec.containers[].ports[]List指定容器需要用到的端口列表
spec.containers[].ports[].nameString指定端口名称
spec.containers[].ports[].containerPortString指定容器需要监听的端口号
spec.containers[].ports[].hostPortString指定容器所在主机需要监听的端口号,默认跟上面containerPort相同,注意设置了hostPort同一台主机无法启动该容器的相同副本 (因为主机的端口号不能相同,这样会冲突)
spec.containers[].ports[].protocolString指定端口协议,支持TCP和UDP,默认值为TCP
spec.containers[].env[]List指定容器运行前需设置的环境变量列表
spec.containers[].env[].namestring指定环境变量名称
spec.containers[].env[].valueString指定环境变量值
spec.containers[].resourcesObject指定资源限制和资源请求的值 (这里开始就是设置容器的资源上限)
spec.containers[].resources.limitsObject指定设置容器运行时资源的运行上限
spec.containers[].resources.limits.cpuString指定CPU的限制,单位为core数,将用于docker run --cpu-shares参数 (这里前面文章Pod资源限制有讲过)
spec.containers[].resources.limits.memoryString指定MEM内存的限制,单位为MIB、GiB
spec.containers[].resources.requestsObject指定容器启动和调度时的限制设置
spec.containers[].resources.requests.cpuStringCPU请求,单位为core数,容器启动时初始化可用数量
spec.containers[].resources.requests.memoryString内存请求,单位为MIB、GiB,容器启动的初始化可用数量
1.探针字段
1.就绪探针
参数名字段类型说明
spec.containers.readinessProbeObject定义容器的就绪探测策略。有三种模式可选
exec:返回码为0为就绪
tcpsoket:tcp 对应检测端口响应成功为就绪
httpget:返回码 >= 200 && < 400 为就绪
httpget:
spec.containers.readinessProbe.execlist定义容器的就绪探测策略为exec。
spec.containers.readinessProbe.exec.commandListexec所对应的命令
spec.containers.readinessProbe.initialDelaySecondsinit探测开始时间
spec.containers.readinessProbe.periodSecondsinit探测间隔时间。s为单位
2.存活探针
参数名字段类型说明
spec.containers.livenessProbeobject定义容器的就绪探测策略。有三种模式可选
exec:返回码为0为就绪
tcpsoket:tcp 对应检测端口响应成功为就绪
httpget:返回码 >= 200 && < 400 为就绪
httpget:
spec.containers.livenessProbe.httpGetobject定义容器的就绪探测策略为httpGet。
spec.containers.livenessProbe.httpGet.portinit探测的端口
spec.containers.livenessProbe.httpGet.pathstring探测的文件。根为网页根路径
spec.containers.livenessProbe.initialDelaySecondsinit探测开始时间
spec.containers.livenessProbe.periodSecondsinit探测间隔时间。s为单位
spec.containers.livenessProbe.timeoutSecondsinit探测超时时间,超时后就是探测失败
2.钩子字段
参数名字段类型说明
spec.containers.lifecycleobject定义钩子
spec.containers.lifecycle.postStartobject定义启动后的钩子
spec.containers.lifecycle.preStopobject定义退出前钩子
spec.containers.lifecycle.postStart.execobject定义启动后的钩子动作为命令
spec.containers.lifecycle.postStart.exec.commandlist定义启动后的钩子详细动作

2) initC字段

与容器字段通过,只不过把containers换成initcontainers

参数名字段类型说明
spec.initcontainers[]list这里是Spec对象的容器列表定义,是个列表,定义initC容器
spec.initcontainers[].nameString这里定义容器的名字
spec.initcontainers[].imageString这里定义要用到的镜像名称
spec.initcontainers[].command[]List指定容器启动命令,因为是数组可以指定多个,不指定则使用镜像打包时使用的启动命令

4、控制器通用字段

参数名字段类型说明
spec.replicasinit副本数(pod数量)
spec.templateobjetpod模板,内容就是pod中的字段内容
spec.selectorobject/objec标签匹配(用来区分是谁的pod),将适合的pod加入到该该控制器下 内容是:标签:值
spec.minReadySecondsinit用定义新建的 Pod 经过多少秒后才被视为可用,默认为0。
spec.backoffLimitinit失败次数达到指定次数之后进入懒启动状态(重建间隔时间长)

1)标签选择—标签选择器

处理RC其他都支持

参数名字段类型说明
spec.selectorobject标签匹配(用来区分是谁的pod),将适合的pod加入到该该控制器下
spec.selector.matchLabels[]list集合式的标签匹配(用来区分是谁的pod),将适合的pod加入到该该控制器下内容是:标签:值(RS支持)
spec.selector.matchExpressions[]object支持运算符匹配进行标签选择(用来区分是谁的pod),将适合的pod加入到该该控制器下
内容是:
key: xxxx
operator: 运算符
vlaues:
- xxxx
spec.selector.matchExpressions[].keystring标签选择器的key字段
spec.selector.matchExpressions.operatorstring标签选择的运算符,有In、NotIn、Exists、DoesNotExist 四个值可选
In :label 的值在某个列表中(根据value的值进行选择)
NotIn :label 的值不在某个列表中
Exists :某个 label 存在(根据key进行选择)
DoesNotExist:某个 label 不存在
spec.selector.matchExpressions[].valueslist标签选择器下的value字段

5、RC 控制器

参数名字段类型说明
spec.selectorlist标签匹配(用来区分是谁的pod),将适合的pod加入到该该控制器下 内容是:标签:值

RC (ReplicationController )主要的作用就是用来确保容器应用的副本数始终保持在用户定义的副本数 。即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收(回收最晚创建的)

根据标签确认是否输入控制器

不支持集合式的标签匹配

6、RS控制器

参数名字段类型说明
spec.minReadySecondsinit用定义新建的 Pod 经过多少秒后才被视为可用,默认为0。
spec.selector.matchLabels[]list集合式的标签匹配(用来区分是谁的pod),将适合的pod加入到该该控制器下内容是:标签:值(RS支持)
spec.selector.matchExpressions[]object支持运算符匹配进行标签选择(用来区分是谁的pod),将适合的pod加入到该该控制器下
内容是:
key: xxxx
operator: 运算符
vlaues:xxxx
spec.selector.matchExpressions[].keystring标签选择器的key字段
spec.selector.matchExpressions.operatorstring标签选择的运算符,有In、NotIn、Exists、DoesNotExist 四个值可选
In :label 的值在某个列表中(根据value的值进行选择)
NotIn :label 的值不在某个列表中
Exists :某个 label 存在(根据key进行选择)
DoesNotExist:某个 label 不存在
spec.selector.matchExpressions[].valueslist标签选择器下的value字段

7、deployment控制器

参数名字段类型说明
spec.minReadySecondsinit用定义新建的 Pod 经过多少秒后才被视为可用,默认为0。
spec.selectorlist默认标签选择器。默认是matchLabels子集形式进行匹配
spec.selector.matchLabels[]list集合式的标签匹配(用来区分是谁的pod),将适合的pod加入到该该控制器下内容是:标签:值
spec.selector.matchExpressions[]object支持运算符匹配进行标签选择(用来区分是谁的pod),将适合的pod加入到该该控制器下
内容是:
key: xxxx
operator: 运算符
vlaues:xxxx
spec.selector.matchExpressions[].keystring标签选择器的key字段
spec.selector.matchExpressions.operatorstring标签选择的运算符,有In、NotIn、Exists、DoesNotExist 四个值可选
In :label 的值在某个列表中(根据value的值进行选择)
NotIn :label 的值不在某个列表中
Exists :某个 label 存在(根据key进行选择)
DoesNotExist:某个 label 不存在
spec.selector.matchExpressions[].valueslist标签选择器下的value字段
sepc.revisionHistoryLimitinit设置保留的滚动更新历史版本数量,默认值为2147483647,表示保存所有历史版本
spec.strategy.typestring部署类型,可以选择 的值为ecreate (字母开头大写) 或 RollingUpdate , 默认为 RollingUpdate
Deployment.spec.strategy.Recreate滚动更新方式为重建
Deployment.spec.strategy.rollingUpdate映射滚动更新方式为滚动更新
Deployment.spec.strategy.rollingUpdate.maxSurgeinit设置更新时pod最多多几个(或者指定百分比)
Deployment.spec.strategy.rollingUpdate.maxUnavailableinit设置更新时pod最多几个不可用(或者指定百分比)
Deployment.spec.revisonHistoryLimitinit指定 deployment 最多保留多少 镜像版本修改的历史记录。默认的会保留所有的 revision;如果将该项设置为0,Deployment 就不允许回退了

8、job控制器

参数名字段类型说明
spec.template格式同Pod相同
spec.template.spec.restartPolicyString仅支持Never或OnFailure,需要修改
定义Pod的重启策略,可选值为Always、OnFailure,默认值为Always。
1.Always: Pod一旦终止运行,则无论容器是如何终止的,kubelet服务都将重启它。
2.OnFailure: 只有Pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常结束 (退出码为0) ,则kubelet将不会重启它
3.Never: Pod终止后,kubelet将退出码报告给Master,不会重启该Pod.
spec.completionsinit标志Job结束需要成功运行的Pod个数,默认为1
spec.parallelisminit标志并行运行的Pod的个数,默认为1
spec.activeDeadlineSecondsinit标志失败Pod的重试最大时间,超过这个时间不会继续重试。秒为单位

9、CronJob控制器

参数名字段类型说明
.spec.schedulestring调度,必需字段,指定任务运行周期,格式同 Cron。如:“*/1 * * * *”
spec.completionsinit标志Job结束需要成功运行的Pod个数,默认为1
spec.parallelisminit标志并行运行的Pod的个数,默认为1
spec.concurrencyPolicystring-并发策略,该字段也是可选的。它指定了如何处理被 Cron Job 创建的 Job 的并发执行。只允许指定下面策略中的一种:
Allow(默认):允许并发运行 Job
Forbid:禁止并发运行,如果前一个还没有完成,则直接跳过下一个
Replace:取消当前正在运行的 Job,用一个新的来替换
spec.suspendstring挂起,该字段也是可选的。有true、false两个值可以选择。如果设置为 true,后续所有执行都会被挂起。它对已经开始执行的 Job 不起作用。默认值为 false
spec.successfulJobsHistoryLimitinit历史限制。是可选的字段。它们指定了可以保留多少完成的 Job。默认为3
spec.failedJobsHistoryLimitinit历史限制。是可选的字段。它们指定了可以保留多少失败的 Job。默认为0
spec.activeDeadlineSecondsinit标志失败Pod的重试最大时间,超过这个时间不会继续重试。该字段是可选的。如果因为任何原因而错过了被调度的时间,那么错过执行时间的 Job 将被认为是失败。秒为单位
spec.jobTemplateobject的。如果没有指定,则没有期限Job 模板,必需字段,指定需要运行的任务,格式同 Job
jobTemplate.spec.template格式同Pod相同
jobTemplate.spec.template.spec.restartPolicyString仅支持Never或OnFailure,需要修改
定义Pod的重启策略,可选值为Always、OnFailure,默认值为Always。
1.Always: Pod一旦终止运行,则无论容器是如何终止的,kubelet服务都将重启它。
2.OnFailure: 只有Pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常结束 (退出码为0) ,则kubelet将不会重启它
3.Never: Pod终止后,kubelet将退出码报告给Master,不会重启该Pod.

10、service

参数名字段类型是否必选取值说明
.apiVersionstringRequiredv1
.kindstringRequiredService
.metadataobjectRequired元数据
.metadata.namestringRequiredService名称,需符合RFC 1035规范
.metadata.namespacestringRequired命名空间,不指定系统时将使用名为default的命名空间
.metadata.labels[] list自定义标签属性列表
.metadata.annotation[]list自定义注解属性列表
.specobjectRequired期望描述
.spec.selector[]listRequiredLabel Selector配置,将选择具有指定Label标签的Pod作为管理范围
.spec.typestringRequitedService的类型,指定Service的防问方式,默认值为ClusterIP。取值可有:ClusterIP、NodePort、LoadBalancer。
.spec.clusterIPstring虚拟服务的IP地址,当type=ClusterIP时,如果不指定,则系统自动分配,也可以手工分配;当type=LoadBalancer时,需要指定
.spec.sessionAffinitystring会话保持字段是否支持Session,可选值为ClientIP,默认值为None。ClientIP:表示将同一个客户端(根据客户端的IP地址决定)的访问请求都转发到同一个后端Pod
.spec.ports[]listService端口列表
.spec.ports[].namestring端口名称
.spec.ports[].protocolstring端口协议,支持TCP和UDP,默认值为TCP
.spec.ports[].portint服务监听的端口号
.spec.ports[].targetPortint需要转发到后端Pod的端口号
.spec.ports[].nodePortint当spec.type=NodePort时,指定映射到宿主机的端口号
.statusobject当spec.type=LoadBalancer时,设置外部负载均衡器的地址
.status.loadBalancerobject外部负载均衡器
.status.loadBalancer.ingressobject外部负载均衡器
.status.loadBalancer.ingress.ipstring外部负载均衡器的IP地址
.status.loadBalancer.ingress.hostnamestring外部负载均衡器的主机名

11、Endpoint

作用:连接外部服务值本地svc

原理:只有配置了 selector 的 service 才会自动创建一个同名的 endpoints,没有配置 selector 的 service 不会产生 endpoints 资源对象

参数名字段类型说明
metadata.namestring必需字段,必须与要匹配的svc名字完全一致,并且在同一名字空间中
svc.subsetsobject#配置外部集群信息(一级字段)
subsets.addresslist外部地址
subsets.portslist外部端口
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
    - protocol: TCP
      port: 6666
      targetPort: 80
---	
apiVersion: v1
kind: Endpoints
metadata:
  name: nginx     #名字必须与svc名字完全一致,并且在同一名字空间中
subsets:          #配置外部集群信息
  - addresses:    #外部地址
      - ip: 192.168.110.102
#      - ip: xxxxxx   跟踪多个 ip (多个 pod 或者容器或者应用),可以使用以下方式
    ports:
      - port: 80  #外部端口

12、ingress

Ingress(入口,准入)是Kubernetes提供的接口,Kubernetes使用Ingress策略定义和Ingress Controller 实现了基于Ingress策略定义的服务路由功能 ,用于对Kubernetes集群外部的客户端提供服务。

Ingress 专门对接用于七层负载的

参数名字段类型说明
Ingress.spec.ruleslist规则设置
spec.rules.hoststring代理到的域名
spec.rules.httpobject基于http协议
spec.rules.http.pathlist访问的网址路径
spec.rules.http.path.pathsstring访问的网址路径是哪个
spec.rules.http.path.paths.backendobject代理设置
spec.rules.http.path.paths.backend.serviceNamestring代理到哪个svc
spec.rules.http.path.paths.backend.servicePortstring代理的端口

13、configmap

创建方式:使用命令创建,在命令中

下方是如何使用:

1、在资源清单中添加环境变量

字段字段类型描述
pod.spec.containers.envlist要在容器中设置的环境变量列表。 无法更新。 EnvVar 表示容器中存在的环境变量。
pod.spec.containers.env.namestring环境变量的Key值,必须设置。
pod.spec.containers.env.valuestring设置环境变量的Value,可以使用 $(VAR_NAME) 的方式对容器中的环境变量进行引用。 $$(VAR_NAME) 表示对 $ 进行转义,会将$(VAR_NAME) 以值的方式设置为环境变量的值而不是将其展开。

2、通过ConfigMap逐个添加env(变量名容器内二次定义)

key=容器定义。value=configmap中的key的value

字段字段类型描述
pod.spec.containers.envlist要在容器中设置的环境变量列表。 无法更新。 EnvVar 表示容器中存在的环境变量。
pod.spec.containers.env.valueFromobject环境变量值的源。如果值不为空,则无法使用。
pod.spec.containers.env.valueFrom.configMapKeyRefobject选择configMap中的一个Key值的字段。
pod.spec.contaienrs.env.valueFrom.configMapKeyRef.namestring指定configMap的名字
pod.spec.containers.env.valueFrom.configMapKeyRef.keystring指定configMap引用的key值,会将对应的value赋予环境变量的value值。
pod.spec.contianers.env.valueFrom.configMapKeyRef.optionalboolean指定configMap和key值是否必需预先定义好逐个添加env(没学,不用看)

3、通过ConfigMap批量添加env(变量名无法二次定义)

key=configmap中的key。value=configmap中的key的value

字段字段类型描述
pod.spec.contianers.envFromlist用于在容器中填充 环境变量的源列表 ,格式必须为C_IDENTIFIER(C语言标识符格式标准)。如果Key值无效则报告为事件,如果key重复,则以最后的为准,环境变量注入 无法被更新 。
pod.spec.containers.envFrom.configMapRefObject选择ConfigMap,注入环境变量
pod.spec.containers.envFrom.configMapRef.namestringConfigMap的名称
pod.spec.containers.optionalboolean(没学,不用看)指定configMap是否需要被预先定义好

4、通过数据卷插件使用configmap

将文件填入数据卷。key就是文件名,value就是文件内容

字段字段类型描述
pod.sepc.containers.volumeMountslist挂载一个卷
pod.sepc.containers.volumeMounts.namestring挂载的卷名
pod.sepc.containers.volumeMounts.mountPathsrting挂载到哪个目录下
pod.sepc.volumeslist定义卷
pod.sepc.volumes.namestring卷名
pod.sepc.volumes.name.configMapobject卷来源是configmap
pod.sepc.volumes.name.configMap.namestringconfigmap的名字

5、configmap的热更新(修改 pod annotations 的方式)

更新 ConfigMap 目前并不会触发相关 Pod 的滚动更新,可以通过修改 pod annotations 的方式强制触发滚动更新 这个例子里我们在 .spec.template.metadata.annotations 中添加 version/config,每次通过修改 version/config的值 来触发滚动更新

$ kubectl patch deployment nginx-test --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20190411" }}}}}'
#在其中添加此字段即可滚动更新,修改也可以触发滚动更新
  • 使用该 ConfigMap 挂载的 Env 不会同步更新
  • 使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新

注意:apps/v1版本的api接口,默认滚动幅度为25%

14、secret

1、service Account

用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。专门用于集群安全中pod的认证。

2、Opaque Secret

类似于 configmap,但是 value 字段是编码的value 数据必须是原数据经过 base64 编码以后的结果,secret 在使用的时候,value 会被自动解码

字段字段类型描述
secret.typestringsecret类型。有三种类型、service Account、opaque 、dockerconfigjson。本处写opaque
secret.datalist数据段。格式:key=value;value必须是过 base64 编码以后的结果

3、kubernetes.io/dockerconfigjson

使用 Kuberctl 命令创建 docker 仓库认证的 secret,命令中有写到。资源清单不在做描述

15、volume

1、emptyDir(空目录)

当 Pod 被分配给节点时,首先创建 emptyDir 卷,并且只要该 Pod 在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以读取和写入 emptyDir 卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除 Pod 时,emptyDir 中的数据将被永久删除

注意:emptyDir跟pod生命周期一致。容器崩溃不会从节点中移除 pod,因此 emptyDir 卷中的数据在容器崩溃时是安全的

用法:pod的暂存空间。(存放initC执行结果、容器运行产生元数据-mfsmaster的元数据日志)

字段字段类型描述
pod.spec.volumeslist定义卷
pod.spec.volumes.namestring卷名
pod.spec.volumes.emptyDirstring卷类型是emptydir。value值为{ }
emptyDir: {}
pod.sepc.containers.volumeMountslist挂载一个卷
pod.sepc.containers.volumeMounts.namestring挂载的卷名
pod.sepc.containers.volumeMounts.mountPathsrting挂载到哪个目录下

2、hostPath

hostPath卷将主机节点的文件系统中的文件或目录挂载到集群中,可对主机文件/目录进行判断,判断是否存在,存在是否合理,并做出动作

字段字段类型描述
pod.sepc.containers.volumeMountslist挂载一个卷
pod.sepc.containers.volumeMounts.namestring挂载的卷名
pod.sepc.containers.volumeMounts.mountPathsrting挂载到哪个目录下
pod.spec.volumeslist定义卷
pod.spec.volumes.namestring卷名
pod.spec.volumes.hostPathobject卷类型为hostpath
pod.spec.volumes.hostPath.pathstring卷的物理机路径(主机上的目录位置)
pod.spec.volumes.hostPath.typestringkey值填hostPath卷的类型。有八个值可选,下方详解。

hostPath卷类型的vlaue值


行为
空字符串(默认)用于向后兼容,这意味着在挂载 hostPath 卷之前不会执行任何检查。(不检查直接使用)
DirectoryOrCreate如果在给定的路径上没有任何东西存在,那么将根据需要在那里创建一个空目录,权限设置为 0755,与 Kubelet 具有相同的组和所有权**(就是节点所在的Kubelet创建的)。(如果目录不存在则创建一个空目录,存在的是个文件则报错)**
Directory给定的路径下必须存在目录,不存在则报错
FileOrCreate如果在给定的路径上没有任何东西存在,那么会根据需要创建一个空文件,权限设置为 0644,与 Kubelet 具有相同的组和所有权。(如果文件不存在则创建空文件,存在的是个目录则报错)
File给定的路径下必须存在文件,否则报错。
Socket给定的路径下必须存在 UNIX 套接字,否则报错。
CharDevice给定的路径下必须存在字符设备,否则报错。
BlockDevice给定的路径下必须存在块设备,否则报错。

16、PVC持久化卷

1、PV

类别是:PersistentVolume

PV 也是集群中的资源。 PV 是 Volume 之类的卷插件,但具有独立于使用 PV 的 Pod 的生命周期。可被PVC调用提供给pod

字段字段类型描述
spec.capacityobjectpv容量
spec.capacity.storagestringpv的大小。5Gi表示5GB
spec.volumeModestring卷模式。写Filesystem即可
spec.accessModesstring访问模式(读写策略)。三个值可选
ReadWriteOnce——该卷可以被单个节点以读/写模式挂载ReadOnlyMany——该卷可以被多个节点以只读模式挂载ReadWriteMany——该卷可以被多个节点以读/写模式挂载
spec.persistentVolumeReclaimPolicystring卷的回收策略,三个值可选
Retain(保留)——手动回收(基本都用这个)Recycle(回收)——基本擦除(rm -rf /thevolume/*
Delete(删除)——关联的存储资产,用于动态pv。此策略会将卷直接删除----节省成本
sepc.storageClassNamestring定义存储类的类名(是自定义的,严格匹配)
sepc.nfsobject通过nfs提供底层数据存储
sepc.nfs.pathstringnfs共享的路径
sepc.nfs.serverstringnfs的地址

Retain(保留)——手动回收(基本都用这个)

Recycle(回收)——基本擦除(rm -rf /thevolume/*

Delete(删除)——关联的存储资产(例如 AWS EBS、GCE PD、Azure Disk 和 OpenStack Cinder 卷)将被删除----节省成本

2、PVC

pvc是用户存储的请求。它与 Pod 相似。Pod 消耗节点资源,PVC 消耗 PV 资源。Pod 可以请求特定级别的资源(CPU 和内存)。声明可以请求特定的大小和访问模式(例如,可以以读/写一次或 只读多次模式挂载)

声明需要在StatefulSet控制器中进行声明

StatefulSet是为了 解决有状态服务的问题 (对应 Deployments 和 ReplicaSets 是为无状态服务而设计),需要配合无头服务Service使用

其特性包括:

  1. 稳定的存储:即 Pod 重新调度后还是能访问到相同的持久化数据,基于 PVC 来实现。

    PV卷的名称为:PodName+PV模板Name。

  2. 稳定的网络标识:即 Pod 重新调度后其 PodName 和 HostName(域名)不变,基于 Headless Service(即没有 Cluster IP 的 Service )来实现。

  3. 有序扩容:有序扩展,即 Pod 是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行

    即从 0 到 N-1,在 下一个 Pod 运行之前所有之前的 Pod 必须都是 Running 和 Ready 状态 ,基于 init containers 来实现。

    只有当第一个pod就绪以后才会创建第二个pod

  4. 有序的回收:有序删除(即从 N-1 到 0)

Service具有以下特点:

  1. 没有ClusterIP地址
  2. kube-proxy不会创建负载均衡转发规则
  3. Service是否有DNS域名解析取决于还Headless Service是否设置了Label Selector

此处直接提供资源清单。

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None     #无头svc
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"    #必须填写无头服务svc的名字
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: wangyanglinux/myapp:v1
        ports:
        - containerPort: 80
          name: web
        volumeMounts:  #卷绑定
        - name: www     
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:    #pvc的卷声明模板(一个pod对应一个pvc,跟随pod一起创建)
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]     #访问策略
      storageClassName: "nfs"      #使用存储类
      resources:
        requests:
          storage: 1Gi    #请求资源是1G  回收策略可不写

17、调度器

1、节点亲和性

匹配逻辑

匹配的是节点的标签。只要node符合该标签即为匹配成功

字段字段类型描述
pod.spec.schedulernamestring指定使用调度器(自定义调度器的使用)
pod.spec.affinityobjectpod的亲和性设置
pod.spec.affinity.nodeAffinityobject节点亲和性设置(硬亲和跟软亲和可在一起)
pod.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecutionobject节点硬亲和
硬亲和.nodeSelectorTermslist节点标签选择器
硬亲和.nodeSelectorTerms.matchExpressions匹配运算符。下面有多个选项的话,满足任何一个条件就可以了
硬亲和.nodeSelectorTerms.matchExpressions.matchExpressionslist匹配运算符
硬亲和.nodeSelectorTerms.matchExpressions.matchExpressions.keystring匹配节点标签的key
硬亲和.nodeSelectorTerms.matchExpressions.matchExpressions.operatorstring使用哪个运算符
In:label 的值在某个列表中
NotIn:label 的值不在某个列表中
Gt:label 的值大于某个值
Lt:label 的值小于某个值
Exists:某个 label 存在(key是否存在)
DoesNotExist:某个 label 不存在(key是否不存在)
硬亲和.nodeSelectorTerms.matchExpressions.matchExpressions.valueslist列表内写匹配的node标签值
pod.spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecutionobject节点软亲和
软亲和.weightstring软亲和权重范围在 1-100 之间(多个软亲和若产生冲突,选择权重高的)
软亲和.preferenceobject节点选择器条目,与权重(weight)相关
软亲和.preference.matchExpressionslist节点选择器条目,与权重(weight)相关
软亲和.preference.matchExpressionslist匹配运算符有多个选项的话,则必须同时满足这些条件才能正常调度
软亲和.preference.matchExpressions.matchExpressions.keystring匹配节点标签的key
软亲和.preference.matchExpressions…matchExpressions.operatorstring使用哪个运算符
In:label 的值在某个列表中
NotIn:label 的值不在某个列表中
Gt:label 的值大于某个值
Lt:label 的值小于某个值
Exists:某个 label 存在(key是否存在)
DoesNotExist:某个 label 不存在(key是否不存在)
软亲和.preference.matchExpressions.matchExpressions.valueslist列表内写匹配的node标签值

2、pod亲和性

匹配逻辑

pod亲和性匹配的是拓扑域,亲和的是拓扑域,反亲和的也是拓扑域。决定跟不跟pod在同一个拓扑域

1、首先在整个集群中寻找标签符合匹配条件的pod

2、找到该pod后,根据设置的拓扑域的key匹配其拓扑域的value

3、只要在设置的拓扑域的value与符合标签的pod的拓扑域的value一致,就可以建立pod

根据拓扑域匹配新的pod该建立在哪里,只要与上面符合条件的pod在同拓扑域即可。

拓扑域:在同一层次就属于同一拓扑域。例如:同一主机、同一机房、同一地区等等

pod亲和性不支持Gt、Lt运算符。

字段字段类型描述
pod.spec.affinityobjectpod的亲和性设置
pod.spec.affinity.podAffinityobjectpod亲和性设置
pod.spec.affinity.podAntiAffinityobjectpod反亲和性设置
pod亲和性.requiredDuringSchedulingIgnoredDuringExecutionlistpod硬亲和策略
pod亲和性.preferredDuringSchedulingIgnoredDuringExecutionlistpod软亲和策略

下方字段通过node亲和性一致

3、亲和性相关运算符

键值运算关系

  • In:label 的值在某个列表中
  • NotIn:label 的值不在某个列表中
  • Gt:label 的值大于某个值–pod不支持
  • Lt:label 的值小于某个值–pod不支持
  • Exists:某个 label 存在(key是否存在)
  • DoesNotExist:某个 label 不存在(key是否不存在
调度策略匹配标签操作符拓扑域支持调度目标
nodeAffinity主机In, NotIn, Exists, DoesNotExist, Gt, Lt指定主机
podAffinityPODIn, NotIn, Exists, DoesNotExistPOD与指定POD同一拓扑域
podAnitAffinityPOD1In, NotIn, Exists, DoesNotExistPOD与指定POD不在同一拓扑域

节点亲和性的前提条件是:

  1. 在指定拓扑域内,有目标Pod(设置为flag的Pod)。
  2. 如果是硬限制,则目标Pod的标签与matchExpressions中的条件(一个或多个)必须完全匹配。
  3. 如果是软限制,则目标Pod的标签,不是必须的,如果相匹配,还要考虑weight(1~100)关系。

4、固定节点调度

字段字段类型描述
Pod.spec.nodeNamestring固定节点调度,后边跟节点名,可以跳过污点
Pod.spec.nodeSelectorstring匹配节点标签进行调度,不会跳过污点。
类似于节点硬亲和,只会在符合匹配的节点上建立。节点不让建立则pending(等待调度)

18、污点与容忍

1、污点

# 设置污点
$ kubectl taint node 节点名 key1=value:NoSchedule

# 节点说明中,查找 Taints 字段
$ kubectl describe node  节点名  

# 去除污点
$ kubectl taint node 节点名  key=value:NoSchedule-   #加个  -  号

2、容忍字段

字段字段类型描述
pod.spec.tolerationslist容忍设置
pod.spec.tolerations.keystring污点的key
pod.spec.tolerations.operatorstring污点运算符
“Equal” #运算符是等于
pod.spec.tolerations.valuesrting污点的value
pod.spec.tolerations.effectstring污点的effect(效果)

19、RBAC

1、Role and ClusterRole

在 RBAC API 中,Role 表示一组规则权限,权限只会增加(累加权限),不存在一个资源一开始就有很多权限而通过 RBAC 对其进行减少的操作;Role 可以定义在一个 namespace 中,如果想要跨 namespace 则可以创建 ClusterRole

1)Role资源清单
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  namespace: default   #必须写,不写就会有个默认值是default
  name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group    #对哪个接口组版本的资源进行操作,不写就代表核心组:v1 
  resources: ["pods"]     #可进行操作的资源对象
  verbs: ["get", "watch", "list"]  #对上方资源的操作,一般写all即可,不同资源有不同操作,在开发者手册中有。get:获取这个pod。watch:监控。lsit:列出,加起来就是查看pod的信息
2)ClusterRole资源清单

ClusterRole 具有与 Role 相同的权限角色控制能力,不同的是 ClusterRole 是集群级别的,ClusterRole 可以用于:

  • 集群级别的资源控制( 例如 node 访问权限 )
  • 非资源型 endpoints( 例如 /health 访问 )
  • 所有命名空间资源控制(例如 pods )
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  # "namespace" omitted since ClusterRoles are not namespaced不能写名字空间
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

集群角色不能写名字空间

2、RoleBinding and ClusterRoleBinding

RoleBinding and ClusterRoleBinding是什么?

RoloBinding 可以将角色中定义的权限授予用户或用户组,RoleBinding 包含一组权限列表(subjects),权限列表中包含有不同形式的待授予权限资源类型(users, groups, or service accounts);RoloBinding 同样包含对被 Bind 的 Role 引用;RoleBinding 适用于某个命名空间内授权,而 ClusterRoleBinding 适用于集群范围内的授权

1. RoleBinding绑定Role

角色通过角色绑定,绑定给用户(user/group/sa)

​ 例如:将 default 命名空间的 pod-reader Role 授予 jane 用户,此后 jane 用户在 default 命名空间中将具有 pod-reader 的权限

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: read-pods 
  namespace: default      #角色所在的名字空间
subjects:  #绑定给说
- kind: User        #绑定给用户
  name: jane        #jane用户
  apiGroup: rbac.authorization.k8s.io      #接口组版本
roleRef:          #角色来源
  kind: Role       #来源于角色
  name: pod-reader   #来源哪个角色用户
  apiGroup: rbac.authorization.k8s.io
2. RoleBinding绑定ClusterRole

集群角色通过集群角色绑定,绑定给用户(user/group/sa)

RoleBinding 同样可以引用 ClusterRole 来对当前 namespace 内用户、用户组或 ServiceAccount 进行授权,这种操作允许集群管理员在整个集群内定义一些通用的 ClusterRole,然后在不同的 namespace 中使用 RoleBinding 来引用

例如:以下 RoleBinding 引用了一个 ClusterRole,这个 ClusterRole 具有整个集群内对 secrets 的访问权限;但是其授权用户 dave 只能访问 development 空间中的 secrets(因为 RoleBinding 定义在 development 命名空间)

# This role binding allows "dave" to read secrets in the "development" namespace.
#这个角色绑定允许“dave”读取“dev”命名空间中的信息。
kind: RoleBinding          #资源类型
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: read-secrets
  namespace: dev # 这只授予“dev”名称空间内的权限。必写
subjects:
- kind: User
  name: dave
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole      #角色来源于集群角色
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io
3.ClusterRoleBinding绑定ClusterRole

集群角色通过角色绑定,绑定给用户(user/group/sa)。将集群角色权限限制在角色名字空间下

使用 ClusterRoleBinding 可以对整个集群中的所有命名空间资源权限进行授权;以下 ClusterRoleBinding 样例展示了授权 manager 组内所有用户在全部命名空间中对 secrets 进行访问

# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace.
#此集群角色绑定允许“manager”组中的任何人读取任何名称空间中的秘密。
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: read-secrets-global
subjects:
- kind: Group
  name: manager
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io

3、Resources(子资源)

Kubernetes 集群内一些资源一般以其名称字符串来表示,这些字符串一般会在 API 的 URL 地址中出现;同时某些资源也会包含子资源,例如 logs 资源就属于 pods 的子资源,API 中 URL 样例如下

GET /api/v1/namespaces/{namespace}/pods/{name}/log

/api/v1/namespaces/default/pods/pod-demo/log

例如:如果要在 RBAC 授权模型中控制这些子资源的访问权限,可以通过 / 分隔符来实现,以下是一个定义 pods 资资源 logs 访问权限的 Role 定义样例

kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  namespace: default
  name: pod-and-pod-logs-reader
rules:
- apiGroups: [""]
  resources: ["pods", "pods/log"]  #这里添加了两个权限。pods权限,pods/log权限。pods权限包含pods/log权限,这里写pods/log就是给看看写的格式。
  verbs: ["get", "list"]

4、to Subjects

(权利附着点:user、group、sa)

权利附着点命名方式

RoleBinding 和 ClusterRoleBinding 可以将 Role 绑定到 Subjects;Subjects 可以是 groups、users 或者 service accounts

  1. Subjects 中 Users 使用字符串表示,

    ​ 它可以是一个普通的名字字符串,如 “alice”;

    ​ 也可以是 email 格式的邮箱地址,如 “wangyanglinux@163.com”;

    ​ 甚至是一组字符串形式的数字 ID 。

    但是 Users 的前缀 system: 是系统保留的,集群管理员应该确保普通用户不会使用这个前缀格式

  2. Groups 书写格式与 Users 相同,都为一个字符串,并且没有特定的格式要求;同样 system: 前缀为系统保留

20、资源限制

参数含义
spec.container[].resources.requests.cpu容器初始要求的CPU数量(Pod运行可能不需要要求的CPU,但必须分配,不能被其他Pod使用)。
spec.container[].resources.limits.cpu容器所能使用的最大CPU数量(单位:500m=0.5)。
spec.container[].resources.requests.memory容器初始要求的内存数量(可以不用,必须分配,不能被其他Pod使用)
spec.container[].resources.requests.memory容器能使用的最大内存数量(单位:Ki,Mi,Gi,Ti,Pi,Ei)
字段描述
.kind LimitRange(指定资源限制对象类型),注意,需要在metadata中指定命名空间。
.spec.limits[].default设置默认的CPU和memory
.spec.limits[].defaultRequest设置默认的请求值
.spec.limits[].max设置Pod可以请求的(在Pod中设置的)最大资源限制
.spec.limits[].min设置Pod可以请求的(在Pod中设置的)最小资源限制
量(单位:500m=0.5)。
spec.container[].resources.requests.memory容器初始要求的内存数量(可以不用,必须分配,不能被其他Pod使用)
spec.container[].resources.requests.memory容器能使用的最大内存数量(单位:Ki,Mi,Gi,Ti,Pi,Ei)
字段描述
.kind LimitRange(指定资源限制对象类型),注意,需要在metadata中指定命名空间。
.spec.limits[].default设置默认的CPU和memory
.spec.limits[].defaultRequest设置默认的请求值
.spec.limits[].max设置Pod可以请求的(在Pod中设置的)最大资源限制
.spec.limits[].min设置Pod可以请求的(在Pod中设置的)最小资源限制
.spec.limits[].maxLimitRequestRatio设置默认超售值,Pod可以使用可以超过的的最大资源限制。
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐