容器化应用系统上生产的最佳实践

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 容器化应用系统上生产的最佳实践

前言

最近忙的要死, 👻👻👻. 上一周来了一次比 996 更猛的 907. 这周二终于有点遭不住了, 调休一天, 稍微歇息一下.

同时手痒的不行, 把筹备了好久的重磅文章发上来哈哈. 😆😆😆

不过时间还是有点仓促, 所以这次就先开个头, 后面有时间再细化.

img

容器化应用系统上生产的最佳实践

  1. 检查镜像、容器是否是用 root 启动以及配置其他特权. 如无必要, 一律使用普通用户.
  2. 检查镜像 LANG 配置: LANG = en_US.UTF-8. 目的: 避免生产出现 乱码等问题
  3. 检查镜像时区配置: TZ=Asia/Shanghai 目的: 避免生产出现时区不一致的问题
  4. 配置外部化. 外部化手段有多种.
  1. ConfigMap/Secret
  2. 配置中心
  3. Env
  1. 同一个镜像, 从测试流转到生产. 给镜像打 ${version}${gitCommitId}这一类的标签. 目的: 通过版本号或 commit id, 保证正确地的版本流转到生产
  2. 讨论每个组件的
  1. 日志输出优化:
  1. 日志到标准输出还是到目录?
  2. 日志采用 JSON 格式输出
  3. 禁止 DEBUG 日志
  4. 如果到目录, 目录是否需要持久化? 是否共享? 要注意日志命名冲突.
  1. (可选) 根据需要, 安装 redis/kafka/rabbitmq 集群(并配置 exporter 监控)
  2. 确定每个服务(Deployment/Statefulset):
  1. Node Selector: zone/rack/arch…
  2. 资源用量: CPU/Memory 的 Requests/Limits
  3. 更新策略: rolling 还是 recreate 还是其他更高阶策略
  1. 微服务参数优化:
  1. JVM Heap/NonHeap 参数优化
  2. 是否有其他 java 参数要配置: JAVA_OPTIONS或者CATALINA_OPTS
  3. 其他…
  1. 制作 DEV, TEST, UAT, Pre-PROD, PROD 的 DevOps pipeline.
  2. 配置 Readiness 和 Liveness 探针.
  3. 增加 Metric(如 JMX-exporter) 监控和 Tracing 监控.
  4. NGINX conf 建议增加: worker_processes 1; 然后按需调节副本数.
  5. (可选)配置 PDB, 指定升级或重启过程中:maxUnavailableminAvailable(特别适用于: 有状态应用. 典型如: redis, kafka, zookeeper 等)
  6. 配置反亲和性podAntiAffinity. 保证同一组微服务 / 应用 / 组件尽可能打散在不同 node 上.

8 操作步骤:

nodeSelector:
  zone: DMZ
YAML

11 步示例如下:

livenessProbe:
  tcpSocket:
    port: 8080
  initialDelaySeconds: 60
readinessProbe:
  httpGet:
    path: /myapp/services/
    port: 8080
    scheme: HTTP
  initialDelaySeconds: 60
YAML

14 步示例如下: (注意关键词: maxUnavailableminAvailable)

kind: PodDisruptionBudget
apiVersion: policy/v1beta1
metadata:
  name: kafka-prod-kafka
  labels:
    app.kubernetes.io/instance: kafka-prod
    app.kubernetes.io/managed-by: strimzi-cluster-operator
    app.kubernetes.io/name: strimzi
    strimzi.io/cluster: kafka-prod
    strimzi.io/kind: Kafka
    strimzi.io/name: kafka-prod-kafka
spec:
  selector:
    matchLabels:
      strimzi.io/cluster: kafka-prod
      strimzi.io/kind: Kafka
      strimzi.io/name: kafka-prod-kafka
  maxUnavailable: 1
YAML
kind: PodDisruptionBudget
apiVersion: policy/v1beta1
metadata:
  name: redis-cluster-redis
  namespace: myapp
  labels:
    app.kubernetes.io/component: redis
    app.kubernetes.io/managed-by: redis-operator
    app.kubernetes.io/name: redis
    app.kubernetes.io/part-of: redis-cluster
    redis.kun/v1beta1: myapp_redis
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app.kubernetes.io/component: redis
      app.kubernetes.io/managed-by: redis-operator
      app.kubernetes.io/name: redis
      app.kubernetes.io/part-of: redis-cluster
      redis.kun/v1beta1: myapp_redis
YAML

15 步骤示例如下: (注意关键词: podAntiAffinity)

kind: StatefulSet
apiVersion: apps/v1
metadata:
  name: redis-cluster-redis
  labels:
    app.kubernetes.io/component: redis
    app.kubernetes.io/managed-by: redis-operator
    app.kubernetes.io/name: redis
    app.kubernetes.io/part-of: redis-cluster
    redis.kun/v1beta1: myapp_redis
spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/component: redis
      app.kubernetes.io/managed-by: redis-operator
      app.kubernetes.io/name: redis
      app.kubernetes.io/part-of: redis-cluster
      redis.kun/v1beta1: myapp_redis
  template:
    metadata:
      creationTimestamp: null
      labels:
        app.kubernetes.io/component: redis
        app.kubernetes.io/managed-by: redis-operator
        app.kubernetes.io/name: redis
        app.kubernetes.io/part-of: redis-cluster
        redis.kun/v1beta1: myapp_redis
    spec:
      containers:
        <...>
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchLabels:
                    app.kubernetes.io/component: redis
                    app.kubernetes.io/managed-by: redis-operator
                    app.kubernetes.io/name: redis
                    app.kubernetes.io/part-of: redis-cluster
                    redis.kun/v1beta1: myapp_redis
                topologyKey: kubernetes.io/hostname
...
YAML

相关文章
|
1月前
|
运维 Java Go
Go语言基础及其在容器化应用中的优势
【2月更文挑战第23天】本文首先介绍了Go语言的基本特性和优势,然后详细阐述了Go语言在容器化应用中的重要作用和独特优势。通过深入分析Go语言的语法简洁性、并发处理能力和内存管理特性,以及Docker容器技术的轻量级、可移植性和版本控制特点,本文旨在说明Go语言与Docker容器技术的结合能够显著提升应用的开发效率和部署灵活性,为现代软件开发和运维带来革命性的变革。
|
2月前
|
Kubernetes Java 应用服务中间件
制作容器镜像的最佳实践
制作容器镜像的最佳实践
|
1天前
|
人工智能 边缘计算 Kubernetes
阿里云边缘容器云帮助AI推理应用快速落地
2024全球分布式云大会·北京站,阿里云徐若晨演讲内容分享
7 0
|
14天前
|
JSON Kubernetes Go
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
25 0
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
|
1月前
|
存储 安全 算法
【C++ 17 包裹类 泛型容器 std::any】深入理解与应用C++ std::any:从泛型编程到多态设计
【C++ 17 包裹类 泛型容器 std::any】深入理解与应用C++ std::any:从泛型编程到多态设计
49 1
|
1月前
|
边缘计算 Kubernetes 负载均衡
容器编排技术在云计算中的应用
随着云计算技术的飞速发展,容器编排技术作为一种重要的部署和管理工具,正在逐渐成为云计算领域的热门话题。本文将介绍容器编排技术在云计算中的应用,探讨其在提高应用程序部署效率、资源利用率以及系统可靠性方面的优势,并分析其未来发展趋势。
|
1月前
|
Kubernetes Go 开发者
Go语言与Docker容器结合的实践应用与案例分析
【2月更文挑战第23天】本文通过分析实际案例,探讨了Go语言与Docker容器技术结合的实践应用。通过详细阐述Go语言在容器化环境中的开发优势,以及Docker容器技术在Go应用部署中的重要作用,本文旨在为读者提供Go语言与Docker容器结合的具体实现方法和实际应用场景。
|
1月前
|
存储 Kubernetes 云计算
云计算基础与实战:从虚拟机到容器化应用
云计算基础与实战:从虚拟机到容器化应用
33 0
|
1月前
|
测试技术 Go 云计算
Go语言优化云计算与容器化环境的策略与最佳实践
【2月更文挑战第15天】在云计算和容器化环境中,Go语言的应用和优化策略对于提高系统的性能和效率至关重要。本文深入探讨了如何使用Go语言优化云计算和容器化环境,包括内存管理、并发编程、代码优化等方面的最佳实践,旨在帮助开发者充分利用Go语言的优势,提升系统的整体性能。
|
2月前
|
NoSQL Redis Docker
深入浅出:使用Docker容器化改进Python应用部署
在快速演进的软件开发领域,持续集成和持续部署(CI/CD)已成为加速产品上市的关键。本文将探索如何利用Docker,一种流行的容器化技术,来容器化Python应用,实现高效、可靠的部署流程。我们将从Docker的基本概念入手,详细讨论如何创建轻量级、可移植的Python应用容器,并展示如何通过Docker Compose管理多容器应用。此外,文章还将介绍使用Docker的最佳实践,帮助开发者避免常见陷阱,优化部署策略。无论是初学者还是有经验的开发人员,本文都将提供有价值的见解,助力读者在自己的项目中实现容器化部署的转型。

热门文章

最新文章