yaml文件格式详解 及 k8s实战演示

目录

[一 k8s 支持的语言格式](#一 k8s 支持的语言格式)

[1,YAML 语法格式](#1,YAML 语法格式)

[2,查看 api 资源版本标签](#2,查看 api 资源版本标签)

[二 k8s 运行nginx pod实例 yaml文件 具体讲解](#二 k8s 运行nginx pod实例 yaml文件 具体讲解)

1,写一个yaml文件demo

[2,deployment 管理nginx 的yaml 文件](#2,deployment 管理nginx 的yaml 文件)

3,创建资源对象

4,查看创建的pod资源

5,创建service服务对外提供访问并测试

6,创建service资源对象

7,查看创建的service

8,验证结果

[三 快速写yaml 文件方法](#三 快速写yaml 文件方法)

[1,用 --dry-run 命令 创建但不执行](#1,用 --dry-run 命令 创建但不执行)

[2, 查看生成yaml格式](#2, 查看生成yaml格式)

[3, 查看生成json格式](#3, 查看生成json格式)

[4, 使用yaml格式导出生成模板](#4, 使用yaml格式导出生成模板)

[5, 将现有的资源生成模板导出](#5, 将现有的资源生成模板导出)

[6, 保存到文件中](#6, 保存到文件中)

[7, 查看字段帮助信息,可一层层的查看相关资源对象的帮助信息](#7, 查看字段帮助信息,可一层层的查看相关资源对象的帮助信息)

[四 实战演练](#四 实战演练)

[1,用yaml 文件 k8s 运行nginx的pod实例](#1,用yaml 文件 k8s 运行nginx的pod实例)

[1.1 实验需求](#1.1 实验需求)

[1.2 创建命名空间](#1.2 创建命名空间)

[1.3 创建pod 实例](#1.3 创建pod 实例)

[1.4 创建service](#1.4 创建service)

[1.5 修改得到的yaml 文件](#1.5 修改得到的yaml 文件)

[1.6 执行yaml 文件](#1.6 执行yaml 文件)

[1.7 查看结果](#1.7 查看结果)

[1.8 进容器 做页面](#1.8 进容器 做页面)

[1.9 访问 nginx](#1.9 访问 nginx)

[2, 用yaml 文件 k8s 运行redis的pod实例 (指定暴露端口)](#2, 用yaml 文件 k8s 运行redis的pod实例 (指定暴露端口))

[2.1 用deployment 控制器创造 redis 实例](#2.1 用deployment 控制器创造 redis 实例)

[2.2 暴露端口](#2.2 暴露端口)

[2.3 修改yaml 文件](#2.3 修改yaml 文件)

[2.4 执行yaml 文件](#2.4 执行yaml 文件)

[2.5 访问 redis](#2.5 访问 redis)

[3, 用yaml 文件 k8s 运行mysql 的pod实例](#3, 用yaml 文件 k8s 运行mysql 的pod实例)

[3.1 报错分析](#3.1 报错分析)

[3.2 查看pod 日志](#3.2 查看pod 日志)

[3.3 解决办法](#3.3 解决办法)

或者

[3.4 修改yaml 文件](#3.4 修改yaml 文件)

[3.5 执行yaml 文件](#3.5 执行yaml 文件)

[3.6 进入mysql 的容器,用root 登录](#3.6 进入mysql 的容器,用root 登录)


一 k8s 支持的语言格式

Kubernetes 支持 YAML 和 JSON 格式管理资源对象
JSON 格式:主要用于 api 接口之间消息的传递
YAML 格式:用于配置和管理,YAML 是一种简洁的非标记性语言,内容格式人性化,较易读

1,YAML 语法格式

●大小写敏感

●使用缩进表示层级关系

●不支持Tab键制表符缩进,只使用空格缩进

●缩进的空格数目不重要,只要相同层级的元素左侧对齐即可,通常开头缩进两个空格

●符号字符后缩进一个空格,如冒号,逗号,短横杆(-)等

●"---"表示YAML格式,一个文件的开始,用于分隔文件间

●"#"表示注释

2,查看 api 资源版本标签

kubectl api-versions 命令帮助用户了解其 Kubernetes 集群所支持的 API 资源及版本范围,是管理和操作集群时的一个有用的信息参考点。

bash 复制代码
kubectl api-versions

如果是业务场景一般首选使用 apps/v1

带有beta字样的代表的是测试版本,不用在生产环境中

二 k8s 运行nginx pod实例 yaml文件 具体讲解

1,写一个yaml文件demo

bash 复制代码
mkdir /opt/demo
cd demo/

vim nginx-deployment.yaml

2,deployment 管理nginx 的yaml 文件

bash 复制代码
apiVersion: apps/v1		#指定api版本标签
kind: Deployment		#定义资源的类型/角色,deployment为副本控制器,此处资源类型可以是Deployment、Job、Ingress、Service等
metadata:					#定义资源的元数据信息,比如资源的名称、namespace、标签等信息
  name: nginx-deployment	#定义资源的名称,在同一个namespace空间中必须是唯一的
  labels:				#定义Deployment资源标签
    app: nginx	
spec:					#定义deployment资源需要的参数属性,诸如是否在容器失败时重新启动容器的属性
  replicas: 3			#定义副本数量
  selector:				#定义标签选择器
    matchLabels:		#定义匹配标签
      app: nginx		#需与 .spec.template.metadata.labels 定义的标签保持一致
  template:				#定义业务模板,如果有多个副本,所有副本的属性会按照模板的相关配置进行匹配
    metadata:
      labels:           #定义Pod副本将使用的标签,需与 .spec.selector.matchLabels 定义的标签保持一致
        app: nginx
    spec:
      containers:				#定义容器属性
      - name: nginx				#定义一个容器名,一个 - name: 定义一个容器
        image: nginx:1.15.4		#定义容器使用的镜像以及版本
        ports:
        - containerPort: 80		#定义容器的对外的端口

详解k8s中的port:

●port

port 是 k8s 集群内部访问service的端口,即通过 clusterIP: port 可以从 Pod 所在的 Node 上访问到 service

●nodePort

nodePort 是外部访问 k8s 集群中 service 的端口,通过 nodeIP: nodePort 可以从外部访问到某个 service。

●targetPort

targetPort 是 Pod 的端口,从 port 或 nodePort 来的流量经过 kube-proxy 反向代理负载均衡转发到后端 Pod 的 targetPort 上,最后进入容器。

●containerPort

containerPort 是 Pod 内部容器的端口,targetPort 映射到 containerPort。

即我要指定暴露nginx的端口,就在yaml 文件中指定nodeport

3,创建资源对象

bash 复制代码
kubectl create -f nginx-deployment.yaml

4,查看创建的pod资源

bash 复制代码
kubectl get pods -o wide
NAME                              READY   STATUS    RESTARTS   AGE    IP            NODE            NOMINATED NODE
nginx-deployment-d55b94fd-29qk2   1/1     Running   0          7m9s   172.17.36.4   192.168.80.12   <none>
nginx-deployment-d55b94fd-9j42r   1/1     Running   0          7m9s   172.17.36.3   192.168.80.12   <none>
nginx-deployment-d55b94fd-ksl6l   1/1     Running   0          7m9s   172.17.26.3   192.168.80.11   <none>

5,创建service服务对外提供访问并测试

bash 复制代码
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

6,创建service资源对象

bash 复制代码
kubectl create -f nginx-service.yaml 

7,查看创建的service

bash 复制代码
kubectl get svc
NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.0.0.1     <none>        443/TCP        16d
nginx-service   NodePort    10.0.0.119   <none>        80:35680/TCP   14s

8,验证结果

在浏览器输入 nodeIP:nodePort 即可访问

bash 复制代码
http://192.168.80.11:35680
http://192.168.80.12:35680

三 快速写yaml 文件方法

1,用 --dry-run 命令 创建但不执行

创建自主状态pod

bash 复制代码
kubectl run nginx-test --image=nginx --port=80 --dry-run=client

创建无状态pod

bash 复制代码
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client

2, 查看生成yaml格式

自主状态pod

bash 复制代码
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yaml

无状态pod

bash 复制代码
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml

3, 查看生成json格式

自主状态pod

bash 复制代码
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o json

无状态pod

bash 复制代码
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o json

4, 使用yaml格式导出生成模板

并进行修改以及删除一些不必要的参数

自主状态pod

bash 复制代码
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yaml > nginx-test.yaml

无状态pod

bash 复制代码
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml  > nginx-deploy.yaml

5, 将现有的资源生成模板导出

bash 复制代码
kubectl get svc nginx-service -o yaml

6, 保存到文件中

bash 复制代码
kubectl get svc nginx-service -o yaml > my-svc.yaml

7, 查看字段帮助信息,可一层层的查看相关资源对象的帮助信息

这个很重要,比如不知道deployment 的yaml 文件怎么写,可以输入 kubectl explain deployment

下面会提示你需要哪些信息

bash 复制代码
kubectl explain deployments.spec.template.spec.containers


或
kubectl explain pods.spec.containers

四 实战演练

1,用yaml 文件 k8s 运行nginx的pod实例

1.1 实验需求
1.2 创建命名空间
bash 复制代码
kubectl create ns my-ky35 --dry-run=client -o yaml  >nginx.yaml
1.3 创建pod 实例
bash 复制代码
kubectl run  my-nginx-ky35 --image=nginx:1.14  --port=80 --labels=njzb=my-ky35 --dry-run=client  -n my-ky35 -o yaml  >> nginx.yaml 
1.4 创建service
bash 复制代码
kubectl expose pod  my-nginx-ky35  --port=80 --target-port=80 --name=nginx01 --type=NodePort --dry-run=client  -n my-ky35  -o yaml  >>nginx.yaml 

tips: 此步骤 要先有命令空间 和 pod 实例

此步骤只是要 暴露端口的yaml语言

1.5 修改得到的yaml 文件
bash 复制代码
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: null
  name: my-ky35
spec: {}
status: {}
---
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    njzb: my-ky35
  name: my-nginx-ky35
  namespace: my-ky35
spec:
  containers:
  - image: nginx:1.14
    name: my-nginx-ky35
    ports:
    - containerPort: 80
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    njzb: my-ky35
  name: nginx01
  namespace: my-ky35
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    njzb: my-ky35
  type: NodePort
status:
  loadBalancer: {}

tips:

1.6 执行yaml 文件
bash 复制代码
kubectl apply -f nginx.yaml 
1.7 查看结果
1.8 进容器 做页面
bash 复制代码
kubectl exec -it  my-nginx-ky35 -n my-ky35 bash
1.9 访问 nginx

2, 用yaml 文件 k8s 运行redis的pod实例 (指定暴露端口)

2.1 用deployment 控制器创造 redis 实例
bash 复制代码
kubectl create deployment my-redis-wyq --image=redis:latest  --port=6379  --dry-run=client  -n my-ky35 -o yaml  >> redis.yaml 
2.2 暴露端口
bash 复制代码
kubectl expose deployment  my-redis-wyq  --port=6379 --target-port=6379 --name=redis01 --type=NodePort --dry-run=client  -n my-ky35  -o yaml  >>redis.yaml 

注意:这边是创造的deployment

所以不论暴露端口还是 删除 都是指定deployment 名字

2.3 修改yaml 文件

在两个apiVersion: apps/v1 中间加 ---

在暴露端口的那段yaml 文件 指定命名空间

添加nodeport 指定暴露端口

bash 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: my-redis-wyq
  name: my-redis-wyq
  namespace: my-ky35
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-redis-wyq
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: my-redis-wyq
    spec:
      containers:
      - image: redis:latest
        name: redis
        ports:
        - containerPort: 6379
        resources: {}
status: {}
---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: my-redis-wyq
  name: redis01
  namespace: my-ky35
spec:
  ports:
  - port: 6379
    protocol: TCP
    nodePort: 32333
    targetPort: 6379
  selector:
    app: my-redis-wyq
  type: NodePort
status:
  loadBalancer: {}
2.4 执行yaml 文件
bash 复制代码
kubectl apply -f redis.yaml
2.5 访问 redis

连接redis 测试

3, 用yaml 文件 k8s 运行mysql 的pod实例

3.1 报错分析

和上述步骤一样时会报错。报错如下:

CrashLoopBackOff 是 Kubernetes 中的一个状态,表明 Pod 内的容器反复启动后立即退出(崩溃),然后 Kubernetes 会按照重启策略(通常默认是重启)不断地尝试重新启动容器。这种状况通常是由于容器内的应用运行时出现错误,导致进程非正常终止。

3.2 查看pod 日志

在master01

查看日志

bash 复制代码
kubectl logs my-mysql-wyq-99f66bcc-dbjvf -n my-ky35

因为 MySQL 服务容器在启动时遇到问题,因为它发现数据库还没有被初始化,并且您没有提供必要的环境变量来设定 root 用户的密码。MySQL 容器要求在首次启动时明确指定关于 root 密码的处理方式

3.3 解决办法

可以通过设置 MYSQL_ROOT_PASSWORD 环境变量来指定 root 用户的密码

bash 复制代码
env:
- name: MYSQL_ROOT_PASSWORD
  value: "your_strong_password_here"
或者

允许 root 用户密码为空

bash 复制代码
env:
- name: MYSQL_ALLOW_EMPTY_PASSWORD
  value: "yes"
3.4 修改yaml 文件

要修改的地方:

允许mysql 的root 密码为空

代码展示如下:

bash 复制代码
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: my-mysql-wyq
  name: my-mysql-wyq
  namespace: my-ky35
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-mysql-wyq
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: my-mysql-wyq
    spec:
      containers:
      - image: mysql:latest
        name: mysql
        ports:
        - containerPort: 3306
        resources: {}
        env:
        - name: MYSQL_ALLOW_EMPTY_PASSWORD
          value: "yes"
status: {}
---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: my-mysql-wyq
  name: mysql01
  namespace: my-ky35
spec:
  ports:
  - port: 3306
    nodePort: 31111
    protocol: TCP
    targetPort: 3306
  selector:
    app: my-mysql-wyq
  type: NodePort
status:
  loadBalancer: {}
3.5 执行yaml 文件
3.6 进入mysql 的容器,用root 登录

mysql 准备好了

进入该pod

使用root 账户登录

相关推荐
chuanauc43 分钟前
Kubernets K8s 学习
java·学习·kubernetes
小张是铁粉1 小时前
docker学习二天之镜像操作与容器操作
学习·docker·容器
烟雨书信1 小时前
Docker文件操作、数据卷、挂载
运维·docker·容器
IT成长日记1 小时前
【Docker基础】Docker数据卷管理:docker volume prune及其参数详解
运维·docker·容器·volume·prune
这儿有一堆花1 小时前
Docker编译环境搭建与开发实战指南
运维·docker·容器
LuckyLay1 小时前
Compose 高级用法详解——AI教你学Docker
运维·docker·容器
Uluoyu1 小时前
redisSearch docker安装
运维·redis·docker·容器
IT成长日记5 小时前
【Docker基础】Docker数据持久化与卷(Volume)介绍
运维·docker·容器·数据持久化·volume·
疯子的模样10 小时前
Docker 安装 Neo4j 保姆级教程
docker·容器·neo4j
虚伪的空想家10 小时前
rook-ceph配置dashboard代理无法访问
ceph·云原生·k8s·存储·rook