27 KiB
因收到Google相关通知,网站将会择期关闭。相关通知内容
47 如何编写Kubernetes资源定义文件?
你好,我是孔令飞。
在接下来的48讲,我会介绍如何基于腾讯云EKS来部署IAM应用。EKS其实是一个标准的Kubernetes集群,在Kubernetes集群中部署应用,需要编写Kubernetes资源的YAML(Yet Another Markup Language)定义文件,例如Service、Deployment、ConfigMap、Secret、StatefulSet等。
这些YAML定义文件里面有很多配置项需要我们去配置,其中一些也比较难理解。为了你在学习下一讲时更轻松,这一讲我们先学习下如何编写Kubernetes YAML文件。
为什么选择YAML格式来定义Kubernetes资源?
首先解释一下,我们为什么使用YAML格式来定义Kubernetes的各类资源呢?这是因为YAML格式和其他格式(例如XML、JSON等)相比,不仅能够支持丰富的数据,而且结构清晰、层次分明、表达性极强、易于维护,非常适合拿来供开发者配置和管理Kubernetes资源。
其实Kubernetes支持YAML和JSON两种格式,JSON格式通常用来作为接口之间消息传递的数据格式,YAML格式则用于资源的配置和管理。YAML和JSON这两种格式是可以相互转换的,你可以通过在线工具json2yaml,来自动转换YAML和JSON数据格式。
例如,下面是一个YAML文件中的内容:
apiVersion: v1 kind: Service metadata: name: iam-apiserver spec: clusterIP: 192.168.0.231 externalTrafficPolicy: Cluster ports:
- name: https nodePort: 30443 port: 8443 protocol: TCP targetPort: 8443 selector: app: iam-apiserver sessionAffinity: None type: NodePort
它对应的JSON格式的文件内容为:
{ "apiVersion": "v1", "kind": "Service", "metadata": { "name": "iam-apiserver" }, "spec": { "clusterIP": "192.168.0.231", "externalTrafficPolicy": "Cluster", "ports": [ { "name": "https", "nodePort": 30443, "port": 8443, "protocol": "TCP", "targetPort": 8443 } ], "selector": { "app": "iam-apiserver" }, "sessionAffinity": "None", "type": "NodePort" } }
我就是通过json2yaml在线工具,来转换YAML和JSON的,如下图所示:
在编写Kubernetes资源定义文件的过程中,如果因为YAML格式文件中的配置项缩进太深,导致不容易判断配置项的层级,那么,你就可以将其转换成JSON格式,通过JSON格式来判断配置型的层级。
如果想学习更多关于YAML的知识,你可以参考YAML 1.2 (3rd Edition)。这里,可以先看看我整理的YAML基本语法:
属性和值都是大小写敏感的。 使用缩进表示层级关系。 禁止使用Tab键缩进,只允许使用空格,建议两个空格作为一个层级的缩进。元素左对齐,就说明对齐的两个元素属于同一个级别。 使用 # 进行注释,直到行尾。 key: value格式的定义中,冒号后要有一个空格。 短横线表示列表项,使用一个短横线加一个空格;多个项使用同样的缩进级别作为同一列表。 使用 --- 表示一个新的YAML文件开始。
现在你知道了,Kubernetes支持YAML和JSON两种格式,它们是可以相互转换的。但鉴于YAML格式的各项优点,我建议你使用YAML格式来定义Kubernetes的各类资源。
Kubernetes 资源定义概述
Kubernetes中有很多内置的资源,常用的资源有Deployment、StatefulSet、ConfigMap、Service、Secret、Nodes、Pods、Events、Jobs、DaemonSets等。除此之外,Kubernetes还有其他一些资源。如果你觉得Kubernetes内置的资源满足不了需求,还可以自定义资源。
Kubernetes的资源清单可以通过执行以下命令来查看:
$ kubectl api-resources NAME SHORTNAMES APIVERSION NAMESPACED KIND bindings v1 true Binding componentstatuses cs v1 false ComponentStatus configmaps cm v1 true ConfigMap endpoints ep v1 true Endpoints events ev v1 true Event
上述输出中,各列的含义如下。
NAME:资源名称。 SHORTNAMES:资源名称简写。 APIVERSION:资源的API版本,也称为group。 NAMESPACED:资源是否具有Namespace属性。 KIND:资源类别。
这些资源有一些共同的配置,也有一些特有的配置。这里,我们先来看下这些资源共同的配置。
下面这些配置是Kubernetes各类资源都具备的:
apiVersion: # string类型,指定group的名称,默认为core。可以使用 kubectl api-versions
命令,来获取当前kubernetes版本支持的所有group。
kind: # string类型,资源类别。
metadata: