【云原生】kubernetes学习之资源(对象)控制器概述---概念和实战(5.2)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【云原生】kubernetes学习之资源(对象)控制器概述---概念和实战

因此,我们可以看到的是,get rs和get deploy 是一样结果,但deploy有一个 UP-TO-DATE,并且名称也不一样。但是看到的pod是一致的哦。水平扩展---将web01这个部署扩展到三个副本:

[root@master ~]# k scale deploy web01 --replicas=3 -n test
deployment.apps/web01 scaled

水平扩展后,可以看到,slave1节点多了两个nginx的pod。

[root@master ~]# k get po -n test -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP            NODE     NOMINATED NODE   READINESS GATES
web01-859c876457-d5978   1/1     Running   0          2m56s   10.244.1.23   slave1   <none>           <none>
web01-859c876457-j7hd5   1/1     Running   0          3m35s   10.244.2.20   slave2   <none>           <none>
web01-859c876457-mbt7p   1/1     Running   0          2m56s   10.244.1.24   slave1   <none>           <none>
当然,扩缩容以及发布等等还有很多的地方可写,比如,蓝灰发布,hpa自动扩缩容等等,内容太多,以后单独一文写吧。

3,StatefulSet Controller


StatefulSet Controller主要是用于部署有状态的服务,有状态的pod与无状态的pod不一样的是,有状态的pod有时候需要通过其主机名来定位,而无状态的不需要,因为无状态的pod每个都是一样的,随机选一个就行,但对于有状态的来说,每一个pod都不一样,通常希望操作的是特定的某一个。statefulset适用于需要以下特点的应用:

(1)稳定的网络标志(主机名):Pod重新调度后其PodName和HostName不变;(2)稳定的持久化存储:基于PVC,Pod重新调度后仍能访问到相同的持久化数据;(3)稳定的创建与扩容次序:有序创建或扩容,从序号小到大的顺序对pod进行创建(即从0到N-1),且在下一个Pod创建运行之前,所有之前的Pod必须都是Running和Ready状态;

(4)稳定的删除与缩容次序:有序删除或缩容,从序号大到小的顺序对pod进行删除(即从N-1到0),且在下一个Pod终止与删除之前,所有之前的Pod必须都已经被删除;(5)稳定的滚动更新次序:从序号大到小的顺序对pod进行更新(即从N-1到0),先删除后创建,且需等待当前序号的pod再次创建完成且状态为Ready时才能进行下一个pod的更新处理。示例,nginx使用volume挂载保存首页状态,具体代码如下:sc是这个:

[root@master ~]# k get sc -A
NAME                  PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
managed-nfs-storage   fuseim.pri/ifs   Delete          Immediate           true                   28h

service和StatefulSet一起编写。

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:
  labels:
    app: sts-nginx
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.18
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: ["ReadWriteOnce"]  # ["ReadWriteOnce","ReadWriteMany"]
      storageClassName: managed-nfs-storage
      resources:
        requests:
          storage: 1Gi

查看pv,pvc和pod的名称以及状态。

[root@master ~]# k get pvc -A
NAMESPACE   NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
default     test-claim   Bound    pvc-39177650-a78e-46d4-899c-7c1f52108280   1Mi        RWX            managed-nfs-storage   28h
default     www-web-0    Bound    pvc-ffd14bef-e852-4955-840d-6d3c84d3c3d8   1Gi        RWO            managed-nfs-storage   19m
default     www-web-1    Bound    pvc-5fd485a8-9e7b-470f-816f-d674cb5d7648   1Gi        RWO            managed-nfs-storage   19m
[root@master ~]# k get pv -A
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS          REASON   AGE
pvc-39177650-a78e-46d4-899c-7c1f52108280   1Mi        RWX            Delete           Bound    default/test-claim   managed-nfs-storage            28h
pvc-5fd485a8-9e7b-470f-816f-d674cb5d7648   1Gi        RWO            Delete           Bound    default/www-web-1    managed-nfs-storage            19m
pvc-ffd14bef-e852-4955-840d-6d3c84d3c3d8   1Gi        RWO            Delete           Bound    default/www-web-0    managed-nfs-storage            19m
[root@master ~]# k get po -A |grep web
default       web-0                                     1/1     Running     0          21m
default       web-1                                     1/1     Running     0          21m

由以上输出可以看到statefulset的命名规则和删除规则:

statefulset pod的命名规则、pod创建与删除

如果创建一个名称为web、replicas为3的statefulset对象,则其pod名称分别为web-0、web-1、web-2。

statefulset pod的创建按0 - n的顺序创建,且在创建下一个pod之前,需要等待前一个pod创建完成并处于ready状态。

同样拿上面的例子来说明,在web statefulset创建后,2 个 Pod 将按顺序创建 web-0,web-1。在 web-0 处于 ready 状态之前,web-1 将不会被创建。直到 web-0 再次回到ready状态。

statefulset滚动更新或缩容过程中pod的删除按n - 0的顺序删除,且在删除下一个pod之前,需要等待前一个pod删除完成。

另外,当statefulset.Spec.VolumeClaimTemplates中定义了pod所需的pvc时,statefulset controller在创建pod时,会同时创建对应的pvc出来,但删除pod时,不会做对应pvc的删除操作,这些pvc需要人工额外做删除操作

4,Daemonset Controller


DaemonSet:服务守护进程,它的主要作用是在Kubernetes集群的所有节点中运行我们部署的守护进程,相当于在集群节点上分别部署Pod副本,如果有新节点加入集群,Daemonset会自动的在该节点上运行我们需要部署的Pod副本,相反如果有节点退出集群,Daemonset也会移除掉部署在旧节点的Pod副本。DaemonSet的主要特征:这个 Pod 运行在 Kubernetes 集群里的每一个节点(Node)上;每个节点上只会运行一个这样的 Pod 实例;如果新的节点加入 Kubernetes 集群后,该 Pod 会自动地在新节点上被创建出来;而当旧节点被删除后,它上面的 Pod 也相应地会被回收掉。

DaemonSet常用场景:


网络插件的 Agent 组件,如(Flannel,Calico)需要运行在每一个节点上,用来处理这个节点上的容器网络;

存储插件的 Agent 组件,如(Ceph,Glusterfs)需要运行在每一个节点上,用来在这个节点上挂载F远程存储目录;

监控系统的数据收集组件,如(Prometheus Node Exporter,Cadvisor)需要运行在每一个节点上,负责这个节点上的监控信息搜集。

日志系统的数据收集组件,如(Fluent,Logstash)需要运行在每一个节点上,负责这个节点上的日志信息搜集。

下面是一个示例,该示例将会在每个node内创建一个nginx-1.9.9版本的pod,除了master节点:

[root@master ~]# cat ds-test.yaml 
apiVersion: apps/v1
kind: DaemonSet # 类型为DaeminSet
metadata:
  name: deamonset-example
  labels:
    app: daemonset
spec:
  selector:
    matchLabels:
      name: deamonset-example  # 当前这个 daemenset 只管理标签 name=deamonset-example的pod
  template:
    metadata:
      labels:
        name: deamonset-example  # 设置标签 匹配上文
    spec:
      containers:
      - name: daemonset-example
        image: nginx:1.9.9
5,CronJob Controller和Job Controller

Job Controller


简单示例一个,比如,打印π值到2000位,代码如下:

[root@master ~]# cat job-test
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  completions: 3
  template:
      spec:
        containers:
        - name: pi
          image: registry.cn-beijing.aliyuncs.com/google_registry/perl:5.26
          command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
        restartPolicy: Never
  backoffLimit: 4

执行这个文件:

k apply -f job-test.yaml

查看pod状态:

[root@master ~]# k get po -A |grep pi
default       pi-5zzr7                                  0/1     Completed   0          32m
default       pi-nhgqg                                  0/1     Completed   0          35m
default       pi-slf4k                                  0/1     Completed   0          32m

查看日志,证明这个job完成了:

[root@master ~]# k logs  pi-slf4k
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275898

其中有一个参数可以自动清理:

activeDeadlineSeconds: 10

这个表示该job运行成功10秒后,自动删除pod,那么,如果是需要看一下log的job,以确认job完成无误的话,这个参数是不可以带的哦。

CronJob Controller

示例:启动一个pod,打印容器内时间并打印hello world,代码如下:

[root@master ~]# cat 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 world"
          restartPolicy: OnFailure

可以看到,每一分钟启动一个pod 

[root@master ~]# k get po -A |grep hello
default       hello-1661256840-zbz77                    0/1     Completed   0          2m19s
default       hello-1661256900-cjvsk                    0/1     Completed   0          78s
default       hello-1661256960-pbmmr                    0/1     Completed   0          18s

查看日志:

1. [root@master ~]# k logs hello-1661256840-zbz77
2. Tue Aug 23 12:14:06 UTC 2022
3. Hello world

删除该任务:

[root@master ~]# k get cronjob -A
NAMESPACE   NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
default     hello   */1 * * * *   False     1        12s             6m42s
[root@master ~]# k delete cronjob hello
cronjob.batch "hello" deleted
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
4天前
|
存储 Kubernetes 负载均衡
CentOS 7.9二进制部署K8S 1.28.3+集群实战
本文详细介绍了在CentOS 7.9上通过二进制方式部署Kubernetes 1.28.3+集群的全过程,包括环境准备、组件安装、证书生成、高可用配置以及网络插件部署等关键步骤。
48 3
CentOS 7.9二进制部署K8S 1.28.3+集群实战
|
4天前
|
Kubernetes 负载均衡 前端开发
二进制部署Kubernetes 1.23.15版本高可用集群实战
使用二进制文件部署Kubernetes 1.23.15版本高可用集群的详细教程,涵盖了从环境准备到网络插件部署的完整流程。
12 2
二进制部署Kubernetes 1.23.15版本高可用集群实战
|
1天前
|
Kubernetes 监控 Cloud Native
云原生入门:Kubernetes 集群部署与管理
【8月更文挑战第38天】在数字化浪潮中,云原生技术如同翱翔的雄鹰,引领着企业飞向灵活高效的未来。本文将带你一探究竟,从Kubernetes的基础概念到实际操作,深入浅出地介绍如何在云端构建和管理你的容器化应用。我们将一步步搭建起一个小型的Kubernetes集群,并通过代码示例和图解,让你轻松掌握云原生世界的钥匙。让我们一起开启这趟技术之旅,探索云原生的秘密花园,找到那把打开创新之门的金钥匙。
|
4天前
|
Kubernetes Ubuntu 网络安全
Ubuntu基于kubeadm快速部署K8S实战
关于如何在Ubuntu系统上使用kubeadm工具快速部署Kubernetes集群的详细实战指南。
18 2
|
5天前
|
弹性计算 Kubernetes Cloud Native
云原生时代的航标:Kubernetes的灯塔作用
在数字化浪潮中,云原生技术如同海上的灯塔,指引着企业航行。本文将深入探讨Kubernetes如何成为云原生技术的领航者,揭示其在容器编排、自动化部署等方面的优势,并分享实践案例,为读者提供实用的操作建议和未来趋势的展望。
|
5天前
|
Kubernetes Linux API
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇
该博客文章详细介绍了在CentOS 7.6操作系统上使用kubeadm工具部署kubernetes 1.17.2版本的测试集群的过程,包括主机环境准备、安装Docker、配置kubelet、初始化集群、添加节点、部署网络插件以及配置k8s node节点管理api server服务器。
21 0
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇
|
5天前
|
Kubernetes 容器
Kubernetes附加组件Dashboard部署实战篇
关于如何在Kubernetes集群中部署和配置Dashboard组件的详细实战指南,涵盖了从创建证书、部署Dashboard、设置服务访问到登录认证的完整流程。
24 0
Kubernetes附加组件Dashboard部署实战篇
|
7天前
|
Kubernetes Cloud Native 开发者
探索云原生技术:从Docker到Kubernetes的旅程
【8月更文挑战第31天】云原生技术正在改变软件开发、部署和运维的方式。本文将带你了解云原生的核心概念,并通过实际代码示例,展示如何使用Docker容器化应用,并进一步通过Kubernetes进行集群管理。我们将一起构建一个简单的微服务架构,体验云原生带来的高效与便捷。
|
1天前
|
监控 Cloud Native 持续交付
云原生时代的微服务架构实践
【9月更文挑战第5天】随着云计算技术的飞速发展,云原生已成为现代软件开发的重要趋势。本文将深入探讨在云原生环境下,如何有效实施微服务架构,包括服务拆分、容器化部署、持续集成与交付等关键环节。通过具体案例,我们将展示如何在云平台上构建弹性、可扩展的微服务应用,并讨论在此过程中可能遇到的挑战及解决策略。
|
1天前
|
运维 Cloud Native 持续交付
云原生时代下的微服务架构实践
在数字化转型的浪潮中,云原生技术以其高效、灵活的特性成为企业IT架构升级的首选。本文将通过深入浅出的方式,探讨云原生环境下微服务架构的设计原则、关键技术及实施策略,旨在为读者提供一条清晰的技术路线图,帮助理解和掌握在云平台上构建和管理微服务的实用方法。
下一篇
DDNS