侧边栏壁纸
博主头像
一揽芳华 博主等级

行动起来,活在当下

  • 累计撰写 265 篇文章
  • 累计创建 24 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

七、Kubernetes核心概念Controller

芳华是个男孩!
2024-10-15 / 0 评论 / 0 点赞 / 8 阅读 / 0 字
广告 广告

一、pod控制器controller作用及分类

controller作用:用于控制pod
参考:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/

invalid image(图片无法加载)

控制器主要分为:

  • Deployments 部署无状态应用,控制pod升,回退
  • ReplicaSet 副本集,控制pod扩容,裁减
  • ReplicationController (相当于ReplicaSet的老版本,现在建议使用Deployments加ReplicaSet替代RC)
  • StatefulSets 部署有状态应用,结合Service、存储等实现对有状态应用部署
  • DaemonSet 守护进程集,运行在所有集群节点(包括master),比如使用filebeat,node_exporter
  • Jobs 一次性
  • Cronjob 周期性

二、Deployment介绍及应用


1、Deployments介绍

1.1、Replicaset控制器的功能

  • 支持新的基于集合的selector(以前的rc里没有这种功能)
  • 通过改变Pod副本数量实现Pod的扩容和缩容

1.2、Deployment控制器的功能

  • Deployment集成了上线部署、滚动升级、创建副本、回滚等功能
  • Deployment里包含并使用了ReplicaSet

1.3、Deployment用于部署无状态应用

无状态应用的特点:
  • 所有pod无差别
  • 所有pod中容器运行同一个image
  • 所有pod可以运行在集群中任意node上
  • 所有pod无启动顺序先后之分
  • 随意pod数量扩容或缩容
  • 例如简单运行一个静态web程序

2、创建Deployments应用

2.1、创建Deployments应用

2.1.1、准备yaml文件

[root@k8s-master01 yaml]# cat deployment-nginx.yaml 
apiVersion: v1
kind: Namespace
metadata:
  name: test
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx                    # deployment名
  namespace: test
spec:
  replicas: 1                            # 副本集,deployment使用了replicas
  selector:
    matchLabels:
      app: nginx                        # 匹配pod标签,表示deployment和rs控制器嗲有此标签的pod
  template:                                # 代表pod的配置模板
    metadata:
      labels:
        app: nginx                        # pod标签
    spec:
      containers:                        # 以下为pod里面的容器定义
      - name: nginx
        image: nginx:1.25.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

2.1.2、检查语法错误并应用

[root@k8s-master01 yaml]# kubectl apply -f deployment-nginx.yaml --dry-run=client
namespace/test created (dry run)
deployment.apps/deploy-nginx created (dry run)

[root@k8s-master01 yaml]# kubectl apply -f deployment-nginx.yaml
namespace/test created
deployment.apps/deploy-nginx created

2.1.3、验证

[root@k8s-master01 yaml]# kubectl get pod -n test deploy-nginx-75b69bd684-k69tz -o wide
NAME                            READY   STATUS    RESTARTS   AGE     IP               NODE           NOMINATED NODE   READINESS GATES
deploy-nginx-75b69bd684-k69tz   1/1     Running   0          4m45s   10.244.203.213   k8s-worker04   <none>           <none>

[root@k8s-master01 yaml]# kubectl get deployments.apps -n test 
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
deploy-nginx   1/1     1            1           6m30s

[root@k8s-master01 yaml]# kubectl get replicasets.apps -n test 
NAME                      DESIRED   CURRENT   READY   AGE
deploy-nginx-75b69bd684   1         1         1       10m

2.2、访问Deployments应用

2.2.1、查看podip地址

[root@k8s-master01 yaml]# kubectl get pod -n test deploy-nginx-75b69bd684-k69tz -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
deploy-nginx-75b69bd684-k69tz   1/1     Running   0          11m   10.244.203.213   k8s-worker04   <none>           <none>
可以在集群中任意节点访问ip:10.244.203.213
[root@k8s-master01 yaml]# curl http://10.244.203.213
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
使用kuboard查看

invalid image(图片无法加载)

2.3、删除Deployments中的pod应用

2.3.1、删除pod(是删除deployment中的pod)

[root@k8s-master01 yaml]# kubectl delete pod -n test deploy-nginx-75b69bd684-k69tz

2.3.2、再次查看发现,又重新启动了一个pod,而且pod所在节点及ip发生了变化

[root@k8s-master01 yaml]# kubectl get pod -n test deploy-nginx-75b69bd684-wkh5j -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP              NODE           NOMINATED NODE   READINESS GATES
deploy-nginx-75b69bd684-wkh5j   1/1     Running   0          17s   10.244.39.208   k8s-worker03   <none>           <none>
也就是说pod的ip不是固定的,比如把整个集群关闭在启动,pod也会自动启动,但是IP地址也会发生变化。既然IP地址不是固定的,所以需要一个固定的访问endpoint给用户,那么这种方式就是service。

2.4、pod版本升级

2.4.1、查看帮助

[root@k8s-master01 yaml]# kubectl set image -h

2.4.2、升级前验证nginx版本

[root@k8s-master01 yaml]# kubectl describe pods -n test deploy-nginx-5db9bd9c5c-pxsnr | grep Image:
    Image:          nginx:1.25.2

[root@k8s-master01 yaml]# kubectl exec -it -n test deploy-nginx-5db9bd9c5c-pxsnr -- nginx -v
nginx version: nginx/1.25.2

2.4.3、升级为1.25.4

[root@k8s-master01 yaml]# kubectl set image deployment/deploy-nginx nginx=nginx:1.25.4 -n test --record
deployment.apps/deploy-nginx image updated

2.4.4、验证

[root@k8s-master01 yaml]# kubectl exec -it -n test deploy-nginx-5fd67d7b9f-fdzs2 -- nginx -v
nginx version: nginx/1.25.4
使用kuboard查看

invalid image(图片无法加载)

如果升级的pod太多需要一定的时间,可通过下面命令查看是否升级成功

[root@k8s-master01 yaml]# kubectl rollout status deployment/deploy-nginx -n test
deployment "deploy-nginx" successfully rolled out

2.5、pod版本回退

2.5.1、查看历史版本信息

[root@k8s-master01 yaml]# kubectl rollout history deployment/deploy-nginx -n test
deployment.apps/deploy-nginx 
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment/deploy-nginx nginx=nginx:1.25.4 --namespace=test --record=true

2.5.2、定义要退回的版本(需要执行后才是真的回退版本)

[root@k8s-master01 yaml]# kubectl rollout history deployment/deploy-nginx -n test --revision=1
deployment.apps/deploy-nginx with revision #1
Pod Template:
  Labels:       app=nginx
        pod-template-hash=5db9bd9c5c
  Containers:
   nginx:
    Image:      nginx:1.25.2                # 可以看到要回退的版本:1.25.2版本
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>

2.5.3、执行回退

[root@k8s-master01 yaml]# kubectl rollout undo deployment/deploy-nginx -n test --to-revision=1
deployment.apps/deploy-nginx rolled back

2.5.4、验证

[root@k8s-master01 yaml]# kubectl exec -it -n test deploy-nginx-5db9bd9c5c-75fjg -- nginx -v
nginx version: nginx/1.25.2
使用kuboard查看

invalid image(图片无法加载)

查看版本历史
[root@k8s-master01 yaml]# kubectl rollout history deployment/deploy-nginx -n test
deployment.apps/deploy-nginx 
REVISION  CHANGE-CAUSE
2         kubectl set image deployment/deploy-nginx nginx=nginx:1.25.4 --namespace=test --record=true
3         <none>

2.6、副本扩容

2.6.1、查看帮助

[root@k8s-master01 yaml]# kubectl scale -h

2.6.2、扩容为2个副本

[root@k8s-master01 yaml]# kubectl scale deployment/deploy-nginx -n test --replicas=2
deployment.apps/deploy-nginx scaled

2.6.3、查看扩容后的副本信息

[root@k8s-master01 yaml]# kubectl get pod -n test -o wide
NAME                            READY   STATUS    RESTARTS   AGE     IP               NODE           NOMINATED NODE   READINESS GATES
deploy-nginx-5db9bd9c5c-75fjg   1/1     Running   0          14m     10.244.203.216   k8s-worker04   <none>           <none>
deploy-nginx-5db9bd9c5c-7ncgp   1/1     Running   0          2m44s   10.244.39.210    k8s-worker03   <none>           <none>
使用kuboard查看

invalid image(图片无法加载)

2.6.4、继续扩容,扩容为4个副本(扩容的数量跟node的节点数无关)

[root@k8s-master01 yaml]# kubectl scale deployment/deploy-nginx -n test --replicas=4
deployment.apps/deploy-nginx scaled
[root@k8s-master01 yaml]# 

2.6.5、再次查看扩容后的副本信息

[root@k8s-master01 yaml]# kubectl get pod -n test -o wide
NAME                            READY   STATUS    RESTARTS   AGE     IP               NODE           NOMINATED NODE   READINESS GATES
deploy-nginx-5db9bd9c5c-75fjg   1/1     Running   0          16m     10.244.203.216   k8s-worker04   <none>           <none>
deploy-nginx-5db9bd9c5c-7ncgp   1/1     Running   0          5m11s   10.244.39.210    k8s-worker03   <none>           <none>
deploy-nginx-5db9bd9c5c-cwncv   1/1     Running   0          32s     10.244.203.217   k8s-worker04   <none>           <none>
deploy-nginx-5db9bd9c5c-lscst   1/1     Running   0          32s     10.244.39.211    k8s-worker03   <none>           <none>

[root@k8s-master01 yaml]# kubectl get deployments.apps -n test
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
deploy-nginx   4/4     4            4           54m
使用kuboard查看

invalid image(图片无法加载)

2.7、副本裁剪

2.7.1、指定副本数为1进行裁剪

[root@k8s-master01 yaml]# kubectl scale deployment/deploy-nginx -n test --replicas=1
deployment.apps/deploy-nginx scaled

2.7.2、验证

[root@k8s-master01 yaml]# kubectl get pod -n test -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
deploy-nginx-5db9bd9c5c-75fjg   1/1     Running   0          27m   10.244.203.216   k8s-worker04   <none>           <none>
使用kuboard查看

invalid image(图片无法加载)

2.8、多副本滚动更新

2.8.1、先扩容多点副本,扩容10个

[root@k8s-master01 yaml]# kubectl scale deployment/deploy-nginx -n test --replicas=10
deployment.apps/deploy-nginx scaled

2.8.2、验证

[root@k8s-master01 yaml]# kubectl get pod -n test -o wide
NAME                            READY   STATUS    RESTARTS   AGE    IP               NODE           NOMINATED NODE   READINESS GATES
deploy-nginx-5db9bd9c5c-56zrv   1/1     Running   0          113s   10.244.203.219   k8s-worker04   <none>           <none>
deploy-nginx-5db9bd9c5c-6gf24   1/1     Running   0          113s   10.244.39.215    k8s-worker03   <none>           <none>
deploy-nginx-5db9bd9c5c-75fjg   1/1     Running   0          31m    10.244.203.216   k8s-worker04   <none>           <none>
deploy-nginx-5db9bd9c5c-8h5c7   1/1     Running   0          113s   10.244.39.212    k8s-worker03   <none>           <none>
deploy-nginx-5db9bd9c5c-pbcmp   1/1     Running   0          113s   10.244.69.204    k8s-worker02   <none>           <none>
deploy-nginx-5db9bd9c5c-rdxkl   1/1     Running   0          113s   10.244.39.213    k8s-worker03   <none>           <none>
deploy-nginx-5db9bd9c5c-sskk4   1/1     Running   0          113s   10.244.79.77     k8s-worker01   <none>           <none>
deploy-nginx-5db9bd9c5c-svqsp   1/1     Running   0          113s   10.244.203.220   k8s-worker04   <none>           <none>
deploy-nginx-5db9bd9c5c-t8v8g   1/1     Running   0          113s   10.244.203.218   k8s-worker04   <none>           <none>
deploy-nginx-5db9bd9c5c-vgzfj   1/1     Running   0          113s   10.244.39.214    k8s-worker03   <none>           <none>

[root@k8s-master01 yaml]# kubectl get deployments.apps -n test
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
deploy-nginx   10/10   10           10          73m
使用kuboard查看

invalid image(图片无法加载)

2.8.3、滚动更新

[root@k8s-master01 yaml]# kubectl set image deployment/deploy-nginx -n test nginx=nginx:1.25.4 --record
deployment.apps/deploy-nginx image updated

2.8.4、验证

[root@k8s-master01 yaml]# kubectl rollout status deployment/deploy-nginx -n test
deployment "deploy-nginx" successfully rolled out

[root@k8s-master01 yaml]# kubectl describe pod -n test deploy-nginx-5fd67d7b9f-
deploy-nginx-5fd67d7b9f-5bbsg  deploy-nginx-5fd67d7b9f-jn4kn  deploy-nginx-5fd67d7b9f-x2j2p  deploy-nginx-5fd67d7b9f-zmwp6
deploy-nginx-5fd67d7b9f-dxbxx  deploy-nginx-5fd67d7b9f-pnjpx  deploy-nginx-5fd67d7b9f-x7ffb  
deploy-nginx-5fd67d7b9f-hsf4p  deploy-nginx-5fd67d7b9f-vm7hw  deploy-nginx-5fd67d7b9f-x955g  
[root@k8s-master01 yaml]# kubectl describe pod -n test deploy-nginx-5fd67d7b9f-5bbsg | grep Image:
    Image:          nginx:1.25.4
使用kuboard查看

invalid image(图片无法加载)

2.9、删除Deployments

若果使用kubectl delete deployment/deploy-nginx命令删除deployment,那么里面的pod也会自动删除

[root@k8s-master01 yaml]# kubectl delete deployments/deploy-nginx -n test
deployment.apps "deploy-nginx" deleted

[root@k8s-master01 yaml]# kubectl get deployments.apps 
No resources found in default namespace.

三、Replicaset类型应用及扩容演示


1、编写yaml文件

[root@k8s-master01 yaml]# cat replicaset-nginx.yaml 
apiVersion: v1
kind: Namespace
metadata:
  name: test
---
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-nginx
  namespace: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.24.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

2、检查语法错误及应用

[root@k8s-master01 yaml]# kubectl apply -f replicaset-nginx.yaml --dry-run=client
namespace/test configured (dry run)
replicaset.apps/rs-nginx configured (dry run)

[root@k8s-master01 yaml]# kubectl apply -f replicaset-nginx.yaml 
namespace/test unchanged
replicaset.apps/rs-nginx created

3、验证

[root@k8s-master01 yaml]# kubectl get replicasets.apps -n test
NAME       DESIRED   CURRENT   READY   AGE
rs-nginx   1         1         0       89s

[root@k8s-master01 yaml]# kubectl get pod -n test rs-nginx-46z8k -o wide
NAME             READY   STATUS              RESTARTS   AGE    IP       NODE           NOMINATED NODE   READINESS GATES
rs-nginx-46z8k   0/1     ContainerCreating   0          109s   <none>   k8s-worker03   <none>           <none>

[root@k8s-master01 yaml]# kubectl describe pod -n test rs-nginx-46z8k | tail -8
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  2m8s  default-scheduler  Successfully assigned test/rs-nginx-46z8k to k8s-worker03
  Normal  Pulling    2m8s  kubelet            Pulling image "nginx:1.24.0"
  Normal  Pulled     11s   kubelet            Successfully pulled image "nginx:1.24.0" in 1m57.106137973s
  Normal  Created    11s   kubelet            Created container nginx
  Normal  Started    10s   kubelet            Started container nginx

4、副本扩容

[root@k8s-master01 yaml]# kubectl scale replicaset/rs-nginx -n test --replicas=4
replicaset.apps/rs-nginx scaled

5、验证

[root@k8s-master01 yaml]# kubectl get replicasets.apps -n test
NAME       DESIRED   CURRENT   READY   AGE
rs-nginx   4         4         4       9m21s

[root@k8s-master01 yaml]# kubectl get pod -n test 
NAME             READY   STATUS    RESTARTS   AGE
rs-nginx-46z8k   1/1     Running   0          9m22s
rs-nginx-56wqf   1/1     Running   0          109s
rs-nginx-8t5xx   1/1     Running   0          110s
rs-nginx-lfxpj   1/1     Running   0          109s

6、pod版本升级

[root@k8s-master01 yaml]# kubectl set image replicaset/rs-nginx -n test nginx=nginx:1.25.2 --record
replicaset.apps/rs-nginx image updated

replicaset/rs-nginx表示控制器replicaset包含了pod应用rs-nginx
nginx=nginx:1.25.0前面的nginx表示为容器名,后面为升级的版本
--record表示会记录

7、验证

[root@k8s-master01 yaml]# kubectl describe pod -n test rs-nginx-46z8k | grep Image:
    Image:          nginx:1.24.0

发现:并没有升级,因此如果需要升级需要借助Deployment控制器来完成因此没有单独使用replicaset控制器的

四、DaemonSet介绍及应用


1、DaemonSet介绍

  • DaemonSet能够让所有(或者特定)的节点运行同一个pod。
  • 当节点加入到K8S集群中,pod会被(DaemonSet)调度到该节点上运行,当节点从K8S集群中被移除,被DaemonSet调度的pod会被移除
  • 如果删除DaemonSet,所有跟这个DaemonSet相关的pods都会被删除。
  • 如果一个DaemonSet的Pod被杀死、停止、或者崩溃,那么DaemonSet将会重新创建一个新的副本在这台计算节点上。
  • DaemonSet一般应用于日志收集、监控采集、分布式存储守护进程等

2、应用案例,在所有节点部署nginx,用来测试

2.1、编写yaml文件

[root@k8s-master01 yaml]# cat DaemonSet-nginx.yaml 
apiVersion: v1
kind: Namespace
metadata:
  name: test
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: dt-nginx
  namespace: test
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      tolerations:                                #tolerations代表容忍
      - key: node-role.kubernetes.io/master        # 能容忍的污点
        effect: NoSchedule                        # kubectl  explain pod.spec.tolerations查看(能容忍的污点effect)
      containers:
      - name: nginx
        image: nginx:1.24.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        resources:                                # resources资源限制是为了防止master节点资源被占用太多,根据实际情况配置
          limits:
            memory: 100Mi
          requests:
            memory: 100Mi

2.2、检查语法错误并应用

[root@k8s-master01 yaml]# kubectl apply -f DaemonSet-nginx.yaml --dry-run=client
namespace/test created (dry run)
daemonset.apps/dt-nginx created (dry run)

[root@k8s-master01 yaml]# kubectl apply -f DaemonSet-nginx.yaml
namespace/test created
daemonset.apps/dt-nginx created

2.3、验证

[root@k8s-master01 yaml]# kubectl get pod -n test -o wide
NAME             READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
dt-nginx-g8v6q   1/1     Running   0          42s   10.244.39.221    k8s-worker03   <none>           <none>
dt-nginx-hx4zq   1/1     Running   0          42s   10.244.195.20    k8s-master03   <none>           <none>
dt-nginx-kgpjq   1/1     Running   0          42s   10.244.122.136   k8s-master02   <none>           <none>
dt-nginx-nkcwz   1/1     Running   0          42s   10.244.203.226   k8s-worker04   <none>           <none>
dt-nginx-qfp88   1/1     Running   0          42s   10.244.69.210    k8s-worker02   <none>           <none>
dt-nginx-qfrnn   1/1     Running   0          42s   10.244.79.82     k8s-worker01   <none>           <none>
dt-nginx-vmm6r   1/1     Running   0          42s   10.244.32.148    k8s-master01   <none>           <none>
使用kuboard查看

invalid image(图片无法加载)

五、StatefulSet介绍及应用


1、StatefulSet控制器作用

  • StatefulSet 是用来管理有状态应用的控制器。
  • StatefulSet 用来管理某Pod集合的部署和扩缩及滚动更新
  • StatefulSet 并为这些 Pod 提供持久存储和持久标识符。

2、无状态应用与有状态应用

2.1 无状态应用

如nginx

  • 请求本身包含了响应端为响应这一请求所需的全部信息。每一个请求都像首次执行一样,不会依赖之前的数据进行响应。
  • 不需要持久化的数据
  • 无状态应用的多个实例之间互不依赖,可以无序的部署、删除或伸缩

2.2 有状态应用

如mysql

  • 前后请求有关联与依赖
  • 需要持久化的数据
  • 有状态应用的多个实例之间有依赖,不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID。

3、StatefulSet的特点

  • 稳定的、唯一的网络标识符。 (通过headless服务实现,这个可以先暂时放一放,讲Service的时候就知道了)
  • 稳定的、持久的存储。 (通过PV,PVC,storageclass实现,这个可以先暂时放一放,讲存储的时候就知道了)
  • 有序的、优雅的部署和缩放。
  • 有序的、自动的滚动更新。

4、StatefulSet的YAML组成

需要三个组成部分:
  • headless service: 实现稳定,唯一的网络标识
  • statefulset类型资源: 写法和deployment几乎一致,就是类型不一样
  • volumeClaimTemplate : 指定存储卷

5、创建StatefulSet应用

关于基于nfs的动态存储,请查看后续

5.1、编写yaml文件

[root@k8s-master01 yaml]# cat StatefulSet-nginx.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
  namespace: test
spec:
  serviceName: nginx
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.24.0
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: nginx-www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: nginx-www
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: "nfs-client"
      resources:
        requests:
          storage: 2Gi

5.2、检查语法并应用

[root@k8s-master01 yaml]# kubectl apply -f StatefulSet-nginx.yaml --dry-run=client
service/nginx configured (dry run)
statefulset.apps/web configured (dry run)
[root@k8s-master01 yaml]# kubectl apply -f StatefulSet-nginx.yaml

5.3、验证pod信息

[root@k8s-master01 yaml]# kubectl get pod -n test -o wide
NAME    READY   STATUS    RESTARTS   AGE     IP               NODE           NOMINATED NODE   READINESS GATES
web-0   1/1     Running   0          9m36s   10.244.203.239   k8s-worker04   <none>           <none>
web-1   1/1     Running   0          9m34s   10.244.79.84     k8s-worker01   <none>           <none>
web-2   1/1     Running   0          9m31s   10.244.203.240   k8s-worker04   <none>           <none>

[root@k8s-master01 yaml]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS        CLAIM                  STORAGECLASS   REASON   AGE
pvc-10d3722a-f06f-439e-8baf-cbba6069d7cd   2Gi        RWO            Delete           Bound         test/nginx-www-web-2   nfs-client              12m
pvc-4edf6abd-98ef-4d2c-ac03-b77e78ecacef   2Gi        RWO            Delete           Bound         test/nginx-www-web-0   nfs-client              16m
pvc-d652f399-a29b-40ea-b866-a214e33f2865   2Gi        RWO            Delete           Bound         test/nginx-www-web-1   nfs-client              12m

5.4、在对应的nfs服务器中就会创建对应的挂载目录

[root@k8s-nfs ~]# tree /kuberneters/
/kuberneters/
├── test-nginx-www-web-0-pvc-4edf6abd-98ef-4d2c-ac03-b77e78ecacef
├── test-nginx-www-web-1-pvc-d652f399-a29b-40ea-b866-a214e33f2865
└── test-nginx-www-web-2-pvc-10d3722a-f06f-439e-8baf-cbba6069d7cd

3 directories, 0 files

5.5、在nfs挂载目录中添加nginx首页文件并测试

# 在nfs服务器中pod对应的挂载目录中创建测试文件
[root@k8s-nfs ~]# cd /kuberneters/
[root@k8s-nfs kuberneters]# echo "nginx01" > test-nginx-www-web-0-pvc-4edf6abd-98ef-4d2c-ac03-b77e78ecacef/index.html
[root@k8s-nfs kuberneters]# echo "nginx02" > test-nginx-www-web-1-pvc-d652f399-a29b-40ea-b866-a214e33f2865/index.html
[root@k8s-nfs kuberneters]# echo "nginx03" > test-nginx-www-web-2-pvc-10d3722a-f06f-439e-8baf-cbba6069d7cd/index.html

# 在集群中测试
[root@k8s-master01 yaml]# kubectl get pod -n test -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
web-0   1/1     Running   0          25s   10.244.203.242   k8s-worker04   <none>           <none>
web-1   1/1     Running   0          23s   10.244.69.211    k8s-worker02   <none>           <none>
web-2   1/1     Running   0          22s   10.244.39.232    k8s-worker03   <none>           <none>
[root@k8s-master01 yaml]# curl 10.244.203.242
nginx01
[root@k8s-master01 yaml]# curl 10.244.69.211
nginx02
[root@k8s-master01 yaml]# curl 10.244.39.232
nginx03
使用kuboard查看

invalid image(图片无法加载)

invalid image(图片无法加载)

invalid image(图片无法加载)

六、Job介绍及应用


1、Job是什么?

  • 对于ReplicaSet、ReplicationController等类型的控制器而言,它希望pod保持预期数目、持久运行下去,除非用户明确删除,否则这些对象一直存在,它们针对的是耐久性任务,如web服务等。对于非耐久性任务,比如压缩文件,任务完成后,pod需要结束运行,不需要pod继续保持在系统中,这个时候就要用到Job。因此说Job是对ReplicaSet、ReplicationController等持久性控制器的补充。
  • Job负责批量处理短暂的一次性任务,即仅执行一次的任务,它保证批处理任务的一个或多个pod成功结束。

2、案例1:计算圆周率2000位

编写yaml文件

[root@k8s-master01 yaml]# vim job1.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: pi                    #job名称
  labels:
    app: pi
spec:
  template:
    metadata:
      name: pi
      labels:
        app: pi
    spec:
      restartPolicy: Never        #执行完成后不在重启
      containers:
      - name: pi                #容器名
        image: perl
        imagePullPolicy: IfNotPresent
        command: ['perl', '-Mbignum=bpi', '-wle',"print bpi(2000)"]

检查语法错误并执行

[root@k8s-master01 yaml]# kubectl apply -f job1.yaml --dry-run=client
job.batch/pi created (dry run)
[root@k8s-master01 yaml]# kubectl apply -f job1.yaml
job.batch/pi created

验证pod信息

[root@k8s-master01 yaml]# kubectl describe pod pi-rj2rz | tail -8
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  18s   default-scheduler  Successfully assigned default/pi-rj2rz to k8s-worker04
  Normal  Pulled     17s   kubelet            Container image "perl" already present on machine
  Normal  Created    17s   kubelet            Created container pi
  Normal  Started    17s   kubelet            Started container pi
  
[root@k8s-master01 yaml]# kubectl get pod -o wide
NAME                                     READY   STATUS      RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
pi-rj2rz                                 0/1     Completed   0          25s   10.244.203.247   k8s-worker04   <none>           <none>

验证计算结果

[root@k8s-master01 yaml]# kubectl logs pi-rj2rz 
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901

查看pod运行状态

[root@k8s-master01 yaml]# kubectl get pod pi-rj2rz -o wide
NAME       READY   STATUS      RESTARTS   AGE    IP               NODE           NOMINATED NODE   READINESS GATES
pi-rj2rz   0/1     Completed   0          2m4s   10.244.203.247   k8s-worker04   <none>           <none>

3、案例2:创建固定次数job

编写yaml文件

[root@k8s-master01 yaml]# vim job2.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: busybox-job
  labels:
    app: busybox-job
spec:
  completions: 10                    # 执行job的次数
  parallelism: 1                    # 执行job的并发数
  template:
    metadata:
      name: busybox-job
      labels:
        app: busybox-job
    spec:
      restartPolicy: Never
      containers: 
      - name: busybox-job
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ['echo', 'hello']

检查语法错误并执行

[root@k8s-master01 yaml]# kubectl apply -f job2.yaml --dry-run=client
job.batch/busybox-job created (dry run)
[root@k8s-master01 yaml]# kubectl apply -f job2.yaml
job.batch/busybox-job created

验证pod信息

[root@k8s-master01 yaml]# kubectl get job
NAME          COMPLETIONS   DURATION   AGE
busybox-job   10/10         11s        2m20s

[root@k8s-master01 yaml]# kubectl get pod -o wide
NAME                                     READY   STATUS      RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
busybox-job-645sx                        0/1     Completed   0          93s   10.244.203.252   k8s-worker04   <none>           <none>
busybox-job-94dkg                        0/1     Completed   0          88s   10.244.203.193   k8s-worker04   <none>           <none>
busybox-job-fqr66                        0/1     Completed   0          97s   10.244.203.248   k8s-worker04   <none>           <none>
busybox-job-jlwp5                        0/1     Completed   0          94s   10.244.203.251   k8s-worker04   <none>           <none>
busybox-job-q5ff9                        0/1     Completed   0          96s   10.244.203.249   k8s-worker04   <none>           <none>
busybox-job-rh4fb                        0/1     Completed   0          92s   10.244.203.253   k8s-worker04   <none>           <none>
busybox-job-sgzx8                        0/1     Completed   0          90s   10.244.203.255   k8s-worker04   <none>           <none>
busybox-job-tlpjp                        0/1     Completed   0          91s   10.244.203.254   k8s-worker04   <none>           <none>
busybox-job-xpkw7                        0/1     Completed   0          87s   10.244.203.194   k8s-worker04   <none>           <none>
busybox-job-z4kbd                        0/1     Completed   0          95s   10.244.203.250   k8s-worker04   <none>           <none>

验证pod输出结果

[root@k8s-master01 yaml]# kubectl logs busybox-job-645sx 
hello

4、案例3:一次性备份MySQL数据库

编写yaml文件准备创建mysql的pod

[root@k8s-master01 yaml]# vim mysql01.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql-test
  namespace: default
spec:
  selector:
    app: mysql-dump
  ports:
  - name: mysql
    port: 3306
  clusterIP: None
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: db
  namespace: default
spec:
  selector:
    matchLabels:
      app: mysql-dump
  serviceName: "mysql-test"
  template:
    metadata:
      labels:
        app: mysql-dump
    spec:
      nodeName: k8s-worker01
      containers:
      - name: mysql
        image: mysql:5.7
        imagePullPolicy: IfNotPresent
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "abc123"
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-data
          mountPath: "/var/lib/mysql"
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql-data
  volumeClaimTemplates:
  - metadata:
      name: mysql-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "nfs-client"
      resources:
        requests:
          storage: 10Gi

检查语法错误并应用

[root@k8s-master01 yaml]# kubectl apply -f mysql01.yaml --dry-run=client
service/mysql-test created (dry run)
statefulset.apps/db created (dry run)
[root@k8s-master01 yaml]# kubectl apply -f mysql01.yaml
service/mysql-test created
statefulset.apps/db created

验证mysql的pod信息

[root@k8s-master01 yaml]# kubectl get pod -o wide
NAME                                     READY   STATUS    RESTARTS   AGE     IP              NODE           NOMINATED NODE   READINESS GATES
db-0                                     1/1     Running   0          2m14s   10.244.79.86    k8s-worker01   <none>           <none>
nfs-client-provisioner-856696f4c-cmlgq   1/1     Running   0          18h     10.244.39.230   k8s-worker03   <none>           <none>

[root@k8s-master01 yaml]# kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP    22d
mysql-test   ClusterIP   None         <none>        3306/TCP   2m23s

[root@k8s-master01 yaml]# kubectl describe pod db-0 | tail -8
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason   Age    From     Message
  ----    ------   ----   ----     -------
  Normal  Pulling  2m36s  kubelet  Pulling image "mysql:5.7"
  Normal  Pulled   2m5s   kubelet  Successfully pulled image "mysql:5.7" in 30.995149216s
  Normal  Created  2m5s   kubelet  Created container mysql
  Normal  Started  2m5s   kubelet  Started container mysql
使用kuboard查看

invalid image(图片无法加载)

invalid image(图片无法加载)

在nfs服务器中查看
[root@k8s-nfs kuberneters]# ls
default-mysql-data-db-0-pvc-477511f5-1dfb-48df-834a-41fc10c6b5b5
[root@k8s-nfs kuberneters]# ls default-mysql-data-db-0-pvc-477511f5-1dfb-48df-834a-41fc10c6b5b5/
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem

编写一次性备份mysql的job类型pod的yaml文件

[root@k8s-master01 yaml]# vim mysql-bk.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: mysql-dump
  namespace: default
spec:
  template:
    metadata:
      name: mysql-dump
    spec:
      restartPolicy: Never
      nodeName: k8s-worker01
      containers:
      - name: mysql-dump
        image: mysql:5.7
        command: ["/bin/sh","-c","mysqldump --host=mysql-test -uroot -pabc123 --databases mysql > /root/mysql2024.sql"]
        volumeMounts:
        - name: mysql-db  # 修改此处的名称为 "mysql-db"
          mountPath: "/root"
      volumes:
      - name: mysql-db
        hostPath: 
          path: /opt/mysqldump
          type: Directory

检查语法错误并应用

[root@k8s-master01 yaml]# kubectl apply -f mysql-bk.yaml --dry-run=client
job.batch/mysql-dump created (dry run)

[root@k8s-master01 yaml]# kubectl apply -f mysql-bk.yaml 
job.batch/mysql-dump created

验证pod信息

[root@k8s-master01 yaml]# kubectl get job
NAME         COMPLETIONS   DURATION   AGE
mysql-dump   1/1           1s         3m16s

[root@k8s-master01 yaml]# kubectl get pod mysql-dump-swj55 -o wide
NAME               READY   STATUS      RESTARTS   AGE   IP             NODE           NOMINATED NODE   READINESS GATES
mysql-dump-swj55   0/1     Completed   0          55s   10.244.79.88   k8s-worker01   <none>           <none>

[root@k8s-master01 yaml]# kubectl describe pod mysql-dump-swj55 | tail -8
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason   Age   From     Message
  ----    ------   ----  ----     -------
  Normal  Pulled   71s   kubelet  Container image "mysql:5.7" already present on machine
  Normal  Created  71s   kubelet  Created container mysql-dump
  Normal  Started  71s   kubelet  Started container mysql-dump

在对应的节点对应的目录中查看

[root@k8s-worker01 mysqldump]# pwd
/opt/mysqldump
[root@k8s-worker01 mysqldump]# ls
mysql2024.sql
[root@k8s-worker01 mysqldump]# 

七、CronJob介绍及应用


1、CronJob介绍

  • 类似于Linux系统的crontab,在指定的时间周期运行相关的任务

  • 时间格式:分时日月周

    2、CronJob应用案例1:周期性输出字符

编写yaml文件

[root@k8s-master01 yaml]# vim cronjob01.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob1
  namespace: default
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:  # 添加这一行,以包含 template 字段
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - "/bin/sh"
            - -c
            - date; echo hello kubernetes
          restartPolicy: OnFailure

检查语法错误并执行

[root@k8s-master01 yaml]# kubectl apply -f cronjob01.yaml --dry-run=client
cronjob.batch/cronjob1 created (dry run)
[root@k8s-master01 yaml]# kubectl apply -f cronjob01.yaml
cronjob.batch/cronjob1 created

验证pod信息

[root@k8s-master01 yaml]# kubectl get cronjobs
NAME       SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob1   * * * * *   False     0        54s             109s

[root@k8s-master01 yaml]# kubectl get pod cronjob1-2847659
cronjob1-28476596-5m9gs  cronjob1-28476597-b94j6  
[root@k8s-master01 yaml]# kubectl get pod 
NAME                                     READY   STATUS              RESTARTS   AGE
cronjob1-28476596-5m9gs                  0/1     Completed           0          69s
cronjob1-28476597-b94j6                  0/1     ContainerCreating   0          9s
nfs-client-provisioner-856696f4c-cmlgq   1/1     Running             0          24h

[root@k8s-master01 yaml]# kubectl get pod -o wide
NAME                                     READY   STATUS      RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
cronjob1-28476596-5m9gs                  0/1     Completed   0          98s   10.244.203.195   k8s-worker04   <none>           <none>
cronjob1-28476597-b94j6                  0/1     Completed   0          38s   10.244.203.198   k8s-worker04   <none>           <none>
nfs-client-provisioner-856696f4c-cmlgq   1/1     Running     0          24h   10.244.39.230    k8s-worker03   <none>           <none>
[root@k8s-master01 yaml]# 

验证pod输出

[root@k8s-master01 yaml]# kubectl logs cronjob1-28476596-5m9gs 
Thu Feb 22 09:56:01 UTC 2024
hello kubernetes
[root@k8s-master01 yaml]# kubectl logs cronjob1-28476598-s8wr6 
Thu Feb 22 09:58:16 UTC 2024
hello kubernetes

在次查看pod信息,会发现每隔一分钟创建一个次

[root@k8s-master01 yaml]# kubectl get pod -o wide
NAME                                     READY   STATUS              RESTARTS   AGE    IP               NODE           NOMINATED NODE   READINESS GATES
cronjob1-28476596-5m9gs                  0/1     Completed           0          3m3s   10.244.203.195   k8s-worker04   <none>           <none>
cronjob1-28476597-b94j6                  0/1     Completed           0          2m3s   10.244.203.198   k8s-worker04   <none>           <none>
cronjob1-28476598-s8wr6                  0/1     Completed           0          63s    10.244.203.199   k8s-worker04   <none>           <none>
cronjob1-28476599-65lg8                  0/1     ContainerCreating   0          3s     <none>           k8s-worker04   <none>           <none>
nfs-client-provisioner-856696f4c-cmlgq   1/1     Running             0          24h    10.244.39.230    k8s-worker03   <none>           <none>

[root@k8s-master01 yaml]# kubectl get cronjobs.batch 
NAME       SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob1   * * * * *   False     1        15s             4m10s

3、CronJob应用案例1:周期性备份mysql数据库

3.1、MySQL数据库准备

编写yaml文件

[root@k8s-master01 yaml]# cat mysql01.yaml 
apiVersion: v1
kind: Service
metadata:
  name: mysql-test
  namespace: default
spec:
  selector:
    app: mysql-dump
  ports:
  - name: mysql
    port: 3306
  clusterIP: None
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: db
  namespace: default
spec:
  selector:
    matchLabels:
      app: mysql-dump
  serviceName: "mysql-test"
  template:
    metadata:
      labels:
        app: mysql-dump
    spec:
      nodeName: k8s-worker01
      containers:
      - name: mysql
        image: mysql:5.7
        imagePullPolicy: IfNotPresent
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "abc123"
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-data
          mountPath: "/var/lib/mysql"
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql-data
  volumeClaimTemplates:
  - metadata:
      name: mysql-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "nfs-client"
      resources:
        requests:
          storage: 10Gi

检查语法并应用

[root@k8s-master01 yaml]# kubectl apply -f mysql01.yaml --dry-run=client
service/mysql-test created (dry run)
statefulset.apps/db created (dry run)
[root@k8s-master01 yaml]# kubectl apply -f mysql01.yaml
service/mysql-test created
statefulset.apps/db created

验证pod信息

[root@k8s-master01 yaml]# kubectl get pod -o wide
NAME                                     READY   STATUS    RESTARTS   AGE   IP              NODE           NOMINATED NODE   READINESS GATES
db-0                                     1/1     Running   0          36s   10.244.79.89    k8s-worker01   <none>           <none>

验证永久存储

[root@k8s-nfs ~]# cd /kuberneters/
[root@k8s-nfs kuberneters]# ls
default-mysql-data-db-0-pvc-699b04bb-b9cb-4848-8236-93ac761e7016
[root@k8s-nfs kuberneters]# ls default-mysql-data-db-0-pvc-699b04bb-b9cb-4848-8236-93ac761e7016/
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem

3.2、创建周期性备份MySQL数据pod

编写yaml文件

[root@k8s-master01 yaml]# cat mysql-bk.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: mysql-dump
  namespace: default
spec:
  schedule: "*/1 * * * *"    # 1分钟备份一次
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: Never
          nodeName: k8s-worker01
          containers:
          - name: mysql-dump
            image: mysql:5.7
            command: ["/bin/sh","-c","mysqldump --host=mysql-test -uroot -pabc123 --databases mysql > /root/mysql`date +%Y%m%d%H%M`.sql"]
            volumeMounts:
            - name: mysql-bp
              mountPath: "/root"
          volumes:
          - name: mysql-bp
            hostPath:
              path: /opt/mysqlbk

检查语法错误并应用

[root@k8s-master01 yaml]# kubectl apply -f mysql-bk.yaml --dry-run=client
cronjob.batch/mysql-dump created (dry run)
[root@k8s-master01 yaml]# kubectl apply -f mysql-bk.yaml
cronjob.batch/mysql-dump created

验证pod信息

[root@k8s-master01 yaml]# kubectl get cronjobs
NAME         SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
mysql-dump   */1 * * * *   False     1        0s              24s

[root@k8s-master01 yaml]# kubectl get pod
NAME                                     READY   STATUS      RESTARTS   AGE
db-0                                     1/1     Running     0          107m
mysql-dump-28477936-kgcsj                0/1     Completed   0          110s
mysql-dump-28477937-phlpj                0/1     Completed   0          50s

我们等待一段时间,在对应节点的对应目录中查看

[root@k8s-worker01 ~]# cd /opt/mysqldump
[root@k8s-worker01 mysqlbk]# ll
total 19020
-rw-r--r-- 1 root root 3892459 Feb 23 16:16 mysql202402230816.sql
-rw-r--r-- 1 root root 3892459 Feb 23 16:17 mysql202402230817.sql
-rw-r--r-- 1 root root 3892459 Feb 23 16:18 mysql202402230818.sql
-rw-r--r-- 1 root root 3892459 Feb 23 16:19 mysql202402230819.sql
-rw-r--r-- 1 root root 3892459 Feb 23 16:20 mysql202402230820.sql
0
k8s
广告 广告

评论区