本文主要是介绍【云原生Kubernetes系列第七篇】一文掌握k8s之YAML文件(少攀谈,多沉潜,清醒而独立),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
系列文章目录
😜即日起,更新云原生相关知识,喜欢的小伙伴可以给我点个三连喔
😜收录至专栏 云原生
😜【云原生Docker系列第一篇】Docker镜像管理
😜【云原生Docker系列第二篇】Docker容器管理
😜【云原生Docker系列第三篇】Docker网络模式
😜【云原生Docker系列第四篇】Docker Cgroups资源控制操作
😜【云原生Docker系列第五篇】Docker数据管理
😜【云原生Docker系列第六篇】基于docker创建镜像
😜【云原生Docker系列第七篇】浅谈镜像的分层原理
😜【云原生Docker系列第九篇】Docker-Compose 容器集群的快速编排
😜 【云原生Docker系列第十篇】搭建本地私有仓库
😜【云原生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是什么
- 1.1 YAML语法格式
- 1.2 基本数据类型
- 1.3 YAML 序列
- 1.4 YAML 映射
- 1.5 序列的映射
- 1.6 映射的映射
- 1.7 序列的序列
- 1.8 映射的序列
- 二、k8s中的yaml
- 2.1 查看 api 资源版本标签
- 2.2 yaml案例1
- 2.3 yaml案例2
- 2.4 yaml案例3
- 2.5 yaml案例4
- 2.6 yaml案例5
- 总结
- 编写service配置清单方法
- 查看某个资源对应的版本号
一、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: 7redhat: 8
Windows:w7: 10.1w10: 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: 2labels:app: nginxmanagedFields:......#解释资源配置清单
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: nginxnamespace: 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: nginxspec:containers: #定义容器属性- name: nginx #定义一个容器名,一个 - name: 定义一个容器image: nginx:1.15.4 #定义容器使用的镜像以及版本ports: #代表容器可以有两个端口- name: httpscontainerPort: 443- name: httpcontainerPort: 80 #定义容器的对外的端口
#创建service服务对外提供访问并测试
vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:name: nginx-servicelabels:app: nginx
spec:type: NodePort ports:- port: 80targetPort: 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-stevelunamespace: defaultlabels:app: myapp
spec:replicas: 3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: myappimage: soscscs/myapp:v1ports:- name: httpcontainerPort: 80
#定义service的yaml文件
vim demo1-svc.yaml
apiVersion: v1
kind: Service
metadata:name: myapp-svcnamespace: defaultspec:type: NodePortports:- port: 8080targetPort: 80nodePort: 31234selector: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: myappname: myapp-stevelunamespace: default
spec:replicas: 3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- image: soscscs/myapp:v1name: myappports:- containerPort: 80name: httpprotocol: 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: myappname: myapp
spec:replicas: 3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- image: soscscs/myapp:v1name: 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-test1name: nginx-deploy #资源名称namespace: test #命名空间(一个命名空间下,同种类型下的资源名称是唯一的)
spec: #下面设置资源属性replicas: 4 #副本数selector: #标签选择器matchLabels:name: nginx-test1template: #该控制器创建的pod副本的模板metadata: #pod的元信息labels: #pod的标签name: nginx-test1spec: #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 4m39sNAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deploy 4/4 4 4 4m39sNAME 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-test1name: nginx-deploynamespace: test
spec:ports: #service端口号- port: 80 #clusterIPprotocol: TCP #端口协议targetPort: 80 #跟容器端口的对应关系nodePort: 31111 #nodeip的端口号selector: #标签选择器name: nginx-test1type: 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 [资源名称]
这篇关于【云原生Kubernetes系列第七篇】一文掌握k8s之YAML文件(少攀谈,多沉潜,清醒而独立)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!