Kubernetes基础入门4 应用的扩展与收缩

Kubernetes应用的扩展与收缩

📋 概述

在Kubernetes中,您可以通过调整Deployment中的副本数量来轻松扩展应用程序实例。本文将向您展示如何手动扩展应用程序实例,并使用负载均衡器将流量分发到所有Pod。

🔧 先决条件

在开始之前,请确保:

  • 已完成之前教程中的步骤,创建了kubernetes-bootcamp Deployment

  • 已创建一个类型为LoadBalancer的服务(如果没有,请运行以下命令):

    复制代码
    kubectl expose deployment/kubernetes-bootcamp --type="LoadBalancer" --port 8080

📊 扩展工作原理

核心概念

  • 副本(Replicas):在Deployment中运行的应用程序实例数量

  • 自动扩缩:Kubernetes还支持Pod自动扩缩,但本教程仅涵盖手动扩缩

  • 负载均衡:Service会自动将流量均匀分发到所有可用的Pod

  • 端点监控:Service持续监控Pod健康状态,确保流量仅发送到可用的Pod

扩展优势

  • 处理流量增加:通过增加实例数量来满足用户需求

  • 高可用性:多个实例确保部分故障不会影响整体服务

  • 无缝更新:运行多个实例后,可以进行滚动更新而无需停机

🚀 扩展应用实例

1. 查看当前Deployment状态

复制代码
kubectl get deployments

输出示例:

复制代码
ccc@cccs-MBP ~ % kubectl get deployments

NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1/1     1            1           168m
ccc@cccs-MBP ~ % 

列说明:

  • READY:当前副本数/期望副本数

  • UP-TO-DATE:已更新到期望状态的副本数

  • AVAILABLE:用户可用的副本数

  • AGE:应用运行时长

2. 查看ReplicaSet

复制代码
kubectl get rs

ReplicaSet名称格式为:[DEPLOYMENT-NAME]-[RANDOM-STRING]

ccc@cccs-MBP ~ % kubectl get rs

NAME DESIRED CURRENT READY AGE
kubernetes-bootcamp-75c5d958ff 1 1 1 170m
ccc@cccs-MBP ~ %

3. 扩展到4个副本

复制代码
kubectl scale deployments/kubernetes-bootcamp --replicas=4

ccc@cccs-MBP ~ % kubectl scale deployments/kubernetes-bootcamp --replicas=4

deployment.apps/kubernetes-bootcamp scaled

ccc@cccs-MBP ~ %

4. 验证扩展结果

复制代码
kubectl get deployments
kubectl get pods -o wide
复制代码
ccc@cccs-MBP ~ % kubectl get deployments

NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   4/4     4            4           171m
ccc@cccs-MBP ~ % kubectl get pods -o wide

NAME                                   READY   STATUS    RESTARTS   AGE    IP          NODE             NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-75c5d958ff-8jz9t   1/1     Running   0          102s   10.1.0.20   docker-desktop   <none>           <none>
kubernetes-bootcamp-75c5d958ff-flfdd   1/1     Running   0          172m   10.1.0.17   docker-desktop   <none>           <none>
kubernetes-bootcamp-75c5d958ff-rzfjt   1/1     Running   0          103s   10.1.0.19   docker-desktop   <none>           <none>
kubernetes-bootcamp-75c5d958ff-wzbdr   1/1     Running   0          102s   10.1.0.18   docker-desktop   <none>           <none>
ccc@cccs-MBP ~ % 

现在应该有4个Pod运行,每个都有不同的IP地址。

5. 查看详细事件

复制代码
kubectl describe deployments/kubernetes-bootcamp
复制代码
ccc@cccs-MBP ~ % kubectl describe deployments/kubernetes-bootcamp

Name:                   kubernetes-bootcamp
Namespace:              default
CreationTimestamp:      Fri, 30 Jan 2026 09:18:24 +0800
Labels:                 app=kubernetes-bootcamp
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=kubernetes-bootcamp
Replicas:               4 desired | 4 updated | 4 total | 4 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=kubernetes-bootcamp
  Containers:
   kubernetes-bootcamp:
    Image:        gcr.io/google-samples/kubernetes-bootcamp:v1
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Progressing    True    NewReplicaSetAvailable
  Available      True    MinimumReplicasAvailable
OldReplicaSets:  <none>
NewReplicaSet:   kubernetes-bootcamp-75c5d958ff (4/4 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  2m46s  deployment-controller  Scaled up replica set kubernetes-bootcamp-75c5d958ff to 4 from 1
ccc@cccs-MBP ~ %

查看输出中显示的副本数量变化。

⚖️ 负载均衡验证

1. 获取服务信息

复制代码
kubectl describe services/kubernetes-bootcamp
复制代码
ccc@cccs-MBP ~ % kubectl describe services/kubernetes-bootcamp

Name:                     kubernetes-bootcamp
Namespace:                default
Labels:                   app=kubernetes-bootcamp
Annotations:              <none>
Selector:                 app=kubernetes-bootcamp
Type:                     LoadBalancer
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.98.179.76
IPs:                      10.98.179.76
LoadBalancer Ingress:     localhost
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  31450/TCP
Endpoints:                10.1.0.17:8080,10.1.0.18:8080,10.1.0.19:8080 + 1 more...
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
ccc@cccs-MBP ~ %

2. 设置环境变量

复制代码
export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')"
echo NODE_PORT=$NODE_PORT
复制代码
ccc@cccs-MBP ~ % export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')"
echo NODE_PORT=$NODE_PORT
NODE_PORT=31450
ccc@cccs-MBP ~ %

3. 测试负载均衡

多次运行以下命令:

复制代码
curl http://localhost:8080

每次请求会命中不同的Pod:

ccc@cccs-MBP ~ % curl http://localhost:8080

Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-75c5d958ff-flfdd | v=1

ccc@cccs-MBP ~ % curl http://localhost:8080

Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-75c5d958ff-8jz9t | v=1

ccc@cccs-MBP ~ % curl http://localhost:8080

Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-75c5d958ff-rzfjt | v=1

ccc@cccs-MBP ~ % curl http://localhost:8080

Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-75c5d958ff-flfdd | v=1

ccc@cccs-MBP ~ % curl http://localhost:8080

Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-75c5d958ff-wzbdr | v=1

ccc@cccs-MBP ~ %

📉 缩减应用实例

1. 缩减到2个副本

复制代码
kubectl scale deployments/kubernetes-bootcamp --replicas=2

ccc@cccs-MBP ~ % kubectl scale deployments/kubernetes-bootcamp --replicas=2

deployment.apps/kubernetes-bootcamp scaled

2. 验证缩减结果

复制代码
kubectl get deployments
kubectl get pods -o wide
复制代码
ccc@cccs-MBP ~ % kubectl get deployments

NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   2/2     2            2           179m
ccc@cccs-MBP ~ % kubectl get pods -o wide

NAME                                   READY   STATUS        RESTARTS   AGE     IP          NODE             NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-75c5d958ff-8jz9t   1/1     Terminating   0          8m56s   10.1.0.20   docker-desktop   <none>           <none>
kubernetes-bootcamp-75c5d958ff-flfdd   1/1     Running       0          3h      10.1.0.17   docker-desktop   <none>           <none>
kubernetes-bootcamp-75c5d958ff-rzfjt   1/1     Terminating   0          8m57s   10.1.0.19   docker-desktop   <none>           <none>
kubernetes-bootcamp-75c5d958ff-wzbdr   1/1     Running       0          8m56s   10.1.0.18   docker-desktop   <none>           <none>
ccc@cccs-MBP ~ %

确认Pod数量已减少到2个。

📈 扩展相关操作总结

操作 命令 说明
查看Deployment kubectl get deployments 查看所有部署状态
查看Pod详情 kubectl get pods -o wide 查看Pod详细信息
扩展副本数 kubectl scale deployments/[NAME] --replicas=[NUM] 增加或减少副本
查看事件 kubectl describe deployments/[NAME] 查看部署详细事件
测试负载均衡 curl http://$(minikube ip):$NODE_PORT 验证流量分发
相关推荐
马克Markorg17 小时前
使用 Docker Compose 本地部署 GitLab 教程
docker·容器·gitlab
nix.gnehc17 小时前
Spring Cloud + Nacos 在 K8s+物理机/虚拟机多部署形态下的优雅适配(零业务改动)
spring cloud·容器·kubernetes
wsad053218 小时前
Docker 常用命令:中英文对照、示例、参数详解及白话解释
运维·docker·容器
认真的薛薛18 小时前
10.k8s中水平和垂直伸缩-Jenkins
容器·kubernetes·jenkins
hhzz1 天前
利用Terraform格式模板文件创建和部署基本网络资源
阿里云·云原生·ros·terraform·资源编排
@hdd1 天前
生产环境最佳实践:资源管理、高可用与安全加固
安全·云原生·kubernetes
@hdd1 天前
实战:在 Kubernetes 上部署微服务应用
微服务·容器·kubernetes
切糕师学AI1 天前
什么是 FinOps 财务运营(Financial Operations)?
云原生·云计算
Elastic 中国社区官方博客2 天前
在 Kubernetes 上的依赖管理
大数据·elasticsearch·搜索引擎·云原生·容器·kubernetes·全文检索
星星乘坐的船2 天前
Centos7.9系统下docker安装
运维·docker·容器