一、学 GO 语言

Kubernetes是基于 GO 编写的,所有的组件都是基于 GO 编写的,kubernetes甚至使用GO编写了一个客户端。学习使用 GO 语言编写的 Kubernetes 客户端并在 Kubernetes 中使用它,这是我对所以使用 Kubernetes 集群的朋友提出的最大的建议。

二、使用探针来检测应用的状态

在Kubernetes中支持配置探针。kubelet使用探针来确定pod和应用程序是否健康。这里提供了两种类型来实现这一功能,Readiness探针和Liveiness探针。Readiness探针用于确定容器何时准备好接收流量。Liveiness探针用于确定容器是健康的还是需要重新启动。在deployment 的yaml中,可以直接定义Readiness 探针和Liveiness探针,还可以设置超时、重试和延迟等参数。

三、充分利用Label标签

标签是Kubernetes的基础配置之一。它允许进群内资源与资源之间松散耦合,还允许基于标签进行查询。你甚至可以使用Kubernetes go客户端,根据标签查看事件。你几乎可以使用标签做任何事情,一个典型的例子是是同一个集群中存在多个环境。假设开发和QA使用相同的集群。这意味着你的集群可能同时进行QA和开发。要以一种简单的方式实现这一点,你必须使用服务对象,一个服务对象在app上执行标签select: app-a以及environment: dev,另一个服务对象在app上打上:app-a标签,但将环境从dev切换到QA。这将为您提供两个相同的应用程序,每个应用程序具有不同的端点,允许同时进行测试。

四、随时记得回收废弃的资源

Kubernetes是一个非常强大的系统,但是就像任何系统一样,它也会出现阻塞。只有一个不连接其他任何服务的服务才不会让系统陷入停滞。当kubernetes规模较小时,几台或者几十台,可能不会有任何问题。但如果把服务扩大到上万,kubelet就会可是出现阻塞。因为Kubelet不仅会对你发出的指令进行校验,同时还要做内部检查。因此,切记,从现在开始,养成习惯。如果你需要删除deployment(或相关的任何内容),请确保用它清理了所有其他内容,比如service,volume等等,避免日后影响kubelet的查询效率。

五、充分利用PodDisruptionBudget控制器

如何保证在kubernetes集群中的应用程序总能正常运行?答案是使用PodDisruptionBudget控制器。在进行kubectl drain操作时,kubernetes会根据PodDisruptionBudget控制器判断应用POD集群数量,进而保证在业务不中断或业务SLA不降级的情况下进行应用POD销毁。PDB(PodDisruptionBudget)应该放在每个拥有一个以上实例的deployment上。我们可以使用简单yaml为集群创建PDB,并使用标签选择器确定PDB应该作用在哪些带有标签的资源上。注意:PDB只考虑主动中断,硬件故障之类的情况不在PDB考虑范围内。PDB可以参考如下例子:

apiVersion: policy/v1beta1 kind: PodDisruptionBudget metadata: name: app-a-pdb spec: minAvailable: 2 selector: matchLabels: app: app-a

在众多配置中,我们最需要关注两个选项是matchlabel和minAvailable部分。匹配标签是kubernetes查看部署是否附加到PDB。例如:如果我有一个带有标签app: app-a的部署和一个带有标签app: app-b的部署,那么示例PDB将只应用于第一个部署。minAvailable会在kubernetes在执行类似 kubectl drain的操作时起作用。假设app-a正在节点1上运行,如果在节点1上执行drain,那么它将只驱逐app-a,即当前至少有2个app在运行。这让你可以控制在给定时间需要运行多少实例。

六、使用Bash完成kubectl命令

这可能是最简单也是使用Kubernetes时最有帮助的方法之一。要添加自动完成(如果使用bash),只需运行以下命令:

echo “source <(kubectl completion bash)” >> ~/.bashrc

这将在.bashrc中添加自动完成功能,这样无论何时打开shell,它都会启用它。你将会发现使用自动补全功能对于输入长指令来说是尤为方便的,尤其是当需要指定命名空间时。

七、向命名空间添加默认内存限制和cpu限制

人们总会犯错,这是常有的事。如果有人编写了一个应用程序,比方说,每秒打开一个数据库的连接,但是从来没有关闭它,这时就会导致在集群上的应用程序中出现内存泄漏。如果将它们部署到没有设置限制的集群中,则可能导致节点崩溃。为了防止这种情况,Kubernetes允许根据每个命名空间设置默认限制。要做到这一点,只需创建一个yaml来限制范围并将其应用于这个命名空间。下面是yaml的一个例子:

apiVersion: v1 kind: LimitRange metadata: name: mem-limit-range spec: limits: - default: memory: 512Mi defaultRequest: memory: 256Mi type: Container

八、用Kubelet辅助清理docker镜像

kubelet默认情况下已经做到了这一点。如果在启动kubelet时没有设置任何标志,那么当var/lib/docker达到90%的容量时,它将启动垃圾收集。这一功能非常贴心,但请注意,kubelet并没有为node节点设置默认阈值(在Kubernetes 1.7之前)。试想这种情况,你的/var/lib/docker可能只占用了50%的磁盘空间,但此时全部的物理机磁盘空间已经被占满。这会给你的容器服务带来很多问题。如果您目前正在使用的kubelet版本是1.4-1.6,那么你必须显式为kubelet添加如下标志。

--eviction-hard=memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%

这些配置在1.7或更高版本时是默认配置项。1.6版本默认情况下不监视 node 节点的资源利用率,因此添加该标志将解决这个问题。

九、Minikube ——迷你但功能强大

Minikube绝对是本地运行Kubernetes集群最简单的方法了。一旦一切都安装好了,简单的命令就能运行它。

minikube start

这时我们将在本地运行一个 K8S 集群。当你想要在本地构建一个应用程序并在本地运行它时,这是有个技巧需要注意。如果你没有运行其他命令,当你执行docker build时,仍然会在物理机上构建一个映像。要让你的docker build将镜像push到本地kubernetes集群,你需要使用以下命令:

eval $(minikube docker-env)

这能让你在本地kubernetes集群上构建应用程序。

十、不要把kubectl权限开放给所有人

这可能说起来很简单,但是当多个团队部署应用到一个 kubernetes 集群时,情况就可能变得很复杂。切记不要把 kubectl 权限开放给每个人。个人建议是,根据命名空间来区分隔离每个团队,然后使用RBAC策略只允许各自团队访问各自的命名空间。如果我们把kubectl权限开放给每个人,那么在pod级上进行读取、创建和删除访问时,可能让人抓狂,因为误操作的情况会经常发生。为此,我们应该只允许管理员有权访问,从而将管理集群和部署集群的人员权限区分开。

Kubernetes学习总结(12)—— 学习 kubernetes 的10个技巧或建议相关推荐

  1. 新手学习MAYA,需要知道的10个技巧!

    Autodesk Maya,也称为"Maya"或"Maya 3D",是一种计算机图形程序,用于电影.电视.游戏和视觉效果 (VFX) 中的各种 3D 动画.它旨 ...

  2. java看log技巧_Log日志框架的学习五.正确使用日志的10个技巧

    做一个苦逼的Java攻城师, 我们除了关心系统的架构这种high level的问题, 还需要了解一些语言的陷阱, 异常的处理, 以及日志的输出, 这些"鸡毛蒜皮"的细节. 这篇文章 ...

  3. kubernetes(K8S)学习笔记P6:K8s集群|java项目部署

    kubernetes(K8S)学习笔记P6:K8s集群|java项目部署 8.集群资源监控 8.1概述 8.2搭建集群监控平台系统 8.2.1部署prometheus 8.2.3部署Grafana 8 ...

  4. 第148天学习打卡(Kubernetes kubeadm init 成功部署 部署网络插件 部署容器化应用)

    继续安装 c3j9i2htclj6thlta6Z ~]# clear [root@iZ2vc3j9i2htclj6thlta6Z ~]# systemctl stop firewalld [root@ ...

  5. 英特尔为 Kubernetes 推出分布式深度学习平台:Nauta

    2019独角兽企业重金招聘Python工程师标准>>> 随着人工智能的发展,深度学习的价值不断增长,但实现它可能是一个复杂耗时的过程.英特尔(Intel)正寻求通过其在 Kubern ...

  6. 【博客507】学习阿里巴巴如何扩展Kubernetes 调度器支持 AI 和大数据作业

    学习阿里巴巴如何扩展Kubernetes 调度器支持 AI 和大数据作业

  7. 学习笔记TF064:TensorFlow Kubernetes

    AlphaGo,每个实验1000个节点,每个节点4个GPU,4000 GPU.Siri,每个实验2个节点,8个GPU.AI研究,依赖海量数据计算,离性能计算资源.更大集群运行模型,把周级训练时间缩短到 ...

  8. kubernetes(六)k8s核心组件学习

    1.1 Master和Node Master K8S集群中的控制节点,负责整个集群的管理和控制,可以做成高可用,防止一台Master不可用. 其中有一些关键的组件:API Server,Control ...

  9. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引...

    Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引 原文:Introduction to 3 ...

最新文章

  1. Windows Server 2012 R2配置ISCSI磁盘共享盘(4)
  2. shell算数表达式运算
  3. linux基础学习(十)
  4. 如何看Linux服务器是否被攻击
  5. JMS学习十一 ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer)
  6. Fiddler设置抓一个域名下个包
  7. 闭环控制 matlab仿真,反馈闭环控制系统Simulink仿真(带电流补偿的电压内环,直流调速)...
  8. 一键识别图片中的表格数据,并转为Excel
  9. 【Tool】ELF 和 AXF 文件分析详解
  10. mysql 按条件join_MySQL Join竟然可以这么玩?根据条件进行复制
  11. 【我的OpenGL学习进阶之旅】EGL简介
  12. 1109 Group Photo (25分)/1055 集体照 (25分)后三个测试点
  13. 【Splay】【ZJOI2006】书架
  14. 关于ros中pcl_ros和ros链接问题Makefile:140的一种解决方案
  15. charles安卓手机抓包
  16. 《数字恐龙》为了一次配种,他们努力了半年
  17. 信息学奥赛一本通【1168】题解
  18. 谷歌将关闭物联网开发平台 Android Things
  19. C#+CodeSoft 读取Label变量
  20. iOS 8支持高保真音乐

热门文章

  1. 安卓是java ios c_如何为Android和iOS使用相同的C ++代码?
  2. jquery ajax 上传文件报错,jQuery :ajaxfileupload+Struts2 文件上传,报错data undefined
  3. 十个程序员必备的网站_程序员必备网站之一:VisuAlgo
  4. java第一阶段面面试题_java基础阶段几个必会面试题
  5. 计算机特殊符号大全集,{精心收藏}电脑输入特殊字符大全
  6. 上传txt生成字典 java_文件上传漏洞fuzz字典生成脚本小工具分享
  7. 带父节点的平衡二叉树_平衡二叉树的左右旋以及双旋转的图文详解
  8. html特殊符号sm,以前搜集的一些资料—html中的特殊字符(2)
  9. iphone以旧换新活动_上苏宁易购预定iPhone12,以旧换新享5G!
  10. C++基础与深度解析第三章:数组、vector与字符串