1.YAML文件概述
k8s集群中对资源管理和资源对编排部署都可以通过声明样式(YAML)文件来解决,也就是可以把需要对资源对象操作编辑到YAML格式文件中,我们把这种文件叫做资源清单文件,通过kubectl命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署.
2.YAML书写格式介绍
YAML:是一种标记语言,为了强调这种语言以数据做为中心,而不是以标记语言为重点,YAML是一个可读性高,用来表达数据序列的格式
3.Yaml组成部分
- apiVersion:指定k8s API的版本,例如v1。
- kind:定义要创建的资源对象类型,如Pod、Service、Namespace等。
- metadata:提供资源对象的元数据,包括名称、命名空间、标签和注解。
- spec:详细描述资源对象的期望状态,包括容器配置、端口设置、存储卷等。
由两部分组成,
(1)控制器定义
(2)被控制对象
- 查看支持版本
shell
[root@kube-master ~]# kubectl api-versions
admissionregistration.k8s.io/v1
apiextensions.k8s.io/v1
apiregistration.k8s.io/v1
apps/v1
authentication.k8s.io/v1
authorization.k8s.io/v1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1
coordination.k8s.io/v1
crd.projectcalico.org/v1
discovery.k8s.io/v1
discovery.k8s.io/v1beta1
events.k8s.io/v1
events.k8s.io/v1beta1
flowcontrol.apiserver.k8s.io/v1beta1
metrics.k8s.io/v1beta1
networking.k8s.io/v1
node.k8s.io/v1
node.k8s.io/v1beta1
policy/v1
policy/v1beta1
rbac.authorization.k8s.io/v1
scheduling.k8s.io/v1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1
[root@kube-master ~]# kubectl api-versions
admissionregistration.k8s.io/v1
apiextensions.k8s.io/v1
apiregistration.k8s.io/v1
apps/v1
authentication.k8s.io/v1
authorization.k8s.io/v1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1
coordination.k8s.io/v1
crd.projectcalico.org/v1
discovery.k8s.io/v1
discovery.k8s.io/v1beta1
events.k8s.io/v1
events.k8s.io/v1beta1
flowcontrol.apiserver.k8s.io/v1beta1
metrics.k8s.io/v1beta1
networking.k8s.io/v1
node.k8s.io/v1
node.k8s.io/v1beta1
policy/v1
policy/v1beta1
rbac.authorization.k8s.io/v1
scheduling.k8s.io/v1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1
shell
[root@kube-master ~]# 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
limitranges limits v1 true LimitRange
namespaces ns v1 false Namespace
nodes no v1 false Node
persistentvolumeclaims pvc v1 true PersistentVolumeClaim
persistentvolumes pv v1 false PersistentVolume
pods po v1 true Pod
podtemplates v1 true PodTemplate
replicationcontrollers rc v1 true ReplicationController
resourcequotas quota v1 true ResourceQuota
secrets v1 true Secret
serviceaccounts sa v1 true ServiceAccount
services svc v1 true Service
mutatingwebhookconfigurations admissionregistration.k8s.io/v1 false MutatingWebhookConfiguration
。。。。
[root@kube-master ~]# 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
limitranges limits v1 true LimitRange
namespaces ns v1 false Namespace
nodes no v1 false Node
persistentvolumeclaims pvc v1 true PersistentVolumeClaim
persistentvolumes pv v1 false PersistentVolume
pods po v1 true Pod
podtemplates v1 true PodTemplate
replicationcontrollers rc v1 true ReplicationController
resourcequotas quota v1 true ResourceQuota
secrets v1 true Secret
serviceaccounts sa v1 true ServiceAccount
services svc v1 true Service
mutatingwebhookconfigurations admissionregistration.k8s.io/v1 false MutatingWebhookConfiguration
。。。。
4.YAML基本语法
- 缩进:使用空格进行缩进,不同级别的数据使用不同数量的空格进行区分。
- 键值对:使用冒号:分隔键和值。
- 列表:使用短横线-加上空格来开始列表中的项
- 开始用三个--- 开始,代表新的yaml资源开始
- 使用#标识注释
用空格做为缩进
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
低版本缩进时不允许使用Tab键,只允许使用空格
4.1 YAML支持的数据结构
对象
- 键值对的集合
- 又称为映射(mapping)/哈希(hashes)/字典(dictionary)
yaml
对象类型:对象的一组键值对,使用冒号结构表示
name:Tom
age:18
Yaml 也允许另一种写法,将所有键值对写成一个行内对象
hash:{name:Tom,age:18}
对象类型:对象的一组键值对,使用冒号结构表示
name:Tom
age:18
Yaml 也允许另一种写法,将所有键值对写成一个行内对象
hash:{name:Tom,age:18}
数组
- 一组按次序排列的值
- 又称为序列(sequence)/列表(list)
yaml
数组类型:一组连词线开头的行,构成一个数组
People
- tom
- han
数组也可以采用行内表示法
People: [tom,han]
数组类型:一组连词线开头的行,构成一个数组
People
- tom
- han
数组也可以采用行内表示法
People: [tom,han]
4.2 查看文档
shell
kubectl api-versions #查看api版本
kubectl api-resources #查看api资源
kubectl explain <资源类型> 查看yaml文件字段,用于参考
对于不知道具体意思的字段,可以去k8s官网进行查询
官网查询地址为:https://kubernetes.io/zh/docs/home/
#比如,查看pod
kubectl explain pods
kubectl api-versions #查看api版本
kubectl api-resources #查看api资源
kubectl explain <资源类型> 查看yaml文件字段,用于参考
对于不知道具体意思的字段,可以去k8s官网进行查询
官网查询地址为:https://kubernetes.io/zh/docs/home/
#比如,查看pod
kubectl explain pods
4.3 案例
yaml
# cat nginx.yaml
kind: Deployment #类型,是deployment控制器,kubectl explain Deployment
apiVersion: v1 #API版本,# kubectl explain Deployment.apiVersion
metadata: #pod的元数据信息,kubectl explain Deployment.metadata
labels: #自定义pod的标签,# kubectl explain Deployment.metadata.labels
app: linux66-nginx-deployment-label #标签名称为app值为linux66-nginx-deployment-label,后面会用到此标签
name: linux66-nginx-deployment #pod的名称
namespace: linux66 #pod的namespace,默认是defaule
spec: #定义deployment中容器的详细信息,kubectl explain Deployment.spec
replicas: 1 #创建出的pod的副本数,即多少个pod,默认值为1
selector: #定义标签选择器
matchLabels: #定义匹配的标签,必须要设置
app: linux66-nginx-selector #匹配的目标标签,
template: #定义模板,必须定义,模板是起到描述要创建的pod的作用
metadata: #定义模板元数据
labels: #定义模板label,Deployment.spec.template.metadata.labels
app: linux66-nginx-selector #定义标签,等于Deployment.spec.selector.matchLabels
spec: #定义pod信息
containers:#定义pod中容器列表,可以多个至少一个,pod不能动态增减容器
- name: linux66-nginx-container #容器名称
image: nginx #镜像地址
#command: ["/apps/tomcat/bin/run_tomcat.sh"] #容器启动执行的命令或脚本
#imagePullPolicy: IfNotPresent #如果本地有镜像,就使用本地镜像,如果没有就根据指定的镜像去下载镜像
imagePullPolicy: Always #拉取镜像策略,每次重建容器,无论本地有没有镜像,都会重新下载镜像
ports: #定义容器端口列表
- containerPort: 80 #定义一个端口
protocol: TCP #端口协议
name: http #端口名称
- containerPort: 443 #定义一个端口
protocol: TCP #端口协议
name: https #端口名称
env: #配置环境变量
- name: "password" #变量名称。必须要用引号引起来
value: "123456" #当前变量的值
- name: "age" #另一个变量名称
value: "18" #另一个变量的值
resources: #对资源的请求设置和限制设置
limits: #资源限制设置,上限
cpu: 500m #cpu的限制,单位为core数,可以写0.5或者500m等CPU压缩值
memory: 2Gi #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
requests: #资源请求的设置
cpu: 200m #cpu请求数,容器启动的初始可用数量,可以写0.5或者500m等CPU压缩值
memory: 512Mi #内存请求大小,容器启动的初始可用数量,用于调度pod时候使用
---
kind: Service #类型为service
apiVersion: v1 #service API版本, service.apiVersion
metadata: #定义service元数据,service.metadata
labels: #自定义标签,service.metadata.labels
app: linux66-nginx #定义service标签的内容
name: linux66-nginx-spec #定义service的名称,此名称会被DNS解析
namespace: linux66 #该service隶属于的namespaces名称,即把service创建到哪个namespace里面
spec: #定义service的详细信息,service.spec
type: NodePort #service的类型,定义服务的访问方式,默认为ClusterIP, service.spec.type
ports: #定义访问端口, service.spec.ports
- name: http #定义一个端口名称
port: 80 #service 80端口
protocol: TCP #协议类型
targetPort: 80 #目标pod的端口
nodePort: 30001 #node节点暴露的端口,是部署k8s时指定的端口范围内的端口
#请求转发过程:请求先转发给node,然后由node转发给service,由service转发给pod
- name: https #SSL 端口
port: 443 #service 443端口
protocol: TCP #端口协议
targetPort: 443 #目标pod端口
nodePort: 30043 #node节点暴露的SSL端口,是部署k8s时指定的端口范围内的端口
selector: #service的标签选择器,定义要访问的目标pod
app: linux66-nginx #将流量路到选择的pod上,须等于Deployment.spec.selector.matchLabels
# cat nginx.yaml
kind: Deployment #类型,是deployment控制器,kubectl explain Deployment
apiVersion: v1 #API版本,# kubectl explain Deployment.apiVersion
metadata: #pod的元数据信息,kubectl explain Deployment.metadata
labels: #自定义pod的标签,# kubectl explain Deployment.metadata.labels
app: linux66-nginx-deployment-label #标签名称为app值为linux66-nginx-deployment-label,后面会用到此标签
name: linux66-nginx-deployment #pod的名称
namespace: linux66 #pod的namespace,默认是defaule
spec: #定义deployment中容器的详细信息,kubectl explain Deployment.spec
replicas: 1 #创建出的pod的副本数,即多少个pod,默认值为1
selector: #定义标签选择器
matchLabels: #定义匹配的标签,必须要设置
app: linux66-nginx-selector #匹配的目标标签,
template: #定义模板,必须定义,模板是起到描述要创建的pod的作用
metadata: #定义模板元数据
labels: #定义模板label,Deployment.spec.template.metadata.labels
app: linux66-nginx-selector #定义标签,等于Deployment.spec.selector.matchLabels
spec: #定义pod信息
containers:#定义pod中容器列表,可以多个至少一个,pod不能动态增减容器
- name: linux66-nginx-container #容器名称
image: nginx #镜像地址
#command: ["/apps/tomcat/bin/run_tomcat.sh"] #容器启动执行的命令或脚本
#imagePullPolicy: IfNotPresent #如果本地有镜像,就使用本地镜像,如果没有就根据指定的镜像去下载镜像
imagePullPolicy: Always #拉取镜像策略,每次重建容器,无论本地有没有镜像,都会重新下载镜像
ports: #定义容器端口列表
- containerPort: 80 #定义一个端口
protocol: TCP #端口协议
name: http #端口名称
- containerPort: 443 #定义一个端口
protocol: TCP #端口协议
name: https #端口名称
env: #配置环境变量
- name: "password" #变量名称。必须要用引号引起来
value: "123456" #当前变量的值
- name: "age" #另一个变量名称
value: "18" #另一个变量的值
resources: #对资源的请求设置和限制设置
limits: #资源限制设置,上限
cpu: 500m #cpu的限制,单位为core数,可以写0.5或者500m等CPU压缩值
memory: 2Gi #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
requests: #资源请求的设置
cpu: 200m #cpu请求数,容器启动的初始可用数量,可以写0.5或者500m等CPU压缩值
memory: 512Mi #内存请求大小,容器启动的初始可用数量,用于调度pod时候使用
---
kind: Service #类型为service
apiVersion: v1 #service API版本, service.apiVersion
metadata: #定义service元数据,service.metadata
labels: #自定义标签,service.metadata.labels
app: linux66-nginx #定义service标签的内容
name: linux66-nginx-spec #定义service的名称,此名称会被DNS解析
namespace: linux66 #该service隶属于的namespaces名称,即把service创建到哪个namespace里面
spec: #定义service的详细信息,service.spec
type: NodePort #service的类型,定义服务的访问方式,默认为ClusterIP, service.spec.type
ports: #定义访问端口, service.spec.ports
- name: http #定义一个端口名称
port: 80 #service 80端口
protocol: TCP #协议类型
targetPort: 80 #目标pod的端口
nodePort: 30001 #node节点暴露的端口,是部署k8s时指定的端口范围内的端口
#请求转发过程:请求先转发给node,然后由node转发给service,由service转发给pod
- name: https #SSL 端口
port: 443 #service 443端口
protocol: TCP #端口协议
targetPort: 443 #目标pod端口
nodePort: 30043 #node节点暴露的SSL端口,是部署k8s时指定的端口范围内的端口
selector: #service的标签选择器,定义要访问的目标pod
app: linux66-nginx #将流量路到选择的pod上,须等于Deployment.spec.selector.matchLabels
5. 资源分配
bash
job/cronjob 0.3/512Mi
job/cronjob 0.3/512Mi