learn-tech/专栏/Go语言项目开发实战/47如何编写Kubernetes资源定义文件?.md
2024-10-16 00:01:16 +08:00

27 KiB
Raw Blame History

                        因收到Google相关通知网站将会择期关闭。相关通知内容
                        
                        
                        47 如何编写Kubernetes资源定义文件
                        你好,我是孔令飞。

在接下来的48讲我会介绍如何基于腾讯云EKS来部署IAM应用。EKS其实是一个标准的Kubernetes集群在Kubernetes集群中部署应用需要编写Kubernetes资源的YAMLYet 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: