Kubernetes 无状态应用扩缩容

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 之前,我们已经学习了如何通过命令行部署应用,本文我们学习如果通过yaml配置文件进行应用部署,并进行应用的扩缩容。

125.jpeg
镜像下载、域名解析、时间同步请点击 阿里巴巴开源镜像站

Kubernetes 对象

本段是参考kubernetes官方手册 的学习笔记,建议初步了解下,如已了解相关概念,可跳过本段,直接看下面的操作。
Kubernetes 对象 是持久化的实体。Kubernetes 使用这些实体去表示整个集群的状态。
描述了如下信息:

  • 哪些容器化应用在运行(以及在哪个 Node 上)
  • 可以被应用使用的资源
  • 关于应用运行时表现的策略,比如重启策略、升级策略,以及容错策略

一但对象被创建,k8s集群就会开始持续工作以保证对象符合期望状态。

对象规约(Spec)与状态(Status)

每个 Kubernetes 对象包含两个嵌套的对象字段,它们负责管理对象的配置:对象 spec 和 对象 status 。 spec 是必需的,它描述了对象的 期望状态(Desired State) —— 希望对象所具有的特征。 status 描述了对象的 实际状态(Actual State) ,它是由 Kubernetes 系统提供和更新的。在任何时刻,Kubernetes 控制面一直努力地管理着对象的实际状态以与期望状态相匹配。

描述 Kubernetes 对象

一般使用yaml来描述一个k8s对象,yaml是专门用来写配置的语言。
基本语法规则如下:

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • '#'表示注释

使用yaml描述k8s对象,需要以下必需字段:

  • apiVersion - 创建该对象所使用的 Kubernetes API 的版本
  • kind - 想要创建的对象的类型
  • metadata - 帮助识别对象唯一性的数据,包括一个 name 字符串、UID 和可选的 namespace
  • spec - 描述了对象的 期望状态(Desired State),k8s集群会持续保证对象符合描述的状态。

管理 Kubernetes 对象

管理k8s对象有三种方式
image.png

命令式命令(Imperative commands)

就是我们上文中使用的方式,在命令行直接操作。
如:

kubectl create deployment nginx --image nginx

与对象配置相比的优点:

  • 命令简单,易学且易于记忆。
  • 命令仅需一步即可对集群进行更改。

与对象配置相比的缺点:

  • 命令不与变更审查流程集成。
  • 命令不提供与更改关联的审核跟踪。
  • 除了实时内容外,命令不提供记录源。
  • 命令不提供用于创建新对象的模板。

命令式对象配置(Imperative object configuration)

需要操作指令和配置文件配合使用。
如:

kubectl create -f nginx.yaml

与命令式命令相比的优点:

  • 对象配置可以存储在源控制系统中,比如 Git。
  • 对象配置可以与流程集成,例如在推送和审计之前检查更新。
  • 对象配置提供了用于创建新对象的模板。

与命令式命令相比的缺点:

  • 对象配置需要对对象架构有基本的了解。
  • 对象配置需要额外的步骤来编写 YAML 文件。

与声明式对象配置相比的优点:

  • 命令式对象配置行为更加简单易懂。
  • 从 Kubernetes 1.5 版本开始,命令式对象配置更加成熟。

与声明式对象配置相比的缺点:

  • 命令式对象配置更适合文件,而非目录。
  • 对活动对象的更新必须反映在配置文件中,否则会在下一次替换时丢失。

声明式对象配置(Declarative object configuration)

使用声明式对象配置,不需要在命令中显示的指定操作,这样可以将配置文件放在目录中,对目录中的文件进行不同的操作。
比如:

kubectl apply -f configs/

与命令式对象配置相比的优点:

  • 对活动对象所做的更改即使未合并到配置文件中,也会被保留下来。
  • 声明性对象配置更好地支持对目录进行操作并自动检测每个文件的操作类型(创建,修补,删除)。

与命令式对象配置相比的缺点:

  • 声明式对象配置难于调试并且出现异常时结果难以理解。
  • 使用 diff 产生的部分更新会创建复杂的合并和补丁操作。

实践操作

创建Deployment

创建node-deployment.yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: node-deployment
  labels:
    app: node
spec:
  replicas: 3
  selector:
    matchLabels:
      app: node
  template:
    metadata:
      labels:
        app: node
    spec:
      containers:
      - name: node
        image: registry.cn-hangzhou.aliyuncs.com/larswang/hello-node:1.0
        ports:
        - containerPort: 80

创建

kubectl apply -f node-deployment.yaml

查看deployments

kubectl get deployments

image.png
查看pods

kubectl get pods --show-labels

image.png

缩放Deployment

扩容到十个副本

kubectl scale deployment.v1.apps/node-deployment --replicas=10

扩展完成查看deployments和pods情况

kubectl get deployments
kubectl get pods --show-labels

image.png

缩容到三个副本

kubectl scale deployment.v1.apps/node-deployment --replicas=3

此时可以看到 其中7个pod处于Terminating状态。一段时间后,再次查看,只剩下了3个正在running的pod。
image.png

自动恢复

先查看pods列表

kubectl get pods --show-labels

选中其中一个pod并删除

kubectl delete pod node-deployment-57df45c5bf-d8xst

等删除成功后,再次查看pods列表

kubectl get pods --show-labels

image.png
会发现被删除的pod已经不存在了,但是Deployment又创建了一个新的pod。
这就是k8s会始终尽量保证集群的运行状态和配置描述的状态保持一致的特性。

获取Deployment描述信息

kubectl describe deployment node-deployment

image.png
可以看到Deployment的当前描述,及pod历史变化情况。
NewReplicaSet:

  • 当第一次创建 Deployment 时,它创建了一个 ReplicaSet (node-deployment-57df45c5bf) 并创建了3个副本。

Events:

  • 先扩容到了10个pods
  • 缩容到了3个pods
  • 缩容到了1个pods
  • 扩容到了3个pods

查看Deployment状态

kubectl get deployment node-deployment -o yaml

以yaml格式展示Deployment的配置情况及当前状态
image.png

总结

本文我们介绍了什么是k8s对象,以及使用yaml配置,创建了一个Deployment。
通过scale对Deployment进行缩放,并演示了手动删除一个pod后,k8s根据描述保持运行态与描述一致的特性。
在操作完一遍之后,回过头再看概念,会有种茅塞顿开的感觉。
来源:AloofJr

阿里巴巴开源镜像站 提供全面,高效和稳定的镜像下载服务。钉钉搜索 ' 21746399 ‘ 加入镜像站官方用户交流群。”

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
17天前
|
Kubernetes 开发者 容器
"Kubernetes的生死抉择:揭秘Pod容器重启策略如何决定应用命运的惊天大戏"
【8月更文挑战第20天】Kubernetes (k8s) 是一个强大的容器编排平台,其中Pod是最小的运行单元。Pod的重启策略确保服务连续性,主要有Always(总是重启)、OnFailure(失败时重启)和Never(从不重启)。默认策略为Always。根据不同场景,如Web服务、批处理作业或一次性任务,可以选择合适的策略。K8s还支持健康检查等高级机制来控制容器重启。合理配置这些策略对维护应用稳定性至关重要。
48 4
|
15天前
|
存储 Kubernetes 开发工具
k8s练习--StorageClass详细解释与应用
本文档详细介绍如何在Kubernetes中使用StorageClass动态创建PersistentVolume (PV),以简化大量PV的手动配置工作。StorageClass作为一种动态存储供给机制,
|
16天前
|
Kubernetes 监控 开发者
|
5天前
|
Kubernetes Cloud Native Linux
云原生入门:Kubernetes的简易部署与应用
【8月更文挑战第31天】在云原生的世界里,Kubernetes(K8s)是一颗璀璨的星。本文将带你走进K8s的世界,从安装到简单应用,轻松驾驭这个强大的容器编排工具。让我们一起探索云原生的奥秘,解锁新技能!
|
5天前
|
容器 Kubernetes Docker
云原生JSF:在Kubernetes的星辰大海中,让JSF应用乘风破浪!
【8月更文挑战第31天】在本指南中,您将学会如何在Kubernetes上部署JavaServer Faces (JSF)应用,享受容器化带来的灵活性与可扩展性。文章详细介绍了从构建Docker镜像到配置Kubernetes部署全流程,涵盖Dockerfile编写、Kubernetes资源配置及应用验证。通过这些步骤,您的JSF应用将充分利用Kubernetes的优势,实现自动化管理和高效运行,开启Java Web开发的新篇章。
13 0
|
5天前
|
Kubernetes Cloud Native Docker
云原生入门:Kubernetes的简单部署与应用
【8月更文挑战第31天】本文将带你进入云原生的世界,以Kubernetes为载体,探索其基础部署及应用。我们将通过浅显易懂的语言和实例,让你轻松上手云原生技术,并理解其在现代IT架构中的重要性。
|
5天前
|
Kubernetes Cloud Native 搜索推荐
探索云原生技术:Kubernetes入门与实践打造个性化安卓应用:从零开始的Flutter之旅
【8月更文挑战第31天】云原生技术正改变着应用开发和部署的方式。本文将带你了解云原生的基石——Kubernetes,通过实际的代码示例,从安装到部署一个简单的应用,让你迅速掌握Kubernetes的核心概念和操作方法。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你进入云原生世界的桥梁。
|
13天前
|
存储 消息中间件 Kubernetes
在K8S中,什么是有状态应用和无状态应用?
在K8S中,什么是有状态应用和无状态应用?
|
13天前
|
存储 缓存 Kubernetes
在K8S中,有状态服务与无状态服务都是怎么使用pv和pvc?(可以通过应用场景说明一下)
在K8S中,有状态服务与无状态服务都是怎么使用pv和pvc?(可以通过应用场景说明一下)
|
17天前
|
存储 Kubernetes 监控
在k8S中,有状态应用如何上云?
在k8S中,有状态应用如何上云?
下一篇
DDNS