K8s: 最佳实践经验之谈

最佳实践


1 )普通配置

  • 定义配置时,请指定最新的稳定 API 版本
  • 在推送到集群之前,配置文件应存储在版本控制中
    • 这允许您在必要时快速回滚配置更改
    • 它还有助于集群重新创建和恢复
  • 使用 YAML 而不是 JSON 编写配置文件
    • 虽然这些格式几乎可以在所有场景中互换使用
    • 但 YAML往往更加用户友好
  • 只要有意义,就将相关对象分组到一个文件中 (推荐)
    • 一个文件通常比几个文件更容易管理
    • 另请注意,可以在目录上调用许多kubectl命令 (相比于上面,不推荐)
      • 例如,你可以在配置文件的目录中调用 kubectl apply

2 )关于“Naked”Pods 与 ReplicaSet,Deployment 和 Jobs

  • 如果可能,不要使用独立的 Pods
    • 即,未绑定到 ReplicaSet 或 Deployment 的 Pod
    • 如果节点发生故障,将不会重新调度独立的 Pods
  • Deployment 会创建一个 ReplicaSet 以确保所需数量的 Pod 始终可用
    • 并指定替换 Pod 的策略(例如 RollingUpdate)
    • 除了一些显式的restartPolicy: Never 场景之外
    • 几乎总是优先考虑直接创建 Pod
    • Job 也可能是合适的

3 )服务

  • 在创建相应的后端工作负载(Deployment 或 ReplicaSet)

  • 以及在需要访问它的任何工作负载之前创建服务

  • 当 Kubernetes 启动容器时,它提供指向启动容器时正在运行的所有服务的环境变量

  • 例如,如果存在名为 foo 的服务,则所有容器将在其初始环境中获得以下变量

    FOO_SERVICE_HOST=<the host the Service is running on>
    FOO_SERVICE_PORT=<the port the Service is running on>
    
  • 这确实意味着在顺序上的要求

    • 必须在 Pod 本身被创建之前创建 Pod 想要访问的任何 Service
    • 否则将环境变量不会生效,而 DNS 没有此限制
  • 一个可选(尽管强烈推荐)的集群插件 是 DNS 服务器

    • DNS 服务器为新的 Services 监视Kubernetes API,并为每个创建一组 DNS 记录
    • 如果在整个集群中启用了 DNS,则所有 Pods 应该能够自动对 Services 进行名称解析
      • Service 有虚拟ip, 这些ip会被注册在域名服务器DNS上
      • 所有worknode上的pod都能找到集群内的所有Service
  • 除非绝对必要,否则不要为 Pod 指定 hostPort

    • 就是 worknode 节点挂掉,Pod就没法调度了
    • 将 Pod 绑定到hostPort时,它会限制 Pod 可以调度的位置数
    • 因为每个 <hostIP, hostPort, protocol> 组合必须是唯一的
    • 如果没有明确指定 hostIP 和 protocol 时,
    • K8s 将使用 0.0.0.0 作为默认 hostIP 和 TCP 作为默认 protocol
    • 如果只需要访问端口以进行调试,则可以使用 apiserver proxy或 kubectl port-forward
  • 如果明确需要在节点上公开 Pod 的端口

    • 请在使用 hostPort 之前考虑使用 NodePort 服务
  • 避免使用 hostNetwork

    • 原因与 hostPort 相同。
  • 当不需要 kube-proxy 负载均衡时

    • 使用 无头服务(ClusterIP 被设置为 None)
    • 以便于服务发现

4 )使用标签

  • 定义并使用标签来识别应用程序 或 Deployment 的 语义属性

    • 例如 { app: myapp, tier: frontend, phase: test, deployment: v3 }
      • 这种属于应用分组,好处是互不影响
    • 你可以使用这些标签为其他资源选择合适的 Pod
    • 例如,一个选择所有 tier: frontend Pod 的服务
    • 或者 app: myapp 的所有 phase: test 组件
  • 通过从选择器中省略特定发行版的标签

    • 可以使服务跨越多个 Deployment
    • Deployment 可以在不停机的情况下轻松更新正在运行的服务
  • Deployment 描述了对象的期望状态,并且如果对该规范的更改被成功应用

    • 则 Deployment 控制器以受控速率将实际状态改变为期望状态

5 )容器镜像

  • imagePullPolicy和镜像标签会影响kubelet何时尝试拉取指定的镜像
    • imagePullPolicy: IfNotPresent:仅当镜像在本地不存在时才被拉取
    • imagePullPolicy: Always:每次启动 Pod 的时候都会拉取镜像
    • imagePullPolicy 省略时,镜像标签为 :latest 或不存在,使用 Always 值
    • imagePullPolicy 省略时,指定镜像标签并且不是 :latest,使用 IfNotPresent 值
    • imagePullPolicy: Never:假设镜像已经存在本地,不会尝试拉取镜像
  • 说明
    • 在生产中部署容器时应避免使用 :latest 标记
    • 因为这样更难跟踪正在运行的镜像版本,并且更难以正确回滚
    • 底层镜像驱动程序的缓存语义能够使即便 imagePullPolicy: Always 的配置也很高效
    • 例如,对于 Docker,如果镜像已经存在,则拉取尝试很快,因为镜像层都被缓存并且不需要下载

6 )使用 kubectl

  • 选择使用 $ kubectl apply -f 更灵活
  • 使用标签选择器进行 get 和 delete 操作,而不是特定的对象名称

7 )kubectl apply -f 和 kubectl create -f 区别

  • 行为差异

    • kubectl create -f
      • 这个命令用于根据提供的配置文件(通常是 YAML 或 JSON 格式)创建 Kubernetes 对象
      • 如果对应的资源已经存在,它会返回错误
      • 因此,在使用 create 命令之前,你需要确保资源对象不存在,或者先删除原有的资源对象
    • kubectl apply -f
      • 这个命令也是用于根据配置文件应用 Kubernetes 对象
      • 但是,如果资源对象已经存在,apply 命令会尝试更新对应的字段值和配置,而不是报错
      • 如果资源对象不存在,apply 命令会自动创建资源对象
      • 因此,apply 命令提供了更大的灵活性,既可以用于创建新对象,也可以用于更新现有对象
  • 记录差异

    • kubectl apply 命令通过将先前应用的配置写入资源的注释来维护配置记录
    • 这有助于计算下一次调用时的差异,从而精确地知道需要应用哪些更改
    • 这种机制使得 apply 命令在处理复杂的混合 IT 场景时特别有用
    • 相比之下,kubectl create 命令不会维护这样的记录
    • 它只是简单地根据提供的配置文件创建资源对象。
  • 其他选项

    • kubectl apply 还提供了许多可选的参数
    • 如 --force、–validate 和 --record 等,这些参数可以使更新操作更加精确和可控
    • 例如,–force 参数可以强制应用配置,即使某些字段可能会导致无效的资源定义
    • kubectl create 命令通常没有这么多可选参数,它主要关注于根据配置文件创建资源对象
  • 总的来说

    • kubectl apply -f 和 kubectl create -f 在行为、记录和其他选项方面存在显著差异
    • 选择使用哪个命令取决于你的具体需求,例如是否需要更新现有资源对象,是否需要维护配置记录等
    • 在大多数情况下,kubectl apply 可能是一个更灵活和强大的选择
    • 因为它既可以用于创建新对象,也可以用于更新现有对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/574208.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详解工业网关在线探测功能及用途

工业网关专为工业物联网应用设计&#xff0c;可实现包括不同通讯协议之间的兼容和转换&#xff0c;提供软硬件加密保障工业数据安全传输&#xff0c;发挥强大算力实现数据边缘预处理&#xff0c;联动联调工业网络设备实现高效协同等。在线探测功能是佰马工业网关的一项重要功能…

unity学习(89)——unity塞满c盘!--删除editor下的log文件

卸了一个视频后强制续命打开详细信息&#xff1a; 这个再往下找也是没用的&#xff01; 显示隐藏文件夹后&#xff01;执行如下操作&#xff01; 30个g&#xff01; 其中unity占23g editer占了21g 删除C:\Users\王栋林\AppData\Local\Unity\Editor下的log文件 恢复到之前的水…

使用 Flask 和 WTForms 构建一个用户注册表单

在这篇技术博客中&#xff0c;我们将使用 Flask 和 WTForms 库来构建一个用户注册表单。我们将创建一个简单的 Flask 应用&#xff0c;并使用 WTForms 定义一个注册表单&#xff0c;包括用户名、密码、确认密码、邮箱、性别、城市和爱好等字段。我们还将为表单添加验证规则&…

【C 数据结构】图

文章目录 【 1. 基本原理 】1.1 无向图1.2 有向图1.3 基本知识 【 2. 图的存储结构 】2.1 完全图2.2 稀疏图和稠密图2.3 连通图2.3.1 (普通)连通图连通图 - 无向图非连通图 的 连通分量 2.3.2 强连通图强连通图 - 有向图非强连通有向图 的 强连通分量 2.3.3 生成树 - 连通图2.3…

美区视频带货“一哥”,一周销量狂干三十万美金!

“超店有数显示&#xff0c;Tybuggy上周带货狂揽34.3万美金&#xff0c;超出第二名近30倍。” TikTok风波再起&#xff0c;4月17日&#xff0c;美众议院推出援乌援以军事议案&#xff0c;值得注意的是&#xff0c;TikTok剥离法案被“打包”夹带其中&#xff0c;以此加大再参议…

LLM应用实战:当KBQA集成LLM(二)

1. 背景 又两周过去了&#xff0c;本qiang~依然奋斗在上周提到的项目KBQA集成LLM&#xff0c;感兴趣的可通过传送门查阅先前的文章《LLM应用实战&#xff1a;当KBQA集成LLM》。 本次又有什么更新呢&#xff1f;主要是针对上次提到的缺点进行优化改进。主要包含如下方面&#…

【Linux笔记】基本指令(一)

一道残阳铺水中 半江瑟瑟半江红 目录 Linux基本指令 罗列目录内容&#xff1a;ls 指令 显示当前目录位置信息&#xff1a;pwd 指令 切换工作目录&#xff1a;cd 指令 创建文件修改时间戳&#xff1a;touch指令 创建空目录&#xff1a;mkdir指令 删除空目录&#xff1a;rmdir指…

1.3K Star我上位机项目中用了这个开源项目

软件介绍 ClientServerProject的软件是一款基于C-S&#xff08;客户端-服务器&#xff09;架构的通用开发框架&#xff0c;为中小型系统的快速开发提供强大的支持。该框架由服务端、客户端以及公共组件三部分组成&#xff0c;不仅提供了基础的账户管理、版本控制、软件升级、公…

输入法重大漏洞曝光,仅华为幸免,近10亿用户受影响

近日&#xff0c;Citizenlab研究人员调查了多家厂商的输入法应用安全漏洞并报告称&#xff1a;除华为以外&#xff0c;百度、荣耀、科大讯飞、OPPO、三星、腾讯、Vivo和小米等供应商的九款应用程序中有八款均存在安全漏洞。 随着用户规模的不断增长&#xff0c;云输入法应用的…

kubernetes中DaemonSet控制器

一、概念 使用DaemonSet控制器&#xff0c;相当于在节点上启动了一个守护进程。通过DaemonSet控制器可以确保在每个节点上运行Pod的一个副本。如果有心的node节点加入集群&#xff0c;则DaemonSet控制器会自动给新加入的节点增加一个Pod的副本&#xff1b;反之&#xff0c;当有…

GPT的全面历史和演变:从GPT-1到GPT-4

人工智能新篇章&#xff1a;GPT-4与人类互动的未来&#xff01; 本文探讨了生成式预训练 Transformer (GPT) 的显着演变&#xff0c;提供了从开创性的 GPT-1 到复杂的 GPT-4 的旅程。 每次迭代都标志着重大的技术飞跃&#xff0c;深刻影响人工智能领域以及我们与技术的互动。 我…

vmware虚拟机网络“桥接模式”与“NAT模式”的联网原理及linux环境下IP配置指引

一、vmware虚拟机网络“桥接模式”与“NAT模式”的区别 选中虚拟机》设置》网络适配器&#xff0c;打开虚拟机设置面板 我们看到网络连接处有多个选项&#xff0c;今天良哥通过试验告诉你“桥接模式”和“NAT模式”的联网原理、区别及两种模式下IP地址配置的详细方法。 桥接模…

YOLOv9改进策略 | 添加注意力篇 | LSKAttention大核注意力机制助力极限涨点 (附多个位置添加教程)

一、本文介绍 本文给大家带来的改进机制是LSKAttention大核注意力机制应用于YOLOv9。它的主要思想是将深度卷积层的2D卷积核分解为水平和垂直1D卷积核&#xff0c;减少了计算复杂性和内存占用。接着&#xff0c;我们介绍将这一机制整合到YOLOv9的方法&#xff0c;以及它如何帮…

面试经典150题——路径总和

​ 1. 题目描述 2. 题目分析与解析 2.1 思路一 注意题目的关键点&#xff1a;判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;起点是root&#xff0c;终点是叶子节点。 那么我们就可以从根节点按照层序遍历的方式&#xff0c;从根节点从根到 叶子不断对路径进行加…

MPC的横向控制与算法仿真实现

文章目录 1. 引言2. 模型预测控制&#xff08;MPC&#xff09;2.1 基础知识2.2 MPC的整体流程2.3 MPC的设计求解 3. 车辆运动学MPC设计4. 算法和仿真实现 1. 引言 随着智能交通系统和自动驾驶技术的发展&#xff0c;车辆的横向控制成为了研究的热点。横向控制指的是对车辆在行…

vue3环境搭建

环境准备&#xff1a; node环境(node.js官网)npm环境 上述两个环境存在版本要求所以安装最新的靠谱&#xff08;旧的环境存在不支持现象&#xff09; windows电脑 安装完node.js会带有npm mac电脑本身自带node和npm&#xff0c;但是需要升级 进入到你想创建前端项目的文件夹:…

C++初识内存管理和模版

目录 前言 1.C/C内存分布 2. C的内存管理方式 2.1 new/delete操作内置类型 2. new和delete操作自定义类型 3. operator new和operator delete函数 4. new和delete的实现原理 4.1 内置类型 4.2 自定义类型 5. malloc/free和new/delete的区别 6. 初识模版 6.1 泛型编…

【python笔记】datafram的时间动态可视化 pyecharts地图

import pandas as pd# 假设DataFrame是这样的&#xff1a; df pd.DataFrame({ year: [2014, 2015, 2016, 2014, 2015, 2016, 2014, 2015, 2016], province: [广东省, 广东省, 河南省, 湖南省, 北京市, 北京市, 上海市, 新疆维吾尔自治区, 上海市], values: [100, 150, 75…

井字棋源码(网络线程池版)

源码链接&#xff1a;game 效果可能没有那么好&#xff0c;大家可以给点建议。 效果展示 game.h #include <stdio.h> #include <stdlib.h> #include <time.h>#define ROW 3 #define COL 3void InitBoard(char board[ROW][COL], int row, int col) {int i…

如何在linux服务器上用Nginx部署Vue项目,以及如何部署springboot后端项目

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、打包Vue项目二、安装Nginx1.更新系统的软件包信息&#xff1a;2.安装Nginx&#xff1a;3.启动 Nginx 服务&#xff1a;安装完成后&#xff0c;Nginx 服务会…
最新文章