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.mzph.cn/pingmian/3290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ADB常用命令

大家好&#xff0c;今天给大家分享一些ADB的常用命令&#xff0c;我们作为测试了解ADB命令能给我们带来哪些好处呢&#xff1f; 1、ADB 命令可以帮助测试人员与Android设备进行交互&#xff0c;如安装、卸载应用&#xff0c;获取设备信息等&#xff0c;便于更深入地测试设备功能…

大数据——Zookeeper安装、启动、操作命令(一)

Zookeeper 概述 Zookeeper本身是Apache提供的一套开源的用于进行分布式管理和协调的机制/框架。官网&#xff1a;https://zookeeper.apache.orgZookeeper本身提供了中心化服务&#xff0c;包含统一配置、统一命名、分布式锁服务、分布式组服务&#xff0c;更多的时候&#xf…

世强硬创获昕感科技授权代理,SiC MOSFET实现超低导通电阻

近日&#xff0c;世强先进&#xff08;深圳&#xff09;科技股份有限公司&#xff08;下称“世强先进”&#xff09;获北京昕感科技有限责任公司&#xff08;下称“昕感科技”&#xff0c;英文名&#xff1a;NEXIC&#xff09;授权代理&#xff0c;为光伏、储能、电网、新能源汽…

耀斑层-如何在Unity中实现耀斑亮光效果

在Unity中实现耀斑亮光效果可以通过以下步骤来实现&#xff1a; 创建一个空物体作为光源&#xff1a;在场景中创建一个空物体&#xff0c;并将其放置在需要发出耀斑亮光效果的位置上。 添加光源组件&#xff1a;选中空物体&#xff0c;在Inspector面板中点击"Add Compone…

leetcode152 乘积最大子数组

给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的非空连续 子数组 &#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该子数组所对应的乘积。 测试用例的答案是一个 32-位 整数。 示例 1: 输入: nums [2,3,-2,4] 输出: 6 解释: 子数组 …

C# 给图片添加文字水印

目录 应用场景 开发运行环境 方法说明 方法代码 调用示例 小结 应用场景 在某些应用项目&#xff08;如电子档案信息管理&#xff09;中&#xff0c;查看电子图片信息是经常使用到的功能&#xff0c;此时我们就需要给显示在浏览器中的图片添加文字水印版权或提示信息。…

石家庄学院2023年大学生程序设计大赛题解

A、大臣的旅费 floyd求最短路径 #include <iostream>using namespace std;int d[1005][1005]; int n; int res;int f(int x) {// 等差数列return ((11 x 10) * x) / 2; }void init() {for (int i 1; i < n; i) {for (int j 1; j < n; j) {if (i j) d[i][j] …

Golang对接Ldap(保姆级教程:概念搭建实战)

Golang对接Ldap&#xff08;保姆级教程&#xff1a;概念&搭建&实战&#xff09; 最近项目需要对接客户的LDAP服务&#xff0c;于是趁机好好了解了一下。LDAP实际是一个协议&#xff0c;对应的实现&#xff0c;大家可以理解为一个轻量级数据库。用户查询。比如&#xff…

各种类型游戏的乐趣与魅力

游戏已经成为人们生活中不可或缺的一部分。从家庭娱乐到专业电竞&#xff0c;游戏行业呈现出多姿多彩的景象&#xff0c;吸引着亿万玩家的目光。而游戏的多样性正是其中一大魅力所在。让我们一起探索各种类型游戏的乐趣与魅力吧&#xff01; 动作游戏&#xff1a; 动作游戏以快…

力扣HOT100 - 114. 二叉树展开为链表

解题思路&#xff1a; class Solution {List<TreeNode> list new ArrayList<>();public void flatten(TreeNode root) {recur(root);for (int i 1; i < list.size(); i) {TreeNode pre list.get(i - 1);TreeNode cur list.get(i);pre.left null;pre.right…

使用Shell终端访问Linux

一、实验目的 1、熟悉Linux文件系统访问命令&#xff1b; 2、熟悉常用 Linux Shell的命令&#xff1b; 3、熟悉在Linux文件系统中vi编辑器的使用&#xff1b; 4、进一步熟悉虚拟机网络连接模式与参数配置&#xff01; 二、实验内容 1、使用root帐号登陆到Linux的X-windows…

【Qt 学习笔记】Qt常用控件 | 输入类控件 | Combo Box的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 输入类控件 | Combo Box的使用及说明 文章编号&#xff…

【Qt 学习笔记】Qt常用控件 | 显示类控件 | LCD Number的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 显示类控件 | LCD Number的使用及说明 文章编号&#xf…

梳理 Pytorch 19个方面,70个核心操作全总结!

最新写了很多关于 Pytorch 的文章&#xff0c;喜欢可以从0开始学习&#xff1a; 小白学 PyTorch 系列&#xff1a;这一次&#xff0c;我准备了 20节 PyTorch 中文课程小白学 PyTorch 系列&#xff1a;54个超强 pytorch 操作小白学 PyTorch 系列&#xff1a;9个技巧让你的 PyTo…

wps屏幕录制怎么用?分享使用方法!

数字化时代&#xff0c;屏幕录制已成为我们学习、工作和娱乐中不可或缺的一部分。无论是制作教学视频、分享游戏过程&#xff0c;还是录制网络会议&#xff0c;屏幕录制都能帮助我们轻松实现。WPS作为一款功能强大的办公软件&#xff0c;其屏幕录制功能也备受用户青睐。本文将详…

代码随想录:二叉树15-17

目录 404.左叶子之和 题目 代码&#xff08;后序递归&#xff09; 代码&#xff08;前序迭代&#xff09; 513.找树左下角的值 题目 代码&#xff08;层序迭代&#xff09; 112.路径总和 题目 代码&#xff08;前序迭代&#xff09; 112.路径总和II 题目 代码&…

记录如何用php将多个字符替换成同一个字符

在PHP中&#xff0c;如果你想要将多个不同的字符替换成同一个字符&#xff0c;可以使用str_replace()函数。这个函数可以接收一个包含需要被替换的字符的数组&#xff0c;以及一个表示替换目标的字符串。 以下是使用str_replace()进行多字符替换的基本示例&#xff1a; $text…

Linux读写文件

前言 学习了文件系统&#xff0c;就能理解为什么说Linux下一切皆文件。 语言层面的操作 在c语言的学习中我们可以使用fopen()函数对文件进行操作。 int main() {//FILE * fp fopen("./log.txt", "w");//FILE * fp fopen("./log.txt", "…

TablePlus for Mac/Win:开启高效数据开发新纪元

在当今数字化时代&#xff0c;数据的重要性日益凸显。无论是企业还是个人&#xff0c;都需要一款强大而实用的本地原生数据开发软件来提升工作效率。而 TablePlus for Mac/Win 正是这样一款卓越的工具&#xff0c;它为用户带来了全新的体验&#xff0c;让数据开发变得更加轻松、…

第1次作业

目录 重点内容提要一、误差度量二、浮点数系统三、误差传播四、数值稳定性 作业解析 重点内容提要 一、误差度量 二、浮点数系统 三、误差传播 四、数值稳定性 作业解析