k8s--五种控制器类型及演示


前言

K8S的控制器是非常重要的存在,每种控制器都处理不同的任务,它主要用来控制Pod的状态和行为。

一、为什么要有控制器

K8S是容器资源管理和调度平台,容器跑在Pod里,Pod是K8S里最小的单元。所以,这些Pod作为一个个单元我们肯定需要去操作它的状态和生命周期。那么如何操作?这里就需要用到控制器了。

这里一个比较通俗的公式:应用APP = 网络 + 载体 + 存储

mark

这里应用一般分为无状态应用、有状态应用、守护型应用、批处理应用这四种。

无状态应用:应用实例不涉及事务交互,不产生持久化数据存储在本地,并且多个应用实例对于同一个请求响应的结果是完全一致的。举例:nginx或者tomcat

有状态应用:有状态服务可以说是需要数据存储功能的服务或者指多线程类型的服务、队列等。举例:mysql数据库、kafka、redis、zookeeper等。

守护型应用:类似守护进程一样,长期保持运行,监听持续的提供服务。举例:ceph、logstash、fluentd等。

批处理应用:工作任务型的服务,通常是一次性的。举例:运行一个批量改文件夹名字的脚本。

这些类型的应用服务如果是安装在传统的物理机或者虚拟机上,那么我们一般会通过人肉方式或者自动化工具的方式去管理编排。但是这些服务一旦容器化了跑在了Pod里,那么就应该按照K8S的控制方式来管理了。上一篇文章我们讲到了编排,那么K8S靠什么具体的操作来做编排?答案就是这些控制器。

二、K8S有哪些控制器

既然应用的类型有上面说的这些无状态、有状态的,那么K8S肯定要实现一些控制器来专门处理对应类型的应用。总体来说,K8S有五种控制器,分别对应处理无状态应用、有状态应用、守护型应用和批处理应用。

  • Deployment

  • StatefulSet

  • DaemonSet

  • Job

  • CronJob

2.1:pod与控制器之间的关系

controllers:在集群上管理和运行容器的对象通过label-selector相关联

Pod通过控制器实现应用的运维,如伸缩,升级等

mark

2.2:Deployment(无状态化应用)

应用场景:web服务

Deployment中文意思为部署、调度,通过Deployment我们能操作RS(ReplicaSet),你可以简单的理解为它是一种通过yml文件的声明,在Deployment 文件里可以定义Pod数量、更新方式、使用的镜像,资源限制等。无状态应用都用Deployment来创建,例

[root@master shuai]# vim nginx-delpoy.yaml

apiVersion: apps/v1
kind: Deployment   '定义是Deployment'
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3  '副本数量为3'
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80


'创建资源'
[root@master shuai]# kubectl apply -f nginx-delpoy.yaml 
deployment.apps/nginx-deployment created

//Replicaset 是控制版本,副本数,回滚就是通过此来实现
'//查看所有资源'
[root@master shuai]# kubectl get all
NAME                                  READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-d55b94fd-cndf2   1/1     Running   0          3m31s
pod/nginx-deployment-d55b94fd-ghlwk   1/1     Running   0          3m31s
pod/nginx-deployment-d55b94fd-tm4sw   1/1     Running   0          3m31s
pod/pod-example                       1/1     Running   0          10h

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   3d6h

NAME                               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   3         3         3            3           3m31s

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-d55b94fd   3         3         3       3m31s

查看控制器信息

kubectl deit deployment/nginx-deployment
.....省略信息.....
strategy:
    rollingUpdate:         '版本更新为滚动更新机制'
      maxSurge: 25%        '最大更新副本数是25%,最多扩容125%' '为了保持副本数量,增加的百分比同时要销毁多少'
      maxUnavailable: 25%  '最大删除副本是25%,最多缩容到75%'
    type: RollingUpdate
...省略信息....


'执行kubectl describe deploy nginx-deployment 也可以查看'

....省略信息....
RollingUpdateStrategy:  25% max unavailable, 25% max surge

查看历史版本

[root@master shuai]# kubectl rollout history deploy/nginx-deployment
deployment.extensions/nginx-deployment 
REVISION  CHANGE-CAUSE
1         <none>   '//这边只有一个,证明还没有滚动更新'

2. 3:StatefulSet(有状态应用应用)

StatefulSet的出现是K8S为了解决 “有状态” 应用落地而产生的,Stateful这个单词本身就是“有状态”的意思。之前大家一直怀疑有状态应用落地K8S的可行性,StatefulSet很有效解决了这个问题。有状态应用一般都需要具备一致性,它们有固定的网络标记、持久化存储、顺序部署和扩展、顺序滚动更新等等。总结两个词就是需要稳定、有序。

那么StatefulSet如何做到Pod的稳定、有序?具体有了哪些内在机制和方法?主要概况起来有这几个方面:

  • 给Pod一个唯一和持久的标识(例:Pod name)
  • 给予Pod一份持久化存储
  • 部署Pod都是顺序性的,0 ~ N-1
  • 扩容Pod必须前面的Pod还存在着
  • 终止Pod,后面Pod也一并终止

举个例子:创建了zk01、zk02、zk03 三个Pod,zk01就是给的命名,如果要扩容zk04,那么前面01、02、03必须存在,否则不成功;如果删除了zk02,那么zk03也会被删除。

2.31:有状态与无状态化对特点

  • 无状态服务的特点:

    1)deployment 认为所有的pod都是一样的

    2)不用考虑顺序的要求

    3)不用考虑在哪个node节点上运行

    4)可以随意扩容和缩容

  • 有状态服务的特点:

    1)实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd,zookeeper

    2)实例之间不对等的关系,以及依靠外部存储的应用。

2.32:常规的service服务和无头服务的区别

service:一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。

Headless service 无头服务,不需要cluster-IP,直接绑定具体的Pod的IP,无头服务经常用于statefulset的有状态部署

2.33:配置service资源

'//编写一个yaml资源'

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx
    
'//查看暴露端口' '已经创建cluster IP为10.0.0.10  集群地址'
[root@master shuai]# kubectl get svc
NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.0.0.1     <none>        443/TCP        3d7h
nginx-service   NodePort    10.0.0.110   <none>        80:43271/TCP   12s

'获取service的endpoint信息'
[root@master shuai]# kubectl get ep
NAME            ENDPOINTS                                               AGE
kubernetes      20.0.0.41:6443,20.0.0.44:6443                           3d7h
nginx-service   172.17.5.2:80,172.17.5.3:80,172.17.5.4:80 + 1 more...   3m31s


'//在node节点操作'
[root@node1 ~]# systemctl restart flanneld.service 
[root@node1 ~]# systemctl restart docker

'查看群集间通讯'
[root@node2 ~]# curl 10.0.0.110
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    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>

2.34:创建Headless service 无头服务资源和dns资源

由于有状态服务的IP地址是动态的,所以使用无头服务的时候要绑定dns服务

[root@master shuai]# vim nginx-headless.yaml

apiVersion: v1
kind: Service      '定义service类型'
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None   '无头服务不使用cluster IP'
  selector:
    app: nginx
    
'创建资源'
[root@master shuai]# kubectl apply -f nginx-headless.yaml 

'删除以前的service资源'
[root@master shuai]# kubectl delete -f nginx-service.yaml 

'查看service资源 可以看到clusterIP是node'
[root@master shuai]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   3d7h
nginx        ClusterIP   None         <none>        80/TCP    3m12s

'没:有clusterIP是访问不到对方,需要配置DNS服务'

2.35:使用CoreDNS实现Kubernetes基于DNS的服务发现

在Kubernetes集群推荐使用Service
Name作为服务的访问地址,因此需要一个Kubernetes集群范围的DNS服务实现从Service Name到Cluster
Ip的解析,这就是Kubernetes基于DNS的服务发现功能。

配置DNS服务

'创建资源,编写yaml文件'
[root@master shuai]# vim coredns.yaml 

# Warning: This is a file generated from the base underscore template file: coredns.yaml.base

apiVersion: v1
kind: ServiceAccount
metadata:
  name: coredns
  namespace: kube-system
  labels:
      kubernetes.io/cluster-service: "true"   '访问clusterIP,是用DNS形式'
      addonmanager.kubernetes.io/mode: Reconcile
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole                                '集群角色'
metadata:
  labels:
    kubernetes.io/bootstrapping: rbac-defaults   '授权访问api 角色控制'
    addonmanager.kubernetes.io/mode: Reconcile
  name: system:coredns
rules:
- apiGroups:
  - ""
  resources:
  - endpoints
  - services
  - pods
  - namespaces
  verbs:
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
    addonmanager.kubernetes.io/mode: EnsureExists
  name: system:coredns
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:coredns             '命名空间'
subjects:
- kind: ServiceAccount
  name: coredns
  namespace: kube-system
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
  labels:
      addonmanager.kubernetes.io/mode: EnsureExists
data:
  Corefile: |
    .:53 {
    
    
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
    
    
            pods insecure
            upstream
            fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        proxy . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }
---
apiVersion: extensions/v1beta1
kind: Deployment                    '无状态化服务'
metadata:
  name: coredns
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
    kubernetes.io/name: "CoreDNS"  '启动核心功能'
spec:
  # replicas: not specified here:
  # 1. In order to make Addon Manager do not reconcile this replicas parameter.
  # 2. Default is 1.
  # 3. Will be tuned in real time if DNS horizontal auto-scaling is turned on.
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
  selector:
    matchLabels:
      k8s-app: kube-dns
  template:
    metadata:
      labels:
        k8s-app: kube-dns
      annotations:
        seccomp.security.alpha.kubernetes.io/pod: 'docker/default'
    spec:
      serviceAccountName: coredns
      tolerations:
        - key: node-role.kubernetes.io/master
          effect: NoSchedule
        - key: "CriticalAddonsOnly"
          operator: "Exists"
      containers:
      - name: coredns
        image: coredns/coredns:1.2.2    '下载的镜像,起DNS服务'
        imagePullPolicy: IfNotPresent
        resources:
          limits:
            memory: 170Mi
          requests:
            cpu: 100m
            memory: 70Mi
        args: [ "-conf", "/etc/coredns/Corefile" ]
        volumeMounts:
        - name: config-volume
          mountPath: /etc/coredns
          readOnly: true
        ports:
        - containerPort: 53
          name: dns
          protocol: UDP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
        - containerPort: 9153
          name: metrics
          protocol: TCP
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 60
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 5
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            add:
            - NET_BIND_SERVICE
            drop:
            - all
          readOnlyRootFilesystem: true
      dnsPolicy: Default
      volumes:
        - name: config-volume
          configMap:
            name: coredns
            items:
            - key: Corefile
              path: Corefile
---
apiVersion: v1
kind: Service
metadata:
  name: kube-dns
  namespace: kube-system
  annotations:
    prometheus.io/port: "9153"
    prometheus.io/scrape: "true"
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
    kubernetes.io/name: "CoreDNS"
spec:
  selector:
    k8s-app: kube-dns
  clusterIP: 10.0.0.2         'dns访问IP,所有pod识别地址就能找到DNS'
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
    protocol: TCP

创建资源验证DNS解析

[root@master shuai]# kubectl create -f coredns.yaml

'//查看命名空间跟创建在哪个节点'
[root@master shuai]# kubectl get pods -n kube-system -o wide
NAME                                    READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE
coredns-56684f94d6-pc8f6                1/1     Running   0          5m52s   172.17.89.5   20.0.0.43   <none>
kubernetes-dashboard-7dffbccd68-lcwbd   1/1     Running   2          6d3h    172.17.5.2    20.0.0.42   <none>

创建测试pod资源并验证DNS解析功能

[root@master shuai]# vim dns.yaml

apiVersion: v1
kind: Pod
metadata:
  name: dns-test
spec:
  containers:
  - name: busybox
    image: busybox:1.28.4
    args:
    - /bin/sh
    - -c
    - sleep 36000
  restartPolicy: Never  '重启政策,默认方式 不重启'
  
'创建资源'
[root@master shuai]# kubectl apply -f dns.yaml 

'查看pod资源'
root@master shuai]# kubectl get pods
NAME                              READY   STATUS    RESTARTS   AGE
dns-test                          1/1     Running   0          7s

'验证dns功能 解析kubernetes和nginx-service名称  这边节点要重启flanneld和docker做服务转发'
[root@master shuai]# kubectl exec -it dns-test sh
/ # nslookup kubernetes
Server:    10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes
Address 1: 10.0.0.1 kubernetes.default.svc.cluster.local

'//解析nginx-service 这边解析的前提是有资源'
/ # nslookup nginx-service
Server:    10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local

Name:      nginx-service
Address 1: 10.0.0.185 nginx-service.default.svc.cluster.local

'查看service资源'
[root@master shuai]# kubectl get svc
NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.0.0.1     <none>        443/TCP        3d8h
nginx           ClusterIP   None         <none>        80/TCP         52m
nginx-service   NodePort    10.0.0.185   <none>        80:32932/TCP   3m32s

创建statefulset资源

[root@master shuai]# vim sts.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None  '无头服务node'
  selector:
    app: nginx
---
apiVersion: apps/v1beta1  
kind: StatefulSet  
metadata:
  name: nginx-statefulset  
  namespace: default
spec:
  serviceName: nginx  
  replicas: 3  
  selector:
    matchLabels:  
       app: nginx
  template:  
    metadata:
      labels:
        app: nginx  
    spec:
      containers:
      - name: nginx
        image: nginx:latest  
        ports:
        - containerPort: 80 
        
'清除所有pod资源'    
[root@master shuai]# kubectl delete -f .

'//创建dns资源'
[root@master shuai]# kubectl apply -f coredns.yaml

'//创建测试资源'
[root@master shuai]# kubectl apply -f sts.yaml 

'//查看pod资源跟service'
[root@master shuai]# kubectl get pod,svc
NAME                      READY   STATUS    RESTARTS   AGE
pod/dns-test              1/1     Running   0          5m6s
pod/nginx-statefulset-0   1/1     Running   0          104s
pod/nginx-statefulset-1   1/1     Running   0          101s
pod/nginx-statefulset-2   1/1     Running   0          85s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   3d8h
service/nginx        ClusterIP   None         <none>        80/TCP    104s

'//登录pod进行测试解析pod的唯一域名跟自身IP'
/ # nslookup nginx-statefulset-0.nginx 
Server:    10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local

Name:      nginx-statefulset-0.nginx
Address 1: 172.17.89.4 nginx-statefulset-0.nginx.default.svc.cluster.local

Name:      nginx-statefulset-1.nginx    
Address 1: 172.17.5.3 nginx-statefulset-1.nginx.default.svc.cluster.local
/ # nslookup nginx-statefulset-2.nginx 
Server:    10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local

Name:      nginx-statefulset-2.nginx
Address 1: 172.17.89.5 nginx-statefulset-2.nginx.default.svc.cluster.local

/ # exit
[root@master shuai]# 

相比于Deployment而言,StatefulSet是有身份的!(序列编号区分唯一身份)

身份三要素:

1、域名 nginx-statefulset-0.nginx

2、主机名 nginx-statefulset-0

3、存储(PVC)

2.4: DaemonSet

Daemon本身就是守护进程的意思,那么很显然DaemonSet就是K8S里实现守护进程机制的控制器。比如我们需要在每个node里部署fluentd采集容器日志,那么我们完全可以采用DaemonSet机制部署。它的作用就是能确保全部(或者你指定的node数里)运行一个fluentd
Pod副本。当有 node加入集群时,也会为他们新增一个 Pod 。当有 node从集群移除时,这些 Pod 也会被回收。删除
DaemonSet 将会删除它创建的所有 Pod。

应用场景:监控,分布式存储,日志收集等

所以,你可以想象,DaemonSet 特别适合运行那些静默后台运行的应用,而且是连带性质的,非常方便。

创建资源,编写yaml文件

[root@master shuai]# vim ds.yaml

apiVersion: apps/v1
kind: DaemonSet         '资源类型为daemonset'
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4  '镜像'
        ports:
        - containerPort: 80

'创建资源'
[root@master shuai]# kubectl apply -f ds.yaml 

'deamonset会在每个node节点创建一个pod 你新加入的node也会自动运行一个pod'
[root@master shuai]# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE
nginx-deployment-c25qb   1/1     Running   0          2m27s   172.17.89.3   20.0.0.43   <none>
nginx-deployment-d52h2   1/1     Running   0          2m27s   172.17.5.3    20.0.0.42   <none>

2.5: Job

Job就是任务,我们不用K8S,批处理的运行一些自动化脚本或者跑下ansible也是经常的事儿。那么在K8S里运行批处理任务我们用Job即可。执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。

应用场景:离线数据处理,视频解码等业务

创建资源,编写yaml文件

[root@master shuai]# vim 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)"]    'perl计算圆周率'
      restartPolicy: Never
  backoffLimit: 4
  
'重试次数默认是6次,修改为4次,当遇到异常时Never状态会重启,所以要设定次数'

'创建资源'
[root@master shuai]# kubectl get pods -w

'这边下载较慢我们就在node节点下载'
[root@node1 ~]# docker pull perl

'计算完成状态'
[root@master shuai]# kubectl get pods
pi-v6kc5                 0/1     Completed   0          4m41s

'我们查看日志查看相信信息'
[root@master shuai]# kubectl logs pi-v6kc5 
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901


'清除job资源'
kubectl delete -f job.yaml 

2.6:CronJob

在IT环境里,经常遇到一些需要定时启动运行的任务。传统的linux里我们执行定义crontab即可,那么在K8S里我们就可以用到CronJob控制器。其实它就是上面Job的加强版,带时间定点运行的。

周期性任务,像Linux的Crontab一样。

周期性任务

应用场景:通知,备份

列子:每分钟输出一句Hello from the Kubernetes cluster

[root@master shuai]# vim cronjob.yaml

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"    '定义定时任务运行'
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

创建资源并查看

'创建资源'
[root@master shuai]# kubectl apply -f cronjob.yaml

'查看pod资源状态'
[root@master shuai]# kubectl get pods -w
NAME                     READY   STATUS    RESTARTS   AGE
nginx-deployment-c25qb   1/1     Running   0          24m
nginx-deployment-d52h2   1/1     Running   0          24m
hello-1602697800-dk9kh   0/1   Pending   0     0s
hello-1602697800-dk9kh   0/1   Pending   0     0s
hello-1602697800-dk9kh   0/1   ContainerCreating   0     0s
hello-1602697800-dk9kh   0/1   Completed   0     8s
hello-1602697860-vs8jc   0/1   Pending   0     0s

'查看日志信息'
[root@master shuai]# kubectl logs hello-1602698040-5m9hq 
Wed Oct 14 17:54:08 UTC 2020
Hello from the Kubernetes cluster

'等待一分钟有会执行一次'
[root@master shuai]# kubectl get pods
NAME                     READY   STATUS      RESTARTS   AGE
hello-1602697920-krl8w   0/1     Completed   0          2m25s
hello-1602697980-lx2rj   0/1     Completed   0          85s
hello-1602698040-5m9hq   0/1     Completed   0          25s

感谢观看。

猜你喜欢

转载自blog.csdn.net/weixin_47151643/article/details/109089409