1. 闲不住的人首页
  2. Kubernetes

Kubernetes资源清单定义入门

资源清单是一种定义 Kubernetes 资源对象的方式,使用 yaml 语法来定义该文件。

大部分资源配置清单都由五个一级字段(属性)组成:

  • apiVersion: 指明 Kubernetes API 群组的版本,格式 group/version 如果不给定 group 则默认为 core 核心组,使用 kubectl api-versoins 查看当前版本支持的 api 版本。
  • kind:指明资源对象类别
  • metadata:指明元数据信息,通常嵌套了多个二级字段
  • spec:用来让用户定义,一个资源对象,应该所处的目标状态,也叫期望的状态,可以理解为我们定义的这个资源,应该满足什么样的特性,比如有几个副本,使用哪个镜像;
  • status:显示这个资源对象,当前的状态;由 Kubernetes 集群维护,用户不能定义;

当我们不知道某个字段(属性)如何定义时,可以使用 kubectl explain 获取某个资源对象的使用方法。

1. kubectl explain 指令使用方法

语法格式:

kubectl explain <type>.<fieldName>[.<fieldName>]

<type>:表示资源对象类型,如 Pod、Service、Deployment
.<fieldName>:表示该类型下面的字段名,注意名字前面有个 "."

举例演示:如何获取 Pod 资源对象的定义方法

root@k8s-master-opsbj:~ # kubectl explain Pod
KIND:     Pod
VERSION:  v1

DESCRIPTION:
     Pod is a collection of containers that can run on a host. This resource is
     created by clients and scheduled onto hosts.

FIELDS:
   apiVersion	<string>
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

   kind	<string>
     Kind is a string value representing the REST resource this object
     represents. Servers may infer this from the endpoint the client submits
     requests to. Cannot be updated. In CamelCase. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

   metadata	<Object>
     Standard object's metadata. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata

   spec	<Object>
     Specification of the desired behavior of the pod. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status

   status	<Object>
     Most recently observed status of the pod. This data may not be up to date.
     Populated by the system. Read-only. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status

上面输出的信息中给出了如下信息:

  • KIND: Pod # 资源对象的类别
  • VERSION: v1 # api 版本
  • FIELDS:字段
  • apiVersion #是一个字符串值类型
  • kind :#是一个字符串值类型
  • metadata # 值是一个对象,可以嵌套多个二级字段
  • spec :# 值是一个对象,可以嵌套多个二级字段
  • status :# 值是一个对象,可以嵌套多个二级字段

通过执行 kubectl explain Pod 我们知道了,定义一个 Pod 需要的几个一级字段,那么如果我想知道 Pod 的 metadata 该怎么定义呢?

还是使用 kubectl explain 如下:

kubectl explain Pod.metadata

2. 配置清单中的 value 类型说明

通过 explain 输出的内容中,字段值的类型有如下几类

2.1 <String> 类型

值是字符串类型;

举例演示:

apiVersion: v1
kind: Pod

2.2 <Object类型>

值是一个对象类型

举例演示:metadata 这个对象就是 <Object> 类型

metadata:
  name: pod-demo   
  namespace: default

2.3 <[]Object> 类型

如果字段值是 <[]Object> 说明是一个对象列表,里面又可以嵌套众多对象;

举例演示:spec.containers 的类型就是 <[]Object> 类型

containers:
- name: myapp
  image: nginx:1.14-alpine
  imagePullPolicy: IfNotPresent

2.4 <map[string] string> 类型

如果字段值是 <map[string] string> 格式,就说明不是一个列表,而是由众多 key: value 数据所组成的一个 JSON 数组;

举例演示:labels字段的值就是 <map[string] string> 类型

metadata:
  labels:
    env: prod
    tier: frontend

2.5 -required- 标记

如果字段值后面带有 -required- 标记,表示这个属性是必须给的;

举例演示:Pod.spec 中 container 字段就是必须给的

root@k8s-master-opsbj:~ # kubectl explain Pod.spec
KIND:     Pod
VERSION:  v1

RESOURCE: spec <Object>

DESCRIPTION:
     Specification of the desired behavior of the pod. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status

     PodSpec is a description of a pod.

FIELDS:
   activeDeadlineSeconds	<integer>
     Optional duration in seconds the pod may be active on the node relative to
     StartTime before the system will actively try to mark it failed and kill
     associated containers. Value must be a positive integer.

   affinity	<Object>
     If specified, the pod's scheduling constraints

   automountServiceAccountToken	<boolean>
     AutomountServiceAccountToken indicates whether a service account token
     should be automatically mounted.

   containers	<[]Object> -required-
     List of containers belonging to the pod. Containers cannot currently be
     added or removed. There must be at least one container in a Pod. Cannot be
     updated.

3. kubernetes配置清单定义实战

接下来通过 yaml 文件定义一个 Pod 对象,文件名为 pod-demo.yaml,在这个示例中,在一个 Pod 内部运行了两个容器,一个为 nginx 作为 web 服务,一个容器为 busybox 镜像,每隔两秒中执行一次 date 命令并将结果作为 nginx 容器的默认首页内容,两个容器挂载同一个存储卷;

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  labels:
    env: test
    tier: frontend
spec:
  containers:
  - name: myapp
    image: nginx:1.14-alpine
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    volumeMounts:
    - name: htdoc
      mountPath: /usr/share/nginx/html
  - name: busybox
    image: busybox:latest
    ports:
    - name: http
      containerPort: 80
    command:
    - "/bin/sh"
    - "-c"
    - "while true;do date > /usr/share/nginx/html/index.html; sleep 2;done"
    volumeMounts:
    - name: htdoc
      mountPath: /usr/share/nginx/html
  volumes:
  - name: htdoc
    hostPath:
      path: /data/www/html

创建对象

root@k8s-master-opsbj:~/manifests # kubectl apply -f pod-demo.yaml
pod/pod-demo created

查看 Pod 的 IP 地址

root@k8s-master-opsbj:~/manifests # kubectl describe pod pod-demo
Name:               pod-demo
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               k8s-node01-opsbj.com/10.100.4.181
Start Time:         Sun, 05 May 2019 16:43:51 +0800
Labels:             env=test
                    tier=frontend
Annotations:        kubectl.kubernetes.io/last-applied-configuration:
                      {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"labels":{"env":"test","tier":"frontend"},"name":"pod-demo","namespace":"defa...
Status:             Running
IP:                 10.244.1.10
省略下面大部分信息

然后我们在任意节点上使用 curl 命令请求 Pod IP 访问 nginx 服务,可以发现每隔两秒时间都会发生变化

访问验证
访问验证

如果觉得文章不错,不妨给个『打赏』写作不易,各位的支持,能激发和鼓励我更大的写作热情。谢谢

原创文章,作者:恩志,如若转载,请注明出处:https://www.xbzdr.com/649.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

在线咨询:点击这里给我发消息

邮件:510749025@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code