K8s-对象资源格式&&标签

root
233
文章
0
评论
2020年8月9日13:21:13 评论 7878字阅读26分15秒

对象资源格式

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对象,仅可用于资源提供“元数据”信息。另外,注解中的元数据不受字符数量的限制,它可大可小,可以为结构化或非结构化形式,也支持使用在标签中禁止使用的其他字符。

 

 

 

 

继续阅读
weinxin
我的微信
这是我的微信扫一扫
  • 文本由 发表于 2020年8月9日13:21:13
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
k8s-Service Account Kubernetes

k8s-Service Account

k8s-Service Account的授权管理 Service Account也是一种账号,是给运行在Pod里的进程提供了必要的身份证明。需要在Pod定义中指明引用的Service Account,...
k8s-RBAC Kubernetes

k8s-RBAC

k8s-RBAC认证授权策略 RBAC介绍 在Kubernetes中,所有资源对象都是通过API进行操作,他们保存在etcd里。而对etcd的操作我们需要通过访问 kube-apiserver 来实现...
k8s-Secret Kubernetes

k8s-Secret

配置管理中心Secret Secret是什么? Configmap一般是用来存放明文数据的,如配置文件,对于一些敏感数据,如密码、私钥等数据时,要用secret类型 Secret解决了密码、token...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: