资源及其在API中的组织形式
1 [root@k8s-master01 ~]# kubectl api-versions 2 admissionregistration.k8s.io/v1 3 admissionregistration.k8s.io/v1beta1 4 apiextensions.k8s.io/v1 5 apiextensions.k8s.io/v1beta1 6 apiregistration.k8s.io/v1 7 apiregistration.k8s.io/v1beta1 8 apps/v1 9 authentication.k8s.io/v1 10 authentication.k8s.io/v1beta1 11 authorization.k8s.io/v1 12 authorization.k8s.io/v1beta1 13 autoscaling/v1 14 autoscaling/v2beta1 15 autoscaling/v2beta2 16 batch/v1 17 batch/v1beta1 18 certificates.k8s.io/v1 19 certificates.k8s.io/v1beta1 20 coordination.k8s.io/v1 21 coordination.k8s.io/v1beta1 22 discovery.k8s.io/v1beta1 23 events.k8s.io/v1 24 events.k8s.io/v1beta1 25 extensions/v1beta1 26 networking.k8s.io/v1 27 networking.k8s.io/v1beta1 28 node.k8s.io/v1beta1 29 policy/v1beta1 30 rbac.authorization.k8s.io/v1 31 rbac.authorization.k8s.io/v1beta1 32 scheduling.k8s.io/v1 33 scheduling.k8s.io/v1beta1 34 storage.k8s.io/v1 35 storage.k8s.io/v1beta1 36 v1
在当前集群中,API Server所支持的API群组及其相关版本信息可以通过kubectl api-servions命令获取,如上命令结果显示的多数API群组会在配置清单时用到。
例如:
apiVersion:v1
apiVersion:apps/v1
对象类资源配置规范(配置清单由5个(核心)一级字段组成)
1 [root@k8s-master01 ~]# kubectl get namespace kube-system -o yaml 2 apiVersion: v1 #API群组及相关版本 3 kind: Namespace #kind字段:标识对象所属资源类型;常用的类型有namespace、deployment、service及pod等等
apiVersion和kind字段可合称为类型元数据(TypeMeta) 4 metadata: #metadata字段为资源提供元数据信息,例如:名称、隶属的名称空间和标签(labels) 5 creationTimestamp: "2021-08-18T05:40:55Z" 6 managedFields: 7 - apiVersion: v1 8 fieldsType: FieldsV1 9 fieldsV1: 10 f:status: 11 f:phase: {} 12 manager: kube-apiserver 13 operation: Update 14 time: "2021-08-18T05:40:55Z" 15 name: kube-system 16 resourceVersion: "4" 17 selfLink: /api/v1/namespaces/kube-system 18 uid: 96bc536f-f992-4822-b31f-204c3b002619 19 spec: #spec字段则是由用户负责声明对象期望状态的字段,不同资源类型的期望状态描述方式各不相同,因此其嵌套支持的字段也不尽相同。 20 finalizers: 21 - kubernetes 22 status: #status字段则记录活动对象当前状态信息,它由kubernetes系统自行维护,对用户来说为只读字段,不需要在配置清单提供。 23 phase: Active
获取资源配置清单格式文档
命令:kubectl explain
kubectl explain pods|service|namespace|deployment 显示一级资源字段
kubectl explain pods.metadata 显示嵌套二级字段
kubectl explain pods.metadata.tables 显示嵌套三级字段
添加标签:
命令直接管理活动对象的标签
1 [root@k8s-master01 yaml]# cat pod-demo-with-cmd-and-args.yaml 2 apiVersion: v1 3 kind: Pod 4 metadata: 5 name: pod-demo-with-cmd-and-args 6 namespace: dev 7 spec: 8 containers: 9 - name: demo 10 image: ikubernetes/demoapp:v1.0 11 imagePullPolicy: IfNotPresent 12 command: ["/bin/sh","-c"] 13 args: ["python3 /usr/local/bin/demo.py -p 8081"] 14 15 [root@k8s-master01 yaml]# kubectl label pod/pod-demo-with-cmd-and-args release=beta 16 Error from server (NotFound): pods "pod-demo-with-cmd-and-args" not found 17 [root@k8s-master01 yaml]# kubectl label pod/pod-demo-with-cmd-and-args -n dev release=beta 18 pod/pod-demo-with-cmd-and-args labeled
修改标签与删除标签
1 [root@k8s-master01 yaml]# kubectl label pod/pod-demo-with-cmd-and-args -n dev release=canary 2 error: 'release' already has a value (beta), and --overwrite is false 3 [root@k8s-master01 yaml]# kubectl label pod/pod-demo-with-cmd-and-args -n dev release=canary --overwrite 4 pod/pod-demo-with-cmd-and-args labeled #修改标签必须带上参数--overwrite 表示强制覆盖原有标签 5 [root@k8s-master01 yaml]# kubectl label pod/pod-demo-with-cmd-and-args -n dev --show-labels 6 Error: unknown flag: --show-labels 7 See 'kubectl label --help' for usage. 8 [root@k8s-master01 yaml]# kubectl get pod/pod-demo-with-cmd-and-args -n dev --show-labels #查看标签 9 NAME READY STATUS RESTARTS AGE LABELS 10 pod-demo-with-cmd-and-args 1/1 Running 0 74m release=canary 11 [root@k8s-master01 yaml]# kubectl label pod/pod-demo-with-cmd-and-args -n dev release- #删除标签,标签名称后面并紧跟一个-号 12 pod/pod-demo-with-cmd-and-args labeled 13 [root@k8s-master01 yaml]# kubectl get pod/pod-demo-with-cmd-and-args -n dev --show-labels 14 NAME READY STATUS RESTARTS AGE LABELS 15 pod-demo-with-cmd-and-args 1/1 Running 0 75m <none>
资源注解(annotations)
资源注解:资源注解也是键值型数据,类似于标签,但是它不能用作标签,可以用户自行添加,也可以由工具程序自动附加并使用。
kubectl get和kubectl describe命令均能显示资源的注解信息
[root@k8s-master01 yaml]# kubectl describe pod/pod-demo-with-cmd-and-args -n dev Name: pod-demo-with-cmd-and-args Namespace: dev Priority: 0 Node: k8s-node02/192.168.3.22 Start Time: Sun, 22 Aug 2021 23:05:29 +0800 Labels: release=canary Annotations: <none> Status: Running IP: 10.244.2.10 IPs: IP: 10.244.2.10 Containers: demo: Container ID: docker://373799e5b51d33bb086ca63936be2193b95e2161c3b6f570abdda2e663172e85 Image: ikubernetes/demoapp:v1.0 Image ID: docker-pullable://ikubernetes/demoapp@sha256:6698b205eb18fb0171398927f3a35fe27676c6bf5757ef57a35a4b055badf2c3 Port: <none> Host Port: <none> Command: /bin/sh -c Args: python3 /usr/local/bin/demo.py -p 8081 State: Running Started: Sun, 22 Aug 2021 23:05:57 +0800 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-7p2m9 (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: default-token-7p2m9: Type: Secret (a volume populated by a Secret) SecretName: default-token-7p2m9 Optional: false QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: <none> [root@k8s-master01 yaml]# [root@k8s-master01 yaml]# [root@k8s-master01 yaml]# clear [root@k8s-master01 yaml]# kubectl get pod/pod-demo-with-cmd-and-args -n dev -o yaml apiVersion: v1 kind: Pod metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"pod-demo-with-cmd-and-args","namespace":"dev"},"spec":{"containers":[{"args":["python3 /usr/local/bin/demo.py -p 8081"],"command":["/bin/sh","-c"],"image":"ikubernetes/demoapp:v1.0","imagePullPolicy":"IfNotPresent","name":"demo"}]}} creationTimestamp: "2021-08-24T02:45:43Z" labels: release: canary managedFields: - apiVersion: v1 fieldsType: FieldsV1 fieldsV1: f:metadata: f:annotations: .: {} f:kubectl.kubernetes.io/last-applied-configuration: {} f:spec: f:containers: k:{"name":"demo"}: .: {} f:args: {} f:command: {} f:image: {} f:imagePullPolicy: {} f:name: {} f:resources: {} f:terminationMessagePath: {} f:terminationMessagePolicy: {} f:dnsPolicy: {} f:enableServiceLinks: {} f:restartPolicy: {} f:schedulerName: {} f:securityContext: {} f:terminationGracePeriodSeconds: {} manager: kubectl-client-side-apply operation: Update time: "2021-08-24T02:45:43Z" - apiVersion: v1 fieldsType: FieldsV1 fieldsV1: f:status: f:conditions: k:{"type":"ContainersReady"}: .: {} f:lastProbeTime: {} f:lastTransitionTime: {} f:status: {} f:type: {} k:{"type":"Initialized"}: .: {} f:lastProbeTime: {} f:lastTransitionTime: {} f:status: {} f:type: {} k:{"type":"Ready"}: .: {} f:lastProbeTime: {} f:lastTransitionTime: {} f:status: {} f:type: {} f:containerStatuses: {} f:hostIP: {} f:phase: {} f:podIP: {} f:podIPs: .: {} k:{"ip":"10.244.2.10"}: .: {} f:ip: {} f:startTime: {} manager: kubelet operation: Update time: "2021-08-24T02:46:09Z" - apiVersion: v1 fieldsType: FieldsV1 fieldsV1: f:metadata: f:labels: .: {} f:release: {} manager: kubectl-label operation: Update time: "2021-08-24T04:06:32Z" name: pod-demo-with-cmd-and-args namespace: dev resourceVersion: "907621" selfLink: /api/v1/namespaces/dev/pods/pod-demo-with-cmd-and-args uid: f52c1976-2f59-4351-92cd-93a970a48a73 spec: containers: - args: - python3 /usr/local/bin/demo.py -p 8081 command: - /bin/sh - -c image: ikubernetes/demoapp:v1.0 imagePullPolicy: IfNotPresent name: demo resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /var/run/secrets/kubernetes.io/serviceaccount name: default-token-7p2m9 readOnly: true dnsPolicy: ClusterFirst enableServiceLinks: true nodeName: k8s-node02 preemptionPolicy: PreemptLowerPriority 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-7p2m9 secret: defaultMode: 420 secretName: default-token-7p2m9 status: conditions: - lastProbeTime: null lastTransitionTime: "2021-08-22T15:05:29Z" status: "True" type: Initialized - lastProbeTime: null lastTransitionTime: "2021-08-22T15:05:58Z" status: "True" type: Ready - lastProbeTime: null lastTransitionTime: "2021-08-22T15:05:58Z" status: "True" type: ContainersReady - lastProbeTime: null lastTransitionTime: "2021-08-24T02:45:43Z" status: "True" type: PodScheduled containerStatuses: - containerID: docker://373799e5b51d33bb086ca63936be2193b95e2161c3b6f570abdda2e663172e85 image: ikubernetes/demoapp:v1.0 imageID: docker-pullable://ikubernetes/demoapp@sha256:6698b205eb18fb0171398927f3a35fe27676c6bf5757ef57a35a4b055badf2c3 lastState: {} name: demo ready: true restartCount: 0 started: true state: running: startedAt: "2021-08-22T15:05:57Z" hostIP: 192.168.3.22 phase: Running podIP: 10.244.2.10 podIPs: - ip: 10.244.2.10 qosClass: BestEffort startTime: "2021-08-22T15:05:29Z"
annotations可以在资源创建时由metadata.annotations字段指定,也可以随时在资源上使用命令kubectl annotate 进行添加(和标签使用方法差不多)。如下实例:
[root@k8s-master01 yaml]# kubectl annotate pod/pod-demo-with-cmd-and-args -n dev ilinux.io/created-by="cluster admin" pod/pod-demo-with-cmd-and-args annotated [root@k8s-master01 yaml]# kubectl annotate pod/pod-demo-with-cmd-and-args -n dev ilinux.io/created-by- pod/pod-demo-with-cmd-and-args annotated [root@k8s-master01 yaml]#