Kubernetes(k8s)容器编排控制器使用1

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: Kubernetes(k8s)容器编排控制器使用1

1 Pod控制器

1.1 Pod控制器是什么

Pod控制器就是帮助我们自动的调度管理Pod,并满足期望的Pod数量。

  Pod控制器是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试进行重启,当根据重启策略无效,则会重新新建pod的资源。
  创建为具体的控制器对象之后,每个控制器均通过`API Server`提供的接口持续监控相关资源对象的当前状态,并在因故障、更新或其他原因导致系统状态发生变化时,尝试让资源的当前状态想期望状态迁移和逼近。

1.2 Pod和Pod控制器

Pod控制器资源通过持续性地监控集群中运行着的Pod资源对象来确保受其管控的资源严格符合用户期望的状态,例如资源副本的数量要精确符合期望等。

通常,一个Pod控制器资源至少应该包含三个基本的组成部分:

  • 标签选择器:匹配并关联Pod资源对象,并据此完成受其管控的Pod资源计数。
  • 期望的副本数:期望在集群中精确运行着的Pod资源的对象数量。
  • Pod模板:用于新建Pod资源对象的Pod模板资源。

1.3 控制器的必要性

  自主式`Pod`对象由调度器调度到目标工作节点后即由相应节点上的`kubelet`负责监控其容器的存活状态,容器主进程崩溃后,`kubelet`能够自动重启相应的容器,但对出现非主进程崩溃类的容器错误却无从感知,这便依赖于`pod`资源对象定义的存活探测,以便`kubelet`能够探知到此类故障。
  但若`pod`被删除或者工作节点自身发生故障(工作节点上都有`kubelet`,`kubelet`不可用,因此其健康状态便无法保证),则便需要控制器来处理相应的容器重启和配置。

1.4 常见的控制器

Pod控制器由masterkube-controller-manager组件提供,常见的此类控制器有以下几种

1.4.1 ReplicaSet

代用户创建指定数量的`pod`副本数量,确保`pod`副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能

1.4.2 Deployment

工作在`ReplicaSet`之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。

1.4.3 DaemonSet

用于确保集群中的每一个节点只运行特定的`pod`副本,常用于实现系统级后台任务,比如`ELK`服务

2 ReplicaSet控制器

2.1 ReplicaSet概述

ReplicaSet是取代早期版本中的ReplicationController控制器,其功能基本上与ReplicationController

相同

`ReplicaSet`(简称RS)是`Pod`控制器类型的一种实现,用于确保由其管控的`Pod`对象副本数在任意时刻都能精确满足期望的数量,`ReplicaSet

2.2 ReplicaSet功能

ReplicaSet能够实现以下功能:

2.2.1 精确反应期望值

**确保Pod资源对象的数量精确反映期望值:**`ReplicaSet`需要确保由其控制运行的Pod副本数量精确吻合配置中定义的期望值,否则就会自

2.2.2 保证高可用

**确保Pod健康运行:**探测到由其管控的`Pod`对象因其所在的工作节点故障而不可用时,自动请求由调度器于其他工作节点创建缺失的`Po

2.2.3 弹性伸缩

**弹性伸缩:**可通过`ReplicaSet`控制器动态扩容或者缩容`Pod`资源对象的数量,必要时还可以通过`HPA`控制器实现`Pod`资源规模的

2.3 创建ReplicaSet

2.3.1 核心属性

spec字段一般嵌套使用以下几个属性字段:


字段值 类型 描述
replicas Integer 指定期望的Pod对象副本数量
selector Object 当前控制器匹配Pod对象副本的标签选择器,支持matchLabels和matchExpressions两种匹配机制
template Object 用于定义Pod时的Pod资源信息
minReadySeconds Integer 用于定义Pod启动后多长时间为可用状态,默认为0秒

2.3.2 ReplicaSet示例

创建资源清单

vi nginx-rs.yml
apiVersion: apps/v1  #api版本定义
kind: ReplicaSet  #定义资源类型为ReplicaSet
metadata:  #元数据定义
  name: nginx-rs
  namespace: default
spec:  #ReplicaSet的规格定义
  replicas: 2  #定义副本数量为2个
  selector:  #标签选择器,定义匹配Pod的标签
    matchLabels:
      app: nginx
  template:  #Pod的模板定义
    metadata:  #Pod的元数据定义
      name: nginx-pod  #自定义Pod的名称
      labels:  #定义Pod的标签,需要和上面的标签选择器内匹配规则中定义的标签一致,可以多出其他标签
        app: nginx
    spec:  #Pod的规格定义
      containers:  #容器定义
      - name: nginx  #容器名称
        image: nginx:1.12  #容器镜像
        imagePullPolicy: IfNotPresent  #拉取镜像的规则
        ports:  #暴露端口
        - name: http  #端口名称
          containerPort: 80

创建rs控制器

kubectl apply -f nginx-rs.yaml

查看rs控制器

kubectl get rs

查看pod容器

通过查看pod可以看出pod命令是规则是前面是replicaset控制器的名称加随机生成的字符串

kubectl get pods -o wide -w

2.4 更新控制器

修改上面创建的replicaset示例文件,将镜像nginx:1.12改为1.20版本

vi nginx-rs.yml
apiVersion: apps/v1  #api版本定义
kind: ReplicaSet  #定义资源类型为ReplicaSet
metadata:  #元数据定义
  name: nginx-rs
  namespace: default
spec:  #ReplicaSet的规格定义
  replicas: 2  #定义副本数量为2个
  selector:  #标签选择器,定义匹配Pod的标签
    matchLabels:
      app: nginx
  template:  #Pod的模板定义
    metadata:  #Pod的元数据定义
      name: nginx-pod  #自定义Pod的名称
      labels:  #定义Pod的标签,需要和上面的标签选择器内匹配规则中定义的标签一致,可以多出其他标签
        app: nginx
    spec:  #Pod的规格定义
      containers:  #容器定义
      - name: nginx  #容器名称
        image: nginx:1.20  #容器镜像
        imagePullPolicy: IfNotPresent  #拉取镜像的规则
        ports:  #暴露端口
        - name: http  #端口名称
          containerPort: 80

2.4.1 应用更新

kubectl apply -f nginx-rs.yaml

查看更新流程

kubectl get pods -o wide -w

我们发现pod没有任何更新变化

查看Pod版本号

kubectl get pods -o custom-columns=Name:metadata.name,Image:spec.containers[0].image

这里并没有更新pod的nginx版本号

删除pod应用

这里虽然重载了,但是已有的pod所使用的镜像仍然是1.12版本的,只是新建pod时才会使用1.20版本,这里测试先手动删除已有的pod。

kubectl delete pods -l app=nginx

查看版本

kubectl get pods -o custom-columns=Name:metadata.name,Image:spec.containers[0].image

现在我们发现pod的版本已经更新正确了

2.5 RS扩缩容

可以直接通过vim 编辑清单文件修改replicas字段,也可以通过kubect edit 命令去编辑

`kubectl`还提供了一个专用的子命令`scale`用于实现应用规模的伸缩,支持从资源清单文件中获取新的目标副本数量,也可以直接在命令行

2.5.1 scale命令扩容

命令扩容一般用于短期的临时性扩容,应付完成后要记得缩容到原来水平

查看容量

可看到当前是两个节点

kubectl get pods -o wide

执行扩容

使用scale命令可以对集群进行扩缩容

kubectl scale replicasets nginx-rs --replicas=4

查看扩容过程

在更新前打开新窗口,监控pod的更新变化

kubectl get pods -o wide -w

在更新前打开新窗口,监控RS的更新变化

kubectl get rs -o wide -w

我们发现扩容后只是在原来的RS集群上面增加了两个节点

2.5.2 配置文件缩容

配置文件扩容一般用于初始容量变更,长期进行扩容

查看容量

可看到当前是四个节点

kubectl get pods -o wide

应用配置

因为没有变更配置文件可以直接应用配置文件

kubectl apply -f nginx-rs.yml

查看缩容容过程

在更新前打开新窗口,监控pod的更新变化

kubectl get pods -o wide -w

在更新前打开新窗口,监控RS的更新变化

kubectl get rs -o wide -w

我们发现扩容后只是在原来的RS集群上面减少了两个节点


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
5天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
23 2
|
15天前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
7天前
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
【赵渝强老师】Kubernetes中Pod的基础容器
|
7天前
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
|
7天前
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Pod中的业务容器
Pod 是 Kubernetes 中的基本调度单元,由一个或多个容器组成。除了业务容器,Pod 还包括基础容器、初始化容器和临时容器。本文通过示例介绍如何创建包含业务容器的 Pod,并提供了一个视频讲解。示例中创建了一个名为 "busybox-container" 的业务容器,并使用 `kubectl create -f firstpod.yaml` 命令部署 Pod。
|
7天前
|
Kubernetes 容器 Perl
【赵渝强老师】K8s中Pod中的初始化容器
Kubernetes的Pod包含业务容器、基础容器、初始化容器和临时容器。初始化容器在业务容器前运行,用于执行必要的初始化任务。本文介绍了初始化容器的作用、配置方法及优势,并提供了一个示例。
|
7天前
|
Kubernetes 监控 Java
如何在Kubernetes中配置镜像和容器的定期垃圾回收
如何在Kubernetes中配置镜像和容器的定期垃圾回收
|
11天前
|
关系型数据库 MySQL API
|
4天前
|
缓存 监控 开发者
掌握Docker容器化技术:提升开发效率的利器
在现代软件开发中,Docker容器化技术成为提升开发效率和应用部署灵活性的重要工具。本文介绍Docker的基本概念,并分享Dockerfile最佳实践、容器网络配置、环境变量和秘密管理、容器监控与日志管理、Docker Compose以及CI/CD集成等技巧,帮助开发者更高效地利用Docker。
|
5天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?