在这里插入图片描述

系列文章目录

😜即日起,更新云原生相关知识,喜欢的小伙伴可以给我点个三连喔

😜收录至专栏 云原生

😜【云原生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是什么

YAMY是一个可读性搞,用来表达数据序列化的格式。

YAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)的递归缩写。

文件后缀:.yaml或者.yml

可以转换成JSON或XML格式

1.1 YAML语法格式

  • 大小写敏感
  • 使用缩进表示层级关系
  • 不支持Tab键制表符缩进,只使用空格缩进
  • 缩进的空格数日不重要,只要相同层级的元素左侧对齐即可,通常开头缩进两个空格
  • 符号字符后缩进一个空格,如冒号,逗号,短横杆(-)等
  • w—”表示YAML格式,一个文件的开始,用于分隔文件间
  • “#”表示注释

1.2 基本数据类型

  1. 纯量:纯量是最基本的,不可再分的值,包括:字符串、布尔值、整数、浮点数、Null、时间、日期
  2. 数组:以 - 开头的行表示构成一个数组, 一组按次序排列的值,又称为序列(sequence) / 列表(list)
  3. 对象:键值对的集合,又称为映射(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 [资源名称]

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐