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文件

相关推荐
kebidaixu11 小时前
VSCode 安装和使用 Claude Code 完整指南
linux
朗晴11 小时前
Linux开机重置密码时做了什么?
linux·运维·服务器
某林21211 小时前
Isaac Lab (v2.3.2) Docker 本地化部署与底层排障全解析
运维·docker·容器·架构·iassc
烟雨江南aabb11 小时前
Docker第四弹:Dockerfile
linux·运维·docker
坤昱11 小时前
cfs调度类深入解刨——EAS科普篇
linux·cfs·linux内核调度·cfs调度类深入解刨·cfs调度类·eas·cfs调度器eas特性
itinymeng11 小时前
在Alibaba Cloud Linux 4 LTS 64位 中安装htop
linux·运维·服务器
白藏y11 小时前
【Linux】基础 IO(一)—— 文件操作及文件系统
linux
utf8mb4安全女神13 小时前
shell中的判断语法
linux·运维·服务器
iDao技术魔方13 小时前
WSL 配 GPU 用 Docker 的折腾指南(2026 年版)
运维·docker·容器
mifengxing13 小时前
操作系统(五)
linux·运维·服务器·操作系统·王道考研