java系统找不到指定文件怎么解决
231
2022-09-11
(四)Kubernetes 资源清单定义
Kubernetes常用资源对象
依据资源的主要功能作为分类标准,Kubernetes的API对象大体可分为五个类别,如下:
类型 | 名称 |
工作负载(Workload) | Pod、ReplicaSet、Deployment、StatefulSet、DaemonSet、Job、Cronjob |
负载均衡(Discovery &LB) | Service、Ingress |
配置和存储(Config&Storage) | Volume、CSI、ConfigMap、Secret、DownwardAPI |
集群(Cluster) | Namespace、Node、Role、ClusterRole、RoleBinding、ClusterRoleBinding |
元数据(metadata) | HPA、PodTemplate、LimitRange |
对象资源格式
Kubernetes API 仅接受及响应JSON格式的数据(JSON对象),同时,为了便于使用,它也允许用户提供YAML格式的POST对象,但API Server需要实现自行将其转换为JSON格式后方能提交。API Server接受和返回的所有JSON对象都遵循同一个模式,它们都具有kind和apiVersion字段,用于标识对象所属的资源类型、API群组及相关的版本。大多数的对象或列表类型的资源提供元数据信息,如名称、隶属的名称空间和标签等;spec则用于定义用户期望的状态,不同的资源类型,其状态的意义也各有不同,例如Pod资源最为核心的功能在于运行容器;而status则记录着活动对象的当前状态信息,它由Kubernetes系统自行维护,对用户来说为只读字段。
获取对象的JSON格式的配置清单可以通过"kubectl get TYPE/NAME -o yaml"命令来获取。
[root@k8s-master ~]# kubectl get pod nginx-67685f79b5-8rjk7 -o yaml #获取该pod的配置清单apiVersion: v1kind: Podmetadata: creationTimestamp: "2019-08-30T07:00:30Z" generateName: nginx-67685f79b5- labels: pod-template-hash: 67685f79b5 run: nginx name: nginx-67685f79b5-8rjk7 namespace: default ownerReferences: - apiVersion: apps/v1 blockOwnerDeletion: true controller: true kind: ReplicaSet name: nginx-67685f79b5 uid: 6de479a9-52f6-4581-8e06-884a84dab593 resourceVersion: "244953" selfLink: /api/v1/namespaces/default/pods/nginx-67685f79b5-8rjk7 uid: 0b6f5a87-4129-4b61-897a-6020270a846espec: containers: - image: nginx:1.12 imagePullPolicy: IfNotPresent name: nginx resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /var/run/secrets/kubernetes.io/serviceaccount name: default-token-s8mbf readOnly: true dnsPolicy: ClusterFirst enableServiceLinks: true nodeName: k8s-node1 priority: 0 restartPolicy: Always schedulerName: default-scheduler securityContext: {} serviceAccount: default serviceAccountName: default terminationGracePeriodSeconds: 30 tolerations: - effect: NoExecute key: node.kubernetes.io/not-ready operator: Exists tolerationSeconds: 300 - effect: NoExecute key: node.kubernetes.io/unreachable operator: Exists tolerationSeconds: 300 volumes: - name: default-token-s8mbf secret: defaultMode: 420 secretName: default-token-s8mbfstatus: conditions: - lastProbeTime: null lastTransitionTime: "2019-08-30T07:00:30Z"
创建资源的方法
apiserver仅接受JSON格式的资源定义yaml格式提供资源配置清单,apiserver可自动将其转为json格式,而后再提交
大部分资源的配置清单由以下5个字段组成
apiVersion: 指明api资源属于哪个群组和版本,同一个组可以有多个版本 group/version # kubectl api-versions 命令可以获取kind: 资源类别,标记创建的资源类型,k8s主要支持以下资源类别 Pod、ReplicaSet、Deployment、StatefulSet、DaemonSet、Job、Cronjobmetadata: 用于描述对象的属性信息,主要提供以下字段: name: 指定当前对象的名称,其所属的名称空间的同一类型中必须唯一 namespace: 指定当前对象隶属的名称空间,默认值为default labels: 设定用于标识当前对象的标签,键值数据,常被用作挑选条件 annotations: 非标识型键值数据,用来作为挑选条件,用于labels的补充spec: 用于描述所期望的对象应该具有的状态(disired state),资源对象中最重要的字段。status: 用于记录对象在系统上的当前状态(current state),本字段由kubernetes自行维护
kubernetes存在内嵌的格式说明,定义资源配置清单时,可以使用kubectl explain命令进行查看,如查看Pod这个资源的定义:
[root@k8s-master ~]# kubectl explain podsKIND: PodVERSION: v1DESCRIPTION: Pod is a collection of containers that can run on a host. This resource is created by clients and scheduled onto hosts.FIELDS: apiVersion
配置清单模式创建Pod
[root@k8s-master ~]# mkdir manfests [root@k8s-master ~]# cd manfests/[root@k8s-master manfests]# vim pod-demo.yamlapiVersion: v1kind: Podmetadata: name: pod-demo namespace: default labels: app: myapp tier: frontendspec: containers: - name: myapp image: ikubernetes/myapp:v1 - name: busybox image: busybox:latest command: - "/bin/sh" - "-c" - "sleep 3600"[root@k8s-master manfests]# kubectl create -f pod-demo.yaml pod/pod-demo created[root@k8s-master manfests]#[root@k8s-master manfests]# kubectl get pods NAME READY STATUS RESTARTS AGEpod-demo 2/2 Running 0 15s[root@k8s-master manfests]# kubectl describe pods pod-demo #查看pod详细信息[root@k8s-master manfests]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESpod-demo 2/2 Running 0 102s 10.244.1.17 k8s-node1
Pod资源spec的containers字段解析
[root@k8s-master ~]# kubectl explain pods.spec.containersname
镜像中的命令和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信息时,并显示对象的标签信息NAME READY STATUS RESTARTS AGE LABELSpod-demo 2/2 Running 5 5h13m app=myapp,tier=frontend[root@k8s-master ~]# kubectl get pods -l app #过滤包含app标签的podNAME READY STATUS RESTARTS AGEpod-demo 2/2 Running 5 5h20m[root@k8s-master ~]# kubectl get pods -l app,tier #过滤同时包含app,tier标签的podNAME READY STATUS RESTARTS AGEpod-demo 2/2 Running 5 5h20m[root@k8s-master ~]# kubectl get pods -L app #显示有app键的标签信息NAME READY STATUS RESTARTS AGE APPpod-demo 2/2 Running 5 5h21m myapp[root@k8s-master ~]# kubectl get pods -L app,tier #显示有app和tier键的标签信息NAME READY STATUS RESTARTS AGE APP TIERpod-demo 2/2 Running 5 5h21m myapp frontend
1)给已有的pod添加标签,通过kubectl label命令
[root@k8s-master ~]# kubectl label --help Usage: kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N[--resource-version=version] [options][root@k8s-master ~]# kubectl label pods/pod-demo env=production #给pod资源pod-demo添加env标签值为productionpod/pod-demo labeled[root@k8s-master ~]# kubectl get pods --show-labelsNAME READY STATUS RESTARTS AGE LABELSpod-demo 2/2 Running 5 5h32m app=myapp,env=production,tier=frontend
2)修改已有的标签的值
[root@k8s-master ~]# kubectl label pods/pod-demo env=testing --overwrite #同上面添加标签一样,只是添加--overwrite参数pod/pod-demo labeled[root@k8s-master ~]# [root@k8s-master ~]# kubectl get pods --show-labelsNAME READY STATUS RESTARTS AGE LABELSpod-demo 2/2 Running 5 5h39m app=myapp,env=testing,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的podNAME READY STATUS RESTARTS AGEpod-demo 2/2 Running 6 6h11m[root@k8s-master ~]# kubectl get pods -l app=myapp,env=testing #过滤标签键为app值为myqpp,并且标签键为env值为testing的podNAME READY STATUS RESTARTS AGEpod-demo 2/2 Running 6 6h11m[root@k8s-master ~]# kubectl get pods -l app!=my #过滤标签键为app值不为my的所有podNAME READY STATUS RESTARTS AGEpod-demo 2/2 Running 6 6h17m
2)集合关系示例:
[root@k8s-master ~]# kubectl get pods -l "app in (myapp)" #过滤键为app值有myapp的podNAME READY STATUS RESTARTS AGEpod-demo 2/2 Running 6 6h51m[root@k8s-master ~]# kubectl get pods -l "app notin (my)" #过滤键为app值没有my的podNAME READY STATUS RESTARTS AGEpod-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对象基于集群中工作节点的标签来挑选倾向运行的目标节点。
#在定义pod资源清单时,可以通过nodeName来指定pod运行的节点,或者通过nodeSelector来挑选倾向的节点[root@k8s-master ~]# kubectl explain pods.spec nodeName
给节点添加标签
[root@k8s-master ~]# kubectl label nodes/k8s-node1 disktype=ssdnode/k8s-node1 labeled[root@k8s-master ~]# kubectl get nodes --show-labelsNAME STATUS ROLES AGE VERSION LABELSk8s-master Ready master 6d2h v1.15.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/master=k8s-node1 Ready
修改yaml文件,添加节点选择器nodeSelector,然后重新创建pod
[root@k8s-master ~]# vim manfests/pod-demo.yamlapiVersion: v1kind: Podmetadata: name: pod-demo namespace: default labels: app: myapp tier: frontendspec: containers: - name: myapp image: ikubernetes/myapp:v1 ports: - name: containerPort: 80 - name: busybox image: busybox:latest command: - "/bin/sh" - "-c" - "sleep 3600" nodeSelector: disktype: ssd [root@k8s-master ~]# kubectl delete -f manfests/pod-demo.yaml #删除上面创建的pod资源pod "pod-demo" deleted[root@k8s-master ~]# kubectl create -f manfests/pod-demo.yaml #重新创建pod-demo资源pod/pod-demo created[root@k8s-master ~]# kubectl get pods -o wide #查看pod,可以看到分配到了k8s-node1节点(也就是上面打上disktype标签的节点)NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESpod-demo 2/2 Running 0 16s 10.244.1.19 k8s-node1
资源注解
除了标签(label)之外,Pod与其他各种资源还能使用资源注解(annotation)。与标签类似,注解也是“键值”类型的数据,不过它不能用于标签及挑选Kubernetes对象,仅可用于资源提供“元数据”信息。另外,注解中的元数据不受字符数量的限制,它可大可小,可以为结构化或非结构化形式,也支持使用在标签中禁止使用的其他字符。
人生是条无名的河,是浅是深都要过; 人生是杯无色的茶,是苦是甜都要喝; 人生是首无畏的歌,是高是低都要唱。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~