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 账户登录

相关推荐
星海幻影27 分钟前
云原生-docker安装与基础操作
网络·安全·docker·云原生·容器
2301_806131361 小时前
Kubernetes 核心组件调度器(Scheduler)
云原生·容器·kubernetes
Ops菜鸟(Xu JieHao)2 小时前
Dockerfile构建镜像(练习一Apache镜像)(5-1)
服务器·docker·容器·apache·脚本·dockerfile·系统运维
小徐敲java2 小时前
docker 安装mongodb
mongodb·docker·容器
运维&陈同学2 小时前
【HAProxy08】企业级反向代理HAProxy高级功能之自定义日志格式与IP透传
linux·运维·nginx·云原生·负载均衡·lvs·haproxy·反向代理
放手啊4 小时前
sealos部署K8s,安装docker时master节点突然NotReady
docker·容器·kubernetes
涔溪4 小时前
云原生后端深度解析
后端·云原生
运维&陈同学5 小时前
【HAProxy05】企业级反向代理HAProxy调度算法之静态算法与动态算法
linux·运维·算法·nginx·云原生·负载均衡·lvs·haproxy
南猿北者11 小时前
Docker Volume
运维·docker·容器
网络研究院13 小时前
Am I Isolated:一款安全态势基准测试工具
容器·工具·基准测试·安全态势