WHCSRL 技术网

k8s中controller部署有状态应用StatefulSet

无状态和有状态区别

(1) 无状态:

  • 认为pod都是一样的(副本内容一样)
  • 没有顺序要求(先用哪一个pod)
  • 不用考虑在哪一个node运行
  • 随意进行伸缩和扩展
    (2)有状态:
  • 上面因素都要考虑到
  • 让每个pod都是独立的。保持pod的启动顺序和唯一性
    • 唯一的网络标识符,持久存储
  • 有序,比如mysql主从

部署有状态应用

** 无头service也就是里面 ClusterIP:none**
无头的service
在这里插入图片描述
(1)SatefulSet 部署有状态应用
在这里插入图片描述

创建了三个有状态应用,查看pod,有三个,每个都是唯一的名称。

在这里插入图片描述

查看创建的无头的service

kubectl get pods,service
kubectl get pods,svc
  • 1
  • 2

在这里插入图片描述

deployment和statefulset区别

statefulset有唯一标识)

根据主机名+按照一定的规则生成域名
规则:
** 每个pod有唯一的主机名 **
** 唯一域名,格式为主机名称.service名称。名称空间.svc.cluster.local**
nginx-statefulset-0.nginx.default.svc.cluster.local

部署守护进程DaemonSet

它可以确保所有node运行同一个pod

在这里插入图片描述

  • 在每一个node上运行同一个pod, 新加入的node也同样运行同一个pod
    例子:在每个node节点安装数据采集工具(日志收集)

实际操作

编写yaml文件:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ds-test
  labels:
    app: filebeat
spec:
  selector:
    matchLabels:
      app: filebeat
  template:
      metadata:
        labels:
          app: filebeat
      spec:
        containers:
        - name: logs
          image: nginx
          ports:
          - containerPort: 80
          volumeMounts:
          - name: varlog
            mountPath: /tmp/log
        volumes:
        - name: varlog
          hostPath: 
            path: /var/log 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

删除StatefulSet创建的pod

kubectl delete statefulset --all   //删除所有statefulset创建的pod
  • 1

删除svc中的服务

kubectl delete svc [pod名称]  // 删除service中的pod服务
  • 1

创建DaemonSet的pod

kubectl apply -f ds.yaml  // 创建 pod
kubectl get pods    //查看pods
  • 1
  • 2

可以看到创建完毕
在这里插入图片描述

进入某一个pod里面查看日志

kubectl exec -it [pod名称] /bin/bash
kubectl exec -it ds-test-fsl2w bash   //进入pod新的终端
  • 1
  • 2

在这里插入图片描述

Controller一次性任务JOB和定时任务CRONJOB

一次性任务 Job

yaml文件

apiVersion: batch/v1
kind: Job
metadata: 
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl", "-Mbignum=bpi","-wle","print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

创建job任务

如果使用create创建job,无法进行滚动更新或者回滚,使用apply就可以

kubectl create -f job.yaml   // 如果使用`create`创建job,无法进行滚动更新或者回滚,使用`apply`就可以
kubectl get pods -o wide   //查看pod具体信息 ,可知道job在node2节点上
kubectl get jobs   //查看任务
docker images   // 在node2节点上可以查看到pull下来的perl镜像
  • 1
  • 2
  • 3
  • 4

创建了任务
而且只完成一次。出现completed
在这里插入图片描述

查看job的信息
在这里插入图片描述
node2节点的perl镜像被下载完成
在这里插入图片描述

查看日志

kubectl logs [pod名称] 
  • 1

计算了pi,执行一次
在这里插入图片描述

删除job的yaml文件

在这里插入图片描述
再次查看job情况,会发现已经消失。

kubectl get jobs
  • 1

在这里插入图片描述

定时任务

定时写出hello任务

编写yaml文件

[root@k8s-master01 ~]# cat cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1****"
  jobTemplate:
  ##################CronJob#####################
    spec:
      template:
        spec:
          containers:
            - name: hello
              image: busybox
              args:
              - /bin/sh
              - -c
              - date; echo He11o from the Kubernetes cluster
          restartPolicy: OnFailure

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

创建任务

kubectl apply -f cronjob.yaml 
  • 1

在这里插入图片描述

查看pod信息

发现每隔一分钟执行一次hello
在这里插入图片描述

查看定时任务

kubectl get coronjobs
  • 1

在这里插入图片描述

查看日志

kubectl logs [job名称]
kubectl logs hello-27242448--1-mm9kj     // 查看日志
  • 1
  • 2

在这里插入图片描述

删除job

kubectl delete cornjob [名称]   //删除job
kubectl delete cronjob  hello   // 删除了定时任务hello
  • 1
  • 2

在这里插入图片描述

推荐阅读