对象资源格式
Kubernetes API仅接受及响应JSON格式的数据(JSON对象),同时,为了便于使用,它也允许用户提供YAML格式的POST对象,但API Server需要实现自行将其转换为JSON格式后方能提交。API Server接受和返回的所有JSON对象都遵循同一个模式,它们都具有kind和apiVersion字段,用于标识对象所属的资源类型、API群组及相关的版本
大多数的对象或列表类型的资源提供元数据信息,如名称、隶属的名称空间和标签等;spec则用于定义用户期望的状态,不同的资源类型,其状态的意义也各有不同,例如Pod资源最为核心的功能在于运行容器;而status则记录着活动对象的当前状态信息,它由Kubernetes系统自行维护,对用户来说为只读字
大部分资源的配置清单由以下5个字段组成
apiVersion: 指明api资源属于哪个群组和版本,同一个组可以有多个版本 group/version
# kubectl api-versions 命令可以获取
kind: 资源类别,标记创建的资源类型,k8s主要支持以下资源类别
Pod、ReplicaSet、Deployment、StatefulSet、DaemonSet、Job、Cronjob
metadata: 用于描述对象的属性信息,主要提供以下字段:
- name: 指定当前对象的名称,其所属的名称空间的同一类型中必须唯一
- namespace: 指定当前对象隶属的名称空间,默认值为default
- labels: 设定用于标识当前对象的标签,键值数据,常被用作挑选条件
- annotations: 非标识型键值数据,用来作为挑选条件,用于labels的补充
spec: 用于描述所期望的对象应该具有的状态(disired state),资源对象中最重要的字段
status: 用于记录对象在系统上的当前状态(current state),本字段由kubernetes自行维护
pod控制器模板
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp
image: nginx:1.13
command:
- "/bin/sh"
- "-c"
- "sleep 3600"
[root@master01 ~]# kubectl apply -f pod-demo.yaml pod/pod-demo created [root@master01 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE pod-demo 1/1 Running 0 6s
Pod资源spec的containers字段解析
[root@master01 ~]# kubectl explain pods.spec.containers
name <string> 指定容器名称
image <string> 指定容器所需镜像仓库及镜像名,例如ikubernetes/myapp:v1
imagePullPolicy <string> (可取以下三个值Always,Never,IfNotpresent)
- Always:镜像标签为“latest”时,总是去指定的仓库中获取镜像 【默认】
- Never:禁止去仓库中下载镜像,即仅使用本地镜像
- IfNotpresent:如果本地没有该镜像,则去镜像仓库中下载镜像
这里还有一种是镜像仓库的认证
把镜像仓库的凭据保存在k8s中,拉取的时候使用这个凭据
保存凭据的方法
apiVersion: v1 kind: Pod metadata: name: foo namespace: awesomeapps spec: containers: - name: foo image: janedoe/awesomeapp:v1 imagePullSecrets: - name: myregistrykey #这里的名字就是下面NAME叫什么
相关命令
Usage: kubectl create secret docker-registry NAME --docker-username=user --docker-password=password --docker-email=email [--docker-server=string] [--from-literal=key1=value1] [--dry-run=server|client|none] [options]
ports <[]Object> 值是一个列表,由一到多个端口对象组成。例如:(名称(可后期调用) 端口号协议暴露在的地址上) 暴露端口只是提供额外信息的,不能限制系统是否真的暴露
- containerPort <integer> 指定暴露的容器端口
- name <string> 当前端口的名称
- hostIP <string> 主机端口要绑定的主机IP
- hostPort <integer> 主机端口,它将接收到请求通过NAT转发至containerPort字段指定的端口
- protocol <string> 端口的协议,默认是TCP
args <[]string> 传递参数给command 相当于docker中的CMD
command <[]string> 相当于docker中的ENTRYPOINT
apiVersion: v1 kind: Pod metadata: name: pod-demo namespace: default labels: app: myapp tier: frontend spec: containers: - name: myapp image: nginx:1.13 imagePullPolicy: IfNotPresent ports: - containerPort: 80 protocol: TCP
镜像中的命令和pod中定义的命令关系说明:
如果pod中没有提供command或者args,则使用docker中的CMD和ENTRYPOINT。
如果pod中提供了command但不提供args,则使用提供的command,忽略docker中的Cmd和Entrypoint。
如果pod中只提供了args,则args将作为参数提供给docker中的Entrypoint使用。
如果pod中同时提供了command和args,则docker中的cmd和Entrypoint将会被忽略,pod中的args将最为参数给cmd使用。
标签和标签选择器
标签
标签是Kubernetes极具特色的功能之一,它能够附加于Kubernetes的任何资源对象之上。简单来说,标签就是“键值”类型的数据,可以在资源创建时直接指定,也可以随时按需添加到活动对象中。而后即可由标签选择器进行匹配度检查从而完成资源挑选。一个对象可拥有不止一个标签,而同一个标签也可以被添加到至多个资源之上。
key=value
- key:字母、数字、_、-、. 只能以字母或者数字开头
- value:可以为空,只能以字母或者数字开头及结尾,中间可以使用字母、数字、_、-、.
- 在实际环境中,尽量做到见名知意,且尽可能保持简单 --> 写脚本“命名”
[root@k8s-master ~]# kubectl get pods --show-labels #查看pod信息时,并显示对象的标签信息 pod-demo 2/2 Running 5 5h13m app=myapp,tier=frontend [root@k8s-master ~]# kubectl get pods -l app #过滤包含app标签的pod pod-demo 2/2 Running 5 5h20m [root@k8s-master ~]# kubectl get pods -l app,tier #过滤同时包含app,tier标签的pod pod-demo 2/2 Running 5 5h20m [root@k8s-master ~]# kubectl get pods -L app #显示有app键的标签信息 pod-demo 2/2 Running 5 5h21m myapp [root@k8s-master ~]# kubectl get pods -L app,tier #显示有app和tier键的标签信息 pod-demo 2/2 Running 5 5h21m myapp frontend
给已有的pod添加标签,通过kubectl label命令
[root@master01 ~]# kubectl label pods/nginx-x 23=kk pod/nginx-x labeled [root@master01 ~]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-x 1/1 Running 0 20h 23=kk,run=nginx-x,xx=hewenfu pod-demo 1/1 Running 1 20h app=myapp,tier=frontend
pods------执行器的类型
给已有的pod修改标签,通过kubectl label命令
[root@master01 ~]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-x 1/1 Running 0 20h 23=kk,run=nginx-x,xx=hewenfu pod-demo 1/1 Running 1 20h app=myapp,tier=frontend [root@master01 ~]# kubectl label -n default pods/nginx-x 23=ww --overwrite pod/nginx-x labeled [root@master01 ~]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-x 1/1 Running 0 20h 23=ww,run=nginx-x,xx=hewenfu pod-demo 1/1 Running 1 20h app=myapp,tier=frontend
删除标签
删除一个Label,只需在命令行最后指定Label的key名并与一个减号相连即可:
$ kubectl label nodes 1.1.1.1 role-
[root@master01 ~]# kubectl label -n default pods/nginx-x 23- pod/nginx-x labeled [root@master01 ~]# kubectl get pod --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-x 1/1 Running 0 20h run=nginx-x,xx=hewenfu pod-demo 1/1 Running 1 20h app=myapp,tier=frontend
标签选择器
标签选择器用于选择标签的查询条件或选择标准,kubernetes API目前支持两个选择器:基于等值关系以及基于集合关系。例如,env=production和env!=qa是基于等值关系的选择器,而tier in(frontend,backend)则是基于集合关系的选择器。使用标签选择器时还将遵循以下逻辑:
1)同时指定的多个选择器之间的逻辑关系为“与”操作
2)使用空值的标签选择器意味着每个资源对象都将被选中
3)空的标签选择器将无法选出任何资源。
等值关系标签选择器:
- "="、“==”和“!=”三种,其中前两个意义相同,都表示等值关系;最后一个表示不等关系。
集合关系标签选择器:
- KEY in(VALUE1,VALUE2,...):指定的健名的值存在于给定的列表中即满足条件
- KEY notin(VALUE1,VALUE2,...):指定的键名的值不存在与给定的列表中即满足条件
- KEY:所有存在此健名标签的资源。
- !KEY:所有不存在此健名标签的资源。
1.等值关系示例:
[root@k8s-master ~]# kubectl get pods -l app=myapp #过滤标签键为app值为myapp的pod pod-demo 2/2 Running 6 6h11m [root@k8s-master ~]# kubectl get pods -l app=myapp,env=testing #过滤标签键为app值为myqpp,并且标签键为env值为testing的pod pod-demo 2/2 Running 6 6h11m [root@k8s-master ~]# kubectl get pods -l app!=my #过滤标签键为app值不为my的所有pod pod-demo 2/2 Running 6 6h17m
2.集合关系示例:
[root@k8s-master ~]# kubectl get pods -l "app in (myapp)" #过滤键为app值有myapp的pod pod-demo 2/2 Running 6 6h51m [root@k8s-master ~]# kubectl get pods -l "app notin (my)" #过滤键为app值没有my的pod pod-demo 2/2 Running 6 6h59m
此外,kubernetes的诸多资源对象必须以标签选择器的方式关联到pod资源对象,例如Service、Deployment和ReplicaSet类型的资源等,它们在spec字段中嵌套使用嵌套的“selector”字段,通过“matchlabels”来指定标签选择器,有的甚至还支持使用“matchExpressions”构建复杂的标签选择器机制。
- matchLabels:通过直接给定键值对来指定标签选择器
- matchExpressions:基于表达式指定的标签选择器列表,每个选择器都形如“{key:KEY_NAME,operator:OPERATOR, values:[VALUE1,VALUE2,...]}”
节点选择器
pod节点选择器是标签及标签选择器的一种应用,它能够让pod对象基于集群中工作节点的标签来挑选倾向运行的目标节点。
给node的节点添加标签
[root@master01 ~]# kubectl get node --show-labels NAME STATUS ROLES AGE VERSION LABELS k8s-master1 Ready <none> 2d7h v1.18.6 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master1,kubernetes.io/os=linux k8s-node1 Ready <none> 2d7h v1.18.6 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux k8s-node2 Ready <none> 2d7h v1.18.6 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux [root@master01 ~]# kubectl label nodes/k8s-node1 kk=hewenfu node/k8s-node1 labeled [root@master01 ~]# kubectl get nodes --show-labels NAME STATUS ROLES AGE VERSION LABELS k8s-master1 Ready <none> 2d7h v1.18.6 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master1,kubernetes.io/os=linux k8s-node1 Ready <none> 2d7h v1.18.6 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kk=hewenfu,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux k8s-node2 Ready <none> 2d7h v1.18.6 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux
修改node的节点添加标签
[root@master01 ~]# kubectl label nodes/k8s-node1 kk=xxxx --overwrite
node/k8s-node1 labeled
指定pod运行到指定node节点
nodeSelector: kk: xxxx
kk:--------node节点里定义的标签,在pod的yaml文件里使用nodeSelector选择器进行选择
[root@master01 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-x 1/1 Running 0 21h 10.244.0.6 k8s-node1 <none> <none>
pod-demo 1/1 Running 1 21h 10.244.1.6 k8s-master1 <none> <none>
pod-demo-x 1/1 Running 0 19s 10.244.0.7 k8s-node1 <none> <none>
[root@master01 ~]# kubectl describe -n default pod pod-demo-x
Volumes:
default-token-qzrtj:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-qzrtj
Optional: false
QoS Class: BestEffort
Node-Selectors: kk=xxxx
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
资源的注解
除了标签(label)之外,Pod与其他各种资源还能使用资源注解(annotation)。与标签类似,注解也是“键值”类型的数据,不过它不能用于标签及挑选Kubernetes对象,仅可用于资源提供“元数据”信息。另外,注解中的元数据不受字符数量的限制,它可大可小,可以为结构化或非结构化形式,也支持使用在标签中禁止使用的其他字符。

评论