文章目录
- 前言:
- 一、YAML文件详解
- 1.1 K8s资源创建方式
- 1.2 YAML 简介
- 1.2.1 YAML语法格式
- 二、实例创建
- 2.1 创建Nginx实例
- 2.2 自动测试
- 总结:
前言:
- K8S 里所有的资源或者配置文件都可以用 yaml 或 Json 定义。YAML 是一个 JSON/ 的超集,任何有效 JSON 文件也都是一个有效的YAML文件。
一、YAML文件详解
1.1 K8s资源创建方式
- K8s由两种创建资源的方式:
① kubectl :命令创建
② yaml/JSON:使用文件方式创建资源对象
两种格式对比:
- JSON:更偏向于二次开发层面,软件中传的参数都会以json格式传输,此处,需要对api进行一个调用,然后传入json格式给k8s进行有效操作。
特点:用于接口之间消息的传递,更适用于开发 - YAML:如果要对K8s进行有效维护,可以使用此格式对K8s的资源(Pod)进行管理
特点:用于配置和管理,如果基于k8s运维的话,更适合使用此格式文件
本问主要介绍YAML格式,所以此处介绍以下YAML格式的优势:
- 完整性:配置文件描述了一个资源的完整状态,可以很清楚地知道一个资源的创建背后究竟做了哪些事;
- 灵活性:配置文件可以创建比命令行更复杂的结构;
- 可维护性:配置文件提供了创建资源对象的模板,能够重复使用;
- 可扩展性:适合跨环境、规模化的部署。
1.2 YAML 简介
- YAML 是一种简洁的非标记性语言,yaml 又被称为是 json 的超集,使用起来比 json 更方便
- 结构上它有两种可选的类型:Lists 和 Maps。
List:用 -(破折号) 来定义每一项
Map:则是一个 key:value 的键值对来表示
1.2.1 YAML语法格式
- 语法格式:
- ① 缩进标识层级关系
- ② 不支持制表符(tab键)缩进,使用空格缩进
- ③ 通常开头缩进两个空格
- ④ 字符后缩进一个空格,如冒号,逗号、短横杠等
- ⑤ “—” 表示YAML 格式,一个文件的开始
- ⑥ “#” 表示注释
- ⑦ 三个“.” 表示整个文档的结束
- 说到语法格式,要谈到pod资源发布的过程,假如使用kubectl expose 发布,流程如下:
- expose----》创建一个service资源做端口映射,把服务提供出去
- 在创建POD资源之前,需要创建service资源
- 而pods和service都可以使用YAML格式写出来
- 先写pods资源
- 再写service资源
- 中间以“—“进行分隔,表示创建的是两个资源
- 标签开头:
语法:kubectl api-versions(标签)
根据不同的资源,使用不同的标签/版本
PS:标签/v1beta1,beta表示测试版本标题,如果标签中未指定,可以使用apps代替
[root@master ~]# kubectl api-versions
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
apps/v1beta1
apps/v1beta2
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1beta1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1
- YAML格式Pod定义文件完整内容
apiVersion: apps/v1 #基本语法,必选(关键字标签/版本)
kind: Deployment #类型,必选
metadata: #元数据(标签)
name: nginx-deployment #自定义标签
labels: #标签
app: nginx #自定义标签名(全文标签要相同)
spec: #选择器/模板
replicas: 3 #指定的副本集:资源数量
selector: #选择器信息
matchLabels: #匹配标签
app: nginx #匹配的标签名
template: #模板
metadata: #描述性信息,设置的标签
labels:
app: nginx
spec:
containers: #设置的容器信息
- name: nginx #指定容器名称(需要与以上相同)
image: nginx:1.15.4 #指定的镜像
ports:
- containerPort: 80 #指定容器端口
- 小结:yaml文件编写顺序:
- ① 开头标签、类型和信息描述
apiVersion、kind和、metadata - ② 指定选择器
spec - ③ 指定容器
spec:container - 需注意:多一个空格,会导致系统认为是上一个标签的子集,会导致报错
二、实例创建
2.1 创建Nginx实例
- 编写nginx-deployment.yaml文件
[root@master ~]# mkdir demo
[root@master ~]# cd demo/
[root@master demo]# vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.4
ports:
- containerPort: 80
- 创建、查看资源
[root@master demo]# kubectl create -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
#查看资源
[root@master demo]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-d55b94fd-d9sbm 0/1 ContainerCreating 0 10s
nginx-deployment-d55b94fd-vsb6l 0/1 ContainerCreating 0 10s
nginx-deployment-d55b94fd-vvkfv 0/1 ContainerCreating 0 10s
- 创建service资源(用于发布)
[root@master demo]# vim nginx-service.yaml
apiVersion: v1 #版本
kind: Service #类型
metadata: #标签描述
name: nginx-service #指定指定资源名称
labels: #标签信息
app: nginx #自定义标签名
spec: #发布信息
type: NodePort #类型:NodePort
ports: #指定端口
- port: 80 #内部端口
targetPort: 80 #对外映射端口:80
selector: #选择器
app: nginx #指定发布的资源名称
----》wq
- 创建nginx-service资源
[root@master demo]# kubectl create -f nginx-service.yaml
service/nginx-service created
[root@master demo]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 7d19h
nginx-service NodePort 10.0.0.196 <none> 80:39632/TCP 9s
- 使用浏览器访问两个node节点
2.2 自动测试
- 自动测试命令、并不执行创建
[root@master demo]# kubectl run nginx-deployment.yaml --image=nginx --port=80 --replicas=3 --dry-run
kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead.
deployment.apps/nginx-deployment.yaml created (dry run)
#--dry-run 只会尝试运行,不进行操作
#如果由语法问题,会出现提示信息(包括语法提示)
- 查看生成的yaml格式
[root@master demo]# kubectl run nginx-deployment.yaml --image=nginx --port=80 --replicas=3 --dry-run -o yaml
kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead.
apiVersion: apps/v1beta1
kind: Deployment
metadata:
creationTimestamp: null
labels:
run: nginx-deployment.yaml
name: nginx-deployment.yaml
spec:
replicas: 3
selector:
matchLabels:
run: nginx-deployment.yaml
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
run: nginx-deployment.yaml
spec:
containers:
- image: nginx
name: nginx-deployment.yaml
ports:
- containerPort: 80
resources: {}
status: {}
- 查看生成的json格式
kubectl run nginx-deployment.yaml --image=nginx --port=80 --replicas=3 --dry-run -o json
- 直接导出格式模标本
[root@master demo]# kubectl run nginx-deployment.yaml --image=nginx --port=80 --replicas=3 --dry-run -o yaml > my-deployment.yaml
- 将现有的资源生成模板导出
[root@master demo]# kubectl get depolyment/nginx --export -o yaml
#创建nginx
kubectl run nginx --image=nginx
#查看状态
kubectl get pods -w
- 查看字段信息
- 以下命令相当于一个小型的官方文档,可以借助此文档查看编写的格式、语法和可选的内容
[root@master demo]# kubectl explain pods.spec.containers
KIND: Pod
VERSION: v1
RESOURCE: containers <[]Object>
DESCRIPTION:
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.
A single application container that you want to run within a pod.
.....省略部分内容
总结:
- YMAL文件编写的格式其实不用花太大精力去研究,完全可以导出模板,使用现有的模板进行按需更改,我们更多的需要注重Pod资源管理,之后会对Pod的资源管理进行着重介绍