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

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

一,kubernetes内的资源(或者称之为对象)


首先,应该是思考一个问题,为什么kubernetes里要引入资源(对象)这个概念?

Kubernetes 中的所有内容都被抽象为“资源”,如 Pod、Service、Node 等都是资源。“对象”就是“资源”的实例,是持久化的实体。如某

个具体的 Pod、某个具体的 Node。Kubernetes 使用这些实体去表现整个集群的状态。

对象的创建、删除、修改都是通过 “Kubernetes API”,也就是 “Api Server” 组件提供的 API 接口,这些是 RESTful 风格的 Api,与 k8s

的“万物皆对象”理念相符。命令行工具 “kubectl”,实际上也是调用的 kubernetes api。

K8s 中的资源类别有很多种,kubectl 可以通过配置文件来创建这些 “对象”,配置文件更像是描述对象“属性”的文件,配置文件格式可以

是 “JSON” 或 “YAML”,常用 “YAML”

那么,以下这些资源或者称之为对象的东西在kubernetes内是由哪个服务提供的呢?kube-apiserver这个服务提供的。

常见资源类型及API

  • 资源对象:Pods(po)、ReplicaSets(rs)、ReplicationControllers(rc)、Deployment、StatefulSet、DaemonSet(ds)、Job、CronJob(cj),HorizontalPodAutoscaling、Node、Namespace(ns)、Services(svc)、Ingress(ing)、Label、CustomResourceDefinition,nodes(no)
  • 存储对象:Volume、PersistentVolume(pv)、PersistentVolumeClaim(pvc)、Secret、ConfigMap(cm),componentstatuses(cs)
  • 策略对象:SecurityContext.ResourceQuota、LimitRange
  • 身份对象:ServiceAccounts(sa)、Role、ClusterRole,clusterrolebindings以上是资源以及它们的缩写,例如,kubectl get no 等于kubectl get nodes
  • 对象是用来完成某些任务的,是持久的,是有目的性的,因此 kubernetes 创建每个对象后,将持续地工作以确保对象存在(例如pod)。当然,kubernetes 并不只是维持对象的存在这么简单,kubernetes 还管理着对象的属性。

查询kubernetes内有哪些资源呢?通过命令 kubectl  api-resources 即可看到。

[root@master ~]# k api-resources
NAME                              SHORTNAMES   APIGROUP                       NAMESPACED   KIND
bindings                                                                      true         Binding
componentstatuses                 cs                                          false        ComponentStatus
configmaps                        cm                                          true         ConfigMap
endpoints                         ep                                          true         Endpoints
events                            ev                                          true         Event
limitranges                       limits                                      true         LimitRange
namespaces                        ns                                          false        Namespace
。。。。。略略略

例如,一个最为简单的资源清单文件,使用了namespace这个资源(kind后面就是资源名称),执行这个文件将会创建一个名字叫ns-elk的namespace:

[root@master ~]# cat 00-ns.yaml 
apiVersion: v1
kind: Namespace
metadata:
  name: ns-elk

kubernetes的学习基本也是围绕着上面查询出来的各种各样的资源来展开的,那如何使用这些资源又是一个难点,因此,kubernetes又提出了一个概念---控制器。

二,控制器


kubernetes的基础服务kube-controller-manager内建了很多controller(控制器),这些相当于一个状态机,用来控制pod的具体状态和行为。kube-controller-manager 由一系列的控制器组成(并不完整,常用的控制器):

Replication Controller

Node Controller

CronJob Controller

Daemon Controller

Deployment Controller

Endpoint Controller

Garbage Collector

Namespace Controller

Job Controller

Pod AutoScaler

RelicaSet

Service Controller

ServiceAccount Controller

StatefulSet Controller

Volume Controller

Resource quota Controller

非常常用的控制器有这些:

  • 确保预期的Pod副本数量---ReplicationController 和 ReplicaSet
  • 无状态应用部署----Deployment Controller
  • 有状态应用部署----StatefulSet Controller
  • 确保所有的node运行同一个pod----Daemonset Controller
  • 一次性任务和定时任务-----CronJob Controller和Job Controller

1,ReplicationController 和 ReplicaSet

ReplicationController用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收,Replication Controller简称RC。

在新版本的Kubernetes中建议使用ReplicaSet来取代ReplicationController。ReplicaSet跟ReplicationController没有本质的不同,只是名字不一样,并且ReplicaSet支持集合式的selector。Replication Set简称RS。

虽然ReplicaSet可以独立使用,但一般还是建议使用 Deployment 来自动管理ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如ReplicaSet不支持rolling-update但Deployment支持)。

下面是一个安装nginx的示例,使用的是ReplicationController这个控制器:

[root@master ~]# cat demo-replica.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

查询pods如下:

[root@master ~]# k get po -A -o wide
NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE   IP               NODE      NOMINATED NODE   READINESS GATES
default       nginx-7mfzc                               1/1     Running     0          40m   10.244.1.9       slave1    <none>           <none>
default       nginx-8djp7                               1/1     Running     0          40m   10.244.1.10      slave1    <none>           <none>
default       nginx-s5xgq                               1/1     Running     0          40m   10.244.2.10      slave2    <none>           <none>

删除任意一个nginx 的pod,由于是多副本部署,将会自动重新拉起一个新的pod以保持规定的pod数目。

如果想要彻底删除相关pod,需要先查询出rc的名称,然后删除rc就可以了。

[root@master ~]# k get rc -A
NAMESPACE   NAME    DESIRED   CURRENT   READY   AGE
default     nginx   3         3         3       47s
k delete rc nginx

下面仍然是一个安装nginx的示例,使用的是Replicationset这个控制器,nginx的版本是指定为1.20.2:

[root@master ~]# cat demo-replica.yaml 
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-test
  labels:
    app: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      name: nginx
      labels:
        app: myapp
    spec:
      containers:
      - name: nginx
        image: nginx:1.20.2
        ports:
        - containerPort: 80

这里需要注意一点,和ReplicationController不同的,Replicationset是在app组下,因此,apiVersion: apps/v1,选择器使用的是matchLabels,别的基本都是一样的。当然,删除也是一样的。只是查询的时候是rs不是rc了,也就是这个了:kuberctl get rs -A

Replication Controller和ReplicaSet的创建删除和Pod并无太大区别,Replication Controller目前几乎已经不在生产环境中使用,ReplicaSet也很少单独被使用,都是使用更高级的资源Deployment、DaemonSet、StatefulSet进行管理Pod。

2,Deployment Controller

Deployment 主要是用于部署无状态的服务,这也是最常用的控制器。一般用于管理维护企业内部无状态的微服务,比如configserver、zuul、springboot。他可以管理多个副本的Pod实现无缝迁移、自动扩容缩容、自动灾难恢复、一键回滚等功能。

Deployment Controller的主要作用:

  • 发布应用
  • 升级应用
  • 回退应用
  • 扩缩容

它和上面的rc和rs相比较,多了升级,回退,扩缩容的功能。

首先一个示例,还是部署nginx,这次版本更改为1.18,部署在test这个namespace内,副本数量是1(这个叫test的namespace要先建立哦):

[root@master ~]# cat web01.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  namespace: test
  labels:
    app: web01
  name: web01
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web01
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web01
    spec:
      containers:
      - image: nginx:1.18
        imagePullPolicy: IfNotPresent
        name: nginx
        resources: {}
status: {}

deployment controller控制器并不直接管理pod,而是通过管理replicaset来间接管理pod,即:deployment管理replicaset,replicaset管理pod。

[root@master ~]# k get rs -A
NAMESPACE     NAME                                DESIRED   CURRENT   READY   AGE
kube-system   coredns-6c76c8bb89                  2         2         2       71d
kube-system   nfs-client-provisioner-6fc484bd4f   1         1         1       26h
test          web01-5464b576c5                    1         1         1       12m
[root@master ~]# k get deploy -A
NAMESPACE     NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   coredns                  2/2     2            2           71d
kube-system   nfs-client-provisioner   1/1     1            1           26h
test          web01                    1/1     1            1           25m
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
1253 33
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
ACK One注册集群已正式支持ACS(容器计算服务)算力,为企业的容器化工作负载提供更多选择和更强大的计算能力。
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
488 10
|
人工智能 Kubernetes 异构计算
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
868 5
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
850 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
Kubernetes 持续交付 数据库
阿里云ACK+GitLab企业级部署实战教程
GitLab 是一个功能强大的基于 Web 的 DevOps 生命周期平台,整合了源代码管理、持续集成/持续部署(CI/CD)、项目管理等多种工具。其一体化设计使得开发团队能够在同一平台上进行代码协作、自动化构建与部署及全面的项目监控,极大提升了开发效率和项目透明度。 GitLab 的优势在于其作为一体化平台减少了工具切换,高度可定制以满足不同项目需求,并拥有活跃的开源社区和企业级功能,如高级权限管理和专业的技术支持。借助这些优势,GitLab 成为许多开发团队首选的 DevOps 工具,实现从代码编写到生产部署的全流程自动化和优化。
|
人工智能 Kubernetes 异构计算
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
本教程演示如何在ACK中多机分布式部署DeepSeek R1满血版。
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
967 24
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
923 6
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。

热门文章

最新文章

推荐镜像

更多