【云原生Kubernetes系列第七篇】一文掌握k8s之YAML文件(少攀谈,多沉潜,清醒而独立)
一文掌握k8s之YAML文件
系列文章目录
😜即日起,更新云原生相关知识,喜欢的小伙伴可以给我点个三连喔
😜收录至专栏 云原生
😜【云原生Docker系列第四篇】Docker Cgroups资源控制操作
😜【云原生Docker系列第九篇】Docker-Compose 容器集群的快速编排
😜【云原生Docker系列项目实战第一篇】dockerfile+lnmp+workpress
😜【云原生Kubernetes系列第一篇】深入理解容器集群管理系统Kubernetes(k8s)
😜【云原生Kubernetes系列第二篇】Kubernetes(k8s)核心组件
😜【云原生Kubernetes系列第三篇】二进制部署单节点Kubernetes(k8s)v1.20
😜【云原生Kubernetes系列第四篇】二进制部署多master集群Kubernetes(k8s)v1.20
😜【云原生Kubernetes系列第五篇】kubeadm v1.20 部署K8S 集群架构
文章目录
一、YAMY是什么
YAMY是一个可读性搞,用来表达数据序列化的格式。
YAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)的递归缩写。
文件后缀:.yaml或者.yml
可以转换成JSON或XML格式
1.1 YAML语法格式
- 大小写敏感
- 使用缩进表示层级关系
- 不支持Tab键制表符缩进,只使用空格缩进
- 缩进的空格数日不重要,只要相同层级的元素左侧对齐即可,通常开头缩进两个空格
- 符号字符后缩进一个空格,如冒号,逗号,短横杆(-)等
- w—”表示YAML格式,一个文件的开始,用于分隔文件间
- “#”表示注释
1.2 基本数据类型
- 纯量:纯量是最基本的,不可再分的值,包括:字符串、布尔值、整数、浮点数、Null、时间、日期
- 数组:以 - 开头的行表示构成一个数组, 一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 对象:键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary)
---
xxx
xxx
xxx
---
mmm
mmmm
mmmm
---
ssss
sss
sssss
每个—代表一个文件,从上而下顺序执行
docker-compose不支持—,Ansible剧本中只支持一个—,k8s中支持多个—,单个—可以省略
1.3 YAML 序列
YAML 序列是一个列表。在其最简单的形式中,每行有一个项目,每行以破折号和空格开始
---
- linux
- macos
- Windows
1.4 YAML 映射
---
centos: linux
CPU: AMD
RAM: '16GB'
1.5 序列的映射
linux:
- centos
- redhat
Windows:
- w7
- w10
linux是第一个键,他的值是一个序列,包含centos和redhat;Windows是第二个键,我的值是一个序列,包含w7和w10
1.6 映射的映射
linux:
centos: 7
redhat: 8
Windows:
w7: 10.1
w10: 12.2
1.7 序列的序列
- [centos,redhat]
- [w7,w10]
1.8 映射的序列
-
linux: centos
-
RAM: '16GB'
二、k8s中的yaml
kubernetes支持YAML和JSON格式管理资源对象
JSON格式:主要用于api接口之间消息的传递
YAML格式:用于配置和管理,YAML是一种简洁的非标记性语言,内容格式人性化,较易读
#查看资源配置清单
[root@master01 opt]# kubectl get deployment nginx -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2022-07-17T11:55:25Z"
generation: 2
labels:
app: nginx
managedFields:
......
#解释资源配置清单
kubectl explain deployment.metadata
kubectl get service nginx -o yaml
kubectl explain service.metadata
#删除资源配置清单
#陈述式删除:
kubectl delete service nginx
#声明式删除:
kubectl delete -f nginx-svc.yaml
2.1 查看 api 资源版本标签
#查看每个资源的api版本号
三种方法
kubectl api-versions
kubectl api-resources
kubectl explain deployment
2.2 yaml案例1
mkdir /opt/demo
cd demo/
vim nginx-deployment.yaml
apiVersion: apps/v1 #指定api版本标签
kind: Deployment #定义资源的类型/角色,deployment为副本控制器,此处资源类型可以是Deployment、Job、Ingress、Service等
metadata: #定义资源的元数据信息,比如资源的名称、namespace、标签等信息
name: nginx-deployment #定义资源的名称,在同一个namespace空间中必须是唯一的
labels: #定义Deployment资源标签
app: nginx
namespace: test #可以定义命令空间,但必须是存在的,不写就是默认命令空间
spec: #定义deployment资源需要的参数属性,诸如是否在容器失败时重新启动容器的属性
replicas: 3 #定义副本数量
selector: #定义标签选择器
matchLabels: #定义匹配标签
app: nginx #需与 .spec.template.metadata.labels 定义的标签保持一致
#以上是Deployment自己的配置及属性,以下是Deployment创建的pod的属性
template: #定义业务模板,如果有多个副本,所有副本的属性会按照模板的相关配置进行匹配
metadata: #pod的元信息
labels: #定义Pod副本将使用的标签,需与 .spec.selector.matchLabels 定义的标签保持一致
app: nginx
spec:
containers: #定义容器属性
- name: nginx #定义一个容器名,一个 - name: 定义一个容器
image: nginx:1.15.4 #定义容器使用的镜像以及版本
ports: #代表容器可以有两个端口
- name: https
containerPort: 443
- name: http
containerPort: 80 #定义容器的对外的端口
#创建service服务对外提供访问并测试
vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: nginx
此时在浏览器输入 nodeIP:nodePort 即可访问
http://192.168.109.133:32761/
http://192.168.109.132:32761/
2.3 yaml案例2
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-stevelu
namespace: default
labels:
app: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: soscscs/myapp:v1
ports:
- name: http
containerPort: 80
#定义service的yaml文件
vim demo1-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
namespace: default
spec:
type: NodePort
ports:
- port: 8080
targetPort: 80
nodePort: 31234
selector:
app: myapp
[root@master01 demo]# curl 10.96.222.48:8080
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
2.4 yaml案例3
通过现有模板生成
#通过现有模板生成
kubectl get deployments.apps myapp-stevelu -o yaml > demo2.yaml
vim demo2.yaml
#通过模板生成的yaml文件有很长一段我们将没有用的删掉,只留下有用信息
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: myapp
name: myapp-stevelu
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- image: soscscs/myapp:v1
name: myapp
ports:
- containerPort: 80
name: http
protocol: TCP
2.5 yaml案例4
根据陈述式命令导出一个yaml配置文件,俗称空跑,并不会正在生成deployment,再根据生成的yaml文件进行修改成自己想要的
[root@master01 demo]# kubectl create deploy myapp --image=soscscs/myapp:v1 --replicas=3 --dry-run=client -o yaml>demo3.yaml
[root@master01 demo]# ls
demo1-svc.yaml demo1.yaml demo2.yaml demo3.yaml nginx-deployment.yaml nginx-service.yaml
[root@master01 demo]# vim demo3.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: myapp
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- image: soscscs/myapp:v1
name: myapp
–dry-run=client的对象不是由apiserver验证的,只是由客户端验证
2.6 yaml案例5
- 资源类型:pod
- 资源名称:my-nginx
- 命名空间:test
- 容器镜像:nginx:1.14
- 容器端口:80
- 标签:app=nginx
- 创建Deployment资源,资源名称为nginx-deploy,命名空间为test,4个副本,nginx:1.14,镜像端口:80,标签:name=nginx-test1、service 关联上而创建的Pod,资源名称为nginx-deploy-sve
#根据陈述式命令导出一个配置文件
[root@master01 demo]# kubectl create -n test deployment nginx-deploy --image=nginx:1.14 --port=80 --replicas=4 --dry-run=client -oyaml >deploy.yaml
#创建test命名空间
[root@master01 demo]# kubectl create ns test
#根据需求修改
[root@master01 demo]# vim deploy.yaml
apiVersion: apps/v1 #deployment版本号
kind: Deployment #类型
metadata: #资源的元信息
labels: #标签
name: nginx-test1
name: nginx-deploy #资源名称
namespace: test #命名空间(一个命名空间下,同种类型下的资源名称是唯一的)
spec: #下面设置资源属性
replicas: 4 #副本数
selector: #标签选择器
matchLabels:
name: nginx-test1
template: #该控制器创建的pod副本的模板
metadata: #pod的元信息
labels: #pod的标签
name: nginx-test1
spec: #pod的属性
containers: #容器的信息
- image: nginx:1.14 #容器的信息
name: nginx #容器的名称
ports: #容器的端口
- containerPort: 80
[root@master01 demo]# kubectl apply -f deploy.yaml
deployment.apps/nginx-deploy created
#查看创建的资源
[root@master01 demo]# kubectl get all -n test
NAME READY STATUS RESTARTS AGE
pod/nginx-deploy-5bbd7cdf77-69f7x 1/1 Running 0 4m39s
pod/nginx-deploy-5bbd7cdf77-8t6r8 1/1 Running 0 4m39s
pod/nginx-deploy-5bbd7cdf77-lx9vt 1/1 Running 0 4m39s
pod/nginx-deploy-5bbd7cdf77-znz5h 1/1 Running 0 4m39s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deploy 4/4 4 4 4m39s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deploy-5bbd7cdf77 4 4 4 4m39s
#生成service资源的yaml文件,并修改
[root@master01 demo]# kubectl expose -n test deployment nginx-deploy --port=80 --target-port=80 --type=NodePort --dry-run=client -oyaml
apiVersion: v1 #service的版本号
kind: Service
metadata:
labels:
name: nginx-test1
name: nginx-deploy
namespace: test
spec:
ports: #service端口号
- port: 80 #clusterIP
protocol: TCP #端口协议
targetPort: 80 #跟容器端口的对应关系
nodePort: 31111 #nodeip的端口号
selector: #标签选择器
name: nginx-test1
type: NodePort #service的类型
#将上面修改后的service资源写入文件
[root@master01 demo]# vim deploy-svc.yaml
[root@master01 demo]# kubectl apply -f deploy-svc.yaml
service/nginx-deploy created
#查看service详细信息
[root@master01 demo]# kubectl describe svc -n test
Name: nginx-deploy
Namespace: test
Labels: name=nginx-test1
Annotations: <none>
Selector: name=nginx-test1
Type: NodePort
IP Families: <none>
IP: 10.96.77.82
IPs: 10.96.77.82
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 31111/TCP
Endpoints: 10.244.1.26:80,10.244.1.
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
总结
编写service配置清单方法
1.根据现有的文件输出一个yaml格式的配置文件,再修改
2.根据陈述式命令导出一个配置文件(空跑)
kubectl create deploy myapp --image=soscscs/myapp:v1 --replicas=3 --dry-run=client -o json>demo4.yaml
kukectl run my=nginx --image=nginx:1.14 --port=80 --dry-run=client -oyaml > pod -my-nginx.yaml
3.从头到尾自己编写
查看某个资源对应的版本号
#法一
kubectl api-versions
#法二
kubectl api-resources
#法三
kubectl explain [资源名称]
更多推荐
所有评论(0)