当前位置: 首页 > news >正文

Kubernetes in action-配置和应用升级

Kubernetes的配置和应用升级

  • 1、配置
    • 1.1 configMap
    • 1.2 secret
    • 1.3 Downward API
    • 1.4 Kubernetes API
  • 2、服务升级
    • 2.1 升级方式
      • 2.1.1 先删除所有的旧版pod,使用新版本pod替换
      • 2.1.2 先创建新版pod,再删除旧版本pod
      • 2.1.3 滚动优化
    • 2.2 使用deployment声明式升级应用

如有侵权,请联系~
如有错误,也欢迎批评指正~
本篇文章大部分是来自学习《Kubernetes in action》的笔记

1、配置

目前大家的共识:代码开发和配置是分离的。所以,k8s也提供了配置能力。通过命令行参数、环境变量、卷等方式给容器传递参数。
Kubernetes 中几种配置管理方式的区别与适用场景:

资源/机制用途
ConfigMap存储非敏感的键值对或文件内容,用于配置应用
Secret存储敏感信息(如密码、密钥等),加密存储
Downward API将 Pod 或容器的元数据注入到容器中(如 Pod 名称、IP 等),只能获取同一个pod中的数据
Kubernetes API提供访问集群资源的接口(不是直接的配置注入方式),可以获取其他pod中的数据

1.1 configMap

✅ 用途:

  • 存储 非敏感配置信息,比如:
    • 应用参数
    • 配置文件内容
    • 环境变量

✅ 使用方式:

  • 作为环境变量注入容器;
  • 挂载为 Volume 文件;

使用案例:
声明configMap

apiVersion: v1
kind: ConfigMap
metadata:name: app-config
data:greeting: "Hello from ConfigMap"timeout: "30s"

在pod中使用

env:- name: GREETINGvalueFrom:configMapKeyRef:name: app-configkey: greeting

1.2 secret

✅ 用途:

  • 存储 敏感信息,如:
    • 密码
    • API token
    • SSH 私钥
    • TLS 证书

✅ 使用方式:

  • 与 ConfigMap 类似,可以作为环境变量或 Volume 挂载;
  • 内容默认是 Base64 编码,建议配合加密方案(如 KMS)使用。

使用案例:

kubectl create secret generic db-secret \--from-literal=username=admin \--from-literal=password=secret123

在pod中使用:

env:- name: DB_USERvalueFrom:secretKeyRef:name: db-secretkey: username

1.3 Downward API

✅ 用途:

  • 将 Pod 或容器的元数据 注入到容器中,例如:
    • Pod 名称
    • Pod IP
    • 容器名
    • 命名空间
    • 资源限制和请求
    • 启动时间等

✅ 使用方式:

  • 通过环境变量或 Volume 挂载的方式将这些信息传递给容器。

使用案例:

env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_IPvalueFrom:fieldRef:fieldPath: status.podIP

在pod中使用:

volumes:- name: podinfodownwardAPI:items:- path: labelsfieldRef:fieldPath: metadata.labels- path: annotationsfieldRef:fieldPath: metadata.annotations

1.4 Kubernetes API

✅ 用途:

  • 是一个 集群管理接口,允许你通过 RESTful API 访问和操作 Kubernetes 资源。
  • 不是“配置注入”方式,而是用来进行编程化管理。

✅ 使用方式:

  • 通过 kubectl、客户端库(如 client-go)、自定义控制器等方式调用;
  • 适用于自动化运维、监控、调度等场景。

使用案例:

curl -k --header "Authorization: Bearer <token>" https://<apiserver>/api/v1/namespaces

2、服务升级

虽然需求的迭代,我们需要对已经部署的应用进行升级以满足产品诉求。当代码进行更新,重新docker build为新版本之后,如何将新的镜像文件部署到容器中代替原来的镜像文件。

2.1 升级方式

2.1.1 先删除所有的旧版pod,使用新版本pod替换

主要步骤:

  • 修改rc的yaml文件,使用新的镜像,不需要修改rc的标签选择器
  • 删除之前旧的pod资源
  • rc会自动创建新的pod
    在这里插入图片描述

优缺点:

  • 优点:操作简单
  • 缺点:下掉已经存在的pod,存在服务短期不可用

2.1.2 先创建新版pod,再删除旧版本pod

主要步骤:

  • 修改rc的yaml文件,使用新的镜像,修改rc的标签选择器
  • 将service的标签替换为新的标签
  • 删除旧的pod
    在这里插入图片描述
    短暂的需要2倍的pod资源。

2.1.3 滚动优化

主要步骤:

  • 修改rc的yaml文件,pod增加一个标签deploy。service仍然能够指向原来的pod
  • 创建一个新的rc,与原来的rc区别只是deploy值和镜像不一样,其他的都一样。例如app标签值一样。这样service可以同时管理这两个rc下的pod
  • 逐渐删除旧的增加新的pod
    在这里插入图片描述

replication controller升级最开始就是使用的这种方式。

kubectl rolling-update {rc原来的name} {rc新的name} --image={新的镜像}

这种方式不推荐的原因:这个升级过程【减少原容器,增加新容器】是由kubectl客户端进行控制,不是有k8s服务端控制。所以如果因为网络等原因,升级很容易处于中间状态。

2.2 使用deployment声明式升级应用

准备deployment资源yaml:

apiVersion: apps/v1
kind: Deployment
metadata:name: my-app
spec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: myregistry/myapp:v1.0.0ports:- containerPort: 8080

应用部署:

kubectl apply -f deployment.yaml

升级应用:

  • 每次升级都会新创建replicaSet,旧的不会删除【用来回滚】
  • deployment中的yaml中有两个属性:maxSurge、maxUnavailable属性控制滚动速度。
kubectl set image deployment/my-app my-container=myregistry/myapp:v1.1.0

回滚应用:

  • 如果旧的replicaSet太多难以管理,可以通过deployment的revisionHistoryLimit属性设置保留多少个历史replicaSet.
// 查看升级历史
kubectl rollout history deployment/my-app
// 结果
REVISION  CHANGE-CAUSE
1         kubectl create --filename=deployment.yaml
2         kubectl set image ...// 回滚到指定版本
kubectl rollout undo deployment/my-app --to-revision=1

相关文章:

  • 关于 Web 漏洞原理与利用:2. XSS(跨站脚本攻击)
  • 斜齿轮直列齿轮箱市场分析报告:驱动因素、挑战及前景预测
  • 初学c语言16(内存函数)
  • 【Fine-Tuning】大模型微调高阶技术点概要
  • 【Unity】Unity中将字典序列化
  • YOLO模型predict(预测/推理)的参数设置
  • Java集合框架解析:从基础到底层源码
  • 题目练习之综合运用
  • 【PhysUnits】4.4 零类型(Z0)及其算术运算(zero.rs)
  • 《解锁具身智能社交密码:文化适配算法探秘》
  • 小目标检测层优化+多模态数据增强——YOLOv5在油气管道环焊缝缺陷识别的创新应用
  • SymPy | 隐函数导数求解:从基础到高阶的完整指南
  • 卓力达手撕垫片:精密制造的创新解决方案与多领域应用
  • docker运行Redis
  • 基于DeepSeek的智能客服系统实践与创新
  • 【Game】Powerful——Punch and Kick(12)
  • C+++STL(一)
  • Linux 内核等待机制详解:prepare_to_wait_exclusive 与 TASK_INTERRUPTIBLE
  • 反射操作注解的详细说明
  • 网络漏洞扫描系统都有着什么作用?
  • 又是“9+2”复式票,浦东退休阿姨擒大乐透1153万头奖
  • AI创业者聊大模型应用趋势:可用性和用户需求是关键
  • 视频丨为救心梗同学缺席职教高考的小伙姜昭鹏完成补考
  • 盐城经济技术开发区党工委书记王旭东接受纪律审查和监察调查
  • 一箭六星,朱雀二号改进型遥二运载火箭发射成功
  • “GoFun出行”订单时隔7年扣费后续:平台将退费,双方已和解