编排文件技巧

  • 使用资源时指定最新稳定版的API version
  • 编排文件应该纳入版本控制,这样可以在必要的时候快速回滚,同样也有利于资源恢复和重建
  • 使用YAML格式而不是JSON格式,尽管两种格式的文件可以相互转换,但是YAML格式更易读
  • 使用单一的文件组织相关资源,单文件比多文件更好组织管理,可以参考guestbook-all-in-one.yaml
  • 很多kubectl命令可以作用于整个文件夹,比如kubectl create somedir,可以对somedir目录中所有的配置文件执行create指令
  • 对资源的描述可以写到annotations中,便于自省

裸Pod

不受任何控制器(Deployment,ReplicaSets,Jobs)控制的Pod称之为裸Pod

  • 尽量避免使用裸Pod,因为在发生节点错误的时候没有任何策略保证Pod的重调度,死掉就彻底死掉了。
  • 相反,Deployment会启动相应的ReplicaSet来保证Pod的可用数量,同时有更新策略提供对Pod的更新比如Rolling Update。
  • 有些特殊只需要执行一次的场景可用Job替代

Service

  • service优先创建,理解为2点:service在它所依赖的资源创建出来之前创建;service在访问它的资源创建之前创建。k8s创建容器的时候会在容器中写入当前存在的service地址的环境变量,比如有个名称为foo的service,所有k8s创建出来的容器中都会有如下的环境变量
FOO_SERVICE_HOST=<the host the Service is running on>
FOO_SERVICE_PORT=<the port the Service is running on>

如果代码中要访问Service,不要使用上述环境变量,最好使用Service的dns名称,上述环境变量只是为了解决有些老的系统无法使用DNS查找问题的临时方案

  • 如非必要,不要给Pod指定hostPort,因为会限制Pod被调度的可能

如果只是想访问某个端口进行debug,可以使用apiserver proxykubectl port-forward

如果确实需要暴露某个Pod的端口到主机端口,建议使用Service中的NodePort

使用标签(labels)

  • 定义和使用语义明确的标签。比如{ app: myapp, tier: frontend, phase: test, deployment: v3 }

Service可以通过Selector实现跨Deployment组织资源;Deployment可以通过标签实现无中断更新

  • 巧用标签进行调试。因为k8s资源控制器和Service都是通过标签来组织和管理资源的。移除Pod上的标签会导致控制器和Service不再将该Pod列为自己的资源,不再会有流量分配到该Pod。此时控制器会创建新的Pod来代替被移除的Pod,这是一种“隔离调试”技术。

容器镜像

  • 默认的 imagePullPolicy是IfNotPresent,kubelet只有在本地不存在的情况下才会去拉取镜像。如果想每次执行都拉取镜像可以指定策略:imagePullPolicy: Always

还有一种方法是指定:latesttag,也会每次都拉取镜像

生产环境避免使用这种方式

使用kubectl

k8s编排最佳实践的更多相关文章

  1. 生产环境容器落地最佳实践 --JFrog 内部K8s落地旅程

    引言 Kubernetes已经成为市场上事实上领先的编配工具,不仅对技术公司如此,对所有公司都是如此,因为它允许您快速且可预测地部署应用程序.动态地伸缩应用程序.无缝地推出新特性,同时有效地利用硬件资 ...

  2. 可能是Asp.net Core On host、 docker、kubernetes(K8s) 配置读取的最佳实践

    写在前面 为了不违反广告法,我竭尽全力,不过"最佳实践"确是标题党无疑,如果硬要说的话 只能是个人最佳实践. 问题引出 ​ 可能很多新手都会遇到同样的问题:我要我的Asp.net ...

  3. Istio最佳实践:在K8s上通过Istio服务网格进行灰度发布

    Istio是什么? Istio是Google继Kubernetes之后的又一开源力作,主要参与的公司包括Google,IBM,Lyft等公司.它提供了完整的非侵入式的微服务治理解决方案,包含微服务的管 ...

  4. ELK:收集k8s容器日志最佳实践

    简介 关于日志收集这个主题,这已经是第三篇了,为什么一再研究这个课题,因为这个课题实在太重要,而当今优秀的开源解决方案还不是很明朗: 就docker微服务化而言,研发有需求标准输出,也有需求文件输出, ...

  5. 一款不错的 Go Server/API boilerplate,使用 K8S+DDD+CQRS+ES+gRPC 最佳实践构建

    Golang API Starter Kit 该项目的主要目的是使用最佳实践.DDD.CQRS.ES.gRPC 提供样板项目设置. 为开发和生产环境提供 kubernetes 配置.允许与反映生产的 ...

  6. JuiceFS CSI Driver 的最佳实践

    文章根据 Juicedata 工程师朱唯唯,在云原生 Meetup 杭州站所作主题演讲<JuiceFS CSI Driver 的最佳实践>整理而成. 大家好,我是来自 Juicedata ...

  7. 在CentOS 7.6 以 kubeadm 安装 Kubernetes 1.15 最佳实践

    前言 Kubernetes作为容器编排工具,简化容器管理,提升工作效率而颇受青睐.很多新手部署Kubernetes由于"scientifically上网"问题举步维艰,本文以实战经 ...

  8. Kubernetes生产环境最佳实践

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 众所周知,Kubernetes很难! 以下是在生产中使用 ...

  9. Java容器化参数配置最佳实践

    Java是以VM为基础的,而云原生讲究的就是Native,天然的矛盾,虽然Quarkus是为GraalVM和HotSpot量身定制的K8s Native Java框架,生态原因切换成本太高,这种矛盾体 ...

随机推荐

  1. Selenium高级篇Web自动化测试框架

    现在常用的是对象模型PO(Page Object), 从过去要知道具体的定位,返回使用现在只需要知道所在页面的名称即可访问页面对象即可看到该页面的元素 PageObject实现了对页面对象及方法的抽离 ...

  2. 在Windows上安装Git

    实话实说,Windows是最烂的开发平台,如果不是开发Windows游戏或者在IE里调试页面,一般不推荐用Windows.不过,既然已经上了微软的贼船,也是有办法安装Git的. Windows下要使用 ...

  3. BuautifulSoup4库详解

    1.BeautifulSoup4库简介 What is beautifulsoup ? 答:一个可以用来从HTML 和 XML中提取数据的网页解析库,支持多种解析器(代替正则的复杂用法) 2.安装 p ...

  4. 爬虫之urllib.error模块

    error模块简介 我们在爬虫的时候发请求的时候难免出现错误,如访问不到服务器或者访问被禁止等等, 出错了之后urllib将错误信息封装成了一个模块对象中,这个模块就叫error模块 error的分类 ...

  5. STL-Vector源码剖析

    G++ ,cygnus\cygwin-b20\include\g++\stl_vector.h 完整列表 /* * * Copyright (c) 1994 * Hewlett-Packard Com ...

  6. 阿里Java架构师谈谈架构和如何成为一个Java架构师

    架构的定义 我们来看看软件架构的一般定义: 程序和计算系统软件体系结构是指系统的一个或多个结构. 该结构包括软件的构建,构建的外部可见属性以及它们之间的相互关系. 该体系结构不是可操作的软件. 具体来 ...

  7. 第二次作业 单例模式的SessionFactory

    一.基础Hibernate环境搭建(参见http://www.cnblogs.com/sangewuxie/p/9004968.html) 二.实体类User及User.hbm.xml配置 1.Use ...

  8. i++ 和 ++i;&& 和 &

    一.算数运算符(自增运算符i++.自减运算符i++)  ※  i++是先赋值(计算)再加1 :++i是先加1再赋值(计算) : int m = 5; boolean bool = ++m > 5 ...

  9. python selenium鼠标键盘操作(ActionChains)

    用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况,比如单击.双击.点击鼠标右键.拖拽等等.而selenium给我们提供了一个类来处理这类事件--ActionChains sele ...

  10. Java 8 Optional类深度解析(转)

    经常会遇到这样的问题,调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数. 新版本的Java,比如J ...