2.k8s资源清单

2023-05-24,,

一、常见资源对象

常见的资源对象:(包括但不仅限于)

l  Workload: Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob

l  服务发现及均衡:Service,Ingress……

l  配置与存储:Volume,CSI(扩展第三方存储的接口)

ConfigMap,Secret

DownwardAPI

l  集群级资源:Namespace,Node,Role,ClusterRole,RoleBinding,ClusterRoleBinding

l  元数据型资源:HPA,PodTemplate,LimitRange

二、创建资源的方法

创建资源的方法:

1、apiServer仅接受Json格式的资源定义;

2、yaml格式提供配置清单,apiserver可自动将其转为json格式,而后再提交执行。

大部分资源的配置清单都有5个一级字段:

apiVersion:group/version(通过$ kubectl api-versions获取所有支持的apiVerison)

kind:资源类别

metadata:元数据

name

namespace

labels  标签,键值

annotations 资源注解

spec:不同的资源类别,此字段不完全相同;定义用户期望的状态

status:当前状态,current state;本字段由k8s维护,用户不能自己定义。

注:每个资源的引用PATH:/api/GROUP/VERSION/namespaces/NAMESPACE/TYPE/NAME(大写需替换为实际值)

[kubelet@master ~]$ kubectl explain pod.metadata #获取pod的资源清单的定义字段

三、资源清单spec字段

# kubectl explain pods.spec.containers    #查看定义字段
Pod资源:
spec.containers <[]object>
spec.containers.name <string> #pod的名称,必须字段,名称唯一且对象创建后不可以被修改
spec.containers.image <string> #镜像仓库的路径/镜像的名称:镜像的标签
spec.containers.image.imagePullPolicy <string> #镜像的下载策略。有三种:Always(总是去仓库下载) ,Never(从不去仓库下载) , IfNotPresent(如果本地没有就去仓库下载)
默认是"IfNotPresent" 但是,如果镜像的标签是latest,则总会是"Always,并且对象一旦被创建,这个字段不允许被改变
spec.containers.ports:       #容器公开的端口列表。在这里公开端口可以为系统提供关于容器使用的网络连接的额外信息,但主要是提供信息。在这里不指定端口不会阻止该端口被公开。任何监听容器内默认的“0.0.0.0”地址的端口都可以从网络访问
spec.containers.ports.containerPort <integer> -required- #pod暴露的端口,此端口仅是额外的信息,对端口是否被暴露没有影响
spec.containers.ports.hostPort <integer> #主机上公开的端口
spec.containers.ports.protocol <string> #端口的协议,没给协议,默认是tcp协议
spec.containers.ports.hostIP <string> #指定要绑定的主机
spec.containers.command <[]string> #运行的程序,类似于docker中的entrypiont,并且这里的命令不会运行在shell中,如果没有这个字段docker镜像会运行自己entrypiont中的指令
spec.containers.args <[]string> #向docker镜像中传递参数 如果定义了这个字段,docker镜像中cmd命令不会被执行,如果引用变量使用$(VAR_NAME)格式引用,如果想使用命令引用的的方式,需要使用$$(VAR_NAME)方式来引用
#关于args和command的官方文档链接:https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/ 
Tips: 修改镜像中的默认应用使用command,args。command args 分别对应image entrypoint image cmd。优先生效自定义的command,args,如果未定义command,定义了args,则args传递给image entrypoint。
pod.spec.containers.volumeMounts
  pod.spec.containers.volumeMounts.name
  pod.spec.containers.volumeMounts.mountPath #可以被容器挂载的存储卷的路径,路径不能包含':' 符号
  pod.spec.containers.volumeMounts.subPath #可以被容器挂载的存储卷的路径,并且不会覆盖挂载点中的文件
  pod.spec.containers.volumeMounts.readOnly #是否只读,默认为false
pod.spec.containers.resources
  spec.containers.resources.limits #资源限制
    spec.containers.resources.limits.cpu : CPU 上限,可以短暂超过,容器也不会被停止
    spec.containers.resources.limits.memory :内存上限,不可以超过;如果超过,容器可能会被终止或调度到其他资源充足的机器上
  spec.containers.resources.requests #资源需求
    spec.containers.resources.requests.cpu : CPU 请求,也是调度 CPU 资源的依据, 可以超过
    spec.containers.resources.requests.memory :内存请求,也是调度内存资源的依据, 可以超过;但如果超过,容器可能会在 Node 内存不足时清理

# kubectl label --help  #给资源对象打标签

# 标签key=value,

key只能字母,数字,“_”,“-”,“.”, value可以为空,key和value只能以字母和数字开头及结尾,;key和value最多只能63个字符。键前缀必须使用域名,且不能大于253个字符。

# 标签选择器:

等值关系:=,==,!=

集合关系:    KEY in (VALUE1,VALUE2,VALUE3)

KEY notin  (VALUE1,VALUE2,VALUE3)   # 不存在KEY也符合条件

节点标签选择器:

spec.nodeSelector <map[string]string>  #节点标签选择器

pod.spec.nodeSelector: #指定对象的调度节点,节点必须存在

annotations:

与label不同的地方在于,不能用于挑选资源对象,仅用于为对象提供“元数据”。字符没有键长度,值长度限制。

四、Tips

# kubectl get pod pod-id –o yaml  #以yaml形式输出pod清单

定义资源的三种方式:Kubectl 命令行、命令式资源清单、声明式资源清单

2.k8s资源清单的相关教程结束。

《2.k8s资源清单.doc》

下载本文的Word格式文档,以方便收藏与打印。