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

相关推荐
4647的码农历程几秒前
Linux网络编程 -- 网络基础
linux·运维·网络
漫无目的行走的月亮31 分钟前
在Docker中运行微服务注册中心Eureka
docker
C++忠实粉丝1 小时前
Linux环境基础开发工具使用(2)
linux·运维·服务器
康熙38bdc2 小时前
Linux 环境变量
linux·运维·服务器
hakesashou2 小时前
python如何比较字符串
linux·开发语言·python
Ljubim.te3 小时前
Linux基于CentOS学习【进程状态】【进程优先级】【调度与切换】【进程挂起】【进程饥饿】
linux·学习·centos
cooldream20093 小时前
Linux性能调优技巧
linux
大G哥3 小时前
记一次K8S 环境应用nginx stable-alpine 解析内部域名失败排查思路
运维·nginx·云原生·容器·kubernetes
feng_xiaoshi3 小时前
【云原生】云原生架构的反模式
云原生·架构
妍妍的宝贝3 小时前
k8s 中微服务之 MetailLB 搭配 ingress-nginx 实现七层负载
nginx·微服务·kubernetes