K8S中YAML案例

目录

案例:自主式创建service并关联上面的pod

案例:部署redis

案例:部署myapp

案例:部署MySQL数据库

总结

1.K8S集群中访问流向

[K8S集群外部:客户端------nodeIP:nodeport------通过target port------podIP:containerport](#K8S集群外部:客户端——nodeIP:nodeport——通过target port——podIP:containerport)

2.语法格式

3.yaml文件组成部署

4.常用字段的含义


案例:自主式创建service并关联上面的pod

资源名称:my-nginx-kkk

命名空间:my-kkk

容器镜像:nginx:1.21

容器端口:80

标签:njzb: my-kkk

创建 server去关联上面的pod

结果:首先修改页面:tian wai lai wu,对外访问,输入地址就能访问

1. 试创建文件获取模板文件

kubectl create ns my-kkk --dry-run -oyaml
kubectl run my-nginx-kkk --image=nginx:1.21 --port=80 --dry-run -oyaml > pod.yaml
  1. 编写yaml文件
kubectl get svc
kubectl get svc nginx -oyaml
vim pod.yaml 
kubectl apply -f pod.yaml 
kubectl get svc,pod -n my-kkk

将获取的yaml资源内容复制过来,进行修改

vim pod.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: my-kkk
---
apiVersion: v1
kind: Pod
metadata:
  labels:
    njzb: my-kkk
  name: my-nginx-kkk
  namespace: my-kkk
spec:
  containers:
  - image: nginx:1.21
    name: my-nginx-kkk
    ports:
    - containerPort: 80
  restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  labels:
    njzb: my-kkk
  name: my-nginx-kkk
  namespace: my-kkk
spec:
  ports:
  - nodePort: 31111  ###节点端口号
    port: 80         ###服务暴露端口
    protocol: TCP    ###通信协议
    targetPort: 80   ###要转发到的容器端口
  selector:
    njzb: my-kkk     ###该服务所选择的后端pod
  type: NodePort

3. 测试结果

案例:部署redis

[root@master01 demo]# vim redis.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-dpm
  labels:
    app: redis
spec:               ###资源所需参数
  replicas: 1
  selector:
    matchLabels:
        app: redis   ###只会与标签app:redis的pod关联
  template:          ###业务模板,如果有多个副本,所有副本属性会按照模板进行匹配
    metadata:
      labels:
        app: redis
    spec:           ###资源所需参数
      containers:
      - name: redis
        image: redis:latest
        ports:
        - containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
  name: redis-dbm
  labels:
    app: redis
spec:
  selector:
    app: redis
  ports:
  - nodePort: 32379
    port: 6379
    protocol: TCP
    targetPort: 6379
  type: NodePort
[root@master01 home]# kubectl get svc,pod

案例:部署myapp

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-kk
  namespace: default
  labels:
    app: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: soscscs/myapp:v1
        ports:
        - containerPort: 80

案例:部署MySQL数据库

apiVersion: v1 
kind: Namespace
metadata:                
  name: mysql-server    
---                    
apiVersion: apps/v1
kind: Deployment      
metadata:            
  labels:           
    app: mysql-01        
  name: mysql-01   
  namespace: mysql-server  
spec:                     
  replicas: 1              
  selector:               
    matchLabels:         
      app: mysql-01        
  template:                
    metadata:             
      labels:           
        app: mysql-01
    spec:              
      containers:
      - image: mysql:latest         
        name: mysql                
        ports:                    
        - containerPort: 3306    
        env:                    
        - name: MYSQL_ROOT_PASSWORD  
          value: "123123"  
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-data
        emptyDir: {}       
--- 
apiVersion: v1              
kind: Service               
metadata:                   
  name: mysql-service       
  namespace: mysql-server   
  labels:                   
    app: mysql-01           
spec:                       
  type: NodePort            
  ports:                    
  - port: 3306              
    targetPort: 3306        
  selector:                 
    app: mysql-01  

注释版

[root@master01 demo]# cat mysql.yaml 

apiVersion: v1             # Kubernetes API 的版本
kind: Namespace            # 定义了一个 Namespace
metadata:                  # 包含了资源的元数据,比如名称、标签等
  name: mysql-server       # Namespace 的名称
---                        # 这个分隔符表示 YAML 文件中的两个资源定义之间的分隔
apiVersion: apps/v1
kind: Deployment           # 指定了资源类型为 Deploymen
metadata:                  # 包含了 Deployment 的元数据,比如名称、标签等
  labels:                  # Deployment 的标签,用于标识和选择相关的资源
    app: mysql-01        
  name: mysql-01           # Deployment 的名称
  namespace: mysql-server  # Deployment 所属的 Namespace
spec:                      # 定义了 Deployment 的规格,包括副本数量、选择器和 Pod 模板
  replicas: 1              # Deployment 的副本数量
  selector:                # 定义了用于选择 Pod 的标签
    matchLabels:           # 这是选择器的标签,与 Pod 模板中的标签匹配
      app: mysql-01        
  template:                # 定义了要创建的 Pod 的模板
    metadata:              # 包含了 Pod 模板的元数据,比如标签等
      labels:              # Pod 模板的标签,用于标识和选择相关的资源
        app: mysql-01
    spec:                  # 定义了 Pod 的规格,包括容器和端口
      containers:
      - image: mysql:latest          # 容器的镜像,使用的是最新版本的 MySQL 镜像
        name: mysql                  # 容器的名称
        ports:                       # 容器的端口列表
        - containerPort: 3306        # 容器的端口
        env:                         # 定义环境变量列表
        - name: MYSQL_ROOT_PASSWORD  # 环境变量的名称
          value: "123123"            # 设置MySQL的root密码,也就是环境变量的值
# 当MySQL容器首次启动时,它会检查数据库是否已经初始化,并且如果没有提供密码相关的环境变量,它会报错并退出
        volumeMounts:                # 定义如何挂载卷到容器中
        - name: mysql-data           # 引用的卷的名称
          mountPath: /var/lib/mysql  # 卷在容器中的挂载路径
      volumes:                       # 定义Pod中使用的卷列表
      - name: mysql-data             # 卷的名称,与volumeMounts中的name相对应
        emptyDir: {}
# 一个空目录卷。这种类型的卷在Pod首次被调度到节点上时创建,并在Pod被删除时销毁。它不持久化数据,仅用于临时存储
apiVersion: v1              
kind: Service               # 定义了一个 Service(服务)
metadata:                   # 包含了服务的元数据,比如名称、标签等
  name: mysql-service       # 服务的名称
  namespace: mysql-server   # 服务所属的 Namespace
  labels:                   # 服务的标签,用于标识和选择相关的资源
    app: mysql-01           # 服务的标签,与 Deployment 或 Pod 的标签匹配
spec:                       # 定义了服务的规格,包括服务类型、端口和选择器
  type: NodePort            # 服务的类型,被设置为 NodePort
  ports:                    # 服务的端口列表
  - port: 3306              # 服务的端口
    targetPort: 3306        # 服务转发请求的目标端口
  selector:                 # 定义了用于选择后端 Pod 的标签
    app: mysql-01           # 选择器的标签,与 Deployment 或 Pod 的标签匹配

[root@master01 demo]# vim mysql.yaml
[root@master01 demo]# kubectl apply -f mysql.yaml 
kubectl get pod,svc -n  mysql-server -owide

总结

1.K8S集群中访问流向

port:为service在clusterIP上暴露的端口

targetport:对应容器映射在pod上的端口

nodeport:可以通过在K8S集群外部使用nodeIP+nodePort来去访问service

containerport:容器内部使用的端口

K8S集群内部:客户端------clusterIP:port------通过target port------podIP:containerport

K8S集群外部:客户端------nodeIP:nodeport------通过target port------podIP:containerport

2.语法格式

通过缩进表示层级关系

不能使用tab进行缩进,只能使用空格,一般开头缩进2个空格

字符后缩进一个空格,比如冒号,逗号等

使用---表示新的yaml文件的开始

使用#表示注释

3.yaml文件组成部署

(1)控制器定义

deployment:定义metadaea、spec、selector

通过yaml完成副本的定义,自主式的

(2)被控制对象

由哪一个控制器(自主式、deployment、statusfulset等)

4.常用字段的含义

如何快速编写yaml

(1)第一种使用kubectl create 命令生成yaml文件

(2)第二种使用kubectl get 命令导出yaml文件

相关推荐
wowocpp16 分钟前
ubuntu 22.04 硬件配置 查看 显卡
linux·运维·ubuntu
山河君28 分钟前
ubuntu使用DeepSpeech进行语音识别(包含交叉编译)
linux·ubuntu·语音识别
鹏大师运维32 分钟前
【功能介绍】信创终端系统上各WPS版本的授权差异
linux·wps·授权·麒麟·国产操作系统·1024程序员节·统信uos
筱源源34 分钟前
Elasticsearch-linux环境部署
linux·elasticsearch
川石课堂软件测试1 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
pk_xz1234562 小时前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器
小珑也要变强2 小时前
Linux之sed命令详解
linux·运维·服务器
Lary_Rock4 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
云飞云共享云桌面6 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
昌sit!7 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes