七、k8s快速入门之资源控制器

文章目录

        • [:star: RC](#:star: RC)
        • [:star: Deployment](#:star: Deployment)
          • [:three: create 和 apply的区别](#:three: create 和 apply的区别)
        • [:star: DaemonSet](#:star: DaemonSet)
        • [:star: job&&CronJob](#:star: job&&CronJob)
⭐️ RC

1️⃣ 查看版本

kubect api-resource
或
kubect explain rs

2️⃣ 编写Yaml文档

yaml 复制代码
[root@master ~]# vim pod/rc.yaml
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
  clusterName: nginx ##集群名
  name: test ##rs的名字
spec:
  replicas: 5 ##期望副本数
  selector: ## 标签匹配 它要和下面的pod标签一样才能匹配,如果为空则一pod模板为主
    matchLabels: ##标签
      app: web
  template: ##pod模板就和kind: Pod 一样
    metadata: 
      labels:
        app: web
    spec:
      containers:
      - name: webapp
        image: harbor.tanc.com/library/nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          protocol: TCP

//指向
[root@master ~]# kubectl create -f pod/rc.yaml   

rs并不会按照自己的标签来管理,而会按照selector来管理

3️⃣ 查看

[root@master ~]# kubectl get pod --show-labels  ##查看标签
NAME         READY   STATUS    RESTARTS   AGE    LABELS
test-9pdcc   1/1     Running   0          146m   app=web
test-fpzwh   1/1     Running   0          146m   app=web
test-g8g86   1/1     Running   0          146m   app=web
test-ljzgp   1/1     Running   0          146m   app=web
test-xw6m6   1/1     Running   0          146m   app=web

4️⃣ 修改一下标签

[root@master ~]# kubectl label pod test-9pdcc app=web1 --overwrite=true
pod/test-9pdcc labeled

overwrite如果为false则不允许覆盖标签,true则允许

在来查看一下有什么不同

shell 复制代码
[root@master ~]# kubectl get pod --show-labels 
NAME         READY   STATUS    RESTARTS   AGE    LABELS
test-7fjv6   1/1     Running   0          4s     app=web
test-9pdcc   1/1     Running   0          149m   app=web1
test-fpzwh   1/1     Running   0          149m   app=web
test-g8g86   1/1     Running   0          149m   app=web
test-ljzgp   1/1     Running   0          149m   app=web
test-xw6m6   1/1     Running   0          149m   app=web
   

5️⃣ 可以发现是多了一个pod,因为rs需要匹配标签,如果标签改了rs就匹配不到了,Pod就为2个了,没有达到期望值,他就会增加在增加一个Pod。

rs对pod副本数目的监控大多都是基于标签来管理的

6️⃣ 试一下把rs删除

[root@master ~]# kubectl get rs
NAME   DESIRED   CURRENT   READY   AGE
test   5         5         5       157m
[root@master ~]# kubectl delete rs test
replicaset.extensions "test" deleted

再来查看pod,发现pod,都在被删除中,可以看见是由rs管理的就会删除

shell 复制代码
[root@master ~]# kubectl get pod
NAME         READY   STATUS        RESTARTS   AGE
test-9pdcc   1/1     Running       0          157m
test-g8g86   0/1     Terminating   0          157m
test-ljzgp   0/1     Terminating   0          157m
⭐️ Deployment

1️⃣ 编写yaml文档

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: http-delpoyment
spec:
  replicas: 3
  template:
    metadata:
      name: httpd
      labels:
       app: web
    spec:
      containers:
      - name: webapp
        image: harbor.tanc.com/library/httpd
        imagePullPolicy: IfNotPresent
        ports:
        - protocol: TCP
          containerPort: 80

2️⃣ 运行

go 复制代码
[root@master ~]# kubectl apply -f pod/deployment.yaml ----record=true
deployment.extensions/http-delpoyment created      
3️⃣ create 和 apply的区别

create 和 apply都可以创建deployment 区别

kubectl create

(1)kubectl create命令,是先删除所有现有的东西,重新根据yaml文件生成新的。所以要求yaml文件中的配置必须是完整的

(2)kubectl create命令,用同一个yaml 文件执行替换replace命令,将会不成功,fail掉。

kubectl apply

kubectl apply命令,根据配置文件里面列出来的内容,升级现有的。所以yaml文件的内容可以只写需要升级的属性

ps2:

------record=false:在资源标注中记录当前kubectl命令。如果设置为false,则不记录该命令。如果设置为true,记录命令。如果没有设置,则默认只在已有注释值时更新现有注释值。

查看pod

[root@master ~]# kubectl get pod --show-labels
NAME                               READY   STATUS    RESTARTS   AGE   LABELS
http-delpoyment-7cffd4d96f-6d54x   1/1     Running   0          51s   app=web,pod-template-hash=7cffd4d96f
http-delpoyment-7cffd4d96f-jvj46   1/1     Running   0          51s   app=web,pod-template-hash=7cffd4d96f
http-delpoyment-7cffd4d96f-zntwn   1/1     Running   0          51s   app=web,pod-template-hash=7cffd4d96f      

4️⃣ 查看rs

[root@master ~]# kubectl get rs --show-labels
NAME                         DESIRED   CURRENT   READY   AGE   LABELS
http-delpoyment-7cffd4d96f   3         3         3       21m   app=web,pod-template-hash=7cffd4d96f

5️⃣ 查看deployment

[root@master ~]# kubectl get deployment --show-labels
NAME              READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
http-delpoyment   3/3     3            3           21m   app=web
⭐️ DaemonSet

⭐️ DaemonSet 保证在每个 Node 上都运行一个容器副本,常用来部署一些集群的日志、监 控或者其他系统管理应用

1️⃣ 编写yaml

apiVersion:  extensions/v1beta1
kind: DaemonSet
metadata:
  name: nginx-daemonset
  labels:
    app: daemonset-web
spec:
  selector:
    matchLabels:
      app: web-nginx
  template:
    metadata:
      name: nginx
      labels:
        app: web-nginx
    spec:
      containers:
      - name: nginx
        image: harbor.tanc.com/library/nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          protocol: TCP

ds也并不会按照自己的标签来管理,而会按照selector来管理

2️⃣ 查看一下podds

[root@master ~]# kubectl get pod --show-labels
NAME                    READY   STATUS    RESTARTS   AGE     LABELS
nginx-daemonset-fntnx   1/1     Running   0          6m57s   app=web-nginx,controller-revision-hash=84b79765f6,pod-template-generation=1
nginx-daemonset-kll5r   1/1     Running   0          6m57s   app=web-nginx,controller-revision-hash=84b79765f6,pod-template-generation=1


[root@master ~]# kubectl get ds --show-labels
NAME              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE     LABELS
nginx-daemonset   2         2         2       2            2           <none>          7m19s   app=daemonset-web

⭐️ job&&CronJob

job:

  • spec.template格式同Pod

  • RestartPolicy仅支持Never或OnFailure 就是从不重启和发生错误才重启

  • 单个Pod时,默认Pod成功运行后Job即结束

  • spec.completions标志Job结束需要成功运行的Pod个数,默认为1 就是代表你这个job要运行几次才算成功

  • spec.parallelism标志并行运行的Pod的个数,默认为1 ##就是一次可以运行几个job来完成任务

  • spec.activeDeadlineSeconds标志失败Pod的重试最大时间,超过这个时间不会继续重试 默认为秒极

1️⃣ 编写yaml

[root@master ~]# vim pod/job.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: echo-job
  labels:
    job: echo
spec:
  completions: 4 
  parallelism: 1
  activeDeadlineSeconds: 20
  template:
    metadata:
      name: echo-job
    spec:
      containers:
      - name: echo-job
        image: harbor.tanc.com/library/busybox
        imagePullPolicy: IfNotPresent
        command: ['sh','-c','echo hello-word']
        ports:
        - containerPort: 80
          protocol: TCP
      restartPolicy: Never

3️⃣ 查看job

[root@master ~]# kubectl get job
NAME       COMPLETIONS   DURATION   AGE
echo-job   4/4           6s         17s

4️⃣ 查看pod,可以看见job都是完成

[root@master ~]# kubectl get pod
NAME                    READY   STATUS      RESTARTS   AGE
echo-job-rkjl5          0/1     Completed   0          17s
echo-job-scf47          0/1     Completed   0          20s
echo-job-tq4hp          0/1     Completed   0          19s
echo-job-zf896          0/1     Completed   0          15s
nginx-daemonset-fntnx   1/1     Running     0          54m
nginx-daemonset-kll5r   1/1     Running     0          54m

5️⃣ 查看日志可以看见输出了hello-word

[root@master ~]# kubectl log echo-job-rkjl5
log is DEPRECATED and will be removed in a future version. Use logs instead.
hello-word

CronJob:

CronJob Spec

  • spec.schedule :调度,必需字段,指定任务运行周期,格式同Crontab \* \* \* \* \* 分 时 日 月 星期

  • spec.jobTemplate : job模板,必需字段,指定需要运行的任务,格式同Job

  • spec.startingDeadlineSeconds: 启动Job的期限(秒级别) ,该字段是可选的。如果因为任何原因而错过了被调度的时间,那么错过执行时间的Job将被认为是失败的。如果没有指定,则没有期限

  • spec.concurrencyPolicy :并发策略,该字段也是可选的。它指定了如何处理被Cron Job创建的Jop的并发执行。只允许指定下面策略中的一种:

    • Allow(默认) :允许并发运行Job
    • Forbid :禁止并发运行,如果前-一个还没有完成,则直接跳过下一个
    • Replace :取消当前正在运行的Job,用-个新的来替换

    注意,当前策略只能应用于同- -个Cron Job创建的Job。如果存在多个Cron Job,它们创建的Job之间总是允许并发运行

  • spec.suspend: 挂起,该字段也是可选的。如果设置为true,后续所有执行都会被挂起。它对已经开始执行的Job不起作用。默认值为false

  • spec.successfullobsHistoryLimitspec.failedJobsHistoryLimit ] :历史限制,是可选的字段。它们指定了可以保留多少完成和失败的Job。默认情况下,它们分别设置为3和1。设置限制的值为0,相关类型的Job完成后将不会被保留。

1️⃣ 编写yaml文档

[root@master ~]# vim pod/cronjob.yaml 

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: echo-cronjob
spec:
  startingDeadlineSeconds: 25
  concurrencyPolicy: Allow
  schedule: "*/1 * * * * "
  jobTemplate:
    spec:
      template:
        metadata:
          name: cronjob-app
        spec:
          containers:
          - name: cronjob
            image: harbor.tanc.com/library/busybox
            imagePullPolicy: IfNotPresent
            command: ['sh','-c','echo how are you??']
          restartPolicy: OnFailure

2️⃣ 查看job

[root@master ~]# kubectl get cronjob
NAME           SCHEDULE       SUSPEND   ACTIVE   LAST SCHEDULE   AGE
echo-cronjob   */1 * * * *    False     0        32s             116s

3️⃣ 查看pod

[root@master ~]# kubectl get pod
NAME                            READY   STATUS      RESTARTS   AGE
echo-cronjob-1629463320-n9xx5   0/1     Completed   0          104s
echo-cronjob-1629463380-skghr   0/1     Completed   0          43s
相关推荐
颜淡慕潇12 分钟前
【K8S系列】Kubernetes 中 Service 的流量不均匀问题【已解决】
后端·云原生·容器·kubernetes
Linux运维老纪15 分钟前
K8s资源对象监控之kube-state-metrics详解(Detailed Explanation of Kube State Metrics)
网络·安全·云原生·容器·kubernetes·云计算·运维开发
meeiuliuus16 分钟前
【读书笔记/深入理解K8S】集群控制器
云原生·容器·kubernetes
二十雨辰22 分钟前
[linux]docker快速入门
运维·docker·容器
梦幻开局38 分钟前
第六章 DNS域名解析服务器
运维·服务器
linzhisong1 小时前
飞牛OS在Docker中安装ODOO ERP系统
运维·docker·容器
V+zmm101341 小时前
社区养老服务小程序ssm+论文源码调试讲解
java·服务器·前端·javascript·小程序·毕业设计·1024程序员节
KTKong2 小时前
kubernetes部署rancher无法查看pod日志及通过execute shell进入pod解决办法
容器·kubernetes·rancher
黑龙江亿林等保3 小时前
阿里云ESC云服务器搭建指南
服务器·阿里云·云计算
遥襟3 小时前
Prometheus套装部署到K8S+Dashboard部署详解
云原生·容器·kubernetes