关于kubernetes:Kubernetes核心原理和搭建

1. 引言在过来,咱们在进行程序部署的时候,是间接将环境和程序对立配置部署到主机上,然而这样做容易造成程序与程序之间的混同,所以为了解决这种问题,咱们能够搭建一台不可变的虚拟机镜像,将环境和程序配置部署到虚拟机镜像中,然而虚拟机镜像部署存在体量过于宏大并且不可挪动的问题,所以容器技术应运而生,容器技术是基于操作系统级别的虚拟化技术,各个容器与宿主机是隔离的,各个容器之间也是是隔离的,它比虚拟机镜像更容易搭建,并且能够很不便在不同的主机上挪动。然而随着分布式、集群等技术在理论利用中越来越多,在理论的生产环境中,咱们可能会波及到多个容器,而这些容器可能会逾越多个服务器主机进行部署,所以一个基于容器技术的分布式架构解决方案利用而生,它就是Kubernetes。 2. Kubernetes的概念Kubernetes(k8s)是一个基于容器技术的的分布式架构解决方案,是Google开源的容器集群管理系统,Google外部称为Borg,次要用于主动部署、扩大和治理容器化的应用程序,是以Docer为根底的分布式系统架构。 Kubernetes能够对分布式系统进行完满的撑持,它具备欠缺的集群控制能力,内建有智能的负载均衡器,领有弱小的故障发现和自我修复能力。同时还针对开发、部署测试、运维监控等提供了欠缺的管理工具。 Kubernetes的核心思想是:所有以服务为核心,依据这一核心思想,Kubernetes能够让在其上构建的零碎独立运行在物理机、虚拟机群或者云上,所以,Service(服务)是Kubernetes进行分布式集群构建的外围,必须领有如下要害特色: 领有一个惟一指定的名称。领有一个虚构IP和端口。可能提供某种近程服务能力。能够被映射到提供这种近程服务能力的一组容器利用上。3. Kubernetes的术语3.1 MasterKubernetes的集群管制节点,负责整个集群的治理和管制,领有一个etcd服务,用来保留所有资源对象的数据,咱们执行的所有管制命令会发给他,他负责具体的执行过程,Master节点通常会独占一个服务器,在其上会运行以上一组要害的过程: Kubernetes API Server:提供Http Rest接口的要害服务过程,是Kubernetes中增、删、改、查等操作的惟一入口,是集群管制的入口过程。Kubernetes Controller Manager:Kubernetes中所有资源对象的自动化控制中心。Kubernetes Scheduler:负责资源调度的过程。3.2 NodeKubernetes集群中的其余机器被称为Node节点,Node节点能够是一台物理主机,也能够是一台虚拟机,每个Node节点会被Master节点调配一些负载,所以Node节点是Kubernetes集群中工作负载节点,当某个Node节点宕机时,工作负载会被Master主动转移到其余节点。Node节点之上会运行一组要害过程: kubelet:负责Pod对应容器的创立,启动、进行等工作。kube-proxy:实现Kubernetes Service通信与负载平衡机制的重要组件。Docker Engine:Docker引擎,负责容器的创立和治理3.3 PodPod是Kurbernetes进行创立、调度和治理的最小单位,Pod运行在Node节点之上,其中蕴含多个业务容器,这些业务容器之间共享网络命名空间、Ip地址、端口,能够通过localhost进行通信。Pod有两种类型:一般Pod和动态Pod。 3.4 Replication ControllerKurbernetes用来治理和保障集群中领有的Pod。 4. Kubernetes的架构Kubernetes的一切都是基于分布式的,上面这张图就是Kubernetes的架构图 通过这张架构图咱们发现Kurbernetes次要由以下几个外围组件组成: Etcd:保留整个集群的状态。API Server:提供认证、受权、访问控制、API注册和发现等机制,是资源操作的惟一入口。Kurbernetes Controller:负责保护集群的状态。Scheduler:负责资源的调度。kubelet:负责保护容器的生命周期,同时治理Volume和网络。Container:负责镜像治理以及Pod和容器的真正运行。kube-proxy:负责为Service提供cluster外部的服务发现和负载平衡。5. Kubernetes的搭建5.1 筹备工作因为Kubernetes的一切都是基于分布式的,那么,要想搭建Kubernetes就须要筹备多台服务器主机,因为条件无限,这里我采纳搭建多台虚拟机零碎的形式进行,所以须要将虚拟机和镜像零碎筹备好。 虚拟机:这里的虚拟机我采纳的是VMware,当然也能够采纳VirtualBox,VMware下载地址如下: https://www.vmware.com/cn.html镜像零碎:虚拟机的镜像零碎我采纳的是:CentOS-7-x86_64-DVD-1810,下载地址如下: http://mirrors.zju.edu.cn/cen...5.2 虚拟机环境搭建咱们筹备装置三个虚拟机节点,一个为Kubernetes的Master节点,剩下两个为Kubernetes的Node节点,这里咱们只演示第一个装置第一个节点,剩下的两个节点,采纳VMware复制镜像的形式进行。 5.2.1 虚拟机环境要求搭建Kubernetes,虚拟机环境至多要满足以下要求: 操作系统 CentOS 7内存 2G 【至多】CPU 2核【至多】硬盘 20G 【至多】5.2.2 创立虚拟机关上VMware,抉择“文件”菜单“新建虚拟机”选项,或者间接点击界面上的“创立新的虚拟机”选项,创立新的虚拟机,如下图所示: 在弹出的弹窗中抉择“经典”选项,点击“下一步”按钮,如下图所示: 在弹出的新的弹窗中抉择“稍后装置操作系统”选项,点击“下一步”按钮,如下图所示: 在弹出的新的弹窗中抉择客户机操作系统为“Linux”,版本为“CentOS 64位”,点击“下一步”按钮,如下图所示: 在弹出的新的弹窗中设置虚拟机名称为“K8S_Node1”,抉择虚拟机零碎的装置地位,点击“下一步”按钮,如下图所示: 在弹出的新的弹窗中设置最大磁盘大小为20G,抉择“将虚构磁盘存储为单个文件”,点击“下一步”按钮,如下图所示: 在弹出的新的弹窗中抉择“自定义硬件”选项 在弹出的硬件配置弹窗中,内存设置为2048M,如下图所示: 处理器设置为2个,如下图所示: 镜像文件抉择本地下载好的镜像文件,如下图所示: 设置完内存、解决、镜像文件之后,点击“敞开”按钮,回到新建虚拟机向导页面,点击“实现”按钮,实现新建虚拟机。 ...

January 22, 2021 · 1 min · jiezi

关于kubernetes:kubernetes1概述

内容次要摘自官网文档资料 官网地址 概述Kubernetes根本信息 前提条件: 把握容器或Docker常识文档编写基于kubernetes v1.17版本 概述要应用Kubernetes,你须要用KubernetesAPI对象来形容集群的预期状态(desiredstate):包含你须要运行的利用或者负载,它们应用的镜像、正本数,以及所需网络和磁盘资源等等。 能够应用命令工具kubectl来调用KubernetesAPI创建对象,通过所创立的这些对象来配置预期状态。也能够间接调用KubernetesAPI和集群进行交互,设置或者批改预期状态。 一旦设置了你所需的指标状态,Kubernetes Control Plane(集群管制面)会通过Pod生命周期事件生成器(PLEG),促成集群的以后状态合乎其预期状态。为此,Kubernetes会主动执行各类工作,比方运行或者重启容器、调整给定利用的正本数等等。 KubernetesKubernetes Control Plane由一组运行在集群上的过程组成: Kubernetes主控组件(Master)蕴含三个过程,都运行在集群中的某个节上,主控组件通常这个节点被称为master节点。这些过程包含:kube-apiserver、kube-controller-manager和kube-scheduler。集群中的每个非master节点都运行两个过程: kubelet,和 master 节点进行通信。kube-proxy,一种网络代理,将 Kubernetes 的网络服务代理到每个节点上。Kubernetes对象Kubernetes蕴含若干用来示意零碎状态的形象层,包含:已部署的容器化利用和负载、与它们相干的网络和磁盘资源以及无关集群正在运行的其余操作的信息。这些形象应用KubernetesAPI对象来示意。 根本的Kubernetes对象包含: PodServiceVolumeNamespaceKubernetes也蕴含大量的被称作Controller的高级形象。控制器基于根本对象构建并提供额定的性能和方便使用的个性。具体包含: DeploymentDaemonSetStatefulSetReplicaSetJobKubernetes Control Plane对于Kubernetes Control Plane的各个局部,(如Kubernetes主控组件和kubelet过程),治理着Kubernetes如何与你的集群进行通信。Kubernetes Control Plane保护着零碎中所有的Kubernetes对象的状态记录,并且通过间断的管制循环来治理这些对象的状态。在任意的给定工夫点,Kubernetes Control Plane的管制环都能响应集群中的变动,并且让零碎中所有对象的理论状态与你提供的预期状态相匹配。 比方,当你通过KubernetesAPI创立一个Deployment对象,你就为零碎减少了一个新的指标状态。Kubernetes Control Plane记录着对象的创立,并启动必要的利用而后将它们调度至集群某个节点上来执行你的指令,以此来放弃集群的理论状态和指标状态的匹配。 Kubernetes Master节点Kubernetes master节点负责保护集群的指标状态。当你要与Kubernetes通信时,应用如kubectl的命令行工具,就能够间接与Kubernetes master节点进行通信。 “master”是指治理集群状态的一组过程的汇合。通常这些过程都跑在集群中一个独自的节点上,并且这个节点被称为master节点。master节点也能够扩大正本数,来获取更好的可用性及冗余。 Kubernetes Node节点集群中的node节点(虚拟机、物理机等等)都是用来运行你的利用和云工作流的机器。Kubernetes master节点管制所有node节点;你很少须要和node节点进行间接通信。 Kubernetes是什么Kubernetes是一个可移植的、可扩大的开源平台,用于治理容器化的工作负载和服务,可促成申明式配置和自动化。Kubernetes领有一个宏大且快速增长的生态系统。Kubernetes的服务、反对和工具宽泛可用。 传统部署时代:晚期,组织在物理服务器上运行应用程序。无奈为物理服务器中的利用程序定义资源边界,这会导致资源分配问题。例如,如果在物理服务器上运行多个应用程序,则可能会呈现一个应用程序占用大部分资源的状况,后果可能导致其余应用程序的性能降落。一种解决方案是在不同的物理服务器上运行每个应用程序,然而因为资源利用有余而无奈扩大,并且组织保护许多物理服务器的老本很高。 虚拟化部署时代:作为解决方案,引入了虚拟化性能,它容许您在单个物理服务器的CPU上运行多个虚拟机(VM)。虚拟化性能容许应用程序在VM之间隔离,并提供安全级别,因为一个应用程序的信息不能被另一应用程序自在地拜访。 因为虚拟化能够轻松地增加或更新应用程序、升高硬件老本等等,所以虚拟化能够更好地利用物理服务器中的资源,并能够实现更好的可伸缩性。 每个VM是一台残缺的计算机,在虚拟化硬件之上运行所有组件,包含其本人的操作系统。 容器部署时代:容器相似于VM,然而它们具备轻量级的隔离属性,能够在应用程序之间共享操作系统(OS)。因而,容器被认为是轻量级的。容器与VM相似,具备本人的文件系统、CPU、内存、过程空间等。因为它们与基础架构拆散,因而能够跨云和OS散发进行移植。 容器因具备许多劣势而变得流行起来。上面列出了容器的一些益处: 麻利应用程序的创立和部署:与应用VM镜像相比,进步了容器镜像创立的简便性和效率。继续开发、集成和部署:通过疾速简略的回滚(因为镜像不可变性),提供牢靠且频繁的容器镜像构建和部署。关注开发与运维的拆散:在构建/公布时而不是在部署时创立应用程序容器镜像,从而将应用程序与基础架构拆散。可察看性不仅能够显示操作系统级别的信息和指标,还能够显示应用程序的运行状况和其余指标信号。跨开发、测试和生产的环境一致性:在便携式计算机上与在云中雷同地运行。云和操作系统散发的可移植性:可在Ubuntu、RHEL、CoreOS、本地、GoogleKubernetesEngine和其余任何中央运行。以应用程序为核心的治理:进步形象级别,从在虚构硬件上运行OS到应用逻辑资源在OS上运行应用程序。涣散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立局部,并且能够动静部署和治理-而不是在一台大型单机上整体运行。资源隔离:可预测的应用程序性能。资源利用:高效率和高密度。为什么须要Kubernetes,它能做什么?容器是打包和运行应用程序的好形式。在生产环境中,您须要治理运行应用程序的容器,并确保不会停机。例如,如果一个容器产生故障,则须要启动另一个容器。如果零碎解决此行为,会不会更容易? 这就是Kubernetes的救济办法!Kubernetes为您提供了一个可弹性运行分布式系统的框架。Kubernetes会满足您的扩大要求、故障转移、部署模式等。例如,Kubernetes能够轻松管理系统的Canary部署。 Kubernetes为您提供: 服务发现和负载平衡Kubernetes能够应用DNS名称或本人的IP地址公开容器,如果到容器的流量很大,Kubernetes能够负载平衡并调配网络流量,从而使部署稳固。 存储编排Kubernetes容许您主动挂载您抉择的存储系统,例如本地存储、公共云提供商等。 主动部署和回滚您能够应用Kubernetes形容已部署容器的所需状态,它能够以受控的速率将理论状态更改为所需状态。例如,您能够自动化Kubernetes来为您的部署创立新容器,删除现有容器并将它们的所有资源用于新容器。 主动二进制打包Kubernetes容许您指定每个容器所需CPU和内存(RAM)。当容器指定了资源申请时,Kubernetes能够做出更好的决策来治理容器的资源。 自我修复Kubernetes重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况查看的容器,并且在筹备好服务之前不将其通告给客户端。 密钥与配置管理Kubernetes容许您存储和治理敏感信息,例如明码、OAuth令牌和ssh密钥。您能够在不重建容器镜像的状况下部署和更新密钥和应用程序配置,也无需在堆栈配置中裸露密钥。 Kubernetes 不是什么Kubernetes不是传统的、无所不包的PaaS(平台即服务)零碎。因为Kubernetes在容器级别而不是在硬件级别运行,因而它提供了PaaS产品共有的一些广泛实用的性能,例如部署、扩大、负载平衡、日志记录和监督。然而,Kubernetes不是繁多的,默认解决方案是可选和可插拔的。Kubernetes提供了构建开发人员平台的根底,然而在重要的中央保留了用户的抉择和灵活性。 Kubernetes: Kubernetes不限度反对的应用程序类型。Kubernetes旨在反对极其多种多样的工作负载,包含无状态、有状态和数据处理工作负载。如果应用程序能够在容器中运行,那么它应该能够在Kubernetes上很好地运行。Kubernetes不部署源代码,也不构建您的应用程序。继续集成(CI)、交付和部署(CI/CD)工作流取决于组织的文化和偏好以及技术要求。Kubernetes不提供应用程序级别的服务作为内置服务,例如中间件(例如,消息中间件)、数据处理框架(例如,Spark)、数据库(例如,mysql)、缓存、集群存储系统(例如,Ceph)。这样的组件能够在- Kubernetes上运行,并且/或者能够由运行在Kubernetes上的应用程序通过可移植机制(例如,凋谢服务代理)来拜访。Kubernetes不指定日志记录、监督或警报解决方案。它提供了一些集成作为概念证实,并提供了收集和导出指标的机制。Kubernetes不提供或不要求配置语言/零碎(例如jsonnet),它提供了申明性API,该申明性API能够由任意模式的申明性标准所形成。Kubernetes不提供也不采纳任何全面的机器配置、保护、治理或自我修复零碎。此外,Kubernetes不仅仅是一个编排零碎,实际上它打消了编排的须要。编排的技术定义是执行已定义的工作流程:首先执行A,而后执行B,再执行C。相比之下,Kubernetes蕴含一组独立的、可组合的管制过程,这些过程间断地将以后状态驱动到所提供的所需状态。从A到C的形式无关紧要,也不须要集中控制,这使得零碎更易于应用且性能更弱小、强壮、弹性和可扩展性。总结为什么须要kuberneteskubernetes是弹性的,可能动静扩大、故障转移等。容器应用kubernetes能够做到主动发现、负载平衡、存储编排、主动部署和回滚、主动打包、自我修复、以及密钥与配置管理。 kubernetes主控组件(master)蕴含哪些次要过程kube-apiserver、kube-controller-manager、kube-scheduler 非master节点(node)蕴含哪些次要过程kubelet、kube-proxy 简述master与node节点各自的作用是什么master节点负责保护集群的指标状态;node节点都是用来运行利用和云工作流的机器

January 21, 2021 · 1 min · jiezi

关于kubernetes:国内最具影响力科技创投媒体36Kr的容器化之路

本文由1月19日晚36Kr运维开发工程师田翰明在Rancher技术交换群的技术分享整顿而成。微信搜寻rancher2,增加Rancher小助手为好友,退出技术群,实时加入下一次分享~田翰明,36Kr 运维开发工程师,在 36Kr 次要负责运维自动化,CI/CD 的建设,以及利用容器化的推动。背景36Kr是一家创建于2010年,专一于科技创投畛域的媒体公司,业务场景并不简单,前端次要应用NodeJS进行Render,挪动端有Android也有iOS,后端服务简直全都由PHP来反对。应用PHP的次要起因是在最后进行技术选型的时候发现,PHP进行Web开发效率比拟高,起初就始终这样连续下来了。 然而在前期,随着业务的突飞猛涨,在程序设计中又没能进行解耦,就导致了许多服务耦合成了一个很臃肿的单体利用,逻辑耦合重大,进而导致了很多的性能问题,随着问题越来越难改,开发工作又越来越紧,就不得不往后拖,越往后拖留下的问题就更难改,造成了一个恶性循环,留下了很多的技术债,很不利于后续的开发工作,并且一旦呈现了问题,也很难追溯具体起因,所以在那时候常常听到一句话 “这是历史遗留问题” 。 B/S、C/S、单体利用,这是一种很传统 也很简略的架构,然而毛病也暴露无遗,所以常常因为一个业务逻辑的性能问题,进而影响到所有的业务。在运维侧,运维只可能通过堆机器,升配置等策略来应答,投入了很多的机器老本和人力老本,然而收效甚微,很是被动。 这种状况曾经是火烧眉毛了,终于技术团队决定应用 Java 语言进行重构,将单体利用进行微服务化拆解,彻底改变这种因为单体利用故障而导致生产环境呈现大范畴的故障。 需要剖析 + 选型在重构打算开始一段时间后,为了节俭虚机资源,咱们一台虚机上运行了多个 Java 程序,然而因为没有资源隔离和灵便的调度零碎,其实也会导致一些资源的节约。并且在高并发场景下,偶然会有资源抢占导致一个利用影响另一个利用的状况。为此,咱们运维专门开发了一套自动化部署零碎,零碎内包含部署、监控检测、部署失败回滚、重启等根底性能。 随着过后 K8s 的风靡,还有 Rancher 2.x 的公布,咱们逐步发现,咱们所面临的这些问题,它们根本都能解决,比方资源隔离、deployment 的控制器模型、灵便的调度零碎,这些都有,这就是最好的自动化部署零碎啊,于是咱们运维侧,也开始决定向容器化进军。 在选型上,因为咱们的服务根本都在阿里云下面,所以第一个想到的是阿里云。时因为咱们和华为有一些业务的往来,所以华为的 CCE 也作为了备选,然而思考到咱们的服务资源全副在阿里云上,这个迁徙老本切实太大了,所以就没再思考华为云。 咱们一开始应用过Rancher 1.6,然而只是用来治理主机上部署的原生 Docker。也因而对Rancher的产品产生了很大的好感。 需要方面,因为要升高咱们研发人员的学习老本,容器治理平台的易用性非常重要。此外,K8s 的根底性能是必须的,因为 K8s 还在高速倒退阶段,所以能须要够随时跟上更新,有安全漏洞后也须要第一工夫进行更新打补丁,同时还要有根本的权限管制。而且咱们公司外部没有专门的K8S团队,运维人员也只有2位,所以如果可能有业余人员进行技术上的交换,产生了问题能够有业余的服务团队来帮助也非常重要。 综上,基本上就是 Rancher 完胜,UI 做得十分敌对,开发人员可能很快上手,更新迭代速度也十分快,发现破绽后也会有具体的补丁计划,认证策略也完满反对咱们的 OpenLDAP 协定,可能对开发、测试、运维人员进行不同权限管制,并且也是第一家做到反对多云环境的,不便当前咱们做跨云的计划。 咱们这次容器化的过程,次要经验了以下几个因素的思考,明天我就来和大家分享咱们在 Rancher 上的一些实际,心愿能给大家带来帮忙: 利用的容器化革新Rancher 的高可用性容器的运维多租户隔离利用的容器化革新因为咱们的开发人员,有相当一部分是没有接触过容器的,为了能对开发人员更敌对一些,咱们的镜像分成了两层,次要的 Dockerfile 编写是由咱们运维人员来编写的,而开发人员代码仓库里的 Dockerfile 是最简略的,基本上只有代码拷贝的过程和一些必传的变量,具体能够参考以下示例: ## 这是运维人员保护的 Dockerfile 示例## 本示例仅做参考FROM alpine:3.8MAINTAINER yunwei <yunwei@36kr.com>WORKDIR /wwwRUN mv /etc/apk/repositories /etc/apk/repositories.bak \ && echo "http://mirrors.aliyun.com/alpine/v3.8/main/" >> /etc/apk/repositories \ && apk update && apk upgradeRUN apk --no-cache add ca-certificates wget && \ wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub && \ wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-2.29-r0.apk && \ apk add glibc-2.29-r0.apk && rm -f glibc-2.29-r0.apkRUN apk add -U --no-cache \ bash \ sudo \ tzdata \ drill \ iputils \ curl \ busybox-extras \ && rm -rf /var/cache/apk/* \ && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeCOPY java-jar/jdk1.8.0_131 /usr/local/jdk1.8.0_131ENV TZ="Asia/Shanghai"ENV JAVA_HOME=/usr/local/jdk1.8.0_131ENV CLASSPATH=$JAVA_HOME/binENV PATH=.:$JAVA_HOME/bin:$PATHENV JAVA_OPTS="-server -Xms1024m -Xmx1024m"CMD java -jar $JAVA_OPTS -Dserver.port=8080 server.jar=======================================## 这是开发人员保护的 Dockerfile 的示例FROM harbor.36kr.com/java:v1.1.1MAINTAINER developer <developer@36kr.com>ADD web.jar ./server.jar能够看到,开发人员所保护的 Dockerfile 能够说相当简略了,这大大的升高了开发人员保护的难度。 ...

January 21, 2021 · 3 min · jiezi

关于kubernetes:网易数帆k8s集群对networkpolicy的实践felix

Networkpolicy的含意与现状networkpolicy是k8s在很早就提出的一个抽象概念。它用一个对象来形容一类pod的网络出入站规定。对于networkpolicy的语义能够参考我之前的文章 networkpolicy的作用对象是pod,作用成果包含出站、入站,作用成果拓扑包含IP段、namespace、pod、端口、协定。 与以往IaaS服务场景下,针对虚拟机、网卡对象的平安组规定不同,networkpolicy是k8s原语。因而,在k8s场景下,进行网络安全规定的布局时,用networkpolicy能做到更加的灵便和自动化。举个例子: 有一套工作负载A是做相似数据库代理一类的工作,它只容许代理服务B拜访,不容许其余业务拜访。 在k8s场景下,如果不应用networkpolicy,咱们须要布局好A类pod的部署节点,配置相应的ACL规定,将B类pod的IP予以放行,一旦A/B类pod做了扩缩容,可能要在重新配置一份甚至多份ACL规定。在k8s场景下,咱们会给A和B类别离配置label,创立好networkpolicy后限度A只放行B类pod,每当A或B扩缩容时,无需做任何额定操作。网易数帆的networkpolicy反对网易数帆的云计算业务的内部用户中,基于交付的openshift-sdn计划或calico计划,这些计划都能够原生地反对networkpolicy(下文会介绍)。 但云计算业务的外部用户(应用vpc或bgp CNI)大多是由PE布局治理IP白名单,限度某些网络拜访,除此之外没有做任何跨业务的网络限度(比如说:离线转码业务与领取业务是互不相干的,然而两种业务的pod彼此网络是可通信的)。因而始终没有networkpolicy的需要,而vpc、bgp等外部应用的CNI也还始终没有实现相干性能。 将来随着业务规模的扩充,相似的网络安全策略是必不可少的,因而咱们会在接下来逐渐将networkpolicy enable。 业界的networkpolicy实现以后社区对于k8s的networkpolicy的实现,不外乎三种计划: 计划依赖案例反对的CNI基于iptables+ipset实现规定容器流量须要通过宿主机的协定栈calico felixcalico、flannel、terway基于ovs流表实现规定应用openvswitchopenshift-sdnopenshift-sdn基于ebpf hook实现规定须要较高版本内核ciliumcilium、flannel、terway从下面的表格能够看出: 基于ovs流表实现的计划,典型的就是openshift-sdn,此前咱们分享过一篇openshift-sdn的详解,介绍了外面对ovs table的设计,其中有一个专门的table(tableid=21)就是用来实现networkpolicy的规定。 该计划是间接内建于openshift-sdn我的项目,根本无奈移植。 而openshift-sdn尽管代码开源,但设计上、代码逻辑上与openshift平台耦合还是比拟严密的。比如说: 公开的openshift-sdn部署计划须要依赖openshift-network-operatoropenshift-sdn代码中硬编码了要拜访的容器运行时为crio,不反对dockershimcilium是最先应用ebpf技术实现网络数据面的CNI,它力求实现大而全的容器网络,封装、加密、全面、高性能等特点包罗万象,它对于networkpolicy的反对也曾经非常欠缺。但ebpf hook的实现形式,依赖较高的内核版本,且在数据面排障时比拟吃力。ebpf技术对于网络性能的晋升很大,将来势必会越来越风行,所以值得关注。基于iptables+ipset技术实现的计划,其实在几年前就比拟成熟了calico-felix、romana、kube-router等开源的网络计划都是基于此实现了反对networkpolicy。其中,felix是calico网络计划中的一个组件,官网反对在calico中enable networkpolicy,且可能与flannel配合应用。阿里云的terway便是间接套用felix实现了对networkpolicy的反对(最近还套用了cilium)。这套计划要求容器流量要进过宿主机协定栈,否则包就不会进入内核的netfilter模块,iptables规定就无奈失效。指标基于上述现状,咱们心愿基于现有的开源实现计划,进行兼容性调研或革新,适配网易数帆的各种网络计划,如: netease-vpcnetease-bgpflannel...因为这些网络计划都满足felix的要求,同时felix有较为沉闷的社区和较多的适配案例,因而咱们决定基于felix,实现一套即插即用的networkpolicy addon。本文接下来将会着重介绍该计划的实现。 calico/felix的设计实现架构calico在部署架构上做了屡次演进,咱们以最新版本v3.17.1为准。calico的残缺架构包含了若干组件: calico/kube-controllers: calico控制器,用于监听一些k8s资源的变更,从而进行相应的calico资源的变更。例如依据networkpolicy对象的变更,变更相应的calicopolicy对象pod2daemon: 一个initcontainer,用于构建一个Unix Domain Socket,来让Felix程序与Dikastes(calico中反对istio的一种sidecar,详见calico的istio集成)进行加密通信.cni plugin / ipam plugin: 规范的CNI插件,用于配置/解除网络;调配/回收网络配置calico-node calico-node其实是一个数据面工具总成,包含了: felix: 治理节点上的容器网卡、路由、ACL规定;并上报节点状态bird/bird6: 用来建设bgp连贯, 并依据felix配置的路由,在不同节点间散发confd: 依据以后集群数据生成本地brid的配置calicoctl: calico的CLI工具。datastore plugin: 即calico的数据库,能够是独立的etcd,也能够以crd形式记录于所在集群的k8s中typha: 相似于数据库代理,能够尽量少防止有大量的连贯建设到apiserver。实用于超过100个node的集群。官网给出了calico整体的组件架构图: 原理在网络连通性(Networking)方面:calico的数据面是非常简单的三层路由转发。路由的学习和散发由bgp协定实现。如果k8s的上层是VPC之类的三层网络环境,则须要进行overlay,calico反对ipip封装实现overlay。 在网络安全性方面:calico思考到其Networking是依赖宿主机协定栈进行路由转发实现的,因而能够基于iptables+ipset进行流量标记、地址集布局、流量解决(放行或DROP),并且基于这些操作能够实现: networkpolicy的抽象概念calico自定义的networkpolicy,为了在openstack场景下利用而设计calico自定义的profile,已废除。这里所有的iptables规定都作用在: pod在宿主机namespace中的veth网卡(calico中将之称为workload)宿主机nodeIP所在网卡(calico中将之称为host-endpoint,实际上这部分规定不属于k8s的networkpolicy领域)。次要包含如下几类规定: iptables的INPUT链规定中,会先跳入cali-INPUT 链,在cali-INPUT链中,会判断和解决两种方向的流量: pod拜访node(cali-wl-to-host)实际上这个链中只走了cali-from-wl-dispatch链,如果是利用在openstack中,该链还会容许拜访metaserver;如果应用ipv6,该链中还会容许收回icmpv6的一系列包来自node的流量(cali-from-host-endpoint)iptables的OUTPUT链中,会首先跳入cali-OUTPUT链,在cali-OUTPUT链中,次要会解决: 拜访node的流量(cali-to-host-endpoint)的流量iptables的FORWARD链中,会首先跳入cali-FORWARD链,在cali-FORWARD链中会解决如下几种流量: 来自node转发的流量cali-from-hep-forward从pod中收回的流量cali-from-wl-dispatch达到pod的流量cali-to-wl-dispatch达到node的转发流量cali-to-hep-forward纯正的IP段到IP段的转发流量cali-cidr-blockk8s的networkpolicy只须要关注上述流量中与pod相干的流量,因而只须要关怀: cali-from-wl-dispatchcali-to-wl-dispatch这两个链的规定,对应到pod的egress和ingress networkpolicy。 1. 除了nat表,在raw和mangle表中还有对calico关注的网卡上的收发包进行初始标记的规定,和最终的判断规定。2. 在https://github.com/projectcalico/felix/blob/master/rules/static.go中能够看到残缺的动态iptables表项的设计接着,iptables规定中还会在cali-from-wl-dispatch和cali-to-wl-dispatch两个链中依据收包/发包的网卡判断这是哪个pod,走到该pod的egress或ingress链中。每个pod的链中则又设置了对应networkpolicy实例规定的链,以此递归调用。 这样,pod的流量通过INPUT/OUTPUT/FORWARD等链后,递归地走了多个链,每个链都会Drop或者Return,如果把链表走一遍下来始终Return,会Return到INPUT/OUTPUT/FORWARD, 而后执行ACCEPT,也就是说这个流量满足了某个networkpolicy的规定限度。如果过程中被Drop了,就示意受某些规定限度,这个链路不通。 咱们通过一个简略的例子来形容iptables这块的链路程序。 felix实现networkpolicy的案例假如有如下一个networkpolicy: spec: egress: - {} ingress: - from: - podSelector: matchLabels: hyapp: client1 - from: - ipBlock: cidr: 10.16.2.0/24 except: - 10.16.2.122/32 ports: - port: 3456 protocol: TCP podSelector: matchLabels: hyapp: server他作用于有hyapp=server的label的pod这类pod出方向不限度这类pod的入站规定中只容许如下几种流量: ...

January 19, 2021 · 4 min · jiezi

关于kubernetes:Kubernetes-如果是个水族馆

作者:Anne LoVerso翻译:Bach(才云) 校对:星空下的文仔(才云) Kubernetes 有很多货色,各种各样的名词,就像洋葱一样,一层一层包裹在一起。 许多 Kubernetes 的介绍图都是这样的,解释了涵盖的所有名词。 从技术上讲,它是精确的,然而对一些人而言不是很有帮忙,本文将其类比于鱼类和水族馆,可能会有助于局部人将这些解析记录在脑海中。 这是一个应用程序。 它自身是一个残缺的性能单元,但不能独自生存,因为它须要正确配置的环境。这个非凡的“鱼”程序须要水能力生存。 咱们能够将它与所有其余应用程序一起扔到陆地中,但它必须竞争资源并应答陆地中的其余所有,因为它没有本人的专属空间和资源。 这就是咱们进行容器化的起因。 应用相似 Docker 的工具,咱们能够为应用程序提供容器,将他们离开,给予他们各自的空间。 这是一个 Pod,它是 Kubernetes 的根本构建单元。这是咱们搁置容器化应用程序的一个盒子。咱们给它一个标签,以便 Kubernetes 晓得它是什么以及如何应用它。 当初鱼程序曾经在 Pod 中平安地进行了调配,当初能够通过 Kubernetes 水族馆进行治理。 有时候,应用程序须要资源,例如内存和 CPU。在这里,咱们的鱼缸容器则是须要 60W 功率能力应用滤水器。 水族馆里有不同的房间能够放鱼缸。 这里的第一个房间没有更多可用资源,仅有的两个电源插座已在应用中。 第二个房间有可用的插座,然而这个房间的插座仅提供 40W 功率,而咱们的鱼缸须要 60W。 这些房间是 Kubernetes 集群中的节点,也就是运行 Pod 的工作人员。 Kubernetes 是水族馆馆长。 他晓得领有哪些房间,有哪些资源,并能够依据这些信息来决定将新鱼缸放在哪里。在没有任何其余限度的状况下,他默认将鱼缸平均地搁置在所有房间中。 咱们通常不会在单个鱼缸中解决单条鱼。馆长常常将鱼缸放在一起,作为一个鱼缸汇合展品。 在这里,深海汇合展品由一些鮟鱇鱼缸、水母缸和鱿鱼缸组成。在将它们归到汇合展品中时,咱们要确定须要创立多少个容器。 设计展品时,咱们提供了无关在展品中每个我的项目的阐明。 这里具体介绍了咱们想要的每个鱼缸数量,以及在须要修复时,如何创立新鱼缸。咱们列出了要填充的水量、所需的水温、须要的食物量。 将这些阐明提供给 Kubernetes 水族馆馆长后,他能够将保护每个应用程序鱼缸的工作委托给“水族馆实习生”。 实习生的工作是确保水族馆中始终有正确数量的鱼缸。用 Kubernetes 讲,这个与 Deployment 一起创立的实习生称为正本集(Replica Set)。 ...

January 14, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes-原生-CICD-构建框架-Argo-详解

作者:FogDong(才云)编辑:Bach(才云) 什么是流水线?在计算机中,流水线是把一个反复的过程合成为若干个子过程,使每个子过程与其余子过程并行进行的技术,也叫 Pipeline。因为这种 s工作形式与工厂中的生产流水线十分相似, 因而也被称为流水线技术。从实质上讲,流水线技术是一种工夫并行技术。以“构建镜像”过程为例: 在每一次构建镜像中,咱们都须要拉下代码仓库中的代码,进行代码编译,构建镜像,最初推往镜像仓库。在每一次代码更改过后,这一过程都是不变的。应用流水线工具能够极大的晋升这一过程的效率,只须要进行简略的配置便能够轻松的实现重复性的工作。这样的过程也被称之为 CI。 上图流程中应用的是 Jenkins。Jenkins 作为老牌流水线框架被大家所熟知。在云原生时代,Jenkins 推出了 Jenkins X 作为基于 Kubernetes 的新一代流水线,另外云原生时代还诞生了两大流水线框架—— Argo 和 Tekton。本文就具体介绍了 Argo 的相干内容。 《Kubernetes 原生 CI/CD 构建框架 Tekton 详解!》具体介绍了 Tekton 的相干内容。ArgoArgo Workflows 是一个开源的容器原生的工作流引擎,可在 Kubernetes 上编排并行作业。Argo Workflows 实现为 Kubernetes CRD。 Quick StartArgo 基于 Kubernetes,能够间接应用 kubectl 装置,装置的组件次要包含了一些 CRD 以及对应的 controller 和一个 server。 留神,上述装置只会执行同 namespace 内的 Workflow,cluster install 详见文档。文档地址:https://github.com/argoproj/a...三级定义要理解 Argo 定义的 CRD,先从其中的三级定义动手。概念上的从大到小别离为 WorkflowTemplate、Workflow、template,这些资源的命名有些类似,要留神分辨。 Template 从最简略的 template 说起,一个 template 有多种类型,别离为 container、script、dag、steps、resource 以及 suspend。对于 template,咱们能够简略的将其了解为一个 Pod ——container/script/resource 类型的 template 都会去理论管制一个 Pod,而 dag/steps 类型的 template 则是由多个根底类型的 template (container/script/resource)组成的。 ...

January 14, 2021 · 3 min · jiezi

关于kubernetes:kubernetes-garbage-collector-explained-in-detail

<iframe id="embed_dom" name="embed_dom" frameborder="0" style="display:block;width:525px; height:245px;" src="https://www.processon.com/embed/5ff5876ce0b34d34e132a0fb"></iframe>

January 11, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes学习笔记之Calico-CNI-Plugin源码解析二

Overviewcalico插件代码仓库在 projectcalico/cni-plugin ,并且会编译两个二进制文件:calico和calico-ipam,其中calico会为sandbox container创立route和虚构网卡virtual interface,以及veth pair等网络资源,并且会把相干数据写入calico datastore数据库里;calico-ipam会为以后pod从以后节点的pod网段内调配ip地址,当然以后节点还没有pod网段,会从集群网段cluster cidr中先调配出该节点的pod cidr,并把相干数据写入calico datastore数据库里,这里cluster cidr是用户本人定义的,曾经提前写入了calico datastore,并且从cluster cidr中划分的block size也是能够自定义的(新版本calico/node容器能够反对自定义,老版本calico不反对),能够参考官网文档 change-block-size 。 接下来重点看下calico二进制插件具体是如何工作的,后续再看calico-ipam二进制插件如何调配ip地址的。 calico plugin源码解析calico插件是遵循cni标准接口,实现了 ADD 和 DEL 命令,这里重点看看 ADD 命令时如何实现的。calico首先会注册 ADD 和 DEL 命令,代码在 L614-L677 : func Main(version string) { // ... err := flagSet.Parse(os.Args[1:]) // ... // 注册 `ADD` 和 `DEL` 命令 skel.PluginMain(cmdAdd, nil, cmdDel, cniSpecVersion.PluginSupports("0.1.0", "0.2.0", "0.3.0", "0.3.1"), "Calico CNI plugin "+version)}ADD 命令里,次要做了三个逻辑: 查问calico datastore里有没有WorkloadEndpoint对象和以后的pod名字匹配,没有匹配,则会创立新的WorkloadEndpoint对象,该对象内次要保留该pod在host network namespace内的网卡名字和pod ip地址,以及container network namespace的网卡名字等等信息,对象示例如下。创立一个veth pair,并把其中一个网卡置于宿主机端网络命名空间,另一个置于容器端网络命名空间。在container network namespace内创立网卡如eth0,并通过调用calico-ipam取得的IP地址赋值给该eth0网卡;在host network namespace内创立网卡,网卡名格局为 "cali" + sha1(namespace.pod)[:11] ,并设置MAC地址"ee:ee:ee:ee:ee:ee"。在容器端和宿主机端创立路由。在容器端,设置默认网关为 169.254.1.1 ,该网关地址代码写死的;在宿主机端,增加路由如 10.217.120.85 dev calid0bda9976d5 scope link ,其中 10.217.120.85 是pod ip地址,calid0bda9976d5 是该pod在宿主机端的网卡,也就是veth pair在宿主机这端的virtual ethernet interface虚构网络设备。一个WorkloadEndpoint对象示例如下,一个k8s pod对象对应着calico中的一个workloadendpoint对象,能够通过 calicoctl get wep -o wide 查看所有 workloadendpoint。记得配置calico datastore为kubernetes的,为不便能够在 ~/.zshrc 里配置环境变量: ...

January 11, 2021 · 7 min · jiezi

关于kubernetes:Kubernetes学习笔记之Calico-CNI-Plugin源码解析二

Overviewcalico插件代码仓库在 projectcalico/cni-plugin ,并且会编译两个二进制文件:calico和calico-ipam,其中calico会为sandbox container创立route和虚构网卡virtual interface,以及veth pair等网络资源,并且会把相干数据写入calico datastore数据库里;calico-ipam会为以后pod从以后节点的pod网段内调配ip地址,当然以后节点还没有pod网段,会从集群网段cluster cidr中先调配出该节点的pod cidr,并把相干数据写入calico datastore数据库里,这里cluster cidr是用户本人定义的,曾经提前写入了calico datastore,并且从cluster cidr中划分的block size也是能够自定义的(新版本calico/node容器能够反对自定义,老版本calico不反对),能够参考官网文档 change-block-size 。 接下来重点看下calico二进制插件具体是如何工作的,后续再看calico-ipam二进制插件如何调配ip地址的。 calico plugin源码解析calico插件是遵循cni标准接口,实现了 ADD 和 DEL 命令,这里重点看看 ADD 命令时如何实现的。calico首先会注册 ADD 和 DEL 命令,代码在 L614-L677 : func Main(version string) { // ... err := flagSet.Parse(os.Args[1:]) // ... // 注册 `ADD` 和 `DEL` 命令 skel.PluginMain(cmdAdd, nil, cmdDel, cniSpecVersion.PluginSupports("0.1.0", "0.2.0", "0.3.0", "0.3.1"), "Calico CNI plugin "+version)}ADD 命令里,次要做了三个逻辑: 查问calico datastore里有没有WorkloadEndpoint对象和以后的pod名字匹配,没有匹配,则会创立新的WorkloadEndpoint对象,该对象内次要保留该pod在host network namespace内的网卡名字和pod ip地址,以及container network namespace的网卡名字等等信息,对象示例如下。创立一个veth pair,并把其中一个网卡置于宿主机端网络命名空间,另一个置于容器端网络命名空间。在container network namespace内创立网卡如eth0,并通过调用calico-ipam取得的IP地址赋值给该eth0网卡;在host network namespace内创立网卡,网卡名格局为 "cali" + sha1(namespace.pod)[:11] ,并设置MAC地址"ee:ee:ee:ee:ee:ee"。在容器端和宿主机端创立路由。在容器端,设置默认网关为 169.254.1.1 ,该网关地址代码写死的;在宿主机端,增加路由如 10.217.120.85 dev calid0bda9976d5 scope link ,其中 10.217.120.85 是pod ip地址,calid0bda9976d5 是该pod在宿主机端的网卡,也就是veth pair在宿主机这端的virtual ethernet interface虚构网络设备。一个WorkloadEndpoint对象示例如下,一个k8s pod对象对应着calico中的一个workloadendpoint对象,能够通过 calicoctl get wep -o wide 查看所有 workloadendpoint。记得配置calico datastore为kubernetes的,为不便能够在 ~/.zshrc 里配置环境变量: ...

January 11, 2021 · 7 min · jiezi

关于kubernetes:Kubernetes学习笔记之Calico-CNI-Plugin源码解析一

Overview之前在 Kubernetes学习笔记之kube-proxy service实现原理 学习到calico会在worker节点上为pod创立路由route和虚构网卡virtual interface,并为pod调配pod ip,以及为worker节点调配pod cidr网段。 咱们生产k8s网络插件应用calico cni,在装置时会装置两个插件:calico和calico-ipam,官网装置文档 Install the plugin 也说到了这一点,而这两个插件代码在 calico.go ,代码会编译出两个二进制文件:calico和calico-ipam。calico插件次要用来创立route和virtual interface,而calico-ipam插件次要用来调配pod ip和为worker节点调配pod cidr。 重要问题是,calico是如何做到的? Sandbox containerkubelet过程在开始启动时,会调用容器运行时的 SyncPod 来创立pod内相干容器,次要做了几件事件 L657-L856 : 创立sandbox container,这里会调用cni插件创立network等步骤,同时思考了边界条件,创立失败会kill sandbox container等等创立ephemeral containers、init containers和一般的containers。这里只关注创立sandbox container过程,只有这一步会创立pod network,这个sandbox container创立好后,其余container都会和其共享同一个network namespace,所以一个pod内各个容器看到的网络协议栈是同一个,ip地址都是雷同的,通过port来辨别各个容器。具体创立过程,会调用容器运行时服务创立容器,这里会先筹备好pod的相干配置数据,创立network namespace时也须要这些配置数据 L36-L138 : func (m *kubeGenericRuntimeManager) createPodSandbox(pod *v1.Pod, attempt uint32) (string, string, error) { // 生成pod相干配置数据 podSandboxConfig, err := m.generatePodSandboxConfig(pod, attempt) // ... // 这里会在宿主机上创立pod logs目录,在/var/log/pods/{namespace}_{pod_name}_{uid}目录下 err = m.osInterface.MkdirAll(podSandboxConfig.LogDirectory, 0755) // ... // 调用容器运行时创立sandbox container,咱们生产k8s这里是docker创立 podSandBoxID, err := m.runtimeService.RunPodSandbox(podSandboxConfig, runtimeHandler) // ... return podSandBoxID, "", nil}k8s应用cri(container runtime interface)来形象出标准接口,目前docker还不反对cri接口,所以kubelet做了个适配模块dockershim,代码在 pkg/kubelet/dockershim 。下面代码中的runtimeService对象就是dockerService对象,所以能够看下 dockerService.RunPodSandbox() 代码实现 L76-L197 : ...

January 11, 2021 · 4 min · jiezi

关于kubernetes:资深首席架构师预测2021年云计算的8个首要趋势

本文转自Ranche Labs 作者简介Alistair,数字化技术解决方案提供商Kainos首席架构师。在IT服务、电信和金融科技领域有十多年的工作教训。在Kainos,Alistair率领团队实现了多个英国政府部门的出名云迁徙和数字化转型我的项目。 因为媒体以及各类考察机构的数据宣传,咱们很容易认为当初大部分企业都曾经上云。但事实并非如此,正如AWS CEO Andy Jassy在re:Invent主题演讲中所说的,超过96%的计算依然停留在传统数据中心。 泛滥企业采纳云技术的阻碍显然依然存在——其中一些阻碍可能是十分无形的,而另一些阻碍则可能更加主观,例如: 对许多企业来说,企业外部不足相干技能是一个重大的挑战,而其余运行高度专业化的工作负载和简单需要的企业可能还没有信念认为商品云可能满足他们的特定需要。不足信赖以及对平安、隐衷和法规听从性的担心可能会升高对私有云的趣味。文化和政治阻碍:比方对危险的激进态度,不足决策者的反对,甚至可能只是对变动和未知的恐怖,都可能提供足够的惯性,阻止企业投身其中。COVID-19: 云计算利用的催化剂?不论是好是坏,2020年都是动荡不安的一年,其影响很可能在将来几十年内都会感触到。那么,2020年是如何影响云在商业世界中的位置的呢? 随着近程办公的遍及,寰球的IT团队忽然发现他们须要争先恐后地应答全新的、简单的、齐全不可预感的紧急需要,这些需要仿佛在一夜之间落在他们办公桌上。 尽管疫情导致的中断对于任何弱小的IT部门来说都是一个重大的阻碍,但云服务提供商的刹时弹性、灵活性和成熟的可靠性将成为许多领有成熟的云利用策略的企业的救星。 然而,对于许多依然依赖本地数据中心经营模式的机构来说,他们的IT部门须要洽购和提供额定的带宽、硬件容量和近程工作能力到他们的数据中心机架,这些曾经是另一个层面的挑战了。此外,企业的IT平安政策和程序将给许多组织带来另一个重大阻碍,因为在云环境下他们须要重构此前的平安手册,以促成近程工作。 那么,2020年对云的位置意味着什么? 2020年已被证实是私有云的决定性时刻寰球各地的企业领导者曾经亲自体验到了以云为核心的模式可能为他们的经营带来至关重要的敏捷性。许多还没有认真开始上云之旅的组织,将被迫克服惯性思维,把向云端延长作为生存的事不宜迟,而那些曾经具备“云端优先”策略的组织,能够释怀地把策略技术方向确定下来。 那么,这些对2021年及当前的倒退可能意味着什么? 2021年云计算的首要趋势是什么?预计采纳云混合和云原生策略的速度将在不断扩大的行业畛域中大大放慢。对于不太熟悉云的组织来说,为了应答COVID紧急状况克服了采纳云的要害阻碍,这是导致其大幅增长的次要起因。在COVID期间,不足上云教训的企业匆匆忙忙地将解决方案部署到云中,很可能会背负大量的技术债权。因而,这些机构的指标将是通过鼎力优化其云服务的老本、平安、性能、可靠性和经营程序来升高危险。为了用合乎 "良好架构 "准则的策略解决方案取代短期的战术性计划,企业将须要付出微小的致力。以云为核心的工作流和合作工具(如Office365)以及桌面即服务产品(如AWS WorkSpaces)的利用将持续激增。越来越多的组织将转向零信赖架构,因为重点将从传统的网络边界转向以SaaS为导向的服务。从2021年起,云迁徙、传统利用现代化和全面数字化转型将成为云供应商和征询公司的重要市场。云迁徙和现代化市场目前预计价值约880亿美元,但预计到2027年将增长至约5160亿美元。预计云供应商将专一于公布大量的促成迁徙的工具和服务——他们的指标是使迁徙过程尽可能地缩小苦楚。在短期内,许多组织将借助(绝对)简略的现有应用程序和反对基础设施的改善开始他们的迁徙和转型之旅,而后再开始长期的策略重组和数字转型打算,以充分利用真正的云原生架构的益处,同时最大限度地升高总成本。因为企业旨在缩小对单个云供应商的依赖,因而对真正的多云解决方案的需要只会一直减少。尽管Kubernetes等平台无供应商锁定的解决方案必定有后劲弥合多个供应商,但挑战仍然存在——市场上真正可信、正当简单的多云解决方案依然存在空白。人工智能/机器学习的民主化和利用将持续减速。甚至在COVID之前,云供应商就曾经在致力进一步欠缺其AI/ML产品,以笼罩更多的端到端流程,使这些产品可能为公众所用,同时也升高了老本。旨在解决指标问题的现成Marketplace AI/ML产品的数量将急剧扩充。在笼罩了绝大多数通用的计算、网络和存储基础设施需要之后,云厂商将加倍努力辨认和打消以后与在云上运行高度专业化工作负载无关的限度。一个不言而喻的例子是AWS的Inferentia和最近颁布的Trainium芯片组——预计将来厂商将持续为业余畛域开发定制化解决方案。企业将致力取得领有牢靠的云能力的人才。寰球经济前景的不确定性将阻止许多企业大规模招聘,而是抉择在外部投资,通过云相干的培训和认证来进步现有员工的技能。此外,企业对于业余的云征询公司将持续放弃旺盛的需要,因为这是补救外部技能和教训差距的必要条件。2020年是世界充沛意识到云的重要性的一年。2021年及当前,企业将在这一势头的根底上,逐渐改善其云计算利用策略,启动其迁徙和现代化打算,并建设其外部应用云的能力。

January 6, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes学习笔记之kubeproxy-service实现原理

Overview咱们生产k8s对外裸露服务有多种形式,其中一种应用 external-ips clusterip service ClusterIP Service形式对外裸露服务,kube-proxy应用iptables mode。这样external ips能够指定固定几台worker节点的IP地址(worker节点服务曾经被驱赶,作为流量转发节点不作为计算节点),并作为lvs vip下的rs来负载平衡。依据vip:port来拜访服务,并且依据port不同来辨别业务。相比于NodePort Service那样能够通过所有worker节点的node_ip:port来拜访更高效,也更容易落地生产。 然而,traffic packet是怎么依据集群外worker节点的node_ip:port或者集群内cluster_ip:port拜访形式找到pod ip的? 并且,咱们生产k8s应用calico来作为cni插件,采纳 Peered with TOR (Top of Rack) routers形式部署,每一个worker node和其置顶交换机建设bgp peer配对,置顶替换机会持续和下层外围交换机建设bgp peer配对,这样能够保障pod ip在公司内网能够间接被拜访。 然而,traffic packet晓得了pod ip,又是怎么跳到pod的呢? 以上问题能够归并为一个问题:数据包是怎么一步步跳转到pod的?很长时间以来,始终在思考这些问题。 原理解析实际上答案很简略:拜访业务服务vip:port或者说node_ip:port,当packet达到node_ip所在机器如worker A节点时,会依据iptable rules一步步找到pod ip;找到了pod ip后,因为应用calico bgp部署形式,外围交换机和置顶交换机都有该pod ip所在的ip段的路由,packet最初会跳转到某一个worker节点比方worker B,而worker B上有calico早就写好的路由规定route和虚构网卡virtual interface,再依据veth pair从而由host network namespace跳转到pod network namespace,从而跳转到对应的pod。 首先能够本地部署个k8s集群模仿测试下,这里应用 install minikube with calico : minikube start --network-plugin=cni --cni=calico# 或者minikube start --network-plugin=cnikubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml而后部署个业务pod,这里应用nginx为例,正本数为2,并创立ClusterIP Service with ExternalIPs和NodePort Service: ---apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-demo-1 labels: app: nginx-demo-1spec: replicas: 2 template: metadata: name: nginx-demo-1 labels: app: nginx-demo-1 spec: containers: - name: nginx-demo-1 image: nginx:1.17.8 imagePullPolicy: IfNotPresent livenessProbe: httpGet: port: 80 path: /index.html failureThreshold: 10 initialDelaySeconds: 10 periodSeconds: 10 restartPolicy: Always selector: matchLabels: app: nginx-demo-1---apiVersion: v1kind: Servicemetadata: name: nginx-demo-1spec: selector: app: nginx-demo-1 ports: - port: 8088 targetPort: 80 protocol: TCP type: ClusterIP externalIPs: - 192.168.64.57 # 这里worker节点ip能够通过 minikube ip 查看,这里填写你本人的worker节点ip地址---apiVersion: v1kind: Servicemetadata: name: nginx-demo-2spec: selector: app: nginx-demo-1 ports: - port: 8089 targetPort: 80 type: NodePort---部署实现后,就能够通过 ExternalIP ClusterIP Service或者NodePort Service两种形式拜访业务服务: ...

January 4, 2021 · 2 min · jiezi

关于kubernetes:简单4步利用Prometheus-Operator实现自定义指标监控

本文来自Rancher Labs在过来的文章中,咱们花了相当大的篇幅来聊对于监控的话题。这是因为当你正在治理Kubernetes集群时,所有都会以极快的速度发生变化。因而有一个工具来监控集群的衰弱状态和资源指标极为重要。 在Rancher 2.5中,咱们引入了基于Prometheus Operator的新版监控,它能够提供Prometheus以及相干监控组件的原生Kubernetes部署和治理。Prometheus Operator能够让你监控集群节点、Kubernetes组件和应用程序工作负载的状态和过程。同时,它还可能通过Prometheus收集的指标来定义告警并且创立自定义仪表盘,通过Grafana能够轻松地可视化收集到的指标。你能够拜访下列链接获取更多对于新版监控组件的细节: https://rancher.com/docs/ranc... 新版本的监控也采纳prometheus-adapter,开发人员能够利用其基于自定义指标和HPA扩大他们的工作负载。 在本文中,咱们将摸索如何利用Prometheus Operator来抓取自定义指标并利用这些指标进行高级工作负载治理。 装置Prometheus在Rancher 2.5中装置Prometheus极为简略。仅需拜访Cluster Explorer -> Apps并装置rancher-monitoring即可。 你须要理解以下默认设置: prometheus-adapter将会作为chart装置的一部分启用ServiceMonitorNamespaceSelector 留为空,容许 Prometheus 在所有命名空间中收集 ServiceMonitors 装置实现后,咱们能够从Cluster Explorer拜访监控组件。 部署工作负载当初让咱们部署一个从应用层裸露自定义指标的示例工作负载。该工作负载裸露了一个简略的应用程序,该应用程序曾经应用Prometheus client_golang库进行了检测,并在/metric端点上提供了一些自定义指标。 它有两个指标: http_requests_totalhttp_request_duration_seconds以下manifest部署了工作负载、相干服务以及拜访该工作负载的ingress: apiVersion: apps/v1kind: Deploymentmetadata: labels: app.kubernetes.io/name: prometheus-example-app name: prometheus-example-appspec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: prometheus-example-app template: metadata: labels: app.kubernetes.io/name: prometheus-example-app spec: containers: - name: prometheus-example-app image: gmehta3/demo-app:metrics ports: - name: web containerPort: 8080---apiVersion: v1kind: Servicemetadata: name: prometheus-example-app labels: app.kubernetes.io/name: prometheus-example-appspec: selector: app.kubernetes.io/name: prometheus-example-app ports: - protocol: TCP port: 8080 targetPort: 8080 name: web---apiVersion: networking.k8s.io/v1beta1kind: Ingressmetadata: name: prometheus-example-appspec: rules: - host: hpa.demo http: paths: - path: / backend: serviceName: prometheus-example-app servicePort: 8080部署ServiceMonitorServiceMonitor是一个自定义资源定义(CRD),能够让咱们申明性地定义如何监控一组动静服务。 ...

January 4, 2021 · 3 min · jiezi

关于kubernetes:简单4步利用Prometheus-Operator实现自定义指标监控

本文来自Rancher Labs在过来的文章中,咱们花了相当大的篇幅来聊对于监控的话题。这是因为当你正在治理Kubernetes集群时,所有都会以极快的速度发生变化。因而有一个工具来监控集群的衰弱状态和资源指标极为重要。 在Rancher 2.5中,咱们引入了基于Prometheus Operator的新版监控,它能够提供Prometheus以及相干监控组件的原生Kubernetes部署和治理。Prometheus Operator能够让你监控集群节点、Kubernetes组件和应用程序工作负载的状态和过程。同时,它还可能通过Prometheus收集的指标来定义告警并且创立自定义仪表盘,通过Grafana能够轻松地可视化收集到的指标。你能够拜访下列链接获取更多对于新版监控组件的细节: https://rancher.com/docs/ranc... 新版本的监控也采纳prometheus-adapter,开发人员能够利用其基于自定义指标和HPA扩大他们的工作负载。 在本文中,咱们将摸索如何利用Prometheus Operator来抓取自定义指标并利用这些指标进行高级工作负载治理。 装置Prometheus在Rancher 2.5中装置Prometheus极为简略。仅需拜访Cluster Explorer -> Apps并装置rancher-monitoring即可。 你须要理解以下默认设置: prometheus-adapter将会作为chart装置的一部分启用ServiceMonitorNamespaceSelector 留为空,容许 Prometheus 在所有命名空间中收集 ServiceMonitors 装置实现后,咱们能够从Cluster Explorer拜访监控组件。 部署工作负载当初让咱们部署一个从应用层裸露自定义指标的示例工作负载。该工作负载裸露了一个简略的应用程序,该应用程序曾经应用Prometheus client_golang库进行了检测,并在/metric端点上提供了一些自定义指标。 它有两个指标: http_requests_totalhttp_request_duration_seconds以下manifest部署了工作负载、相干服务以及拜访该工作负载的ingress: apiVersion: apps/v1kind: Deploymentmetadata: labels: app.kubernetes.io/name: prometheus-example-app name: prometheus-example-appspec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: prometheus-example-app template: metadata: labels: app.kubernetes.io/name: prometheus-example-app spec: containers: - name: prometheus-example-app image: gmehta3/demo-app:metrics ports: - name: web containerPort: 8080---apiVersion: v1kind: Servicemetadata: name: prometheus-example-app labels: app.kubernetes.io/name: prometheus-example-appspec: selector: app.kubernetes.io/name: prometheus-example-app ports: - protocol: TCP port: 8080 targetPort: 8080 name: web---apiVersion: networking.k8s.io/v1beta1kind: Ingressmetadata: name: prometheus-example-appspec: rules: - host: hpa.demo http: paths: - path: / backend: serviceName: prometheus-example-app servicePort: 8080部署ServiceMonitorServiceMonitor是一个自定义资源定义(CRD),能够让咱们申明性地定义如何监控一组动静服务。 ...

January 4, 2021 · 3 min · jiezi

关于kubernetes:PromtheusGrafana监控告警

服务器监控,整顿分2局部,一部分是退出kubernetes,另外一部分未退出的。选用Promtheus如何来监控一.kubernetes监控1.增加一个namespacekubectl create namespace monitor2.prometheus部署prometheus-rbac.yaml apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: labels: app.kubernetes.io/name: prometheus name: prometheus namespace: monitorrules:- apiGroups: - "" resources: - nodes - nodes/proxy - pods - services - endpoints verbs: - get - list - watch- apiGroups: - extensions resources: - ingresses verbs: - get - list - watch- nonResourceURLs: - "/metrics" verbs: - get---apiVersion: v1kind: ServiceAccountmetadata: name: prometheus namespace: monitor---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: prometheusroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: prometheussubjects:- kind: ServiceAccount name: prometheus namespace: monitorprometheus-config-kubernetes.yaml ...

December 28, 2020 · 9 min · jiezi

关于kubernetes:Kubernetes学习笔记之LRU算法源码解析

Overview本文章基于k8s release-1.17分支代码。 之前一篇文章学习 Kubernetes学习笔记之ServiceAccount TokensController源码解析 ,次要学习ServiceAccount无关常识,发现其中应用了LRU Cache,代码在 L106 。k8s本人封装了一个LRU cache的对象 MutationCache ,正好趁此机会温习下 LRU 算法常识。 LRU算法个别也是面试必考算法题,算法内容也很简略很直观,次要是通过在固定容量空间内,不常被拜访被认为旧数据能够先删除,最近被拜访的数据能够认为前面被拜访概率很大,作为最新的数据。比方,漫画:什么是LRU算法? 这幅漫画形容的那样,在容量无限状况下,能够删除那些最老的用户数据,留下最新的用户数据。这样就感觉数据依照顺叙排列似的,最后面的是最新的,最开端的是最旧的数据。 数据存储能够通过双向链表存储,而不是单向链表,因为当晓得链表的一个元素element时,能够通过element.prev和element.next指针就能晓得以后元素的前驱元素和后驱元素,删除和增加操作算法复杂度都是O(1),而单向链表无奈做到这一点。 另外一个问题是如何晓得O(1)的查问到一个元素element的值,这能够通过哈希表即 map[key]*element 构造晓得,只有晓得key,就立即O(1)晓得element,再联合双向链表的O(1)删除和O(1)增加操作。 通过组合双向链表和哈希表组成的一个lru数据结构,就能够实现删除旧数据、读取新数据和插入新数据算法复杂度都是O(1),这就很厉害很高效的算法了。 设计编写LRU算法代码首先是设计出一个双向链表list,能够间接应用golang自带的双向链表,代码在 /usr/local/go/src/container/list/list.go ,本文这里参考源码写一个并学习之。 首先设计双向链表的构造,Element对象是链表中的节点元素。这里最要害设计是list的占位元素root,是个值为空的元素,其root.next是链表的第一个元素head,其root.prev是链表的最初一个元素tail,这个设计是间接O(1)晓得链表的首位元素,这样链表list就形成了一个链表环ring: // 算法设计:应用哈希表+双向链表实现type Element struct { prev, next *Element Value interface{}}// root这个设计很奇妙,连着双向链表的head和tail,能够看Front()和Back()函数// 获取双向链表的第一个和最初一个元素。root相似一个占位元素type list struct { root Element len int}// root是一个empty Element,作为补位元素使得list为一个ring// list.root.next 是双向链表的第一个元素;list.root.prev 是双向链表的最初一个元素func (l *list) Init() *list { l.root.prev = &l.root l.root.next = &l.root l.len = 0 return l}func (l *list) Len() int { return l.len}而后就是双向链表的新退出一个元素并置于最后面、挪动某个元素置于最后面、从链表中删除某个元素这三个重要办法。新退出一个元素并置于最后面办法,比较简单: ...

December 28, 2020 · 4 min · jiezi

关于kubernetes:Kubernetes学习笔记之ServiceAccount-TokensController源码解析

Overview本文章基于k8s release-1.17分支代码,代码位于pkg/controller/serviceaccount目录,代码:tokens_controller.go 。 在 Kubernetes学习笔记之ServiceAccount AdmissionController源码解析 文章中,晓得一个ServiceAccount对象都会援用一个type="kubernetes.io/service-account-token" 的secret对象,这个secret对象内的 ca.crt 、 namespace 和 token 数据会被挂载到pod内的每一个容器,供调用api-server时认证受权应用。 当创立一个ServiceAccount对象时,援用的 type="kubernetes.io/service-account-token" 的secret对象会主动创立。比方: kubectl create sa test-sa1 -o yamlkubectl get sa test-sa1 -o yamlkubectl get secret test-sa1-token-jg6lm -o yaml 问题是,这是怎么做到的呢? 源码解析TokensController实例化实际上这是由kube-controller-manager的TokenController实现的,kube-controller-manager过程的启动参数有 --root-ca-file 和 --service-account-private-key-file ,其中, --root-ca-file 就是上图中的 ca.crt 数据, --service-account-private-key-file 是用来签名上图中的jwt token数据,即 token 字段值。 当kube-controller-manager过程在启动时,会首先实例化TokensController,并传递实例化所需相干参数。其中,从启动参数中读取ca根证书和私钥文件内容,并且应用 serviceaccount.JWTTokenGenerator() 函数生成jwt token,代码在 L546-L592 : func (c serviceAccountTokenControllerStarter) startServiceAccountTokenController(ctx ControllerContext) (http.Handler, bool, error) { // ... // 读取--service-account-private-key-file私钥文件 privateKey, err := keyutil.PrivateKeyFromFile(ctx.ComponentConfig.SAController.ServiceAccountKeyFile) if err != nil { return nil, true, fmt.Errorf("error reading key for service account token controller: %v", err) } // 读取--root-ca-file的值作为ca,没有传则应用kubeconfig文件内的ca值 var rootCA []byte if ctx.ComponentConfig.SAController.RootCAFile != "" { if rootCA, err = readCA(ctx.ComponentConfig.SAController.RootCAFile); err != nil { return nil, true, fmt.Errorf("error parsing root-ca-file at %s: %v", ctx.ComponentConfig.SAController.RootCAFile, err) } } else { rootCA = c.rootClientBuilder.ConfigOrDie("tokens-controller").CAData } // 应用tokenGenerator来生成jwt token,并且应用--service-account-private-key-file私钥来签名jwt token tokenGenerator, err := serviceaccount.JWTTokenGenerator(serviceaccount.LegacyIssuer, privateKey) //... // 实例化TokensController controller, err := serviceaccountcontroller.NewTokensController( ctx.InformerFactory.Core().V1().ServiceAccounts(), // ServiceAccount informer ctx.InformerFactory.Core().V1().Secrets(), // Secret informer c.rootClientBuilder.ClientOrDie("tokens-controller"), serviceaccountcontroller.TokensControllerOptions{ TokenGenerator: tokenGenerator, RootCA: rootCA, }, ) // ... // 生产队列数据 go controller.Run(int(ctx.ComponentConfig.SAController.ConcurrentSATokenSyncs), ctx.Stop) // 启动ServiceAccount informer和Secret informer ctx.InformerFactory.Start(ctx.Stop) return nil, true, nil}TokensController实例化时,会去监听ServiceAccount和 kubernetes.io/service-account-token 类型的Secret对象,并设置监听器: ...

December 28, 2020 · 5 min · jiezi

关于kubernetes:Kubernetes学习笔记之ServiceAccount-AdmissionController源码解析

Overview本文章基于k8s release-1.17分支代码,代码位于 plugin/pkg/admission/serviceaccount 目录,代码:admission.go 。 api-server作为罕用的服务端利用,蕴含认证模块Authentication、受权模块Authorization和准入模块Admission Plugin(能够了解为申请中间件模块middleware pipeline),以及存储依赖Etcd。其中,针对准入插件,在api-server过程启动时,启动参数 --enable-admission-plugins 须要蕴含 ServiceAccount 准入控制器来开启该中间件,能够见官网文档:enable-admission-plugins 。ServiceAccount Admission Plugin次要作用蕴含: 如果提交的pod yaml里没有指定spec.serviceAccountName字段值,该插件会增加默认的 default ServiceAccount;判断spec.serviceAccountName指定的service account是否存在,不存在就拒绝请求;为该pod创立个volume,且该volume source是SecretVolumeSource,该secret来自于service account对象援用的secret;如果提交的pod yaml里没有指定spec.ImagePullSecrets字段值,那就将service account对象援用的ImagePullSecrets字段值来补位,并且该volume会被mount到pod的 /var/run/secrets/kubernetes.io/serviceaccount 目录中;比方,往api-server过程提交个pod对象: echo > pod.yaml <<EOFapiVersion: v1kind: Podmetadata: name: serviceaccount-admission-plugin labels: app: serviceaccount-admission-pluginspec: containers: - name: serviceaccount-admission-plugin image: nginx:1.17.8 imagePullPolicy: IfNotPresent ports: - containerPort: 80 name: "http-server"EOFkubectl apply -f ./pod.yamlkubectl get pod/serviceaccount-admission-plugin -o yamlkubectl get sa default -o yaml就会看到该pod对象被ServiceAccount Admission Plugin解决后,spec.serviceAccountName指定了 default ServiceAccount;减少了个SecretVolumeSource的Volume,volume name为ServiceAccount的secrets的name值,mount到pod的 /var/run/secrets/kubernetes.io/serviceaccount目录中;以及因为pod和default service account都没有指定ImagePullSecrets值,pod的spec.ImagePullSecrets没有值: ...

December 28, 2020 · 2 min · jiezi

关于kubernetes:Kubernetes学习笔记之Calico-Startup源码解析

Overview咱们目前生产k8s和calico应用ansible二进制部署在公有机房,没有应用官网的calico/node容器部署,并且因为没有应用network policy只部署了confd/bird过程服务,没有部署felix。采纳BGP(Border Gateway Protocol)形式来部署网络,并且采纳 Peered with TOR (Top of Rack) routers 形式部署,每一个worker node和其置顶交换机建设bgp peer配对,置顶替换机会持续和下层外围交换机建设bgp peer配对,这样能够保障pod ip在公司内网能够间接被拜访。 BGP: 次要是网络之间散发动静路由的一个协定,应用TCP协定传输数据。比方,交换机A下连着12台worker node,能够在每一台worker node上装置一个BGP Client,如Bird或GoBGP程序,这样每一台worker node会把本人的路由分发给交换机A,交换机A会做路由聚合,以及持续向上一层外围交换机转发。交换机A上的路由是Node级别,而不是Pod级别的。平时在保护k8s云平台时,有时发现一台worker节点上的所有pod ip在集群外没法拜访,通过排查发现是该worker节点有两张内网网卡eth0和eth1,eth0 IP地址和交换机建设BGP连贯,并获取其as number号,然而bird启动配置文件bird.cfg里应用的eth1网卡IP地址。并且发现calico里的 Node 数据的IP地址ipv4Address和 BGPPeer 数据的交换机地址peerIP也对不上。能够通过如下命令获取calico数据: calicoctl get node ${nodeName} -o yamlcalicoctl get bgppeer ${peerName} -o yaml一番抓头挠腮后,找到根本原因是咱们的ansible部署时,在调用网络API获取交换机的bgp peer的as number和peer ip数据时,应用的是eth0地址,并且通过ansible工作calicoctl apply -f bgp_peer.yaml 写入 Node-specific BGP Peer数据,写入calico BGP Peer数据里应用的是eth0交换机地址。然而ansible工作跑到配置bird.cfg配置文件时,环境变量IP应用的是eth1 interface,写入calico Node数据应用的是eth1网卡地址,而后被confd过程读取Node数据生成bird.cfg文件时,应用的就会是eth1网卡地址。这里应该是应用eth0才对。 找到问题起因后,就欢快的解决了。 然而,又忽然想晓得,calico是怎么写入Node数据的?代码原来在calico启动代码 startup.go 这里。官网提供的calico/node容器里,会启动bird/confd/felix等多个过程,并且应用runsvdir(相似supervisor)来治理多个过程。容器启动时,也会进行运行初始化脚本,配置在这里 L11-L13 : # Run the startup initialisation script.# These ensure the node is correctly configured to run.calico-node -startup || exit 1所以,能够看下初始化脚本做了什么工作。 ...

December 27, 2020 · 5 min · jiezi

关于kubernetes:Kubernetes-119-国内镜像源部署部署前后端服务以及-Gitlab的helm部署

本篇博客将具体介绍如何在云服务器上搭建 Kubernetes 1.19 集群,以及在咱们部署好的集群上应用 Helm 部署 gitlab和 minio 服务。 部署环境两台云服务器 配置为: 4 核 8GB 内存2 核 4GB 内存操作系统:ubuntu 18.04目录搭建 Kubernetes 1.19 集群应用 helm 部署 gitlab 与 minio1. 搭建 Kubernetes 1.19 集群我的master节点设定为4核8gb的机器,这里称其为master,另一台机称为worker。 Step 1: 进入root用户的身份(master)su输出root的明码即可。 Step 2: 装置docker(master和worker都要操作)对于 docker 的装置倡议参考官网文档. 这里给出疾速装置的脚本: curl -fsSL https://get.docker.com | sudo sh -s -- --mirror Aliyunsudo usermod -aG docker $USERsudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{ "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "registry-mirrors": ["https://t9ab0rkd.mirror.aliyuncs.com"]}EOFsudo systemctl daemon-reloadsudo systemctl restart dockerStep3: 装置 Kubernetes 三件套: kubelet kubeadm kubectl(仅在master)# 增加并信赖APT证书curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -# 增加源地址add-apt-repository "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"# 更新源并装置最新版 kubenetessudo apt update && apt install -y kubelet kubeadm kubectl# 增加 completion,最好放入 .bashrc 中source <(kubectl completion bash)source <(kubeadm completion bash)Step4: 敞开 swap(master和worker都要操作)这里因为腾讯云主机是默认敞开 swap 的,如果是其余主机,则执行以下操作并重启机器: ...

December 20, 2020 · 3 min · jiezi

关于kubernetes:Kubernetes弃用Docker后怎么办

本文转自Rancher Labs近期,Kubernetes在其最新的Changelog中发表,自Kubernetes 1.20之后将弃用Docker作为容器运行时。这一音讯在云原生畛域激发了不小的水花,在Rancher技术社区里许多小伙伴也对此进行了强烈的探讨。 Kubernetes为什么抉择弃用Docker呢?咱们须要先简略理解Dockershim。它是一个桥接服务,帮忙Kubernetes与Docker进行通信,Kubelet 之前应用 dockershim 实现对 Docker 的 CRI 反对(Docker自身目前尚未实现CRI)。但时至今日,保护Dockershim已成为运维/开发人员的沉重负担。因而Kubernetes社区倡议大家思考应用蕴含 CRI 残缺实现(兼容 v1alpha1 或 v1)的可用容器运行时。从而勾销了对Docker作为容器运行时的反对。 不过大家不用过分放心,近期从Rancher社区外面收集了一些大家比拟关注的问题,上面一一为大家解答: 1、Kubernetes Kubelet 弃用了Docker作为容器运行时,有代替计划吗? 在Kubernetes集群中,容器运行时负责提取和运行容器镜像。Docker只是被广泛应用的容器运行时,在Docker被弃用之后,咱们还有两个常见的选项:containerd 和 CRI-O。 Containerd 是一个工业级规范的容器运行时,它极为简略、强壮并且具备可移植性。Containerd 能够在宿主机中治理残缺的容器生命周期。这是一个100%开源的软件,已于去年2月份从CNCF毕业。 去年年初,Rancher推出的轻量级Kubernetes发行版K3s曾经应用containerd作为默认容器运行时。 containerd:https://github.com/containerd... CRI-O是由Red Hat推出的一款容器运行时,旨在提供一种在OCI统一的运行时和Kubelet之间的集成形式。在文章后半局部咱们将会进一步比照containerd和CRI-O的性能,为您在抉择容器运行时的时候提供参考。 CRI-O:https://github.com/cri-o/cri-o 2、我依然能够在Kubernetes 1.20中应用Docker吗? 是的,如果应用Docker作为运行时,在1.20中只会在Kubelet启动时打印一个正告日志。Kubernetes最早将在2021年末公布1.23版本中将dockershim移除。 3、我现有的Docker镜像依然能够应用吗? 依然能够应用。Docker生成的镜像实际上并不是特定于Docker的镜像,而是OCI(Open Container Initiative)镜像。无论你应用什么工具构建镜像,任何合乎OCI规范的镜像在Kubernetes看来都是一样的。containerd和CRI-O都可能提取这些镜像并运行它们。所以您能够依然应用Docker来构建容器镜像,并且能够持续在containerd和CRI-O上应用。 4、我应该应用哪个CRI实现? 这是一个比较复杂的问题,它取决于许多因素。如果您之前纯熟应用Docker,那么迁徙到containerd应该是一个绝对容易的抉择,并且containerd具备更好的性能和更低的老本。当然,您也能够摸索CNCF畛域中的其余我的项目,来抉择更适宜您的环境。 起源:https://kubernetes.io/blog/20... eBay对containerd和CRI-O进行了一组性能测试,包含创立、启动、进行和删除容器,以比拟它们所耗的工夫。如图所示,containerd在各个方面都体现良好,除了启动容器这项。从总用时来看,containerd的用时比cri-o要短。 以下数据来自eBay的分享: containerd和cri-o的性能比拟 containerd和cri-o的综合比拟 Rancher,阿里云,AWS, Google,IBM和Microsoft作为初始成员,独特建设 containerd 社区。2017年3月,Docker 将 containerd 募捐给CNCF(云原生计算基金会)。containerd失去了疾速的倒退和宽泛的反对。Docker引擎曾经将containerd作为容器生命周期治理的根底,Kubernetes也在2018年5月,正式反对containerd作为容器运行时管理器。2019年2月,CNCF发表containerd毕业,成为生产可用的我的项目,更加稳固。 5、Rancher 对 Containerd 的反对 Rancher 在轻量级Kubernetes发行版 K3s和 RKE2(2020年10月推出)中早已将 containerd 作为默认的容器运行时。置信在 Rancher 2.x 反对 Kubernetes 1.20+ 之后会将这些贵重教训使用到新版本的Rancher 2.x 迭代中。 ...

December 17, 2020 · 1 min · jiezi

关于kubernetes:Kubernetes-常见问题总结

如何删除不统一状态下的 rc,deployment,service在某些状况下,常常发现 kubectl 过程挂起景象,而后在 get 时候发现删了一半,而另外的删除不了 [root@k8s-master ~]# kubectl get -f fluentd-elasticsearch/NAME DESIRED CURRENT READY AGErc/elasticsearch-logging-v1 0 2 2 15hNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEdeploy/kibana-logging 0 1 1 1 15hError from server (NotFound): services "elasticsearch-logging" not foundError from server (NotFound): daemonsets.extensions "fluentd-es-v1.22" not foundError from server (NotFound): services "kibana-logging" not found删除这些 deployment,service 或者 rc 命令如下: kubectl delete deployment kibana-logging -n kube-system --cascade=falsekubectl delete deployment kibana-logging -n kube-system  --ignore-not-founddelete rc elasticsearch-logging-v1 -n kube-system --force now --grace-period=01|2删除不了后如何重置etcd删除不了后如何重置 etcdrm -rf /var/lib/etcd/*删除后从新 reboot master 结点。 reset etcd 后须要从新设置网络 etcdctl mk /atomic.io/network/config '{ "Network": "192.168.0.0/16" }'启动 apiserver 失败每次启动都是报如下问题: start request repeated too quickly for kube-apiserver.service但其实不是启动频率问题,须要查看, /var/log/messages,在我的状况中是因为开启    ServiceAccount 后找不到 ca.crt 等文件,导致启动出错。 May 21 07:56:41 k8s-master kube-apiserver: Flag --port has been deprecated, see --insecure-port instead.May 21 07:56:41 k8s-master kube-apiserver: F0521 07:56:41.692480 4299 universal_validation.go:104] Validate server run options failed: unable to load client CA file: open /var/run/kubernetes/ca.crt: no such file or directoryMay 21 07:56:41 k8s-master systemd: kube-apiserver.service: main process exited, code=exited, status=255/n/aMay 21 07:56:41 k8s-master systemd: Failed to start Kubernetes API Server.May 21 07:56:41 k8s-master systemd: Unit kube-apiserver.service entered failed state.May 21 07:56:41 k8s-master systemd: kube-apiserver.service failed.May 21 07:56:41 k8s-master systemd: kube-apiserver.service holdoff time over, scheduling restart.May 21 07:56:41 k8s-master systemd: start request repeated too quickly for kube-apiserver.serviceMay 21 07:56:41 k8s-master systemd: Failed to start Kubernetes API Server.在部署 fluentd 等日志组件的时候,很多问题都是因为须要开启 ServiceAccount 选项须要配置平安导致,所以说到底还是须要配置好 ServiceAccount. 呈现 Permission denied 状况在配置 fluentd 时候呈现cannot create /var/log/fluentd.log: Permission denied 谬误,这是因为没有关掉 SElinux 平安导致。 能够在 /etc/selinux/config 中将 SELINUX=enforcing 设置成 disabled,而后 reboot基于 ServiceAccount 的配置首先生成各种须要的 keys,k8s-master 需替换成 master 的主机名. openssl genrsa -out ca.key 2048openssl req -x509 -new -nodes -key ca.key -subj "/CN=k8s-master" -days 10000 -out ca.crtopenssl genrsa -out server.key 2048echo subjectAltName=IP:10.254.0.1 > extfile.cnf#ip由下述命令决定#kubectl get services --all-namespaces |grep 'default'|grep 'kubernetes'|grep '443'|awk '{print $3}'openssl req -new -key server.key -subj "/CN=k8s-master" -out server.csropenssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out server.crt -days 10000如果批改 /etc/kubernetes/apiserver 的配置文件参数的话,通过 systemctl start kube-apiserver 启动失败,出错信息为: Validate server run options failed: unable to load client CA file: open /root/keys/ca.crt: permission denied但能够通过命令行启动 API Server ...

December 17, 2020 · 1 min · jiezi

关于kubernetes:Kubernetes-原生-CICD-构建框架-Tekton-详解

作者:FogDong(Tekton 社区)编辑:Bach(才云)什么是流水线?在计算机中,流水线是把一个反复的过程合成为若干个子过程,使每个子过程与其余子过程并行进行的技术,也叫 Pipeline。因为这种 s工作形式与工厂中的生产流水线十分相似, 因而也被称为流水线技术。从实质上讲,流水线技术是一种工夫并行技术。以“构建镜像”过程为例: 在每一次构建镜像中,咱们都须要拉下代码仓库中的代码,进行代码编译,构建镜像,最初推往镜像仓库。在每一次代码更改过后,这一过程都是不变的。应用流水线工具能够极大的晋升这一过程的效率,只须要进行简略的配置便能够轻松的实现重复性的工作。这样的过程也被称之为 CI。 上图流程中应用的是 Jenkins。Jenkins 作为老牌流水线框架被大家所熟知。在云原生时代,Jenkins 也推出了 Jenkins X 作为基于 Kubernetes 的新一代流水线,但明天本文次要介绍诞生于云原生时代的流水线框架——Tekton。 TektonTekton 是一个基于 Kubernetes 的云原生 CI/CD 开源框架,属于 CD 基金会的我的项目之一。Tekton 通过定义 CRD 的形式,让用户以灵便的自定义流水线以满足本身 CI/CD 需要。 基本概念四个基本概念 Tekton 最次要的四个概念为:Task、TaskRun、Pipeline 以及 PipelineRun。 Task: Task 为构建工作,是 Tekton 中不可分割的最小单位,正如同 Pod 在 Kubernetes 中的概念一样。在 Task 中,能够有多个 Step,每个 Step 由一个 Container 来执行。Pipeline: Pipeline 由一个或多个 Task 组成。在 Pipeline 中,用户能够定义这些 Task 的执行程序以及依赖关系来组成 DAG(有向无环图)。PipelineRun: PipelineRun 是 Pipeline 的理论执行产物,当用户定义好 Pipeline 后,能够通过创立 PipelineRun 的形式来执行流水线,并生成一条流水线记录。TaskRun: PipelineRun 被创立进去后,会对应 Pipeline 外面的 Task 创立各自的 TaskRun。一个 TaskRun 管制一个 Pod,Task 中的 Step 对应 Pod 中的 Container。当然,TaskRun 也能够独自被创立。综上可知:Pipeline 由多个 Task 组成,每次执行对应生成一条 PipelineRun,其管制的 TaskRun 将创立理论运行的 Pod。上面以一个简略例子来展现这些概念。 ...

December 11, 2020 · 4 min · jiezi

关于kubernetes:Kubernetes学习笔记kubeadm-手动搭建kubernetes-集群

kubeadm是Kubernetes官网提供的用于疾速装置Kubernetes集群的工具,通过将集群的各个组件进行容器化装置治理,通过kubeadm的形式装置集群比二进制的形式装置要不便不少。 装置参考- https://kubernetes.io/docs/se... 每一个节点主机上包含master节点都要手动装置并运行docker,同时也都要手动装置并运行kubelet。如果将第一个节点初始化为master节点,在执行初始化这个步骤,其实就是通过kubeadm工具将API Server、etcd、controller-manager、scheduler各组件运行为Pod,也就是跑在docker上。而其余node节点,因曾经运行了kubelet、docker组件,剩下的kube-proxy组件也是要运行在Pod上。 kubeadm K8S 组件形成kubectlkubeadmK8s Master kubeletkube-proxykube-apiserverkube-schedulerkube-controller-manageretcdK8s Node kubeletkube-proxycalicocoredns环境筹备 (以ubuntu零碎为例)1. kubernetes集群机器机器IP机器hostnameK8s集群角色机器操作系统172.20.249.16172-20-249-16masterubuntu16.04172.20.249.17172-20-249-17nodeubuntu16.04172.20.249.18172-20-249-18nodeubuntu16.04应用如下命令设置hostname: (非必须)# 172.20.249.16hostnamectl --static set-hostname k8s-master# 172.20.249.17hostnamectl --static set-hostname k8s-node-01# 172.20.249.18hostnamectl --static set-hostname k8s-node-02Kubernetes v1.8+ 要求关闭系统 Swap,请在所有节点利用以下指令敞开 (否则kubelet会出错!) swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab 2. 装置 docker、 kubeadm、kubelet、kubectl2.1 在每台机器上装置 docker# step 1: 装置必要的一些零碎工具sudo apt-get updatesudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common# step 2: 装置GPG证书curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -# Step 3: 写入软件源信息sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"# Step 4: 更新并装置 Docker-CE (可指定版本)sudo apt-get -y updatesudo apt-get -y install docker-cesudo apt-get -y install docker-ce=17.03.0~ce-0~ubuntu-xenial2.2 每台机器上装置 kubelet 、kubeadm 、kubectlkubeadm: the command to bootstrap the cluster.kubectl: the command line util to talk to your clusterkubelet: the component that runs on all of the machines in your cluster and does things like starting pods and containers.apt-get update && apt-get install -y apt-transport-https# 装置 GPG 证书curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -# 写入软件源;留神:咱们用零碎代号为 bionic,但目前阿里云不反对,所以沿用 16.04 的 xenialcat <<EOF >/etc/apt/sources.list.d/kubernetes.listdeb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial mainEOFapt-get updateapt-get install -y kubelet kubeadm kubectl# 指定版本apt-get install -y kubelet=1.18.8-00 kubeadm=1.18.8-00 kubectl=1.18.8-00 ...

December 11, 2020 · 3 min · jiezi

关于kubernetes:Kubernetes-v120-重磅发布-新版本核心主题-主要变化解读

作者:Bach(才云)、bot(才云)技术校对:星空下的文仔(才云) 美国工夫 12 月 8 日,Kubernetes v1.20 正式公布,这是 2020 年的第三个新版本,也是最初一个版本。该版本蕴含 42 个加强性能:其中 11 个加强性能趋于稳定,15 个进入 Beta,16 个进入 Alpha。 之前扩大公布周期后,v1.20 公布周期复原到失常的 11 周。这是近来性能最密集的版本之一:Kubernetes 更新速度仍在放慢。该版本 Alpha 加强性能比稳固的加强性能更多,这表明在云原生生态系统中还有许多值得摸索的空间。 Major Themes新版本次要围绕以下主题: 存储卷快照性能趋于稳定 当初提供了触发存储卷快照性能的规范办法,并容许用户以可移植的形式在 Kubernetes 环境或任何受反对的存储提供程序上合并快照操作。同时,Kubernetes 快照原语可作为根底构建块,能提供 Kubernetes 开发企业级存储管理性能的能力,包含应用程序以及集群备份解决方案。 另外,快照反对须要 Kubernetes 发行厂商捆绑 Snapshot 控制器、Snapshot CRD 和验证 Webhook。反对快照性能的 CSI 驱动程序也要部署在集群上。 Kubectl Debug 进入 Beta kubectl alpha debug 性能在 v1.20 进入 Beta 版,并更名为 kubectl debug。该性能能通过 kubectl 提供常见调试工作流的反对。当初 kubectl 反对的故障排除计划包含: 通过创立应用其余容器镜像的 Pod 正本解决启动时工作负载解体的问题。通过在 Pod 的新正本或长期容器(长期容器是一项默认不启用的 Alpha 性能。)应用调试工具增加新容器来解决 Distroless 容器的故障。通过在主机命名空间中创立能运行并具备拜访主机文件系统权限的容器,对节点进行故障排除。作为新的内置命令,kubectl debug 比任何名字带有 “debug” 的 kubectl 插件优先级都要高,因而必须重命名受影响的插件。在 v1.20 中,不倡议持续应用 kubectl alpha debug。后续发行版中其也被删除,倡议更新脚本应用 kubectl debug。 ...

December 11, 2020 · 2 min · jiezi

关于kubernetes:Kubernetes-弃用-Docker-来龙去脉

作者:Bach(才云)、bot(才云)技术校对:星空下的文仔(才云)弃用 DockerKubernetes 最新版本 Kubernetes v1.20.0-rc.0 现已正式公布。Kubernetes 打算弃用 kubelet 中 Docker Engine 反对,对于 dockershim 的反对也将在下个版本中放弃。[1] 不过不用放心,在目前 Kubernetes v1.20 中,Kubernetes 管理员能够持续应用 Docker 命令与 kubectl 命令治理 Kubernetes 集群,而且镜像应用不会受到任何影响。在将来公布的 Kubernetes 版本中,包含接下来陆续推出的主要版本,对于 dockershim 的反对将最终被移除(最早会在 v1.23 把 Dockershim 从 Kubelet 中移除),届时将无奈应用 Docker 命令查看集群。 Kubernetes 本次弃用的是 dockershim[2],即 Kubernetes kubelet 实现中的组件之一,它可能与 Docker Engine 进行通信。其实 Docker 中曾经蕴含 containerd,Kubernetes 为什么还须要 Dockershim?这是因为 Docker 与 CRI(即容器运行时接口)并不相容。简而言之,Docker 并不反对 CRI(容器运行时接口)这一 Kubernetes 运行时 API,而 Kubernetes 用户始终以来所应用的其实是名为“dockershim”的桥接服务。Dockershim 可能转换 Docker API 与 CRI,但当前,Kubernetes 将不再提供这项桥接服务。 ...

December 11, 2020 · 1 min · jiezi

关于kubernetes:Kubernetes一安装配置与基本组件原理

装置kubernetes集群kubernetes的装置过程极其简单,对Linux运维不相熟的状况下装置kubernetes极为艰难,再加上国内无法访问google服务器,咱们装置k8s就更加艰难 kubeasz我的项目(https://github.com/easzlab/kubeasz)极大的简化了k8s集群的装置过程,使咱们能够离线一键装置k8s集群 筹备第一台虚拟机设置虚拟机cpu 上传离线安装文件将ansible目录上传到/etc/目录下将easzup上传到/root目录下筹备离线装置环境在CentOS7虚拟机中执行上面操作 cd ~/# 下载 kubeasz 的自动化装置脚本文件: easzup,如果曾经上传过此文件,则不用执行这一步export release=2.2.0curl -C- -fLO --retry 3 https://github.com/easzlab/kubeasz/releases/download/${release}/easzup# 对easzup文件设置执行权限chmod +x ./easzup# 下载离线安装文件,并装置配置docker,# 如果离线文件曾经存在则不会反复下载,# 离线安装文件寄存门路: /etc/ansible./easzup -D# 启动kubeasz工具应用的长期容器./easzup -S# 进入该容器docker exec -it kubeasz sh# 上面命令在容器内执行# 配置离线装置cd /etc/ansiblesed -i 's/^INSTALL_SOURCE.*$/INSTALL_SOURCE: "offline"/g' roles/chrony/defaults/main.ymlsed -i 's/^INSTALL_SOURCE.*$/INSTALL_SOURCE: "offline"/g' roles/ex-lb/defaults/main.ymlsed -i 's/^INSTALL_SOURCE.*$/INSTALL_SOURCE: "offline"/g' roles/kube-node/defaults/main.ymlsed -i 's/^INSTALL_SOURCE.*$/INSTALL_SOURCE: "offline"/g' roles/prepare/defaults/main.ymlexit# 装置 python,已装置则疏忽这一步yum install python -y导入镜像为了节省时间,前面课程中应用的docker镜像不必再花工夫从网络下载 将课前材料中 images.gz 中的镜像导入 docker docker load -i images.gz筹备三台服务器 筹备三台服务器,一台master,两台工作节点,他们的ip地址能够用任意的地址,最好设置为固定ip 上面测试中应用的ip为: 192.168.64.191192.168.64.192192.168.64.193从第一台虚拟机克隆两台虚拟机 ...

December 10, 2020 · 17 min · jiezi

关于kubernetes:Kubernetes-Prometheus-Grafana的一个好看的总览看板分享

GitHub链接地址

December 9, 2020 · 1 min · jiezi

关于kubernetes:一键支持kuberntes抛弃docker的渣男行为

# 下载离线资源包$ wget -c https://sealyun.oss-cn-beijing.aliyuncs.com/7b6af025d4884fdd5cd51a674994359c-1.20.0-rc.0/kube1.20.0-rc.0.tar.gz# 装置一个三master的kubernetes集群$ sealos init --passwd '123456' --master 192.168.0.2 --master 192.168.0.3 --master 192.168.0.4 --node 192.168.0.5 --pkg-url /root/kube1.20.0-rc.0.tar.gz --version v1.20.0-rc离线包里齐全摈弃了docker,应用了最新版本的containerd. 正式版本会和kubernetes 1.20.0正式发版时同步收回. dockder万岁集体非常喜爱docker,对于kubernetes的渣男行为不屑一顾,刻骨仇恨,然而在银子背后咱们显然是没太多节操的用containerd替换掉了docker,真香。。。 其实早在1.14版本,sealos就想反对containerd了,咱们认为绕开docker engine会让零碎架构更轻,官网测试性能也稍好,然而一个外围问题,docker被广泛承受,以上那些理由还有余已让用户替换docker,所以咱们也就没替换。 明天kubernetes帮忙咱们做了这个决定,尽管有点痛,然而这个后果是好的,对于有技术洁癖的人来说,适配来适配去十分不爽,大家定好规范,兼容规范就好好玩,不兼容就滚粗,规范这个货色就像两个人在一起相处的底线,你重,你丑,你不欠缺,都能够容纳,然而你不兼容规范就真的没法一起玩。胳膊拧不过大腿,我等也只能无奈追寻大势。 咱们还反对了ARM离线包有太多用户三天两头催咱们出ARM版本的包,只是对咱们来说这是个难堪的市场,用户量少,客单价低,做就是亏,然而咱们小伙伴还是做了! 对自动化的极致谋求也让咱们能够十分不便自动化公布各种版本的ARM包。咱们不晓得就义了多少假期和肝了多少个深夜才把所有货色欠缺好~ 为了能躺着把钱挣了就必须花足够精力在自动化下面。 教你一招技术变现sealyun的出世很有意思,当年守业时注册的域名sealyun.com,直到守业失败也没找到适合的用处,起初工作时发现装置kubernetes挺麻烦,就写了一个破脚本放到了阿里云市场上:没想到,真的有人违心为技术付费,这让我有保持做上来的理由。而且晚期的确受到了十分多用户的鼓励,那个时候真的十分开心:那个时候有几件事历历在目: 每天晚上写代码到12点左右,12点之后就一个用户一个用户的发短信问他们的应用体验,让他们加群。起初有十分多的问题,简直没有哪个用户能一次就装置上,看电影时,买菜时都在反对用户,优化了很多个版本后诞生了sealos,两头经验了shell的版本ansible的版本,最终诞生了golang的这个终极版本。这是第一个客户,各种装不上,反对了一天才搞定 所以我感觉做出好的货色,用户会用钞票投票,当初咱们领有了几千的付费客户,很多企业用于生产环境中如51talk科大讯飞等,阿里外部也fork了sealos一个版本进行深度定制和应用。 你也能够售卖本人的软件包了sealos只是个工具,这种技术人员变现的形式是能够复制的,所以咱们新的sealyun官网上线了:意味着你能够上传一个属于你本人的软件,以雷同的形式售卖,比方你能够上传一个prometheus的离线包。这样sealyun的用户能够间接购买你的软件,收益的60%归软件owner。 拿到token 用咱们工具一键上传你的软件 $ cat test.yamlmarket: body: spec: name: v1.19.0 price: 0.01 # 售卖价格 product: class: cloud_kernel productName: kubernetes url: https://sealyun.oss-cn-beijing.aliyuncs.com/c937a97b72d1665acf25b0b54bdc7131-1.19.0/kube1.19.0.tar.gz status: productVersionStatus: ONLINE kind: productVersion$ marketctl create --token $marketapi -f test.yaml --logger命令行的益处是能够接入到你的CI零碎中,这样每次公布版本主动上传到市场上,无需人为干涉实现躺着变现。 ...

December 6, 2020 · 1 min · jiezi

关于kubernetes:Kubernetes学习笔记使用Minikube快速部署K8S单机学习环境

介绍https://minikube.sigs.k8s.io/...Minikube 用于疾速在本地搭建 Kubernetes 单节点集群环境,它对硬件资源没有太高的要求,不便开发人员学习试用,或者进行日常的开发。 其反对大部分kubernetes的性能,列表如下 DNSNodePortsConfigMaps and SecretsDashboardsContainer Runtime: Docker, and rktEnabling CNI (Container Network Interface)Ingress...Minikube 反对 Windows、macOS、Linux 三种 OS,会依据平台不同,下载对应的虚拟机镜像,并在镜像内装置 k8s。 目前的虚拟机技术都是基于Hypervisor 来实现的,Hypervisor 规定了对立的虚构层接口,由此 Minikube 就能够无缝切换不同的虚拟机实现,如 macOS 能够切换hyperkit 或 VirtualBox, Windows 下能够切换 Hyper-V 或 VirtualBox 等。 虚拟机的切换能够通过 --vm-driver 实现,如minikube start --vm-driver hyperkit/ minikube start --vm-driver hyperv 如果 Minikube 装置在内核原生就反对 LXC 的 OS 内,如 Ubuntu 等,再装置一次虚拟机显然就是对资源的节约了,Minikube 提供了间接对接 OS 底层的形式 driver!=none mode`In this case minikube provisions a new docker-machine (Docker daemon/Docker host) using any supported providers. For instance:a) local provider = your Windows/Mac local host: it frequently uses VirtualBox as a hypervisor, and creates inside it a VM based on boot2docker image (configurable). In this case k8s bootstraper (kubeadm) creates all Kubernetes components inside this isolated VM. In this setup you have usually two docker daemons, your local one for development (if you installed it prior), and one running inside minikube VM.b) cloud hosts - not supported by minikube` ...

December 3, 2020 · 3 min · jiezi

关于kubernetes:KubernetesDocker-for-MacOS

容器(Container) 将程序及其所需的任何内容捆绑在一起,包含依赖项、工具和配置文件等等。这样使得程序不受环境的烦扰,真正意义上做到开发环境和生成环境完全一致。而 Docker 在容器的根底上,进行了进一步的封装,从文件系统、网络互联到过程隔离等等,极大的简化了容器的创立和保护。与传统虚拟机相比,Docker 也有许多长处,如:更高效的系统资源利用和更疾速的启动工夫。 Docker装置1. macOS 咱们能够应用 Homebrew 来装置 Dockerbrew cask install docker从利用中找到 Docker 图标并点击运行,点击 Next,可能会询问你的 macOS 登陆密码,你输出即可。之后会弹出一个 Docker 运行的提醒窗口,状态栏上也有有个小鲸鱼的图标上述步骤 Docker 装置胜利2. 通过命令能够查看装置后的 Docker 版本 ***docker version 查看版本信息 (_Client_和_Server_版本信息)docker info 查看配置信息开始 应用docker,理论利用1. 编写Go业务我的项目*** 2. 我的项目根目录下创立Dockerfile文件,编写 dockerfile内容 3. 构建镜像
docker build -t gdp .
-t: 镜像的名字及标签,通常 name:tag 或者 name 格局;能够在一次构建中为一个镜像设置多个标签。
当你触发docker build 命令时,当前目录就被称为构建上下文(build context)。默认状况下 Dockerfile文件就在这个目录下, 然而能够通过 -f 参数来指定Dockerfile的地位。不论Dockerfile在哪里,当前目录中的所有文件和目录都会作为构建上下文发送到 docker daemon 过程。 4. docker image ls 查看构建生成的镜像*** 5. 运行容器 Docker 容许你在容器内运行应用程序, 应用 docker run命令来在容器内运行一个应用程序。 docker run 命令 docker run -p 8080:8080 gdp-p:指定端口映射,将容器端口映射到服务器上; -p 对外裸露的端口:容器端口为了了解 docker run的各个参数意思,再举一个例子: ...

December 3, 2020 · 1 min · jiezi

关于kubernetes:超稳攻略Rancher-23手动轮换证书保护集群安全

本文转自Rancher Labs 前 言Rancher 2.3正式公布曾经一年,第一批应用Rancher 2.3的用户可能会遇到Rancher Server证书过期,然而没有主动轮换的状况。这会导致Rancher Server无奈启动,并且日志呈现报错: 请留神: Rancher Server无奈启动不会影响上游集群,上游集群仍然能够通过kubeconfig去操作。 请留神:Rancher Server无奈启动不会影响上游集群,上游集群仍然能够通过kubeconfig去操作。 以上状况只会在docker run启动或应用小于k3s v1.19用作local集群的Rancher上才会产生。以上状况只会在docker run启动或应用小于k3s v1.19用作local集群的Rancher上才会产生。 重现问题为了让大家更好的了解这个问题,上面将以手动批改零碎工夫的模式来重现这个问题。 以后工夫:2020年10月30日 星期五 10时37分59秒 CST 1、启动Rancher v2.3.1,并且增加上游集群,操作步骤能够参考官网: https://docs.rancher.cn/docs/...https://docs.rancher.cn/docs/...2、启动Rancher 之后,从浏览器上查看到的过期工夫:2021年10月30日 星期六 中国规范工夫 10:29:35 3、查看Rancher Server容器内的K3s证书过期工夫为 Oct 30 02:28:49 2021 GMT root@rancher1:~# docker exec -it rancher_server_id bashroot@25c228f6a4c8:/var/lib/rancher# for i in `ls /var/lib/rancher/k3s/server/tls/*.crt`; do echo $i; openssl x509 -enddate -noout -in $i; done/var/lib/rancher/k3s/server/tls/client-admin.crtnotAfter=Oct 30 02:28:49 2021 GMT/var/lib/rancher/k3s/server/tls/client-auth-proxy.crtnotAfter=Oct 30 02:28:49 2021 GMT/var/lib/rancher/k3s/server/tls/client-ca.crtnotAfter=Oct 28 02:28:49 2030 GMT/var/lib/rancher/k3s/server/tls/client-controller.crtnotAfter=Oct 30 02:28:49 2021 GMT/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crtnotAfter=Oct 30 02:28:49 2021 GMT/var/lib/rancher/k3s/server/tls/client-kube-proxy.crtnotAfter=Oct 30 02:28:49 2021 GMT/var/lib/rancher/k3s/server/tls/client-scheduler.crtnotAfter=Oct 30 02:28:49 2021 GMT/var/lib/rancher/k3s/server/tls/request-header-ca.crtnotAfter=Oct 28 02:28:49 2030 GMT/var/lib/rancher/k3s/server/tls/server-ca.crtnotAfter=Oct 28 02:28:49 2030 GMT/var/lib/rancher/k3s/server/tls/serving-kube-apiserver.crtnotAfter=Oct 30 02:28:49 2021 GMT4、将服务器工夫调整为证书过期后5天的日期,比方:20211105 ...

December 1, 2020 · 2 min · jiezi

关于kubernetes:通过K3S与Github-Action部署一个Hexo博客

最近看上了一个Hexo博客的主题,就打算本人也开一个博客。惊奇的发现 github 上竟然曾经有了 CI 性能(是我火星了)。于是乎,一个通过 GitHub Actions 继续部署博客到 Kubernetes 中的想法就呈现了。通过这种形式,咱们能够实现 0 停机工夫更新 Hexo、弹性扩缩、健康检查和故障转移等等。。。不过其实都没啥意义,一个博客而已,跑在 1c1g 的机器上,没必要引入这种重型工具。 但这架不住我闲得慌,也就有了当初这一篇记录。本文根本是纯记录,对于很多事件不会有太多介绍和解释。 事先筹备一个 Github 账号一个曾经配置好的 hexo 博客。这方面教程太多了,不赘述了一个云主机,配置无所谓肯定的 Linux 操作常识经得住折腾部署Kubernetes?还是K3s吧最初我还是没有应用 Kubernetes,而是转为应用了K3s。起因很简略,Kubernetes 他切实是太大了,光是一个 Etcd 就够我这个可怜的 1c1g 主机喝一壶了。尽管 K8s(Kubernetes)可能是不能用了,但咱们还有 K3s 啊。 啥是K3sK3s是 Rancher Lab 在 18 年 7 月发行的一个基于 K8s 的容器编排工具。尽管在应用上和 K8s 简直截然不同,然而为了缩小资源的应用,k3s 删除了很多云服务相干的插件( Cloud Provider)和存储插件。同时,k3s 应用 sqlite 作为默认的数据库,这能够进一步缩小 k3s 的资源使用率,对于单机部署来说天然是极好的。当然,k3s 也反对配置 etcd 以及其余数据库,如 mysql、postgresql。 就在这几天(2020 年 1 月 13 号),k3s 正式 release 了 1.0 版本。这意味着 K3S 曾经能够失常的应用了。所以我也是第一工夫的在本人的云主机上部署了一套来玩。不过值得一提的是,k3s 中的容器并非是应用 docker 来运行的,而是应用了containderd,这个工具通过crictl交互,子命令和 docker 都差不多。如果想要应用 docker 作为 container runtime,须要在启动参数中指定。 ...

December 1, 2020 · 3 min · jiezi

关于kubernetes:基于Kubernetes和OpenKruise的可变基础设施实践

本文来自OPPO互联网根底技术团队,转载请注名作者。同时欢送关注咱们的公众号:OPPO_tech,与你分享OPPO前沿互联网技术及流动。1. 对于可变基础设施的思考1.1 kubernetes中的可变与不可变基础设施在云原生逐步流行的当初,不可变基础设施的理念曾经逐步深入人心。不可变基础设施最早是由Chad Fowler于2013年提出的,其核心思想为任何基础设施的实例一旦创立之后变成为只读状态,如须要批改和降级,则应用新的实例进行替换。这一理念的领导下,实现了运行实例的统一,因而在晋升公布效率、弹性伸缩、降级回滚方面体现出了无可比拟的劣势。 kubernetes是不可变基础设施理念的一个极佳实际平台。Pod作为k8s的最小单元,承当了利用实例这一角色。通过ReplicaSet从而对Pod的正本数进行管制,从而实现Pod的弹性伸缩。而进行更新时,Deployment通过管制两个ReplicaSet的正本数此消彼长,从而进行实例的整体替换,实现降级和回滚操作。 咱们进一步思考,咱们是否须要将Pod作为一个齐全不可变的基础设施实例呢?其实在kubernetes自身,曾经提供了一个替换image的性能,来实现Pod不变的状况下,通过更换image字段,实现Container的替换。这样的劣势在于无需从新创立Pod,即可实现降级,间接的劣势在于免去了从新调度等的工夫,使得容器能够疾速启动。 从这个思路延长开来,那么咱们其实能够将Pod和Container分为两层来看。将Container作为不可变的基础设施,确保利用实例的残缺替换;而将Pod看为可变的基础设施,能够进行动静的扭转,亦即可变层。 1.2 对于降级变动的剖析对于利用的降级变动品种,咱们来进行一下分类探讨,将其分为以下几类: 降级变动类型阐明规格的变动cpu、内存等资源使用量的批改配置的变动环境变量、配置文件等的批改镜像的变动代码批改后镜像更新健康检查的变动readinessProbe、livenessProbe配置的批改其余变动调度域、标签批改等其余批改针对不同的变动类型,咱们做过一次抽样调查统计,能够看到下图的一个统计后果。 在一次降级变动中如果含有多个变动,则统计为屡次。能够看到反对镜像的替换能够笼罩一半左右的的降级变动,然而依然有相当多的状况下导致不得不从新创立Pod。这点来说,不是特地敌对。所以咱们做了一个设计,将对于Pod的变动分为了三种Dynamic,Rebuild,Static三种。 批改类型批改类型阐明批改举例对应变动类型Dynamic 动静批改Pod不变,容器无需重建批改了健康检查端口健康检查的变动Rebuild 原地更新Pod不变,容器须要从新创立更新了镜像、配置文件或者环境变量镜像的变动,配置的变动Static 动态批改Pod须要从新创立批改了容器规格规格的变动这样动静批改和原地更新的形式能够笼罩90%以上的降级变动。在Pod不变的状况下带来的收益也是不言而喻的。 缩小了调度、网络创立等的工夫。因为同一个利用的镜像大部分层都是复用的,大大缩短了镜像拉取的工夫。资源锁定,避免在集群资源紧缺时因为出让资源从新创立进入调度后,导致资源被其余业务抢占而无奈运行。IP不变,对于很多有状态的服务非常敌对。2. Kubernetes与OpenKruise的定制2.1 kubernetes的定制那么如何来实现Dynamic和Rebuild更新呢?这里须要对kubernetes进行一下定制。 动静批改定制liveness和readiness的动静批改反对相对来说较为简单,次要批改点在与prober_manager中减少了UpdatePod函数,用以判断当liveness或者readiness的配置扭转时,进行原先的worker,重新启动新的worker。而后将UpdatePod嵌入到kubelet的HandlePodUpdates的流程中即可。 func (m *manager) UpdatePod(pod *v1.Pod) { m.workerLock.Lock() defer m.workerLock.Unlock() key := probeKey{podUID: pod.UID} for _, c := range pod.Spec.Containers { key.containerName = c.Name { key.probeType = readiness worker, ok := m.workers[key] if ok { if c.ReadinessProbe == nil { //readiness置空了,原worker进行 worker.stop() } else if !reflect.DeepEqual(*worker.spec, *c.ReadinessProbe) { //readiness配置扭转了,原worker进行 worker.stop() } } if c.ReadinessProbe != nil { if !ok || (ok && !reflect.DeepEqual(*worker.spec, *c.ReadinessProbe)) { //readiness配置扭转了,启动新的worker w := newWorker(m, readiness, pod, c) m.workers[key] = w go w.run() } } } { //liveness与readiness类似 ...... } }}原地更新定制kubernetes原生反对了image的批改,对于env和volume的批改是未做反对的。因而咱们对env和volume也反对了批改性能,以便其能够进行环境变量和配置文件的替换。这里利用了一个小技巧,就是咱们在减少了一个ExcludedHash,用于计算Container内,蕴含env,volume在内的各项配置。 ...

November 26, 2020 · 2 min · jiezi

关于kubernetes:Kubernetes-CSI-容器存储接口一结束及原理

本文已收录于Kubernetes笔记容器存储接口(CSI)是用于将任意块和文件存储系统裸露给诸如Kubernetes之类的容器编排零碎(CO)上的容器化工作负载的规范。 应用CSI的第三方存储提供商能够编写和部署在Kubernetes中公开新存储系统的插件,而无需接触外围的Kubernetes代码。 具体来说,Kubernetes针对CSI规定了以下内容: Kubelet到CSI驱动程序的通信 Kubelet通过Unix域套接字间接向CSI驱动程序发动CSI调用(例如NodeStageVolume,NodePublishVolume等),以挂载和卸载卷。Kubelet通过kubelet插件注册机制发现CSI驱动程序(以及用于与CSI驱动程序进行交互的Unix域套接字)。因而,部署在Kubernetes上的所有CSI驱动程序必须在每个受反对的节点上应用kubelet插件注册机制进行注册。Master到CSI驱动程序的通信 Kubernetes master组件不会间接(通过Unix域套接字或其余形式)与CSI驱动程序通信。Kubernetes master组件仅与Kubernetes API交互。因而,须要依赖于Kubernetes API的操作的CSI驱动程序(例如卷创立,卷attach,卷快照等)必须监听Kubernetes API并针对它触发适当的CSI操作(例如上面的一系列的external组件)。组件 CSI实现中的组件分为两局部: 由k8s官网保护的一系列external组件负责注册CSI driver 或监听k8s对象资源,从而发动csi driver调用,比方(node-driver-registrar,external-attacher,external-provisioner,external-resizer,external-snapshotter,livenessprobe)各云厂商or开发者自行开发的组件(须要实现CSI Identity,CSI Controller,CSI Node 接口)RPC接口(开发商实现)Identity Service service Identity { //返回driver的信息,比方名字,版本 rpc GetPluginInfo(GetPluginInfoRequest) returns (GetPluginInfoResponse) {} //返回driver提供的能力,比方是否提供Controller Service,volume 拜访能能力 rpc GetPluginCapabilities(GetPluginCapabilitiesRequest) returns (GetPluginCapabilitiesResponse) {} //探针 rpc Probe (ProbeRequest) returns (ProbeResponse) {}}Controller service service Controller { //创立卷 rpc CreateVolume (CreateVolumeRequest) returns (CreateVolumeResponse) {} //删除卷 rpc DeleteVolume (DeleteVolumeRequest) returns (DeleteVolumeResponse) {} //attach 卷 rpc ControllerPublishVolume (ControllerPublishVolumeRequest) returns (ControllerPublishVolumeResponse) {} //unattach卷 rpc ControllerUnpublishVolume (ControllerUnpublishVolumeRequest) returns (ControllerUnpublishVolumeResponse) {} //返回存储卷的性能点,如是否反对挂载到多个节点上,是否反对多个节点同时读写 rpc ValidateVolumeCapabilities (ValidateVolumeCapabilitiesRequest) returns (ValidateVolumeCapabilitiesResponse) {} //列出所有卷 rpc ListVolumes (ListVolumesRequest) returns (ListVolumesResponse) {} //返回存储资源池的可用空间大小 rpc GetCapacity (GetCapacityRequest) returns (GetCapacityResponse) {} //返回controller插件的性能点,如是否反对GetCapacity接口,是否反对snapshot性能等 rpc ControllerGetCapabilities (ControllerGetCapabilitiesRequest) returns (ControllerGetCapabilitiesResponse) {} //创立快照 rpc CreateSnapshot (CreateSnapshotRequest) returns (CreateSnapshotResponse) {} //删除快照 rpc DeleteSnapshot (DeleteSnapshotRequest) returns (DeleteSnapshotResponse) {} //列出快照 rpc ListSnapshots (ListSnapshotsRequest) returns (ListSnapshotsResponse) {} //扩容 rpc ControllerExpandVolume (ControllerExpandVolumeRequest) returns (ControllerExpandVolumeResponse) {} //取得卷 rpc ControllerGetVolume (ControllerGetVolumeRequest) returns (ControllerGetVolumeResponse) { option (alpha_method) = true; }}Node Service ...

November 23, 2020 · 2 min · jiezi

关于kubernetes:循环获取kubernetes-pod日志流

package mainimport ( "bufio" "flag" "io" "path/filepath" "context" "fmt" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/util/homedir" "k8s.io/api/core/v1")func log() error { var kubeconfig *string if home := homedir.HomeDir(); home != "" { kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file") } else { kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file") } flag.Parse() // use the current context in kubeconfig config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig) if err != nil { panic(err.Error()) } // create the clientset clientset, err := kubernetes.NewForConfig(config) if err != nil { panic(err.Error()) } opts := &v1.PodLogOptions{ Follow: true, // 对应kubectl logs -f参数 } request := clientset.CoreV1().Pods("default").GetLogs("your pod name", opts) readCloser, err := request.Stream(context.TODO()) if err != nil { return err } defer readCloser.Close() r := bufio.NewReader(readCloser) for { bytes, err := r.ReadBytes('\n') fmt.Println(string(bytes)) if err != nil { if err != io.EOF { return err } return nil } } return nil}func main(){ log()}

November 23, 2020 · 1 min · jiezi

关于kubernetes:Kubernetes服务类型浅析从概念到实践

本文转自Rancher Labs 在Kubernetes中,服务总是能使其网络拜访到一个或一组Pod上。服务将会依据标签抉择Pod并且当对这些服务建设网络时,它会抉择集群中所有与服务的selector相匹配的Pod,并抉择其中的一个,而后将网络申请转发给它。 Kubernetes 服务vs Deployment在K8S中咱们应该如何辨别Deployment和服务呢?Deployment次要负责让一组pod在集群中放弃运行服务次要负责在集群中启用对一组pod的网络拜访咱们能够应用deployment而不应用服务,所以咱们能够放弃几个雷同的Pod在K8S集群中运行。此外,Deployment的规模能够扩充和放大,pod也能够复制。在Kubernetes中,单个pod能够间接通过网络申请独自拜访,因而要跟踪pod会有些艰难。 咱们也能够应用一个服务类型而不须要deployment。如果咱们这样做,将创立一个繁多的pod,而不是像咱们在deployment中那样一起创立所有pod。不过,咱们还有另一种代替计划,即咱们的服务可能依据调配给它们的标签进行抉择,从而将网络申请路由到这些Pod。 咱们如何发现Kubernetes服务呢?在Kubernetes中,有两种形式能够发现服务: DNS类型。DNS server被增加到集群中,以便察看Kubernetes API为每个新服务创立DNS record set。当整个集群启用DNS后,所有的Pod都应该可能主动进行服务名称解析。ENV变量。在这一发现办法中,一个pod运行在一个节点上,所以 kubelet为每个active服务增加环境变量。ClusterIP、NodePort和LoadBalancer是什么?服务标准中的类型属性决定了服务如何裸露在网络中。比方,ClusterIP、NodePort和LoadBalancer。 ClusterIP—默认值。该服务只能从Kubernetes集群内拜访。NodePort—这使得服务能够通过集群中每个节点上的动态端口拜访。LoadBalancer—服务通过云提供商的负载均衡器性能能够从内部拜访。阿里云、AWS、Azure都提供了这一性能。如何创立一个服务通过deployment kind的帮忙,以“Hello World” App模式的简略示例将会帮忙你更好地了解如何创立服务。 咱们的操作流程是,当咱们看到应用程序曾经部署实现并且以up状态运行的时候,咱们将创立服务(Cluster IP)来拜访Kubernetes中的应用程序。 当初,让咱们创立一个正在运行的deployment “kubectl run hello-world –replicas=3 –labels=”run=load-balancer-example” –image=gcr.io/google-samples/node-hello:1.0 –port=8080”. 这里,这个命令在Kubernetes中创立了一个有两个应用程序正本的deployment。 接下来, run "kubectl get deployment hello-world" so see that the deployment is running.Now we can check the replicaset and pods that the deployment created.$ kubectl get deployments hello-worldNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEhello-world 3 3 3 3 76s应用程序当初正在运行,如果你想要拜访新创建的应用程序,咱们须要创立ClusterIP类型的服务: ...

November 20, 2020 · 2 min · jiezi

关于kubernetes:Kubernetes-Ingress-基于内容的路由

什么是 Kubernetes Ingress? Kubernetes Ingress 提供了一个基于规定的工作流,该工作流将在集群外部设置路由 API 对象。Ingress 的 API 将应用与公共网络所连贯的 HTTP(S)负载均衡器,为具备内部端点的服务提供基于内容的路由。 什么是 Anycast 路由? Anycast 是一种路由办法,它基于区域、基于内容或任何其余优先级办法将传入申请(单个 IP 地址)调配到多个路由中。路由节点的优先级为用户提供了低提早带宽内的服务。Anycast 网络的最短门路算法确定了最近的节点。在理论状况下,网络申请须要达到任何最近的 CDN 数据中心,以缩小高流量利用中的流量拥挤。 K8sMeetup 外部流量的 Ingress 负载平衡 外部 HTTP 负载均衡器只能应用外部 IP 地址从虚构公有云(VPC)网络拜访选定区域。 Envoy Proxy 外部 HTTP 负载均衡器应用 Envoy Proxy 来治理集群中的服务。代理服务应用 Sidecar 代理,以提供服务网格来管理控制区域或节点中的外部流量。Envoy Proxy 负责集群中的服务发现、负载平衡、流量管制、熔断、健康检查。 Sidecar 它是作为容器、配置元素、日志记录、代理服务利用的应用程序的一项反对性能。Sidecar 服务是应用程序生命周期中的可连贯和可拆卸组件。 基于门路的路由(Path-based routing) 外部负载均衡器遵循 L7 路由办法,该办法容许造成某些 URL 类型,以定义应用单个外部 IP 地址与后端服务连贯的各种门路。URL 网址映射创立门路规定来管制基于内容的路由后端服务流量。 示例 当初有一个具备两个后端服务“video”、“image”的 BASE URL “mymediaservice.internal”,门路规定将决定应用单个 URL 连贯到多个外部后端服务或存储空间(Bucket)。 https://mymediaservice.intern...,连贯到视频后端服务。https://mymediaservice.intern...,连贯到镜像云存储后端存储空间。 外部微服务架构 外部后端服务托管在 VM 内的多个实例组中,这些实例组充当外部客户端的外部微服务。 ...

November 17, 2020 · 1 min · jiezi

关于kubernetes:K8s-节点断开连接后本在运行的-Pod-会如何

因为各种起因,工作节点与主节点断开连接的状况会常常产生。在这种状况下,其实有很多问题,例如,主节点是否删除了在无奈连贯的节点上运行的 Pod?Kubernetes 控制器的行为如何?Pod 是否在工作节点上持续运行?简而言之,咱们想晓得当节点变得不可拜访时,Kubernetes 零碎行为是什么样子的? 定义:在 Kubernetes 中,无奈连贯的节点称为隔离节点(partitioned node)。为了具体理解,让咱们创立一个隔离节点案例并理解其行为。 K8sMeetup 示例集群 示例集群具备一个主节点(master node)和 3 个工作节点(worker node)。这里创立了具备 2 个正本的 Nginx Deployment。这些正本在不同的节点上运行:kind-worker2 和 kind-worker3。图 1 展现了示例集群的状态: 图1:示例集群的状态 K8sMeetup 创立一个隔离节点 创立一个隔离节点的简略办法是删除节点的 IP 地址,即 kind-worker2。图 2 展现了必要的步骤: 图2:创立一个隔离节点 K8sMeetup Kubernetes 零碎的体现如何? 工作节点(kind-worker2)被设置为 NotReady 状态,但 Pod 仍在持续运行,这是因为负责节点的 kube-controller-manager 的 node-controller 局部在期待 pod-eviction-timeout,这是确保在 Pod 删除之前该节点是无法访问的。 pod-eviction-timeout 默认设置为 5 分钟,能够在 kube-controller-manager 启动过程中进行批改。在 pod-eviction-timeout(示例中为 5 分钟)之后,node-controller 将在隔离节点上运行的 pod 调度为 Termination 状态。kube-controller-manager 的 Deployment Controller 局部开始在不同的节点上创立新的正本和调度。在示例中,咱们在 kind-worker 节点上创立了一个 Nginx 正本。图 3 展现了 Kubernetes 零碎上的所有状态更改: ...

November 12, 2020 · 1 min · jiezi

关于kubernetes:5-款顶级-Kubernetes-日志监控工具

Kubernetes在容器编排市场中占主导地位,推动企业向微服务演进。微服务的每个实例都会生成大量日志事件,这些事件很快就变得难以治理。但更简单的是当呈现问题时,因为服务之间简单的交互作用,以及可能的故障模式,导致很难找到根本原因。潜在的问题使得Kubernetes日志管理工具变得非常重要。 企业总是设法寻找实用的工具满足需要,并让监控,日志记录和故障剖析尽可能高效和疾速。 Zebrium你可能会优先思考Prometheus(普罗米修斯)或ELK?但Zebrium却也能作为优先选项。 这家新成立的初创公司最近入选了“Gartner 2020年值得关注的25家企业软件初创企业”。谈到最佳实际,Zebrium最近还帮忙Sweetwater将事件跟踪工夫从3小时缩小到只有几分钟。Zebrium甚至能够发现以前未发现的暗藏问题。这是一项杰出的性能,因为它能够帮忙在问题影响客户之前发现问题。 那么,什么使Zebrium在竞争中怀才不遇?Zebrium应用人工智能来发现问题以及主动发现根本原因,而所有其余工具都依赖于用户手动增加规定。Zebrium也能够用作独立的日志治理平台,也能够与ELK Stack或其余日志管理器集成。 长处:易于启动;只需复制/粘贴自定义的HELM或kubectl命令;自动检测问题和根本原因,无需手动规定;能够用作独立的日志管理工具,也能够用作现有日志管理工具(例如ELK Stack)的机器学习附件。 毛病:收费打算限度为每天500 MB,保留3天;反对Kubernetes,Docker和大多数常见平台,但不反对Windows。 Sematext用于日志治理和应用程序性能监控的解决方案。Sematex提供了零碎状态的全栈可见性。Sematext不仅限于Kubernetes日志,还能够监控和Kubernetes(基于度量规范和日志)。收集到的日志会主动针对几种不同的已知日志格局进行解析/结构化,并且用户还能够提供自定义日志的模式。它还公开了Elasticsearch API,因而也能够应用任何与Elasticsearch配合应用的工具,例如Filebeat和Logstash与Sematex。能够将其用作ELK的变体或与本机Sematext生态系统一起应用。该工具有助于创立特定规定,来监控特定状况并捕捉异样。借助Sematex全面的实时仪表板,客户能够管制和监控所有服务。关注民工哥技术之路公众号,回复1024获取2TB材料一份,助力大家更好的学习技术。 长处:与其余Sematext云工具集成;可配置超限来阻止日志被承受从而管制老本;具备ELK的灵活性。 毛病:Sematext小部件和Kibana不能在一个仪表板上混合应用;自定义解析须要在日志传送器中实现,Sematext仅在服务器端解析Syslog和JSON;跟踪性能较弱,但曾经在打算进行改良。 LokiLoki是一个受Prometheus启发的多租户和高度可用的日志聚合工具。这款工具有助于收集日志,然而用户将须要为其建设手动规定。Loki与Grafana,Prometheus和Kubernetes单干。Loki能够让外部流程更有效率。如,它节俭了Paytm Insider 75%的日志记录和监控老本。Loki不会索引你的日志内容,而是仅索引每个事件流的一组标签,因而效率很高。长处:领有大型的生态系统;丰盛的可视化性能;因为未索引日志内容而进步了效率。 毛病:未针对Kubernetes日志治理进行优化;大量的架构规定手工工作;短少内容索引可能会限度搜寻性能。 ELK StackELK是最驰名的日志治理开源工具。ELK是Elasticsearch,Logstash和Kibana的首字母缩写。每个组件负责日志记录过程的不同局部。Elasticsearch是一个功能强大且可扩大的搜寻零碎,Logstash聚合并解决日志,而Kibana提供了一个剖析和可视化界面,可帮忙用户了解数据。它们独特为Kubernetes提供了全面的日志记录解决方案。但ELK Stack还有许多其余变体,如EFK Stack,即Elasticsearch,Fluentd和Kibana组成。ELK被Adobe,T-Mobile和沃尔玛等许多大公司应用,因而能够证实它的可生产性。所以ELK是一个牢靠且通过验证的工具。但他会带来复杂性和工作所需的大量资源。 长处:ELK是家喻户晓的,并且领有宏大的社区;十分宽泛的平台反对;Kibana中丰盛的剖析和可视化性能;须要对日志和手动定义的警报规定进行简单的剖析。 毛病:维持规模难度大;须要很多调整,特地是对于大型环境;大量的资源需要;某些性能须要付费许可证。 FluentdFluentd是一个跨平台的开源数据收集器,提供了对立的日志记录层,但它不是独立的日志管理器。作为颇受欢迎的工具,领有Atlassian,微软和亚马逊等5000多个客户。看到这些大型客户,可印证其可靠性和性能。此外,Fluentd还创立了一个对立的日志记录层,可帮忙更无效地应用数据并在软件上疾速迭代数据。它能够帮忙你每秒解决120000条记录。长处:大型社区和插件生态系统;对立日志记录层;通过验证的可靠性和性能。能够在不到10分钟的工夫内装置结束。 毛病:难以配置;对转换数据的反对无限;不是残缺的日志记录解决方案。 结语你可能会问,为什么没有将Prometheus列入名单,因为本文专一于日志监控工具,而Prometheus解决指标不反对日志。 所以,如果你对手动搜寻日志的不善于,或者不违心构建和治理警报规定,则应尝试应用基于机器学习算法的Zebrium。这可能会节俭大量工夫,并解脱创立大量规定的繁琐工作。 如果你正在寻找更支流的货色,并且晓得要创立哪些规定,可尝试应用Loki或Sematext,它们将是非常适合的高效工具。 此外,你心愿在私有云中应用日志监控,则无妨应用云提供商提供的服务,比方AWS的CloudWatch,而他们仅对自家云中的业务的提供反对。 如果你的日志有多个或非凡的起源,则可尝试应用Fluentd及其对立的日志记录层,然而你依然须要一个日志记录工具。 原文:https://www.toutiao.com/i6889... 作者:云智时代

November 12, 2020 · 1 min · jiezi

关于kubernetes:源码剖析KEDA是如何工作的

KEDA 在2020年11月4号release了2.0版本,蕴含了一些新的比拟有用的个性,比方ScaledObject/ScaledJob中反对多触发器、反对HPA原始的CPU、Memory scaler等。 具体的装置应用请参考上一篇文章应用keda实现基于事件的弹性伸缩,这篇文章次要深刻的看下KEDA外部机制以及是如何工作的。 咱们先提出几个问题,带着问题去看代码,不便咱们了解整个机制: KEDA是如何获取到多种事件的指标,以及如何判断扩缩容的?KEDA是如何做到将利用的正本数缩容0,根据是什么?代码构造对一些次要目录阐明,其余一些MD文件次要是文字说明: ├── BRANDING.md├── BUILD.md //如何在本地编译和运行├── CHANGELOG.md├── CONTRIBUTING.md //如何参加奉献次我的项目├── CREATE-NEW-SCALER.md├── Dockerfile├── Dockerfile.adapter├── GOVERNANCE.md├── LICENSE├── MAINTAINERS.md├── Makefile // 构建编译相干命令├── PROJECT├── README.md├── RELEASE-PROCESS.MD├── adapter // keda-metrics-apiserver 组件入口├── api // 自定义资源定义,例如ScaledObject的定义├── bin ├── config //组件yaml资源,通过kustomization工具生成├── controllers //kubebuilder 中controller 代码管制crd资源├── go.mod├── go.sum├── hack├── images├── main.go //keda-operator controller入口├── pkg //蕴含组件外围代码实现├── tests //e2e测试├── tools ├── vendor└── versionkeda中次要是两个组件keda-operator以及keda-metrics-apiserver。 keda-operator : 负责创立/更新HPA以及通过Loop管制利用正本数keda-metrics-apiserver:实现external-metrics接口,以对接给HPA的external类型的指标查问(比方各种prometheus指标,mysql等)keda-operator我的项目中用到了kubebuilder SDK,用来实现这个Operator的编写。 对于k8s中的自定义controller不理解的能够看看这边文章:如何在Kubernetes中创立一个自定义Controller?。 keda controller的次要流程,画了幅图: 组件启动入口在于main.go文件中: 通过controller-runtime组件启动两个自定义controller:ScaledObjectReconciler,ScaledJobReconciler: mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ Scheme: scheme, MetricsBindAddress: metricsAddr, HealthProbeBindAddress: ":8081", Port: 9443, LeaderElection: enableLeaderElection, LeaderElectionID: "operator.keda.sh", })...// Add readiness probe err = mgr.AddReadyzCheck("ready-ping", healthz.Ping)...// Add liveness probeerr = mgr.AddHealthzCheck("health-ping", healthz.Ping)....//注册 ScaledObject 解决的controllerif err = (&controllers.ScaledObjectReconciler{ Client: mgr.GetClient(), Log: ctrl.Log.WithName("controllers").WithName("ScaledObject"), Scheme: mgr.GetScheme(),}).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "ScaledObject") os.Exit(1)}////注册 ScaledJob 解决的controllerif err = (&controllers.ScaledJobReconciler{ Client: mgr.GetClient(), Log: ctrl.Log.WithName("controllers").WithName("ScaledJob"), Scheme: mgr.GetScheme(),}).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "ScaledJob") os.Exit(1)}if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { setupLog.Error(err, "problem running manager") os.Exit(1)}ScaledObjectReconciler 解决咱们次要关注Reconcile办法,当ScaledObject发生变化时将会触发该办法:办法外部次要性能实现: ...

November 12, 2020 · 3 min · jiezi

关于kubernetes:在-Kubernetes-中使用-DNS-和-Headless-Service-发现运行中的-Pod

在 Kubernetes 集群中,Service 是将运行在一组 Pods 上的应用程序公开为网络服务的形象办法。Service 能够充当服务发现机制,使咱们能轻松地和上游 Pod 通信,而无需晓得各个 Pod 的确切 IP 地址。 在某些状况下,咱们想检索并连贯到特定 Service 所有 Pod 的 IP 地址。当 Pod 是有状态的(例如已部署的数据库)时,各个 Pod 须要与其同属实例进行通信。在这种状况下,Pod 如果想晓得哪些其余成员是数据库集群的一部分时,Headless Service 能够派上用场。 什么是 Headless Service?部署 Service时,能够设置三种不同的 ServiceTypes 以指定所需的 Service 类型: ClusterIP:仅在集群外部 ip 地址上公开 Service,这也是默认的 ServiceType。NodePort:容许通过节点上的动态端口公开 Service。LoadBalancer:容许应用云提供商的内部负载均衡器公开 Service 。为防止申请在单个 IP 地址前面进行负载平衡,当不须要单个 IP 地址时,咱们能够通过指定 Cluster IP(spec.clusterIP)的值为 "None" 来创立 Headless Service。Kubernetes 不会为该 Service 调配任何 IP 地址。这种 Service 就称为 Headless Services。 DNS 解析和 Headless Service部署 Service 时,Kubernetes 会为其调配一个 DNS 名称。集群中的其余组件能够应用此名称与 DNS 和上游 Pod 通信。DNS 名称遵循以下命名约定: ...

November 3, 2020 · 1 min · jiezi

关于kubernetes:K8S集群长连接服务需要配置哪些

所谓长连贯,个别咱们所说的就是基于tcp协定长时间放弃连贯。我自个分成2种,一种就是tcp长连贯,另外一种就是Websocket,简称ws,基于tcp的长连贯,通过HTTP/1.1 协定的101状态码进行握手。在开发我的项目时,有可能这2种都会有遇到。这里记录下在K8s中如何进行配置以及注意事项。 tcp长连贯配置在k8s中,咱们须要创立长连贯我的项目的服务svc,如果须要对外对外裸露提供接口,后面能够创立一个slb负载平衡实例,slb默认是基于4层tcp协定,提供80和443端口,咱们能够借助阿里云控制台创立也能够yaml创立长连贯svc服务 apiVersion: v1kind: Servicemetadata: annotations: service.beta.kubernetes.io/alicloud-loadbalancer-id: lb-xxxxx name: link-tcp-socket-svc namespace: bsg-prod resourceVersion: '493439928' selfLink: /api/v1/namespaces/bsg-prod/services/link-tcp-socket-svc uid: xxxxxxspec: externalTrafficPolicy: Local healthCheckNodePort: 31694 ports: - name: link-80 nodePort: 31495 port: 80 protocol: TCP targetPort: 5150 - name: link-443 nodePort: 30254 port: 443 protocol: TCP targetPort: 5150 selector: app: link sessionAffinity: None type: LoadBalancerstatus: loadBalancer: ingress: - ip: xx.xx.xx.xx创立好之后,slb配置tcp监听端口80和443即可,很简略。 Websocket配置个别线上须要配置wss,即对ws加密,因为wss是通过https进行长连贯的,对外裸露接口时就须要配置https协定监听端口(须要配置证书)。先说下配置的大抵思路:slb(tcp)→ingress(https)→后端服务在k8s中,因为配置的后端服务和Web服务器都是通过ingress-nginx来路由的,svc服务配置ClusterIP类型,再通过slb裸露进来,十分不便。创立link-svc.yaml服务: apiVersion: v1kind: Servicemetadata: name: link-websocket-svc namespace: bsg-prod resourceVersion: '493450033' selfLink: /api/v1/namespaces/21go-prod/services/link-websocket-svc uid: xxxxspec: ports: - name: link-websocket port: 5151 protocol: TCP targetPort: 5151 selector: app: link sessionAffinity: None type: ClusterIPstatus: loadBalancer: {}长连贯服务创立的deployment就不说了,同时上面还须要创立link-ingress.yaml: ...

October 29, 2020 · 1 min · jiezi

关于kubernetes:解放开发者3款工具实现快速K8S开发

本文转自Rancher Labs关注咱们,即可第一工夫获取K8S教程哦简 介时至今日,Kubernetes正在变得越来越重要,不仅仅是运维须要Kubernetes,在开发的世界里Kubernetes也不可或缺。因而可能熟练掌握Kubernetes常识会备受追捧。然而问题是,开发人员是否须要间接上手操作Kubernetes,他们是否必须齐全理解Kubernetes。 躲避这一问题的常见办法是通过提供一个平台或CI/CD流水线,将Kubernetes的复杂性从开发人员身上形象进去,使开发人员更容易在Kubernetes内测试应用程序,而无需间接拜访Kubernetes。 然而,容许开发人员间接拜访Kubernetes,让他们间接在Kubernetes外部开发一些应用程序往往是有意义的,因为这样能够在一个十分靠近生产的环境中工作。 这就呈现了一个问题,即如何让开发人员应用Kubernetes工作,同时又不因其复杂性而使他们不堪重负。这个问题的答案可能是须要应用为Kubernetes而筹备的开发者工具,例如DevSpace。在这篇文章中,咱们将探讨开发人员如何应用DevSpace和Rancher来简化Kubernetes开发。 DevSpace: 应用Rancher轻松开发DevSpace是一款面向Kubernetes的客户端、开源的开发者工具。它能够: 间接在Kubernetes外部构建、测试和调试应用程序通过更新正在运行的容器而不须要重建镜像或重启容器来进行热重载开发在团队外部以及在开发、暂存和生产中对立部署工作流程主动实现镜像构建和部署的重复性工作DevSpace作为开发者的客户端工具,是对Rancher的补充。开发者在Rancher内取得调配的我的项目,而后间接在Kubernetes内开发或测试利用。这使开发环境更靠近生产环境,让开发人员在公布新性能时更有把握,置信所有都可能在生产环境中运行良好。 设置DevSpace首先须要下载DevSpace二进制文件,接下来,在一个曾经容器化的我的项目中通过运行devspace init创立一个新的我的项目。如果你当初手边没有一个能够用来进行试验的我的项目,你能够应用咱们的示例我的项目: https://devspace.sh/cli/docs/... $ devspace init ____ ____ | _ \ _____ __/ ___| _ __ __ _ ___ ___ | | | |/ _ \ \ / /\___ \| '_ \ / _` |/ __/ _ \ | |_| | __/\ V / ___) | |_) | (_| | (_| __/ |____/ \___| \_/ |____/| .__/ \__,_|\___\___| |_|? How do you want to initialize this project? Use the Dockerfile in ./Dockerfile? Which registry do you want to use for storing your Docker images? Use hub.docker.com => you are logged in as devspacecloud? Which image name do you want to use on Docker Hub? devspacecloud/quickstart? Which port is your application listening on? (Enter to skip) 8080[done] √ Project successfully initialized在你答复了几个对于应该被初始化的我的项目的问题之后,DevSpace将为你创立一个devspace.yaml。这个文件蕴含了如何应用DevSpace部署和开发我的项目,看起来如下所示: ...

October 23, 2020 · 3 min · jiezi

关于kubernetes:Kubernetes-上对应用程序进行故障排除的-6-个技巧

从 Docker 迁徙到 Docker Swarm,再到 Kubernetes,而后解决了多年来的所有各种 API 更改之后,我十分乐意发现部署中呈现的问题和把问题进行修复。 我明天分享下我认为最有用的5条故障排除技巧,以及一些其余的应用技巧。 kubectl –“瑞士军刀” kubectl 就是咱们的瑞士军刀,咱们常常在呈现问题的时候应用他们,在呈现问题如何应用他们很重要,让咱们从5个“理论案例”开始,看呈现问题时如何应用它们。 状况将是:我的YAML已被承受,但我的服务未启动且已启动,但无奈失常工作。 1.kubectl get deployment/pods这个命令如此重要的起因是它无需显示大量内容即可显示很有用的信息。如果要为工作负载应用部署,则有两种抉择: kubectl get deploykubectl get deploy -n  名称空间kubectl get deploy –all-namespaces [或“ -A”]现实状况下,您心愿看到的是1/1或等值的2/2,以此类推。这表明您的部署已被承受,并已尝试进行部署。 接下来,您可能须要查看kubectl get pod,以查看部署的后备Pod是否正确启动。 kubectl get events我感到诧异的是,我不得不常常向与Kubernetes有问题的人们解释这个小技巧。此命令将打印出给定名称空间中的事件,非常适合查找关键问题,例如解体的pod或无奈pull容器镜像。 Kubernetes中的日志是“未排序的”,因而,您将须要增加以下内容,这些内容取自OpenFaaS文档。 $ kubectl get events --sort-by=.metadata.creationTimestamp kubectl get事件的另一个靠近的命令是是kubectl  describe,就像get deploy / pod一样,它与对象的名称一起工作: kubectl describe deploy/figlet -n openfaas您会在这里取得十分具体的信息。您能够形容大多数事件,包含节点,这些节点将显示因为资源限度或其余问题而无奈启动 Pod。 kubectl logs这个命令必定常常大家常常应用,但很多人应用了谬误的形式。 如果您进行了部署,比方说cert-manager命名空间中的cert-manager,那么很多人认为他们首先必须找到Pod的长(惟一)名称并将其用作参数。不对。 kubectl logs deploy/cert-manager -n cert-manager要跟踪日志,请增加-f kubectl logs deploy/cert-manager -n cert-manager -f您能够将所有三个联合起来。 如果您的 Deployment 或 Pod 有任何标签,则能够应用 -l app = name 或任何其余标签集来附加到一个或多个匹配Pod的日志中。 kubectl logs -l app=nginx有一些工具,例如 stern 和 kail,能够帮忙您匹配模式并节俭一些键入操作,但我发现它们会扩散您的注意力。 4.kubectl get -o yaml当您开始应用由另一个我的项目或诸如Helm之类的其余工具生成的YAML时,您将很快须要它。在生产中查看镜像的版本或您在某处设置的正文也很有用。 kubectl run nginx-1 --image=nginx --port=80 --restart=Always输入yaml kubectl get deploy/nginx-1 -o yaml当初咱们晓得了。而且,咱们能够增加–export并将YAML保留在本地以进行编辑并再次利用。 实时编辑YAML的另一个选项是kubectl edit,如果您对vim感到困惑,不晓得如何应用,请在命令前加上VISUAL = nano,应用这个简化编辑器。 ...

October 21, 2020 · 1 min · jiezi

关于kubernetes:kubescheduler架构设计和启动流程简介

之前都是花工夫在k8s的搭建,根底概念学习以及具体利用在k8s上的搭建,始终想对k8s源码进行浏览学习,这次借着云原生社区的Kubernetes 源码研习社我的项目机会对k8s源码进行摄入的学习,也能鞭策本人坚持下去把源码读完。 本文次要对第一周kube-scheduler的架构设计和启动流程的学习进行了一个总结。 1、kube-scheduler架构设计kube-scheduler组件是kubernetes默认的调度器,kube-scheduler组件内置的预选和优选算法,次要负责把创立的Pod调度到具体的Work工作节点上,实现Pod到Node的调度和预绑定工作(具体的绑定实现在kube-apiserver组件上实现)。 如kube-scheduler架构图上图所示,kube-scheduler通过informer从kube-apiserver保护一个还未绑定到Node的待调度Pod队列,每个调度循环中,scheduler会从Pod queue中获取一个Pod,依据scheduler框架的filter阶段(预选阶段)和Score阶段(优选阶段)从待绑定的Node列表中选出最优Node,最初通过绑定阶段把Pod绑定到最优的Node节点上。 filter阶段(预选阶段):依据Pod须要的CPU、内存、端口等资源状况,间接过滤掉不合乎Pod资源条件的Node节点Score阶段(优选阶段):依据Pod的节点亲和性、资源状况等进行归一化打分,选出分数最优的Node节点。绑定阶段:该阶段次要把Pod预绑定到选出的Node上,并择机把绑定后果上传到kube-apiserver,由kube-apiserver实现理论绑定操作。2、kube-scheduler启动流程kube-scheduler组件程序入口在 cmd/kube-scheduler/scheduler.go 文件的 main()函数中,该函数次要实现了命令行解析和运行scheduler工作。cmd/kube-scheduler/scheduler.go:33 func main() { ... // 1、 创立cobra.Command对象, cobra次要用来解析scheduler命令行参数  command := app.NewSchedulerCommand() // 2、 初始化 log pflag.CommandLine.SetNormalizeFunc(cliflag.WordSepNormalizeFunc) logs.InitLogs() defer logs.FlushLogs() // 3、运行 command 对象的 Run 成员对应的函数, 该函数 在 cmd/kube-scheduler/app/server.go:117 if err := command.Execute(); err != nil { os.Exit(1) }}下面的Execute()办法理论执行的是 cmd/kube-scheduler/app/server.go:117 的 runCommand() 办法 func runCommand(cmd *cobra.Command, args []string, opts *options.Options, registryOptions ...Option) error { ...... //1、装载生成一个scheduler.Scheduler对象 cc, sched, err := Setup(ctx, args, opts, registryOptions...) if err != nil { return err } ...... // 2、通过装载好的Scheduler对象,执行真正的scheduler流程 return Run(ctx, cc, sched)}Run() 函数次要进行以下操作: ...

October 18, 2020 · 3 min · jiezi

关于kubernetes:听说生鲜领军企业k8s集群都上云了鱼会飞了

在这个中秋都和国庆在一起的双节里,咱们的小明还在辛辛苦苦的找工作,据说他经验了一段“难忘”的面试。 小明面对着面试官的“层层拷问”,熟能生巧的化解了这些难题。 面试官:请问你晓得哪些“编排管理工具”? 小明:有Docker平台、Google GKE、Amazon EKS这类的平台。 面试官:那你晓得k8s嘛? 小明:理解的,k8s就是Kubernetes(首字母为 k、首字母与尾字母之间有 8 个字符、尾字母为 s,所以简称 k8s),又叫做 "kube" ,是一种可主动施行Linux 容器操作的开源平台。它能够帮忙用户省去利用容器化过程的许多手动部署和扩大操作。也就是说,能够将运行 Linux 容器的多组主机汇集在一起,由 Kubernetes 帮忙咱们轻松高效地治理这些集群。而且,这些集群可跨公共云、公有云或混合云部署主机。因而,对于要求疾速扩大的云原生利用而言(例如借助 Apache Kafka 进行的实时数据流解决),Kubernetes 是现实的托管平台。 面试官:嗯,说的是挺具体的,能用一句话概括一下吗? 小明:k8s就是为容器服务而生的一个可移植容器的编排管理工具,就相当于你家有相当于一个足球队的孩子(当然,超生是不提倡的,请大家响应国家计生政策!!!),而后你须要一个专职保姆来帮你治理这些孩子的起居生活。这个专职保姆就是k8s,这些孩子就是你的每一个集群。 面试官:嗯,这样讲,更加的通俗易懂了,看来是真的会这些货色,不是在百度上背下来的,先来公司试用一段时间吧... 小明:好的,感激。 k8s当初作为业界的扛把子,从各个方面都可能完满的解决问题。 从架构设计层面,咱们关注的可用性,伸缩性都能够联合k8s失去很好的解决,如果你想应用微服务架构,搭配k8s,真的是完满,再从部署运维层面,服务部署,服务监控,利用扩容和故障解决,k8s都提供了很好的解决方案。 基于k8s的个性,很多公司当初都抉择利用这个治理平台来倒退业务,然而不乏有些公司他短少业余的运维团队无奈将平台的劣势施展进去,并且会承当这微小的运维压力。 某业余的生鲜电子商务有限公司是一家采纳“预订制”模式,通过全程冷链配送和社区智能冷柜自提形式,为用户提供优质生鲜服务的中国新批发领军企业。该公司响应政府新一轮放慢“菜篮子工程”建设的号召,立足于家庭生鲜农产品的供给,以生鲜直投站为社区服务点,打造种植、采摘、分拣、包装、冷链配送于一体的产业链。 业务倒退初期,该公司自建了云下Kubernetes集群,但随着容器技术的疾速迭代和本身业务一直拓展,须要同时保护多个版本的集群,每次降级集群的过程都都是一次极大的业务调整和微小的运维累赘。 为了升高运维老本,通过垂直伸缩容来疾速应答数据分析业务的峰值。该公司决定将云下自建的Kubernetes集群迁徙到云上,同时在云上构建一个Kubernetes集群部署新的利用,实现新老业务申请交互并对权限进行对立集中管理。 为加重运维压力及老本,并保障业务的稳固运行,云掣基于丰盛的Kubernetes运维教训,为客户提供Kubernetes迁徙服务: 基于物理专线连贯云上和云下的网络互通,并对链路的性能进行测试,确保物理专线能够满足迁徙需要。 基于多个专有网络构建VPC互联场景下的多Kubernetes集群,买通VPC间的物理链路,实现数据申请转发的互通性。 基于Kubernetes集群外部的网络通信限度,联合专有网络的个性设计阿里云资源的IP地址范畴、路由表和网关,放弃新老业务网络环境的隔离性。 基于岗位角色创立自定义受权策略进行最小化受权,防止人为因素对集群产生谬误变更操作。 基于CRD扩大,采集容器日志,展现整体流量程度,网站实时状态,用户申请散布等信息,实现业务监控概览。 在云掣抗打的业余能力下,帮忙该企业实现了自建Kubernetes集群的平滑上云,简化了集群的扩容操作,实现业务架构云化,晋升了业务的连续性及可扩展性,为打造高效的经营模式和欠缺的供应链体系提供了保障。 该企业将为更多消费者带去陈腐、丰盛、价优、平安的生鲜食材,一直升高交易费用、晋升用户体验,实现生鲜零库存。 更多技术细节能够去官网查看哦云掣·云制手,云上治理好帮手(点击链接即可进入)

October 10, 2020 · 1 min · jiezi

关于kubernetes:CRD-就像-Kubernetes-中的一张表

作者:Hiro OSAKI翻译:Bach(才云) 校对:星空下的文仔(才云)、bot(才云) CRD(Custom Resource Definition)是 Kubernetes 中的非凡资源。如果咱们只是以惯例形式应用 Kubernetes,那就不用创立该资源,因而,CRD 对于许多用户而言并不那么重要。但它会经常出现在前沿的博客文章、kubernetes.io 的文档和社区探讨中。本文就简略介绍一下 CRD 是什么?咱们什么时候应用?一旦须要,要如何创立? K8sMeetup CRD 是什么? CRD 就是一个数据库表。举个例子,咱们在数据库中创立一个名为 Fruit 的表,该表蕴含了许多记录(record),例如 apple 、banana 和 orange。这些记录有很多列(column),如“甜度”、“滋味”和“分量”,来显示水果的个性。CRD 就像一个 Fruit 表。 CR(Custom Resource,自定义资源)的每个记录(record)都相似于 apple。 创立 CRD(表)之后,咱们能够增加或删除 CR(记录)。 为什么须要 CRD?因为越来越多的用户相熟了 Kubernetes 的用法后,心愿更宽泛地应用它。他们将更多数据输出 Kubernetes 来应用,这些数据格式互不雷同,而且不是 Kubernetes 本来就有定义的,因而他们在 Kubernetes 中创立表的品种,并设置自定义的列名或类型,就像在数据库中那样定义表,这就是 CRD 的由来。 K8sMeetup 如何创立 CRD? 如上所述,CRD 是一个表,创立表时,咱们须要定义表的格局,例如列名和类型,这些元素在 CRD 文件中以 YAML 或 JSON 格局形容。 CR 以 YAML 或 JSON 格局形容记录(record)的每个值。 这是 CRD 外部详细信息。 ...

September 30, 2020 · 2 min · jiezi

关于kubernetes:Kubernetes-Pod-冗余策略

作者:Harry Martland翻译:Bach(才云) 校对:星空下的文仔(才云)、bot(才云) 分布式系统会不可避免地产生些故障,咱们须要打算好如何解决,其中有种办法是运行多个服务实例,这样即使有一个故障了,其余的能够持续接管。在本文中,咱们将探讨一些在 Kubernetes 上实现此指标的不同办法。 K8sMeetup None 冗余(Redundancy)是有代价的,咱们在思考弹性时就应想到这一点。当然,如果客户能够忍耐大量中断,并且对他们的体验没有太大影响,那么这点就无所谓了。 在探讨服务运行工夫(uptime)时,通常以几个 9 来评估,例如运行工夫为 99.9%,这意味着每 1000 个申请中,只有一个失败。依据以往教训,咱们每减少九个服务,须要破费约十倍的老本。 只有应用程序不是常常解体,咱们就能够运行一个 Pod 并依附 K8s 从新运行,不过这须要一个 Pod 来解决服务接管的负载。 K8sMeetup N 随着服务开始须要更多的 Pod 来解决负载,咱们能够对其进行扩大。如果流量是随工夫变动的(例如中午顶峰),那咱们要有足够的 Pod 在顶峰工夫解决负载。这种策略在 Pod 接管的流量会显著缩小时,能力提供较好的弹性。 如果某个 Pod 在顶峰时段产生故障,那么申请(request)将散布到其余 Pod 上,这样可能会超过它们的容量。不过在流量较小的话,其余 Pod 可能会有足够的容量来接受负载。 在探讨伸缩时,大家可能听过一些术语,例如 in、out、up 和 down。通常,up 和 down 意味着放弃雷同数量的实例,但减少或缩小 CPU 或 Server 的内存。In 和 out 是减少或删除服务实例,但放弃资源不变。明确这些后,咱们能够进一步实现伸缩,但要留神会受到可应用的最大 CPU 或内存限度。 K8sMeetup N+1 与 N 一样,咱们要理解须要多少 Pod 来解决顶峰流量,这次增加了一个额定 Pod 来为咱们提供爱护,以避免顶峰期间呈现 Pod 故障的状况。这种策略的弹性老本就是一个 Pod,这是额定的老本,并只在故障状况下才须要。这就是为什么即使有一个 Pod 能够解决所有流量,但咱们仍要有一个额定 Pod。 ...

September 29, 2020 · 1 min · jiezi

关于kubernetes:使用-EndpointSlice-扩展-Kubernetes-网络

作者:Rob Scott翻译:Bach(才云) 校对:星空下的文仔(才云)、bot(才云) EndpointSlice 是一个新 API,它提供了 Endpoint API 可伸缩和可拓展的代替计划。EndpointSlice 会跟踪 Service Pod 的 IP 地址、端口、readiness 和拓扑信息。 在 Kubernetes v1.19 中,此性能将默认启用:从 EndpointSlice (不是 Endpoint)中读取 kube-proxy。只管这个更改看起来并不起眼,但实际上它能让大型集群的可伸缩性失去显着进步。另外,它还与 Kubernetes 将来版本中的重要新性能无关,例如 Topology Aware Routing。 K8sMeetup Endpoint API 可伸缩性限度 如果应用 Endpoint API,Service 只有一个 Endpoint 资源。这意味着它须要为 Service 的每个 Pod 都存储好 IP 地址和端口(网络端点),这须要大量的 API 资源。另外,kube-proxy 会在每个节点上运行,并监控 Endpoint 资源的任何更新。如果 Endpoint 资源中有一个端口产生更改,那么整个对象都会散发到 kube-proxy 的每个实例。 Endpoint API 另一个局限是,它会限度跟踪 Service 的网络端点数量。个别存储在 etcd 中的对象默认大小限度为 1.5MB。在某些状况下,它会将 Endpoint 资源限度为 5000 个 Pod IP。对于大多数用户而言,这没什么关系,然而对于靠近这个大小的 Service 而言,就有大问题了。 ...

September 22, 2020 · 2 min · jiezi

关于kubernetes:灵雀云开源网络插件KubeOVN-140-版发布支持跨集群容器网络NetworkPolicy-日志

从 1.4 开始 Kube-OVN 反对将多个 Kubernetes 集群容器网络买通,不同集群之间的 Pod 能够通过 Pod IP 间接相互通信。本版本还反对 ACL 日志,能够记录因 NetworkPolicy 而抛弃的数据包的数量和起因。本版本还更新了相干依赖并对性能进行了晋升,欢送应用。1 新性能•集成 OVN-IC 反对跨集群网络•启用 ACL 日志记录 NetworkPolicy 触发状况•NodePort 类型 Service 拜访本地 Pod 的源 IP 保留•反对 vlan 网关类型的动静调整2 问题修复•减少 Forward Accept 规定•修复 kubectl-ko 寻找网卡问题•修复subnet更新抵触问题•修复subnet acl 重叠问题修复 session lb 失落问题3 其余改良•降级 ovs 至 2.14•降级 golang 至 1.15•日志级别调整•减少 psp 规定•删除 juju 依赖4 Kube-OVN企业版开启限时收费试用!事实上,社区版和企业版是共生的关系。Kube-OVN社区版曾经集结了大量社区开源贡献者的智慧,汇聚了顶尖的技术,Kube-OVN企业版的诞生,受害于大量社区用户创立的生态,而Kube-OVN社区版又将受害于企业版的不断改进。收费试用地址(https://www.alauda.cn)

September 21, 2020 · 1 min · jiezi

关于kubernetes:K8S实战五-控制器-StatefulSet-的原理

前言Deployment 中能够随便的敞开和启动一个 Pod,Pod 之间的关系是平等的。 当 Pod 之间有主从关系,以及每个 Pod 对应特定的存储卷中的内容时,无奈应用 Deployment 控制器来随便的操作 Pod。 咱们须要应用一个叫做 StatefulSet 的控制器来解决这种有状态利用 Pod。 更新历史20200605 - 初稿 - 左程立原文地址 - https://blog.zuolinux.com/2020/06/05/about-controller-statefulset.htmlStatefulSet 控制器工作原理治理有状态利用 Pod 的秘诀是,提供稳固不变的 Pod 标识和稳固不变的存储。 稳固不变的拓扑状态,即不变的主机名该标识和 Pod 是绑定的,不论 Pod 被调度到哪个节点上StatefulSet 中每个 Pod 将被调配一个整数序号,从 0 到 N-1,该序号在 StatefulSet 上是惟一的每个 Pod 依据 StatefulSet 的名称和 Pod 的序号派生出它的主机名。组合主机名的格局为 $(StatefulSet 名称)-$(序号)StatefulSet 名称为 web,replicas 为 3,那么将会创立三个名称别离为 web-0、web-1、web-2 的 Pod。一旦每个 Pod 创立胜利,就会失去一个匹配的 DNS 名称,格局为:<pod-name>. <service-name>.<namespace>.svc.cluster.local,其中 service-name 由 StatefulSet 的 serviceName 域来设定并且这些 Pod 的创立,是严格依照编号程序进行的。比方,在 web-0 进入到 Running 状态、并且 Conditions 成为 Ready 之前,web-1 会始终处于 Pending 状态当咱们把这几个 Pod 删除之后,Kubernetes 会依照原先编号的程序,创立出新的 Pod。并且,Kubernetes 仍然为它们调配了与原来雷同的“网络身份”通过这种严格的对应规定,StatefulSet 就保障了 Pod 网络标识的稳定性稳固不变的存储每个 Pod 都会绑定一个固定编号的 PVC,这些 PVC 的名字都是 <PVC名>-<Pod名>名叫 web-0 的 Pod,会申明应用名叫 www-web-0 的 PVCPV/PVC 通过动静卷的形式存储于近程存储服务器当一个 Pod 被删除后,对应的 PVC 和 PV 并不会被删除,数据仍然存在于近程服务器,Pod 被重建后,StatefulSet 会从新查找对应名称的 PVC 来进行绑定结束语StatefulSet 扩大了 Deployment,对 Pod 和对应的存储卷都进行了固定名称和编号,不论 Pod 如何解决,这些对应关系都不会有变动,从而将业务逻辑关系以及存储关系固定了下来,确保了有状态利用失常运行。 ...

September 18, 2020 · 1 min · jiezi

关于kubernetes:K8S实战四-控制器-Deployment

前言上一节说到间接创立的 Pod 没有自愈性能。 应用控制器创立的 Pod 能力故障自愈,那么什么是控制器呢。 能够这么了解,容器是赤裸裸的箱子,Pod 把箱子进行了包装以不便 K8S 挂载。 那么 K8S 一次挂载几个 Pod,如何挂载,这些信息都由控制器来指定和治理。 控制器蕴含很多种,本节实际 Deployment 控制器。 更新历史20200601 - 初稿 - 左程立原文地址 - https://blog.zuolinux.com/2020/06/01/about-controller-deployment.htmlDeployment 控制器咱们通过 Deployment 控制器来公布 Pod # cat nginx.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deploymentspec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80该例中: 创立名为 nginx-deployment 的控制器,metadata.name 指定创立 2 个复制的 Pod,spec.replicas 指定spec.selector 指定 Deployment 如何抉择治理的 Podspec.template.metadata.lables 指定了 Pod 的标签spec.template.spec.containers 指定了容器的相干信息公布 Deployment ...

September 18, 2020 · 2 min · jiezi

关于kubernetes:K8S实战三-Pod-的本质

前言上一节公布了一个容器到 K8S 中,但其实实际操作的是 Pod ,那么为什么是 Pod,而不是容器。 更新历史20200531 - 初稿 - 左程立原文地址 - https://blog.zuolinux.com/2020/05/22/about-pod.htmlPod 的实质Pod 包装了一个或多个容器。Pod 是 K8S 的最小执行单元。Pod 是 K8S 中的一个过程。Pod 可包装 Docker,也反对包装其余类型容器。Pod 蕴含封装的容器、存储资源、网络资源、以及领导容器如何运行的配置。 能够把容器了解为一个无挂钩的赤裸裸的集装箱,K8S 这艘大船无奈间接挂载它,通过给集装箱(容器)加装挂钩(IP地址)等造成一个 Pod,不便 K8S 来操作。 也能够把 Pod 了解为传统的虚拟机,而容器是传统虚拟机中运行的程序,只不过虚拟机是一个实体,而 Pod 是一个逻辑概念。 K8S 通过编排 Pod 来调度容器,而不是间接操作容器,K8S 无奈间接操纵容器。 Pod 中的共享资源Pod 为其中运行的多容器提供共享的网络、存储资源、命名空间。 网络Pod 具备惟一 IP 地址,Pod 中的多个容器共享一个 IP 地址和网络端口等网络资源Pod 中多容器可应用 localhost 通信Pod 中容器和内部通信时候,多容器须要协调网络端口Pod 中的容器获取的零碎主机名与为 Pod 配置的 name 雷同 存储Pod 可指定一组存储卷Pod 中多容器均能够拜访该存储卷,以便相互共享数据Pod 中的共享卷能够长久保留,避免容器重启失落数据 Pod 的特点如果应用 kind: Pod 的 yaml 文件来创立 Pod,以后节点服务器呈现问题后,Pod 不能被主动调度到其余可用服务器。 ...

September 18, 2020 · 4 min · jiezi

关于kubernetes:K8S实战二-发布容器到-K8S-集群中

前言明天在 K8S 集群中跑一个容器化利用。 更新历史20200518 - 初稿 - 左程立原文地址 - https://blog.zuolinux.com/2020/05/18/first-app-on-k8s.html如何公布容器到 K8S 中容器起源应用 nginx 的官网容器镜像。 公布容器的两种形式镜像有了,咱们如何将其提交给 K8S 运行呢,有两种形式: 命令行形式(不举荐)。配置文件形式(举荐)。这里应用官网举荐的第二种形式,即通过将容器的各种信息写入配置文件提交给 K8S。 定义容器配置文件创立一个 nginx.yaml 文件[root@master01 ~]# cat nginx.yaml apiVersion: v1kind: Podmetadata: name: nginxspec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 hostAliases: - ip: "10.20.20.20" hostnames: - "test1.com" - "test2.com"部署容器到 K8S 中[root@master01 ~]# kubectl apply -f nginx.yaml pod/nginx created查看容器的运行状况[root@master01 ~]# kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx 1/1 Running 0 93s 192.10.205.195 work01 <none> <none>查看容器的具体信息所有重要操作,都会被记录在kubectl describe 指令返回的 Events 里,用于 DEBUG[root@master01 ~]# kubectl describe pod nginxName: nginxNamespace: defaultPriority: 0Node: work03/192.168.10.17IP: 192.10.137.130.....省略......Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled <unknown> default-scheduler Successfully assigned default/nginx to work03 Normal Pulled 74s kubelet, work03 Container image "nginx:1.7.9" already present on machine Normal Created 73s kubelet, work03 Created container nginx Normal Started 73s kubelet, work03 Started container nginx降级容器中nginx版本# 批改 nginx.yamlimage: nginx:1.9.0# 提交给 K8S# kubectl apply -f nginx.yaml 删除该容器利用[root@master01 ~]# kubectl delete -f nginx.yaml pod "nginx" deleted[root@master01 ~]# kubectl get podsNo resources found in default namespace.nginx.yaml 参数简介参数定义,分为 metadata 和 Spec 两局部:metadata 寄存元数据Spec 寄存这个对象独有的定义,用于形容它要表白的性能kind: Pod指明是一个 Pod 类型的API对象,该对象操作治理另一种 API 对象即PodmetadataAPI 对象的标识,即这个 Pod 的标识spec.containers表明是一个容器相干参数spec.hostAliases给容器的 /etc/hosts 文件中减少解析查看 Pod 帮忙文档[root@master01 ~]# kubectl explain Pod结束语明天公布了一个容器利用到K8S中。 ...

September 18, 2020 · 1 min · jiezi

关于kubernetes:K8S实战一-运营管理生产级-K8S-高可用集群之初始化

前言春暖花开的五月,疫情根本过来,值得庆祝,在这美妙的日子里咱们来实战一下 K8S 的高可用负载平衡集群吧。 更新历史2020 年 05月 07 日 - 初稿 - 左程立原文地址 - https://blog.zuolinux.com/2020/05/07/k8s-cluster-on-centos7.html平台环境软件信息CentOS Linux release 7.7.1908 (Kernel 3.10.0-1062.18.1.el7.x86_64)Docker CE 18.09.9Kubernetes v1.18.2Calico v3.8Keepalived v1.3.5HAproxy v1.5.18硬件信息主机名ipmaster01192.168.10.12master02192.168.10.13master03192.168.10.14work01192.168.10.15work02192.168.10.16work03192.168.10.17VIP192.168.10.19集群配置初始化master/worker 均执行# cat >> /etc/hosts << EOF192.168.10.12 master01192.168.10.13 master02192.168.10.14 master03192.168.10.15 work01192.168.10.16 work02192.168.10.17 work03EOF# 敞开防火墙systemctl stop firewalldsystemctl disable firewalld# 敞开 SeLinuxsetenforce 0sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config# 敞开 swapswapoff -ayes | cp /etc/fstab /etc/fstab_bakcat /etc/fstab_bak |grep -v swap > /etc/fstab# 装置wgetyum install wget -y# 备份mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup# 阿里云yum源wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo# 获取阿里云epel源wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo# 清理缓存并创立新的缓存yum clean all && yum makecache# 更新yum update -y#同步工夫timedatectltimedatectl set-ntp true装置 Dockermaster/worker 均装置# 装置 Docker CE# 设置仓库# 装置所需包yum install -y yum-utils device-mapper-persistent-data lvm2# 新增 Docker 装置源yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 装置 Docker CE.yum install -y containerd.io \ docker-ce-18.09.9 \ docker-ce-cli-18.09.9# 启动 Docker 并增加开机启动systemctl start dockersystemctl enable docker#将Docker 的 Cgroup Driver 批改为 systemd#批改为国内源cat > /etc/docker/daemon.json <<EOF{ "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "registry-mirrors":[ "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn", "https://registry.docker-cn.com" ]}EOFmkdir -p /etc/systemd/system/docker.service.d# Restart docker.systemctl daemon-reloadsystemctl restart docker装置 kubeadm、kubelet 、kubectlmaster/worker 节点均执行# 配置K8S的yum源,最好应用官网源cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF# 减少配置cat <<EOF > /etc/sysctl.d/k8s.confnet.ipv4.ip_forward=1net.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOF# 加载sysctl --system# 装置以后日期最新稳定版(v1.18.2) kubelet、 kubeadm 、kubectlyum install -y kubelet-1.18.2 kubeadm-1.18.2 kubectl-1.18.2 --disableexcludes=kubernetes# 启动并设置 kubelet 开机启动systemctl start kubeletsystemctl enable kubeletHAProxy 实现 apiserver 负载平衡集群所有 master 节点执行yum install haproxy-1.5.18 -ycat > /etc/haproxy/haproxy.cfg <<EOFglobal log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon # turn on stats unix socket stats socket /var/lib/haproxy/statsdefaults mode http log global option httplog option dontlognull option http-server-close retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000frontend k8s-api mode tcp option tcplog bind *:16443 default_backend k8s-apibackend k8s-api mode tcp balance roundrobin server master01 192.168.10.12:6443 check server master02 192.168.10.13:6443 check server master03 192.168.10.14:6443 checkEOF所有 master 节点启动 HAProxysystemctl start haproxysystemctl enable haproxyKeepalived实现 apiserver 高可用集群所有 master 节点执行yum -y install keepalived psmiscmaster01 上 keepalived 的配置:# cat > /etc/keepalived/keepalived.conf <<EOF! Configuration File for keepalivedglobal_defs { router_id master01 script_user root enable_script_security }vrrp_script check_haproxy { script "killall -0 haproxy" interval 2 weight 10}vrrp_instance VI_1 { state MASTER interface ens192 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.10.19 } track_script { check_haproxy }}EOFmaster02 上 keepalived 的配置:# cat > /etc/keepalived/keepalived.conf <<EOF! Configuration File for keepalivedglobal_defs { router_id master02 script_user root enable_script_security }vrrp_script check_haproxy { script "killall -0 haproxy" interval 2 weight 10}vrrp_instance VI_1 { state BACKUP interface ens192 virtual_router_id 50 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.10.19 } track_script { check_haproxy }}EOFmaster03 上 keepalived 的配置:# cat > /etc/keepalived/keepalived.conf <<EOF! Configuration File for keepalivedglobal_defs { router_id master03 script_user root enable_script_security }vrrp_script check_haproxy { script "killall -0 haproxy" interval 2 weight 10}vrrp_instance VI_1 { state BACKUP interface ens192 virtual_router_id 50 priority 96 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.10.19 } track_script { check_haproxy }}EOF所有 master 节点执行service keepalived startsystemctl enable keepalived留神vrrp_script 中参数 weight 肯定要大于 master 和 backup 的 priority 的相差值vrrp_instance 中参数 nopreempt 能够避免 master 复原后主动回切创立 K8S 集群在初始化之前,须要先设置 hosts 解析MASTER_IP 为 VIP 的地址APISERVER_NAME 为 VIP 的域名export MASTER_IP=192.168.10.19export APISERVER_NAME=k8s.apiecho "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts在 master01 上执行 kubeadm init 进行初始化kubeadm init \ --apiserver-advertise-address 0.0.0.0 \ --apiserver-bind-port 6443 \ --cert-dir /etc/kubernetes/pki \ --control-plane-endpoint k8s.api \ --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \ --kubernetes-version 1.18.2 \ --pod-network-cidr 192.10.0.0/16 \ --service-cidr 192.20.0.0/16 \ --service-dns-domain cluster.local \ --upload-certs留神保留后果中两行 kubeadm join 结尾内容,用于增加其余 master、worker 节点到集群中。 ...

September 18, 2020 · 4 min · jiezi

关于kubernetes:CentOS7安装Rancher2x并创建Kubernetes集群

前言此文档在三台内网机器搭建,只是为了学习搭建环境,不做生成环境应用。 环境主机名ip角色web2192.168.2.202masterweb5192.168.2.205node1web8192.168.2.208node2三台主机零碎均为 CentOS 7.8.2003文中会明确每个操作是在 master 还是 node 操作node 蕴含 node1 和 node2装置之前先敞开三台主机的防火墙 systemctl stop firewalld.service装置Docker主机master 和 node 均需操作Docker版本为 19.03.12 CentOS装置Docker官网文档 卸载旧版本docker sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine增加软件源信息 # 增加yum工具sudo yum install -y yum-utils# 增加源sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo装置docker sudo yum install -y docker-ce docker-ce-cli containerd.io启动docker sudo systemctl start docker【可选】设置开启启动 sudo systemctl enable docker【可选】通过hello-word镜像验证是否装置胜利 sudo docker run hello-world如下图输入阐明装置胜利 ...

September 18, 2020 · 1 min · jiezi

关于kubernetes:施耐德电气使用Kubernetes促进能源领域的敏捷及创新

施耐德电气成立于1836年,是世界领先的数字能源和自动化解决方案提供商,聚焦晋升能源应用效率及其可持续性。施耐德电气是市场上最具翻新精力、历史最为悠久的跨国公司之一。 施耐德电气坚信,获取能源并利用数字技术是每个人理当取得的基本权利。 施耐德电气为家庭、商业、市政修建和工业基础设施提供集成解决方案。通过将效率和可持续性置于公司投资组合的外围,施耐德电气帮忙消费者和企业充分利用他们的能源资源。 施耐德电气的容器之旅Timeline 2016年:采纳Kubernetes作为容器编排策略2017年:确定了对对立治理平台的需要2018年:Rancher胜利POC2019年6月:在胜利POC之后,抉择了Rancher作为基础架构2020年6月:Rancher使用量减少了一倍;2个RMS(Rancher management server)和40个节点2020年7月:4个应用程序现已投入生产;将在5年内迁徙数百个应用程序施耐德电气将资产数据转化为口头,基础设施性能的实时数据有助于其升高保护老本并且最大化零碎失常运行工夫。寰球基础设施策略负责人Anthony Andrades领导业务部门进行重大转型。Andrades的职责是建立策略近景,并从翻新的角度剖析业务流动,包含数据中心的运作形式、构建和运行应用程序的各种形式,资产过期、配置和老本。除此之外,他还负责管理与大规模数字化转型密切相关的文化转变。 早在2013年,施耐德电气便曾经进入了云生态系统时代,几个由业务驱动的我的项目悄悄在亚马逊AWS和微软Azure上线。其后,这些我的项目取得了胜利,并被大家所熟知,Andrades以此为根底,创立了一个企业级的云策略。到2016年,施耐德电气曾经扩充了其寰球 AWS 的覆盖范围,将其基础设施迁徙到云计算的工作也曾经开始。 对此,Andrades评估道:“通过四分之一个世纪的技术提高,咱们启动了一个历史上最要害的转变。通过对所有遗留零碎进行现代化革新,创立一个云原生微服务集群。咱们正变得更加麻利和翻新。” 早在2015年,施耐德电气的团队就未然意识到,Kubernetes是一种极具老本效益的形式,能够发明出基于微服务的面向服务的体系结构,谷歌、Facebook等大型数字企业创始了Kubernetes的先河。彼时,Kubernetes曾经在某些方面体现优异,然而仍旧存在一些问题,比方访问控制等。施耐德电气的几个客户开发团队须要不同的集群拜访权限,但这在某些场景下是无法控制的。因而,施耐德电气的团队临时停用了Docker,直至通用的PaaS平台上线。 施耐德电气的团队和Rancher的单干由来已久。2018年初,Andrades与Rancher以及Rancher的平安合作伙伴Aqua胜利进行了PoC。尔后,该团队开始在Kubernetes上应用Rancher,以提供Kubernetes的访问控制、身份治理和全球化性能指标。 “Google、Netflix、亚马逊和Facebook等世界上最先进的数字企业都在运行面向服务的体系结构,其中微服务畛域彼此齐全拆散,由地方进行集中管理。这是咱们最渴望能够达到的成果,Rancher则是整个旅程中尤为要害的一环。”Andrades补充道。 一场与时俱进的技术革新Benefits 自动化缩小了部署和治理工夫集成Aqua、RBAC和NaaS,领有极佳的安全性放慢技术团队的翻新Kubernetes一直增长的业务案例基于Rancher在PoC时的杰出体现,施耐德团队将Rancher作为施耐德容器治理平台的根底。2019年6月,施耐德容器治理平台部署运行了20个节点,并由此开展了施耐德容器治理平台的应用程序现代化过程。 像许多知名企业一样,施耐德经验了25年的技术倒退。随着工夫的推移,他们构建和部署了数千个独立的服务和应用程序,这些服务及利用程序运行在Windows Server或Red Hat上,在迁徙到云之前必须进行从新设计或从新构建。 Andrades的次要指标是在五年内实现所有应用程序的转换和迁徙。当这一指标波及数量宏大的应用程序,以及不同的应用程序须要不同的现代化办法时,施耐德的团队发现这并非易事。在2019年末,施耐德的团队开始了剖析整体应用程序的艰巨过程,依据最失当以及最无效的形式对每一个应用程序进行分类,推动应用程序现代化及迁徙。 对于一些要害的应用程序,现代化和迁徙将分阶段实现。应用程序将被“降级和转移”到云端,进行优化并作为服务提供。团队之后会从新设计应用程序。其余服务的则可能齐全服役并重建为微服务。例如,动态web服务器能够很容易地转换成Amazon S3 存储桶。如果波及到两层应用程序(web前端运行一个在后端有关系数据库的 UI),UI将在容器上运行,数据库则将迁徙至Amazon RDS。 在Andrades看来,这是施耐德业务撑持形式的全面转变,最终的指标是让施耐德的技术资产产生更大的价值,帮忙逾20年的反对生产过程的零碎实现现代化。Kubernetes和Rancher则是施耐德在这一技术革新过程中的最佳伴侣。 在Kubernetes,开发团队能够部署多个集群,每个集群都配置为特定的应用程序需要。在 Rancher,基础设施团队能够通过一个直观的平台并排运行这些定制的环境。至关重要的是,当与Aqua等其余解决方案一起应用时,Rancher将成为一个平安和兼容的环境,供外部和内部团队进行合作。通过在Rancher中轻松配置访问控制,基础设施团队能够对平台进行不受约束的拜访,这一办法极大地推动了团队翻新。 目前,这一我的项目尚处于起步阶段,然而Andrades曾经每天都从中受害。他面临着艰巨的工作:如果要实现其五年迁徙指标,他必须使一系列根本流程自动化,例如基于角色的访问控制(RBAC)、命名空间即服务、身份验证、应用程序目录等。Rancher为施耐德容器平台提供了他们所需的性能,极大地缩小了施耐德的团队的部署工作量。Andrades示意,开发人员无需放心安全性或操作流程,他们能够应用本人的流水线和存储库,无缝地运行其工作负载,Rancher和Aqua负责整体的安全控制。 Andrades和团队对于他们无需放心底层基础架构的事实尤为称心。如果有问题,他们会收到告诉。如果他们想疾速查看集群的状态,则能够查看仪表板以查看所有是否为绿色。他们无需持续查看性能、工作负载状态、资源应用状况,Rancher打消了手动累赘。Andrades置信,这使得团队可能更具备创造性地思考。 在过来的一年中,施耐德的团队曾经胜利地迁徙了四个要害应用程序,并通过 Rancher平台在集群中治理这些应用程序。这一胜利促使团队扩充了Rancher平台的应用范畴,并将云中运行的节点数量减少了一倍。 一次企业文化的思维改革除了领导技术革新,Andrades 还负责管理迁徙到容器和云计算所引致的企业文化转型。 Andrades解释道:“这不仅仅是一场技术革新,还是一场文化转型。咱们的团队曾经建设了很久的方法论,所以通知他们‘嘿,你不再只须要一个应用程序的服务器’是一件十分重要的事件。咱们心愿公司能够上下同心地实现这段技术革新之旅。” 对于一些在过来几十年均从事技术工作的人来说,向云原生的转变是一个很大的挑战。根植于基础架构中的积重难返的开发方法与技术自身一样难以现代化,尤其是当技术自身仿佛正在取代工作的次要局部时。 因而,Andrades的重点是让开发者们置信,每个开发者都有机会建设全新的颠覆性技能。施耐德开发者的教训范畴涵盖了从初学者到专家的各个阶段,Andrades的工作是通过将公司的开发者汇集在一起,听取他们的故事,仔细观察他们是如何胜利地应用Kubernetes的,从而使现有的优良我的项目全球化。通过分享具体的技术特长和最佳实际,随同着长期的价值观植入,Andrades和他的团队坚信,他们将和衷共济,以技术推动公司的业务倒退。 施耐德电气和Rancher的关系将在可预感的将来变得愈发严密,近日,施耐德未然和Rancher续签了订阅合同,并将原先的20个节点扩大至40个节点,Rancher平台的使用率翻了一番。单方关系的加深,阐明了Andrades及其团队对施耐德容器治理平台充满信心,他们将从Rancher取得反对,并为施耐德电气、其客户和更宽泛的欧洲能源行业带来长期价值。

September 16, 2020 · 1 min · jiezi

关于kubernetes:人人都可以写弹性伸缩器DigitalOcean开源CPA-operator

Kubernetes提供了Horizontal Pod Autoscaler,它能够依据您提供的指标主动缩放资源(Deployment,ReplicationController,ReplicaSet,StatefulSet)中正本的数量。通常,所应用的度量规范是CPU /内存负载,对于大多数应用程序而言已足够。 Horizontal Pod Autoscaler的局限性在于它具备用于评估以下指标的硬编码算法: desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]如果您在缩放方面须要更大的灵活性,除了此算法之外,Horizontal Pod Autoscaler不能满足您的需要,则须要编写本人的缩放逻辑。 对于游戏服务器,按CPU负载或内存使用量进行扩大没有意义,即便您施行了自定义指标,缩放算法也不会以正当的形式进行缩放。游戏服务器应依据服务器上的玩家数量或心愿退出服务器的玩家数量进行伸缩。 Custom Pod Autoscaler (CPA)是 自定义Pod主动伸缩器框架的一部分。其容许更轻松,更快地开发Kubernetes主动伸缩器。通过应用此我的项目,能够扩大提供的Docker根本镜像并插入本人的逻辑,从而创立Custom Pod Autoscaler。 特点反对任何语言,环境和框架;惟一的要求是它必须可由Shell命令或HTTP申请启动。反对Horizontal Pod Autoscaler的所有配置选项(冷却窗口,同步周期等)容许疾速轻松地进行原型开发。摘除所有简单的Kubernetes API交互。公开HTTP REST API以与更宽泛的零碎/手动干涉集成。能够应用无限的Kubernetes API或生命周期常识编写主动伸缩器。在构建时或部署时进行配置。容许缩放到零或从零开始。能够在没有主节点拜访权限的状况下进行配置,能够在EKS或GKE等托管提供程序上进行配置。工作原理Custom Pod Autoscaler 具备一个根本程序,该程序处理与用户逻辑的交互,例如,通过应用shell命令并将数据传递到其中。开发自定义Pod主动缩放器时,您须要为两个阶段定义逻辑: 指标收集-收集或生成指标;能够调用指标API,在本地运行计算并收回HTTP申请。评估指标-获取这些收集的指标,并应用它们来确定资源应具备多少个正本。这两个逻辑都是构建Custom Pod Autoscaler所需的所有自定义逻辑,根本程序将解决所有Kubernetes API交互以扩大/获取资源。 示例开发Custom Pod Autoscaler是一个简略而灵便的过程,它能够用您喜爱的任何一种语言实现,并且能够应用各种Docker镜像。对于本指南,咱们将构建一个简略的基于Python的主动缩放器,然而您能够采纳此处概述的原理并以任何语言实现主动缩放器,其余语言实现的示例。在本指南中,咱们将创立一个基于Python的Kubernetes主动缩放器。主动缩放器将依据资源标签numPods来工作,并将标签中提供的值作为目标值。这只是一个示例,但心愿能够让让您明确编写自定义主动扩缩器的原理和办法。能够在 python-custom-autoscaler 中查阅残缺代码。 1:创立工程 为我的项目python-custom-autoscaler创立一个新目录。 mkdir python-custom-autoscaler2:编写自定义Pod伸缩器的配置 咱们将为此主动缩放器设置Custom Pod Autoscaler配置,该配置将定义要运行的脚本,如何调用它们以及该脚本的超时工夫。创立一个新文件config.yaml: evaluate: type: "shell" timeout: 2500 shell: entrypoint: "python" command: - "/evaluate.py"metric: type: "shell" timeout: 2500 shell: entrypoint: "python" command: - "/metric.py"runMode: "per-resource"该配置文件指定了咱们要增加的两个脚本,即度量收集器和评估器-定义应通过shell命令调用它们,并且它们应在2500毫秒(2.5秒)后超时。还指定了runMode,咱们抉择了per-resource-这意味着度量规范收集将仅针对资源运行一次,并且将向度量规范脚本提供资源信息。每个Pod的一个代替选项是,它将为资源所具备的每个Pod运行度量收集脚本,并为该脚本提供独自的Pod信息。 ...

September 16, 2020 · 2 min · jiezi

关于kubernetes:Kubeprometheus-rules-报警规则-手工汉化

alertmanagergroups:- name: alertmanager.rules rules: - alert: Alertmanager配置不统一 annotations: message: '{{ $labels.cluster }} 集群Alertmanager集群的节点之间配置不同步 {{ $labels.service }}!' expr: | count_values("config_hash", alertmanager_config_hash{job="alertmanager-main",namespace="monitoring"}) BY (cluster, service) / ON(cluster, service) GROUP_LEFT() label_replace(max(prometheus_operator_spec_replicas{job="prometheus-operator",namespace="monitoring",controller="alertmanager"}) by (cluster, name, job, namespace, controller), "service", "alertmanager-$1", "name", "(.*)") != 1 for: 5m labels: severity: critical - alert: Alertmanager重载失败 annotations: message: '{{ $labels.cluster }} 集群在重载Alertmanager配置时失败 {{ $labels.namespace }}/{{ $labels.pod }}!' expr: | alertmanager_config_last_reload_successful{job="alertmanager-main",namespace="monitoring"} == 0 for: 10m labels: severity: warning - alert: Alertmanager成员不统一 annotations: message: '{{ $labels.cluster }} 集群Alertmanager未找到群集的所有成员!' expr: | alertmanager_cluster_members{job="alertmanager-main",namespace="monitoring"} != on (cluster,service) GROUP_LEFT() count by (cluster,service) (alertmanager_cluster_members{job="alertmanager-main",namespace="monitoring"}) for: 5m labels: severity: criticalapiservergroups:- name: kubernetes-system-apiserver rules: - alert: K8S的APISERVER潜在危险过高 annotations: message: '{{ $labels.cluster }} 集群 API server 的 {{ $labels.verb }} {{ $labels.resource }} 有异样提早 {{ $value }} 秒!' expr: | ( cluster:apiserver_request_duration_seconds:mean5m{job="apiserver"} > on (verb) group_left() ( avg by (verb) (cluster:apiserver_request_duration_seconds:mean5m{job="apiserver"} >= 0) + 2*stddev by (verb) (cluster:apiserver_request_duration_seconds:mean5m{job="apiserver"} >= 0) ) ) > on (verb) group_left() 1.2 * avg by (verb) (cluster:apiserver_request_duration_seconds:mean5m{job="apiserver"} >= 0) and on (verb,resource) cluster_quantile:apiserver_request_duration_seconds:histogram_quantile{job="apiserver",quantile="0.99"} > 1 for: 5m labels: severity: warning - alert: K8S的APISERVER潜在致命危险 annotations: message: '{{ $labels.cluster }} 集群 API server 的 {{ $labels.verb }} {{ $labels.resource }} 有 99% 的申请的提早达 {{ $value }} 秒!' expr: | cluster_quantile:apiserver_request_duration_seconds:histogram_quantile{job="apiserver",quantile="0.99"} > 4 for: 10m labels: severity: critical - alert: K8S的APISERVER存在返回谬误过高 annotations: message: '{{ $labels.cluster }} 集群 API server 申请中有 {{ $value | humanizePercentage }} 的返回谬误!' expr: | sum(rate(apiserver_request_total{job="apiserver",code=~"5.."}[5m])) / sum(rate(apiserver_request_total{job="apiserver"}[5m])) > 0.03 for: 10m labels: severity: critical - alert: K8S的APISERVER存在返回谬误 annotations: message: '{{ $labels.cluster }} 集群 API server 申请中有 {{ $value | humanizePercentage }} 的返回谬误!' expr: | sum(rate(apiserver_request_total{job="apiserver",code=~"5.."}[5m])) / sum(rate(apiserver_request_total{job="apiserver"}[5m])) > 0.01 for: 10m labels: severity: warning - alert: K8S的APISERVER资源存在返回谬误过高 annotations: message: '{{ $labels.cluster }} 集群 API server 的 {{ $labels.verb }} {{ $labels.resource }} {{ $labels.subresource }} 的申请中有 {{ $value | humanizePercentage }} 的返回谬误!' expr: | sum(rate(apiserver_request_total{job="apiserver",code=~"5.."}[5m])) by (resource,subresource,verb,cluster) / sum(rate(apiserver_request_total{job="apiserver"}[5m])) by (resource,subresource,verb,cluster) > 0.10 for: 10m labels: severity: critical - alert: K8S的APISERVER资源存在返回谬误 annotations: message: '{{ $labels.cluster }} 集群 API server 的 {{ $labels.verb }} {{ $labels.resource }} {{ $labels.subresource }} 的申请中有 {{ $value | humanizePercentage }} 的返回谬误!' expr: | sum(rate(apiserver_request_total{job="apiserver",code=~"5.."}[5m])) by (resource,subresource,verb,cluster) / sum(rate(apiserver_request_total{job="apiserver"}[5m])) by (resource,subresource,verb,cluster) > 0.05 for: 10m labels: severity: warning - alert: K8S客户端证书行将过期 annotations: message: '{{ $labels.cluster }} 集群一个 K8S 的客户端证书将在 7 天内过期!' expr: | apiserver_client_certificate_expiration_seconds_count{job="apiserver"} > 0 and histogram_quantile(0.01, sum by (job, le) (rate(apiserver_client_certificate_expiration_seconds_bucket{job="apiserver"}[5m]))) < 604800 labels: severity: warning - alert: K8S客户端证书24小时内过期 annotations: message: '{{ $labels.cluster }} 集群一个 K8S 的客户端证书将在 24 小时内过期!' expr: | apiserver_client_certificate_expiration_seconds_count{job="apiserver"} > 0 and histogram_quantile(0.01, sum by (job, le) (rate(apiserver_client_certificate_expiration_seconds_bucket{job="apiserver"}[5m]))) < 86400 labels: severity: critical - alert: APISERVER掉线 annotations: message: '{{ $labels.cluster }} 集群 Prometheus Targets 无奈发现 APISERVER!' expr: | absent(up{job="apiserver"} == 1) for: 15m labels: severity: criticalappsgroups:- name: kubernetes-apps rules: - alert: K8S容器组短时间内屡次重启 annotations: message: '{{ $labels.cluster }} 集群容器组 {{ $labels.namespace }}/{{ $labels.pod }} ({{ $labels.container }}) 在10分钟内重启了 {{ printf "%.2f" $value }} 次!' expr: | rate(kube_pod_container_status_restarts_total{job="kube-state-metrics"}[15m]) * 60 * 10 > 1 for: 10m labels: severity: critical# - alert: K8S容器组Terminated# annotations:# message: '{{ $labels.cluster }} 集群容器组 {{ $labels.namespace }}/{{ $labels.pod }} Terminated 起因是 {{ $labels.reason }}!'# expr: |# kube_pod_container_status_terminated_reason{reason!="Completed"} > 0# for: 15m# labels:# severity: warning# - alert: K8S容器组Completed# annotations:# message: '{{ $labels.cluster }} 集群容器组 {{ $labels.namespace }}/{{ $labels.pod }} Terminated 起因是 {{ $labels.reason }}!'# expr: |# kube_pod_container_status_terminated_reason{reason="Completed"} > 0# for: 15m# labels:# severity: none - alert: K8S容器组Waiting annotations: message: '{{ $labels.cluster }} 集群容器组 {{ $labels.namespace }}/{{ $labels.pod }} Waiting 起因是 {{ $labels.reason }}!' expr: | kube_pod_container_status_waiting_reason{reason!="ContainerCreating"} > 0 for: 3m labels: severity: critical - alert: K8S容器组调度失败 annotations: message: '{{ $labels.cluster }} 集群容器组 {{ $labels.namespace }}/{{ $labels.pod }} 无合乎预期工作节点,无奈被调度!' expr: | sum by (cluster,pod) (kube_pod_status_unschedulable) > 0 for: 5m labels: severity: critical - alert: K8S容器组NotReady annotations: message: '{{ $labels.cluster }} 集群 {{ $labels.namespace }}/{{ $labels.pod }} 已处于 non-ready 状态超过15分钟!' expr: | sum by (namespace, pod, cluster) (max by(namespace, pod, cluster) (kube_pod_status_phase{job="kube-state-metrics", phase=~"Pending|Unknown"}) * on(namespace, pod, cluster) group_left(owner_kind) max by(namespace, pod, owner_kind, cluster) (kube_pod_owner{owner_kind!="Job"})) > 0 for: 15m labels: severity: critical - alert: K8S部署状态异样 annotations: message: '{{ $labels.cluster }} 集群部署的 {{ $labels.namespace }}/{{ $labels.deployment }} 状态异样,局部实例不可用已达15分钟!' expr: | kube_deployment_status_replicas_unavailable{cluster="prod"} != 0 for: 15m labels: severity: warning - alert: K8S部署版本号不匹配 annotations: message: '{{ $labels.cluster }} 集群部署的 {{ $labels.namespace }}/{{ $labels.deployment }} 部署版本号不匹配,这表明部署的部署过程失败,并且没有回滚达15分钟!' expr: | kube_deployment_status_observed_generation{job="kube-state-metrics"} != kube_deployment_metadata_generation{job="kube-state-metrics"} for: 15m labels: severity: critical - alert: K8S部署理论正本数与预期数不匹配 annotations: message: '{{ $labels.cluster }} 集群部署 {{ $labels.namespace }}/{{ $labels.deployment }} 部署的理论正本数与预期数不匹配超过15分钟!' expr: | kube_deployment_spec_replicas{job="kube-state-metrics"} != kube_deployment_status_replicas_available{job="kube-state-metrics"} for: 15m labels: severity: critical - alert: K8S有状态部署理论正本数与预期数不匹配 annotations: message: '{{ $labels.cluster }} 集群有状态部署 {{ $labels.namespace }}/{{ $labels.deployment }} 有状态部署的理论正本数与预期数不匹配超过15分钟!' expr: | kube_statefulset_status_replicas_ready{job="kube-state-metrics"} != kube_statefulset_status_replicas{job="kube-state-metrics"} for: 15m labels: severity: critical - alert: K8S有状态部署版本号不匹配 annotations: message: '{{ $labels.cluster }} 集群有状态部署的 {{ $labels.namespace }}/{{ $labels.deployment }} 有状态部署版本号不匹配,这表明有状态部署状态失败,并且没有回滚!' expr: | kube_statefulset_status_observed_generation{job="kube-state-metrics"} != kube_statefulset_metadata_generation{job="kube-state-metrics"} for: 15m labels: severity: critical - alert: K8S有状态部署更新未开展 annotations: message: '{{ $labels.cluster }} 集群有状态部署 {{ $labels.namespace }}/{{ $labels.statefulset }} 的更新未开展,发现以后本非更新版本!' expr: | max without (revision) ( kube_statefulset_status_current_revision{job="kube-state-metrics"} unless kube_statefulset_status_update_revision{job="kube-state-metrics"} ) * ( kube_statefulset_replicas{job="kube-state-metrics"} != kube_statefulset_status_replicas_updated{job="kube-state-metrics"} ) for: 15m labels: severity: critical - alert: K8S守护过程集开展失败 annotations: message: '{{ $labels.cluster }} 集群守护过程集 {{ $labels.namespace }}/{{ $labels.daemonset }} 只有预期容器组数的 {{ $value | humanizePercentage }} 的容器被调度并就绪!' expr: | kube_daemonset_status_number_ready{job="kube-state-metrics"} / kube_daemonset_status_desired_number_scheduled{job="kube-state-metrics"} < 1.00 for: 15m labels: severity: critical# - alert: K8S容器期待中# annotations:# message: '{{ $labels.cluster }} 集群容器组 {{ $labels.namespace }}/{{ $labels.pod }} 中的 {{ $labels.container}} 容器曾经再期待状态超过1小时!'# expr: |# sum by (cluster, namespace, pod, container) (kube_pod_container_status_waiting_reason{job="kube-state-metrics"}) > 0# for: 1h# labels:# severity: warning - alert: K8S守护过程集未被调度 annotations: message: '{{ $labels.cluster }} 集群守护过程集 {{ $labels.namespace }}/{{ $labels.daemonset }} 的 {{ $value }} 个容器组没有被调度!' expr: | kube_daemonset_status_desired_number_scheduled{job="kube-state-metrics"} - kube_daemonset_status_current_number_scheduled{job="kube-state-metrics"} > 0 for: 10m labels: severity: warning - alert: K8S守护过程集调度谬误 annotations: message: '{{ $labels.cluster }} 集群守护过程集 {{ $labels.namespace }}/{{ $labels.daemonset }} 的 {{ $value }} 个非预期的容器组正在运行!' expr: | kube_daemonset_status_number_misscheduled{job="kube-state-metrics"} > 0 for: 10m labels: severity: warning - alert: K8S定时工作运行中 annotations: message: '{{ $labels.cluster }} 集群定时工作 {{ $labels.namespace }}/{{ $labels.cronjob }} 曾经应用1小时工夫来实现工作!' expr: | time() - kube_cronjob_next_schedule_time{job="kube-state-metrics"} > 3600 for: 1h labels: severity: warning - alert: K8S工作实现 annotations: message: '{{ $labels.cluster }} 集群工作 {{ $labels.namespace }}/{{ $labels.cronjob }} 曾经应用1小时工夫来实现工作!' expr: | kube_job_spec_completions{job="kube-state-metrics"} - kube_job_status_succeeded{job="kube-state-metrics"} > 0 for: 1h labels: severity: warning - alert: K8S工作失败 annotations: message: '{{ $labels.cluster }} 集群工作 {{ $labels.namespace }}/{{ $labels.cronjob }} 曾经失败!' expr: | kube_job_failed{job="kube-state-metrics"} > 0 for: 15m labels: severity: warning - alert: K8S的HPA正本数不匹配 annotations: message: '{{ $labels.cluster }} 集群HPA {{ $labels.namespace }}/{{ $labels.hpa }} 与预期正本数不匹配曾经超过15分钟!' expr: | (kube_hpa_status_desired_replicas{job="kube-state-metrics"} != kube_hpa_status_current_replicas{job="kube-state-metrics"}) and changes(kube_hpa_status_current_replicas[15m]) == 0 for: 15m labels: severity: warning - alert: 侦测到K8S的HPA缩容 annotations: message: '{{ $labels.cluster }} 集群 HPA {{ $labels.namespace }}/{{ $labels.hpa }} 已触发缩容,可用正本数达到预期,以后预期 {{ printf "%.0f" $value }} !' expr: | (kube_hpa_status_desired_replicas{job="kube-state-metrics"} == kube_hpa_status_current_replicas{job="kube-state-metrics"}) and delta(kube_hpa_status_current_replicas[5m]) < 0 for: 1m labels: severity: none - alert: 侦测到K8S的HPA扩容 annotations: message: '{{ $labels.cluster }} 集群 HPA {{ $labels.namespace }}/{{ $labels.hpa }} 已触发扩容,可用正本数达到预期,以后预期 {{ printf "%.0f" $value }} !!' expr: | (kube_hpa_status_desired_replicas{job="kube-state-metrics"} == kube_hpa_status_current_replicas{job="kube-state-metrics"}) and delta(kube_hpa_status_current_replicas[5m]) > 0 for: 1m labels: severity: none - alert: K8S工作负载的HPA放弃满载 annotations: message: '{{ $labels.cluster }} 集群 HPA {{ $labels.namespace }}/{{ $labels.hpa }} 以限度最大正本数满载运行超过了15分钟!' expr: | kube_hpa_status_current_replicas{job="kube-state-metrics"} == kube_hpa_spec_max_replicas{job="kube-state-metrics"} for: 15m labels: severity: none - alert: K8S部署服务版本变更通告 annotations: message: '侦测到 {{ $labels.cluster }} 集群服务部署 {{ $labels.namespace }}/{{ $labels.deployment }} 部署 metadata 版本已更替,实列数以达到预设值。' expr: | (kube_deployment_status_observed_generation{job="kube-state-metrics"} == kube_deployment_metadata_generation{job="kube-state-metrics"}) and (kube_deployment_spec_replicas{job="kube-state-metrics"} == kube_deployment_status_replicas_available{job="kube-state-metrics"}) and changes(kube_deployment_status_observed_generation{job="kube-state-metrics"}[5m]) > 0 for: 1m labels: severity: none - alert: K8S部署服务版本变更异样 annotations: message: '侦测到 {{ $labels.cluster }} 集群服务部署 {{ $labels.namespace }}/{{ $labels.deployment }} 部署 metadata 版本已更替,实列在线数不匹配部署预设值,以后运行版本非新版本,或 HPA 已触发,或服务运行故障!' expr: | ((kube_deployment_status_observed_generation{job="kube-state-metrics"} != kube_deployment_metadata_generation{job="kube-state-metrics"}) or (kube_deployment_spec_replicas{job="kube-state-metrics"} != kube_deployment_status_replicas_available{job="kube-state-metrics"})) or ((kube_hpa_status_desired_replicas{job="kube-state-metrics"} != kube_hpa_status_current_replicas{job="kube-state-metrics"}) and changes(kube_hpa_status_current_replicas[15m]) != 0) and changes(kube_deployment_status_observed_generation{job="kube-state-metrics"}[5m]) > 0 for: 1m labels: severity: criticalcontroller-managergroups:- name: kubernetes-system-controller-manager rules: - alert: KubeControllerManager掉线 annotations: message: KubeControllerManager 从 Prometheus Targets 的发现中隐没! expr: | absent(up{job="kube-controller-manager"} == 1) for: 15m labels: severity: criticalgeneralgroups:- name: general.rules rules: - alert: Target掉线 annotations: message: '{{ $labels.cluster }} 集群命名空间 {{ $labels.namespace }} 中 {{ $labels.job }} 的 {{ printf "%.4g" $value }}% 个targets掉线!' expr: 100 * (count(up == 0) BY (cluster, job, namespace, service) / count(up) BY (cluster, job, namespace, service)) > 10 for: 10m labels: severity: warning - alert: Watchdog annotations: message: | 此警报旨在确认整个警报管道功能性的。这个警报始终处于触发状态,因而它应始终在Alertmanager中触发,并始终针对各类接收器发送。 expr: vector(1) labels: severity: nonekubeletgroups:- name: kubernetes-system-kubelet rules: - alert: K8S节点未就绪 annotations: message: '{{ $labels.cluster }} 集群K8S节点 {{ $labels.node }} 处于未就绪状态已超过15分钟!' expr: | kube_node_status_condition{job="kube-state-metrics",condition="Ready",status="true"} == 0 for: 15m labels: severity: warning - alert: K8S节点不可达 annotations: message: '{{ $labels.cluster }} 集群K8S节点 {{ $labels.node }} 不可达,一部分工作负载已从新调度!' expr: | kube_node_spec_taint{job="kube-state-metrics",key="node.kubernetes.io/unreachable",effect="NoSchedule"} == 1 labels: severity: warning - alert: Kubelet节点存在过多容器组 annotations: message: '{{ $labels.cluster }} 集群 Kubelet {{ $labels.node }} 节点曾经运行了其总量的 {{ $value | humanizePercentage }} 的容器组再这个节点上!' expr: | max(max(kubelet_running_pod_count{job="kubelet", metrics_path="/metrics"}) by(instance,cluster) * on(instance,cluster) group_left(node) kubelet_node_name{job="kubelet", metrics_path="/metrics"}) by(node,cluster) / max(kube_node_status_capacity_pods{job="kube-state-metrics"}) by(node,cluster) > 0.95 for: 15m labels: severity: warning - alert: Kubelet掉线 annotations: message: '{{ $labels.cluster }} 集群 Prometheus Targets 无奈发现 Kubelet {{ $labels.node }}!' expr: | absent(up{job="kubelet", metrics_path="/metrics"} == 1) for: 15m labels: severity: criticalnetworkgroups:- name: node-network rules: - alert: Node网络网卡抖动 annotations: message: '{{ $labels.cluster }} 集群侦测到 node-exporter {{ $labels.namespace }}/{{ $labels.pod }} 节点上的网卡 {{ $labels.device }} 状态常常扭转!' expr: | changes(node_network_up{job="node-exporter",device!~"veth.+"}[2m]) > 2 for: 2m labels: severity: warning# - alert: 节点侦测到TCP已调配的套接字数量# expr: sum(avg_over_time(node_sockstat_TCP_alloc[5m])) by (instance,cluster) > 5000# for: 1m# labels:# severity: critical# annotations:# message: '{{ $labels.cluster }} 集群 {{ $labels.instance }} 节点侦测到 TCP 已调配的套接字数量达到 {{ printf "%.0f" $value }}!'# - alert: 节点侦测到UDP应用中的套接字数量# expr: sum(avg_over_time(node_sockstat_UDP_inuse[5m])) by (instance,cluster) > 5000# for: 1m# labels:# severity: critical# annotations:# message: '{{ $labels.cluster }} 集群 {{ $labels.instance }} 节点侦测到UDP应用中的套接字数量达到 {{ printf "%.0f" $value }}!' - alert: 节点上行网络谬误 annotations: message: '{{ $labels.cluster }} 集群 {{ $labels.instance }} 节点的网络设备 {{ $labels.device }} 再过来2分钟内侦测到 {{ printf "%.0f" $value }} 的下载谬误!' expr: | increase(node_network_receive_errs_total[2m]) > 10 for: 5m labels: severity: warning - alert: 节点上行网络谬误 annotations: message: '{{ $labels.cluster }} 集群 {{ $labels.instance }} 节点的网络设备 {{ $labels.device }} 再过来2分钟内侦测到 {{ printf "%.0f" $value }} 的上传谬误!' expr: | increase(node_network_transmit_errs_total[2m]) > 10 for: 5m labels: severity: warning - alert: 节点上行带宽过高 annotations: message: '{{ $labels.cluster }} 集群 {{ $labels.instance }} 节点的网络设备 {{ $labels.device }} 下载带宽超过 > 100MB/s' expr: | sum by (icluster,instance) (irate(node_network_receive_bytes_total[2m])) / 1024 / 1024 > 100 for: 5m labels: severity: warning - alert: 节点上行带宽过高 annotations: message: '{{ $labels.cluster }} 集群 {{ $labels.instance }} 节点的网络设备 {{ $labels.device }} 上传带宽超过 > 100MB/s' expr: | sum by (cluster,instance) (irate(node_network_transmit_bytes_total[2m])) / 1024 / 1024 > 100 for: 5m labels: severity: warning - alert: 节点上行丢包率过高 annotations: message: '{{ $labels.cluster }} 集群 {{ $labels.instance }} 节点3分钟内上行丢包率超过达到 {{ printf "%.0f" $value }}%!' expr: | sum by (instance,cluster) (irate(node_network_receive_drop_total[3m])) / sum by (instance,cluster) (irate(node_network_receive_packets_total[3m])) * 100 > 80 for: 1m labels: severity: cirtical - alert: 节点上行丢包率过高 annotations: message: '{{ $labels.cluster }} 集群 {{ $labels.instance }} 节点3分钟内上行丢包率超过达到 {{ printf "%.0f" $value }}%!' expr: | sum by (instance,cluster) (irate(node_network_transmit_drop_total[3m])) / sum by (instance,cluster) (irate(node_network_transmit_packets_total[3m])) * 100 > 80 for: 1m labels: severity: cirticalprometheus-operatorgroups:- name: prometheus-operator rules: - alert: PrometheusOperatorReconcileErrors annotations: message: '{{ $labels.cluster }} 集群 {{ $labels.namespace }} 命名空间中协调 {{ $labels.controller }} 时产生谬误!' expr: | rate(prometheus_operator_reconcile_errors_total{job="prometheus-operator",namespace="monitoring"}[5m]) > 0.1 for: 10m labels: severity: warning - alert: PrometheusOperator节点lookup谬误 annotations: message: '{{ $labels.cluster }} 集群协调 Prometheus 时 {{ $labels.namespace }} 命名空间产生谬误!' expr: | rate(prometheus_operator_node_address_lookup_errors_total{job="prometheus-operator",namespace="monitoring"}[5m]) > 0.1 for: 10m labels: severity: warningprometheusgroups:- name: prometheus rules: - alert: Prometheus谬误的配置 annotations: message: '{{ $labels.cluster }} 集群 Prometheus {{$labels.namespace}}/{{$labels.pod}} 再重载配置时失败!' expr: | # Without max_over_time, failed scrapes could create false negatives, see # https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details. max_over_time(prometheus_config_last_reload_successful{job="prometheus-k8s",namespace="monitoring"}[5m]) == 0 for: 10m labels: severity: critical - alert: Prometheus告诉队列已满 annotations: message: Prometheus {{$labels.namespace}}/{{$labels.pod}} 的报警告诉队列已满! 30m. expr: | # Without min_over_time, failed scrapes could create false negatives, see # https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details. ( predict_linear(prometheus_notifications_queue_length{job="prometheus-k8s",namespace="monitoring"}[5m], 60 * 30) > min_over_time(prometheus_notifications_queue_capacity{job="prometheus-k8s",namespace="monitoring"}[5m]) ) for: 15m labels: severity: warning - alert: Prometheus在推送警报时产生谬误 annotations: message: '{{ $labels.cluster }} 集群 {{$labels.namespace}}/{{$labels.pod}} 在推送警报至某些 Alertmanager {{$labels.alertmanager}} 时呈现了 {{ printf "%.1f" $value }}% 的谬误!' expr: | ( rate(prometheus_notifications_errors_total{job="prometheus-k8s",namespace="monitoring"}[5m]) / rate(prometheus_notifications_sent_total{job="prometheus-k8s",namespace="monitoring"}[5m]) ) * 100 > 1 for: 15m labels: severity: warning - alert: Prometheus在推送警报时全副谬误 annotations: message: '{{ $labels.cluster }} 集群 {{$labels.namespace}}/{{$labels.pod}} 在推送警报至全副 Alertmanager {{$labels.alertmanager}} 时呈现了 {{ printf "%.1f" $value }}% 的谬误!' expr: | min without(alertmanager) ( rate(prometheus_notifications_errors_total{job="prometheus-k8s",namespace="monitoring"}[5m]) / rate(prometheus_notifications_sent_total{job="prometheus-k8s",namespace="monitoring"}[5m]) ) * 100 > 3 for: 15m labels: severity: critical - alert: Prometheus未连贯Alertmanagers annotations: message: '{{ $labels.cluster }} 集群 Prometheus {{$labels.namespace}}/{{$labels.pod}} 没有连贯到任何 Alertmanagers!' expr: | max_over_time(prometheus_notifications_alertmanagers_discovered{job="prometheus"}[5m]) < 1 for: 10m labels: severity: warning - alert: PrometheusTSDB重载失败 annotations: message: '{{ $labels.cluster }} 集群在过来的3小时内 Prometheus {{$labels.namespace}}/{{$labels.pod}} 侦测到 {{$value | humanize}} 个重载谬误!' expr: | increase(prometheus_tsdb_reloads_failures_total{job="prometheus-k8s",namespace="monitoring"}[3h]) > 0 for: 4h labels: severity: warning - alert: PrometheusTSDB压缩失败 annotations: message: '{{ $labels.cluster }} 集群在过来的3小时内 Prometheus {{$labels.namespace}}/{{$labels.pod}} has detected {{$value | humanize}} 个压缩谬误!' expr: | increase(prometheus_tsdb_compactions_failed_total{job="prometheus-k8s",namespace="monitoring"}[3h]) > 0 for: 4h labels: severity: warning - alert: Prometheus没有采集到数据样本 annotations: message: '{{ $labels.cluster }} 集群 Prometheus {{$labels.namespace}}/{{$labels.pod}} 没有采集到数据样本!' expr: | rate(prometheus_tsdb_head_samples_appended_total{job="prometheus-k8s",namespace="monitoring"}[5m]) <= 0 for: 10m labels: severity: warning - alert: Prometheus反复的工夫戳 annotations: message: '{{ $labels.cluster }} 集群 Prometheus {{$labels.namespace}}/{{$labels.pod}} 正在抛弃 {{ printf "%.4g" $value }} 领有雷同工夫戳不同数据的数据样本!' expr: | rate(prometheus_target_scrapes_sample_duplicate_timestamp_total{job="prometheus-k8s",namespace="monitoring"}[5m]) > 0 for: 10m labels: severity: warning - alert: Prometheus工夫戳超过限度 annotations: message: '{{ $labels.cluster }} 集群 Prometheus {{$labels.namespace}}/{{$labels.pod}} 正在抛弃 {{ printf "%.4g" $value }} 超过工夫戳限度的数据样本!' expr: | rate(prometheus_target_scrapes_sample_out_of_order_total{job="prometheus-k8s",namespace="monitoring"}[5m]) > 0 for: 10m labels: severity: warning - alert: Prometheus近程存储失败 annotations: message: '{{ $labels.cluster }} 集群 Prometheus {{$labels.namespace}}/{{$labels.pod}} 在推送至数据都队列 {{$labels.queue}} 数据时有 {{ printf "%.1f" $value }}% 的谬误!' expr: | ( rate(prometheus_remote_storage_failed_samples_total{job="prometheus-k8s",namespace="monitoring"}[5m]) / ( rate(prometheus_remote_storage_failed_samples_total{job="prometheus-k8s",namespace="monitoring"}[5m]) + rate(prometheus_remote_storage_succeeded_samples_total{job="prometheus-k8s",namespace="monitoring"}[5m]) ) ) * 100 > 1 for: 15m labels: severity: critical - alert: Prometheus近程数据写落后 annotations: message: '{{ $labels.cluster }} 集群 Prometheus {{$labels.namespace}}/{{$labels.pod}} 近程写落后于队列 {{$labels.queue}} {{ printf "%.1f" $value }} 秒!' expr: | # Without max_over_time, failed scrapes could create false negatives, see # https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details. ( max_over_time(prometheus_remote_storage_highest_timestamp_in_seconds{job="prometheus-k8s",namespace="monitoring"}[5m]) - on(job, instance) group_right max_over_time(prometheus_remote_storage_queue_highest_sent_timestamp_seconds{job="prometheus-k8s",namespace="monitoring"}[5m]) ) > 120 for: 15m labels: severity: critical - alert: Prometheus近程写预期切片 annotations: message: '{{ $labels.cluster }} 集群 Prometheus {{$labels.namespace}}/{{$labels.pod}} 近程写的预期切片数预计须要 {{ $value }} shards, 大于最大值 {{ printf `prometheus_remote_storage_shards_max{instance="%s",job="prometheus-k8s",namespace="monitoring"}` $labels.instance | query | first | value }}!' expr: | # Without max_over_time, failed scrapes could create false negatives, see # https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details. ( max_over_time(prometheus_remote_storage_shards_desired{job="prometheus-k8s",namespace="monitoring"}[5m]) > max_over_time(prometheus_remote_storage_shards_max{job="prometheus-k8s",namespace="monitoring"}[5m]) ) for: 15m labels: severity: warning - alert: Prometheus规定谬误 annotations: message: '{{ $labels.cluster }} 集群在5分钟内 Prometheus {{$labels.namespace}}/{{$labels.pod}} 评估 {{ printf "%.0f" $value }} 条的规定失败!' expr: | increase(prometheus_rule_evaluation_failures_total{job="prometheus-k8s",namespace="monitoring"}[5m]) > 0 for: 15m labels: severity: critical - alert: Prometheus短少规定评估 annotations: message: '{{ $labels.cluster }} 集群在过来5分钟内 Prometheus {{$labels.namespace}}/{{$labels.pod}} 错过了 {{ printf "%.0f" $value }} 规定组评估!' expr: | increase(prometheus_rule_group_iterations_missed_total{job="prometheus-k8s",namespace="monitoring"}[5m]) > 0 for: 15m labels: severity: warningresourcegroups: - name: kubernetes-resources rules: - alert: K8S的CPU的Requests过载 annotations: message: '{{ $labels.cluster }} 群集对容器组的 CPU 资源 Requests 过载,并且无容忍策略,集群须要扩容!' expr: | sum(namespace:kube_pod_container_resource_requests_cpu_cores:sum) / sum(kube_node_status_allocatable_cpu_cores) > (count(kube_node_status_allocatable_cpu_cores)-1) / count(kube_node_status_allocatable_cpu_cores) for: 5m labels: severity: warning - alert: K8S的内存Requests过载 annotations: message: '{{ $labels.cluster }} 群集对容器组的内存资源Requests过载,并且无容忍策略,集群须要扩容!' expr: | sum(namespace:kube_pod_container_resource_requests_memory_bytes:sum) / sum(kube_node_status_allocatable_memory_bytes) > (count(kube_node_status_allocatable_memory_bytes)-1) / count(kube_node_status_allocatable_memory_bytes) for: 5m labels: severity: warning - alert: K8S工作节点的CPURequests过载 annotations: message: '{{ $labels.cluster }} 集群容器组对节点 {{ $labels.node }} 的 CPU 资源 Requests 以达到 {{ printf "%.0f" $value }}%!' expr: | sum by (node,cluster) (kube_pod_container_resource_requests_cpu_cores) / sum by (node,cluster) (node:node_num_cpu:sum) * 100 > 95 for: 5m labels: severity: warning - alert: K8S工作节点的均匀CPURequests过载 annotations: message: '{{ $labels.cluster }} 集群容器组对节点 {{ $labels.node }} 的 CPU 资源均匀 Requests 以达到 {{ printf "%.0f" $value }}%,可能导致无奈调度,{{ $labels.cluster }} 集群可能须要扩容!' expr: | avg by (cluster) (sum by (node,cluster) (kube_pod_container_resource_requests_cpu_cores) / sum by (node,cluster) (node:node_num_cpu:sum)) * 100 > 90 for: 5m labels: severity: warning - alert: K8S工作节点内存Requests过载 annotations: message: '{{ $labels.cluster }} 集群容器组对节点 {{ $labels.node }} 的内存资源 Requests 以达到 {{ printf "%.0f" $value }}%!' expr: | sum by (node,cluster) (kube_pod_container_resource_requests_memory_bytes) / sum by (node,cluster) (kube_node_status_allocatable_memory_bytes) * 100 > 95 labels: severity: warning - alert: K8S工作节点均匀内存Requests过载 annotations: message: '{{ $labels.cluster }} 集群容器组对节点 {{ $labels.node }} 的内存资源均匀 Requests 以达到 {{ printf "%.0f" $value }}%,可能导致无奈调度,{{ $labels.cluster }} 集群可能须要扩容!' expr: | avg by (cluster) (sum by (node,cluster) (kube_pod_container_resource_requests_memory_bytes) / sum by (node,cluster) (kube_node_status_allocatable_memory_bytes)) * 100 > 85 labels: severity: warning - alert: 'K8S的命名空间CPU过载' annotations: message: '{{ $labels.cluster }} 集群命名空间的CPU过载!' expr: | sum(kube_resourcequota{job="kube-state-metrics", type="hard", resource="cpu"}) / sum(kube_node_status_allocatable_cpu_cores) > 1.5 for: 5m labels: severity: warning - alert: K8S的命名空间内存过载 annotations: message: '{{ $labels.cluster }} 集群命名空间的内存过载!' expr: | sum(kube_resourcequota{job="kube-state-metrics", type="hard", resource="memory"}) / sum(kube_node_status_allocatable_memory_bytes{job="node-exporter"}) > 1.5 for: 5m labels: severity: warning - alert: K8S超过配额 annotations: message: '{{ $labels.cluster }} 集群命名空间 {{ $labels.namespace }} 已应用了其配额的 {{ $labels.resource }} {{ $value | humanizePercentage }}!' expr: | kube_resourcequota{job="kube-state-metrics", type="used"} / ignoring(instance, job, type) (kube_resourcequota{job="kube-state-metrics", type="hard"} > 0) > 0.90 for: 15m labels: severity: warning - alert: 有受限的CPU(CPU节流) annotations: message: '{{ $labels.cluster }} 集群命名空间 {{ $labels.namespace }} 的容器组 {{ $labels.pod }} 中的容器 {{ $labels.container }} 存在 {{ $value | humanizePercentage }} 受限 CPU(CPU节流)!' expr: | sum(increase(container_cpu_cfs_throttled_periods_total{container!="", }[5m])) by (container, pod, namespace,cluster) / sum(increase(container_cpu_cfs_periods_total{}[5m])) by (container, pod, namespace,cluster) > ( 100 / 100 ) for: 15m labels: severity: warning - alert: K8S容器组CPULimits%使用率高 annotations: message: '{{ $labels.cluster }} 集群命名空间 {{ $labels.namespace }} 的容器组 {{ $labels.pod }} 中的容器 {{ $labels.container }} CPU Limits %达到 {{ $value | humanizePercentage }} !' expr: | sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate) by (container,pod,namespace,cluster) / sum(kube_pod_container_resource_limits_cpu_cores) by (container,pod,namespace,cluster) > 1 for: 15m labels: severity: warning - alert: K8S容器组内存Limits%使用率高 annotations: message: '{{ $labels.cluster }} 集群命名空间 {{ $labels.namespace }} 的容器组 {{ $labels.pod }} 中的容器 {{ $labels.container }} 内存 Limits% 达到 {{ $value | humanizePercentage }} !' expr: | sum(container_memory_working_set_bytes) by (container,pod,namespace,cluster) / sum(kube_pod_container_resource_limits_memory_bytes) by (container,pod,namespace,cluster) > 1 for: 15m labels: severity: warning# - alert: K8S工作负载的HPA放弃满载并且资源均匀利用率高# annotations:# message: '{{ $labels.cluster }} 集群 HPA {{ $labels.namespace }}/{{ $labels.hpa }} 以限度正本数满载运行超过了15分钟,并且资源均匀利用率达 {{ $value }}% ,须要扩容!'# expr: |# kube_hpa_status_current_metrics_average_utilization > 95# and# kube_hpa_status_current_replicas{job="kube-state-metrics"}# ==# kube_hpa_spec_max_replicas{job="kube-state-metrics"}# for: 15m# labels:# severity: critical - alert: K8S工作负载CPULimits%使用率高 annotations: message: '{{ $labels.cluster }} 集群命名空间 {{ $labels.namespace }} 的 {{ $labels.workload_type }} 工作负载 {{ $labels.workload }} CPU Limits% 达到 {{ $value | humanizePercentage }} 可能触发 HPA!' expr: | sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate * on(namespace,pod,cluster) group_left(workload, workload_type) mixin_pod_workload) by (workload,workload_type,cluster,namespace) / sum(kube_pod_container_resource_limits_cpu_cores * on(namespace,pod,cluster) group_left(workload, workload_type) mixin_pod_workload) by (workload, workload_type,cluster,namespace) > 3.5 for: 15m labels: severity: warning - alert: K8S工作负载CPURequests%使用率达HPA扩容阈值 annotations: message: '{{ $labels.cluster }} 集群命名空间 {{ $labels.namespace }} 的 {{ $labels.workload_type }} 工作负载 {{ $labels.workload }} CPU Requests% 达到 {{ $value | humanizePercentage }} 达到 HPA 扩容条件!' expr: | sum( node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{namespace=~"prod|super", container!=""} * on(namespace,pod,cluster) group_left(workload, workload_type) mixin_pod_workload) by (workload,workload_type,cluster,namespace) / sum( kube_pod_container_resource_requests_cpu_cores{namespace=~"prod|super"} * on(namespace,pod,cluster) group_left(workload, workload_type) mixin_pod_workload) by (workload, workload_type,cluster,namespace) > 4 and count( sum( node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{namespace=~"prod|super", container!=""} * on(namespace,pod,cluster) group_left(workload, workload_type) mixin_pod_workload) by (workload,workload_type,pod,cluster,namespace) / sum( kube_pod_container_resource_requests_cpu_cores{namespace=~"prod|super"} * on(namespace,pod,cluster) group_left(workload, workload_type) mixin_pod_workload) by (workload, workload_type,pod,cluster,namespace) > 4) by (workload, workload_type,cluster,namespace) == count( sum( kube_pod_container_resource_requests_cpu_cores{namespace=~"prod|super"} * on(namespace,pod) group_left(workload, workload_type) mixin_pod_workload{namespace=~"prod|super"}) by (workload, workload_type,pod,cluster,namespace)) by (workload, workload_type,cluster,namespace) for: 30s labels: severity: none - alert: K8S工作负载内存Limits%使用率高 annotations: message: '{{ $labels.cluster }} 集群命名空间 {{ $labels.namespace }} 的 {{ $labels.workload_type }} 工作负载 {{ $labels.workload }} 内存 Limits% 达到 {{ $value | humanizePercentage }} 可能触发 HPA!' expr: | sum(container_memory_working_set_bytes * on(namespace,pod,container,cluster) group_left(workload, workload_type) mixin_pod_workload) by (workload, workload_type,cluster,namespace) / sum(kube_pod_container_resource_limits_memory_bytes * on(namespace,pod,cluster) group_left(workload, workload_type) mixin_pod_workload) by (workload, workload_type,cluster,namespace) > 1 for: 15m labels: severity: warning - alert: K8S工作负载内存Requests%使用率达HPA扩容阈值 annotations: message: '{{ $labels.cluster }} 集群命名空间 {{ $labels.namespace }} 的 {{ $labels.workload_type }} 工作负载 {{ $labels.workload }} 内存 Requests% 达到 {{ $value | humanizePercentage }} 达到 HPA 扩容条件!' expr: | (sum( container_memory_working_set_bytes{namespace=~"prod|super", container!=""} * on(namespace,pod,cluster) group_left(workload, workload_type) mixin_pod_workload) by (workload,workload_type,cluster,namespace) / sum( kube_pod_container_resource_requests_memory_bytes{namespace=~"prod|super"} * on(namespace,pod,cluster) group_left(workload, workload_type) mixin_pod_workload) by (workload, workload_type,cluster,namespace) > 1.1) and ((count( sum( container_memory_working_set_bytes{namespace=~"prod|super", container!=""} * on(namespace,pod,cluster) group_left(workload, workload_type) mixin_pod_workload) by (workload,workload_type,pod,cluster,namespace) / sum( kube_pod_container_resource_requests_memory_bytes{namespace=~"prod|super"} * on(namespace,pod,cluster) group_left(workload, workload_type) mixin_pod_workload) by (workload, workload_type,pod,cluster,namespace) > 1.1) by (workload, workload_type,cluster,namespace)) == (count( sum( kube_pod_container_resource_requests_memory_bytes{namespace=~"prod|super"} * on(namespace,pod) group_left(workload, workload_type) mixin_pod_workload{namespace=~"prod|super"}) by (workload, workload_type,pod,cluster,namespace)) by (workload, workload_type,cluster,namespace))) for: 30s labels: severity: noneschedulergroups:- name: kubernetes-system-scheduler rules: - alert: K8SScheduler掉线 annotations: message: KubeScheduler 从 Prometheus Targets 的发现中隐没! expr: | absent(up{job="kube-scheduler"} == 1) for: 15m labels: severity: criticalstoragegroup:- name: kubernetes-storage rules: - alert: K8S的PV使用量警报 annotations: message: '{{ $labels.cluster }} 集群命名空间 {{ $labels.namespace }} 中被PVC {{ $labels.persistentvolumeclaim }} 申明的的PV只剩下 {{ $value | humanizePercentage }} 闲暇!' expr: | kubelet_volume_stats_available_bytes{job="kubelet", metrics_path="/metrics"} / kubelet_volume_stats_capacity_bytes{job="kubelet", metrics_path="/metrics"} < 0.03 for: 1m labels: severity: critical - alert: KubePersistentVolumeFullInFourDays annotations: message: '{{ $labels.cluster }} 集群通过抽样计算,命名空间 {{ $labels.namespace }} 中被PVC {{ $labels.persistentvolumeclaim }} 申明的的PV将在4天内用尽,以后残余 {{ $value | humanizePercentage }}!' expr: | ( kubelet_volume_stats_available_bytes{job="kubelet", metrics_path="/metrics"} / kubelet_volume_stats_capacity_bytes{job="kubelet", metrics_path="/metrics"} ) < 0.15 and predict_linear(kubelet_volume_stats_available_bytes{job="kubelet", metrics_path="/metrics"}[6h], 4 * 24 * 3600) < 0 for: 1h labels: severity: critical - alert: K8S的PV谬误 annotations: message: '{{ $labels.cluster }} 集群 PV {{ $labels.persistentvolume }} 的状态为 {{ $labels.phase }}!' expr: | kube_persistentvolume_status_phase{phase=~"Failed|Pending",job="kube-state-metrics"} > 0 for: 5m labels: severity: criticalsystemgroups: - name: kubernetes-system rules: - alert: 节点文件系统24小时内用完 annotations: message: '{{ $labels.cluster }} 集群的 {{ $labels.instance }} 节点的文件系统的 {{ $labels.device }} 设施只剩下 {{ printf "%.2f" $value }}% 可应用空间,速率计算可能在24小时内填满!' expr: | ( node_filesystem_avail_bytes{job="node-exporter",fstype!=""} / node_filesystem_size_bytes{job="node-exporter",fstype!=""} * 100 < 40 and predict_linear(node_filesystem_avail_bytes{job="node-exporter",fstype!=""}[6h], 24*60*60) < 0 and node_filesystem_readonly{job="node-exporter",fstype!=""} == 0 ) for: 1h labels: severity: warning - alert: 节点文件系统4小时内用完 annotations: message: '{{ $labels.cluster }} 集群的 {{ $labels.instance }} 节点的文件系统的 {{ $labels.device }} 设施只剩下 {{ printf "%.2f" $value }}% 可应用空间,速率计算可能在4小时内填满!' expr: | ( node_filesystem_avail_bytes{job="node-exporter",fstype!=""} / node_filesystem_size_bytes{job="node-exporter",fstype!=""} * 100 < 20 and predict_linear(node_filesystem_avail_bytes{job="node-exporter",fstype!=""}[6h], 4*60*60) < 0 and node_filesystem_readonly{job="node-exporter",fstype!=""} == 0 ) for: 1h labels: severity: critical - alert: 节点文件系统只剩下不到5% annotations: message: '{{ $labels.cluster }} 集群的 {{ $labels.instance }} 节点的文件系统的 {{ $labels.device }} 设施只剩下 {{ printf "%.2f" $value }}% 可应用空间!' expr: | ( node_filesystem_avail_bytes{job="node-exporter",fstype!=""} / node_filesystem_size_bytes{job="node-exporter",fstype!=""} * 100 < 5 and node_filesystem_readonly{job="node-exporter",fstype!=""} == 0 ) for: 1h labels: severity: warning - alert: 节点文件系统只剩下不到3% annotations: message: '{{ $labels.cluster }} 集群的 {{ $labels.instance }} 节点的文件系统的 {{ $labels.device }} 设施只剩下 {{ printf "%.2f" $value }}% 可应用空间!' expr: | ( node_filesystem_avail_bytes{job="node-exporter",fstype!=""} / node_filesystem_size_bytes{job="node-exporter",fstype!=""} * 100 < 3 and node_filesystem_readonly{job="node-exporter",fstype!=""} == 0 ) for: 1h labels: severity: critical - alert: 节点挂载的文件系统闲暇的文件节点个数24小时内用完 annotations: message: '{{ $labels.cluster }} 集群的 {{ $labels.instance }} 节点的文件系统的 {{ $labels.device }} 设施只剩下 {{ printf "%.2f" $value }}% 可应用空间,速率计算可能在24小时内填满!' expr: | ( node_filesystem_files_free{job="node-exporter",fstype!=""} / node_filesystem_files{job="node-exporter",fstype!=""} * 100 < 40 and predict_linear(node_filesystem_files_free{job="node-exporter",fstype!=""}[6h], 24*60*60) < 0 and node_filesystem_readonly{job="node-exporter",fstype!=""} == 0 ) for: 1h labels: severity: warning - alert: 节点挂载的文件系统闲暇的文件节点个数4小时内用完 annotations: message: '{{ $labels.cluster }} 集群的 {{ $labels.instance }} 节点的文件系统的 {{ $labels.device }} 设施只剩下 {{ printf "%.2f" $value }}% 可应用空间,速率计算可能在4小时内填满!' expr: | ( node_filesystem_files_free{job="node-exporter",fstype!=""} / node_filesystem_files{job="node-exporter",fstype!=""} * 100 < 20 and predict_linear(node_filesystem_files_free{job="node-exporter",fstype!=""}[6h], 4*60*60) < 0 and node_filesystem_readonly{job="node-exporter",fstype!=""} == 0 ) for: 1h labels: severity: critical - alert: 节点挂载的文件系统闲暇的文件节点个数不到5% annotations: message: '{{ $labels.cluster }} 集群的 {{ $labels.instance }} 节点的文件系统的 {{ $labels.device }} 设施只剩下 {{ printf "%.2f" $value }}% 可应用空间!' expr: | ( node_filesystem_files_free{job="node-exporter",fstype!=""} / node_filesystem_files{job="node-exporter",fstype!=""} * 100 < 5 and node_filesystem_readonly{job="node-exporter",fstype!=""} == 0 ) for: 1h labels: severity: warning - alert: 节点挂载的文件系统闲暇的文件节点个数不到3% annotations: message: '{{ $labels.cluster }} 集群的 {{ $labels.instance }} 节点的文件系统的 {{ $labels.device }} 设施只剩下 {{ printf "%.2f" $value }}% 可应用空间!' expr: | ( node_filesystem_files_free{job="node-exporter",fstype!=""} / node_filesystem_files{job="node-exporter",fstype!=""} * 100 < 3 and node_filesystem_readonly{job="node-exporter",fstype!=""} == 0 ) for: 1h labels: severity: critical - alert: 节点CPU应用大于85% expr: 100 - (avg by(cluster,instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85 for: 3m labels: severity: critical annotations: message: '{{ $labels.cluster }} 集群 {{ $labels.instance }} 节点 CPU 使用率在 3m 内继续达到 {{ printf "%.0f" $value }}%!' - alert: 节点内存闲暇低 annotations: message: '{{ $labels.cluster }} 集群 {{ $labels.instance }} 节点侦测到内存使用率在 3m 内继续达到 {{ printf "%.0f" $value }}%!' expr: | 100 - ( node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 ) > 85 for: 3m labels: severity: critical - alert: 侦测到OOM触发行为 annotations: message: '{{ $labels.cluster }} 集群 {{ $labels.instance }} 节点侦测到 OOM 行为!' expr: | node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 15 for: 3m labels: severity: critical# - alert: 节点侦测到文件描述符切换次数过高# expr: (rate(node_context_switches_total[5m])) / (count without(cpu, mode) (node_cpu_seconds_total{mode="idle"})) > 5000# for: 1m# labels:# severity: critical# annotations:# message: '{{ $labels.cluster }} 集群 {{ $labels.instance }} 节点侦测到文件描述符切换次数达到 {{ printf "%.0f" $value }} 次/s!'# - alert: 节点侦测到关上的文件描述符过多# expr: avg by (instance,cluster) (node_filefd_allocated) > 102400# for: 1m# labels:# severity: critical# annotations:# message: '{{ $labels.cluster }} 集群 {{ $labels.instance }} 节点侦测到关上的文件描述符达到 {{ printf "%.0f" $value }}!'timegroups:- name: node-time rules: - alert: 侦测到时钟偏差 annotations: message: '{{ $labels.cluster }} 集群 node-exporter {{ $labels.namespace }}/{{ $labels.pod }} 侦测到时钟偏差!' expr: | abs(node_timex_offset_seconds{job="node-exporter"}) > 0.05 for: 2m labels: severity: warningversiongroups:- name: node-time rules: - alert: 侦测到时钟偏差 annotations: message: '{{ $labels.cluster }} 集群 node-exporter {{ $labels.namespace }}/{{ $labels.pod }} 侦测到时钟偏差!' expr: | abs(node_timex_offset_seconds{job="node-exporter"}) > 0.05 for: 2m labels: severity: warning[root@iZrj99mogqud1ugmdysxvjZ rules]# cat k8s-version.ymlgroups:- name: kubernetes-system rules: - alert: K8S版本不匹配 annotations: message: '{{ $labels.cluster }} 集群存在 {{ $value }} 各不同的Kubernetes版本running!' expr: | count(count by (gitVersion) (label_replace(kubernetes_build_info{job!~"kube-dns|coredns"},"gitVersion","$1","gitVersion","(v[0-9]*.[0-9]*.[0-9]*).*"))) > 1 for: 15m labels: severity: warning - alert: K8S的APISERVER谬误 annotations: message: '{{ $labels.cluster }} 集群K8S API server client {{ $labels.job }}/{{ $labels.instance }} 存在 {{ $value | humanizePercentage }} 的申请谬误!' expr: | (sum(rate(rest_client_requests_total{code=~"5.."}[5m])) by (instance, job, cluster) / sum(rate(rest_client_requests_total[5m])) by (instance, job, cluster)) > 0.01 for: 15m labels: severity: warning

September 15, 2020 · 19 min · jiezi

关于kubernetes:阿里云-OpenYurt-成为-CNCF-沙箱项目加速原生-Kubernetes-边缘场景全覆盖

简介: 2020 年 9 月 9 号,经 CNCF 技术监督委员会投票一致同意,阿里巴巴云原生边缘计算平台 OpenYurt 正式成为 CNCF 沙箱级别我的项目(Sandbox Level Project),标记着 OpenYurt 在边缘计算场景中构建云原生基础设施的能力受到了行业的宽泛认可。 2020 年 9 月 9 号,经 CNCF 技术监督委员会投票一致同意,阿里巴巴云原生边缘计算平台 OpenYurt 正式成为 CNCF 沙箱级别我的项目(Sandbox Level Project),标记着 OpenYurt 在边缘计算场景中构建云原生基础设施的能力受到了行业的宽泛认可。 OpenYurt 我的项目地址:https://github.com/alibaba/openyurt OpenYurt 致力于将阿里云在云原生边缘计算畛域的大规模实践经验回馈给开源社区,减速云计算向边缘全面延长的过程,与社区共建将来云原生边缘计算架构的统一标准。 如何打造边缘基础设施成为新课题Gartner 预测,到 2022 年,超过 50% 的企业生成数据将在数据中心或云之外进行创立和解决,20% 的新工业控制系统将领有剖析和 AI 边缘推理能力,至多 50% 的现场物联网我的项目将应用容器进行边缘应用程序生命周期治理。边缘计算正在成为新时代网络、计算、存储、利用等近端整体解决方案的基础设施和根底能力。 然而,边缘计算规模和业务复杂度的日益晋升对效率、可靠性、资源利用率等能力提出了新的诉求。传统云计算中心集中存储、计算的模式曾经无奈满足边缘设施对于时效、容量、算力的需要,如何打造边缘基础设施成了一个新课题。 OpenYurt 应运而生,边缘场景全笼罩2017 年底,作为典型的边缘计算业务,阿里云物联网(IoT)和 CDN 服务正面临着产品规模的爆发式增长、运维复杂度急剧攀升、运维效率不高的“三难”地步,边缘利用运维管理模式的全面转型成为亟待解决的问题。 秉承“Extending your native Kubernetes to  Edge”的非侵入式设计理念,云原生边缘计算平台 OpenYurt 诞生于阿里云容器服务团队。与其余相似产品不同的是,OpenYurt 领有可实现边缘计算全场景笼罩的能力。在短短两年内,作为公共云服务 ACK@Edge 的外围框架,OpenYurt 已实现全网笼罩和本地笼罩的全场景落地,全网笼罩的利用场景如 CDN、音视频直播、物联网、物流、工业大脑、城市大脑等;本地笼罩的利用场景和案例如阿里云 LinkEdge、优酷、盒马、AIBox、银泰商城等,其中,帮忙优酷实现端到端提早升高 75%,机器老本节俭 50%;盒马鲜生实现新门店开服效率晋升 70%,资源老本节俭 50% 以上。 ...

September 14, 2020 · 1 min · jiezi

关于kubernetes:采用GitOps的11大原因

Kubernetes容许咱们单纯地应用申明性的配置文件来治理咱们的利用部署和其余基础设施组件(例如,咱们当初都是YAML开发者)。这使咱们可能把所有这些文件放到Git仓库中,而后把它挂到流水线上(Jenkins、GitLab等),流水线会把这些变动利用到集群上,而后就有了GitOps。如果你还不理解GitOps是什么,能够查看咱们之前公布过的文章:GitOps初阶指南:将DevOps扩大至K8S 为了使工作失常进行,咱们必须确保扭转集群的惟一办法是在Git仓库上提交。GitOps并不是专门针对Kubernetes的,同样的原理也能够利用于任何其余申明式配置管理的环境。 能够说,很多企业曾经开始采纳GitOps了,但当初是业界开始充分认识到其后劲的时候。所以,让咱们深刻理解一下它如此杰出的起因吧! 1、存储环境变更历史记录只有通过更新相应Git仓库中的配置,能力扭转应用环境。这将创立一个残缺的状态变动的历史记录,包含谁做了更改和为什么更改的记录。你能够通过正在应用的Git用户界面来读取历史记录。 2、轻松回滚到之前的状态一旦咱们所有的变更都被存储为Git历史记录,就能够很容易地将一个环境回滚到之前的任何状态。通过还原一些commit,咱们能够回到以前的工作状态。 3、保障部署平安一旦对集群的所有更改都通过GitOps repo,用户和继续集成(CI)流程就不须要再拜访集群了。这大大降低了攻击面,尤其是还能够缩小对Kubernetes API的网络拜访。 部署过程无论如何实现,都能够在集群外部运行,并从Git中拉取配置。其对API的拜访应用基于角色的访问控制(RBAC)进行限度。这极大地提高了集群的安全性,避免任何歹意的近程更改在API服务器上。 4、轻量化审批程序在批改生产环境时,开发人员总是不受信赖。因而在许多公司中都建设了四眼审批流程(four-eyes approval processes),不论是出于什么起因建设的审批流程,GitOps都提供了一个简略的办法来实现它们。 具体实现形式取决于你应用的Git服务器,但重点是给开发人员在Git repo上创立拉取申请的权力,同时给另一组人审查和合并的权力。大多数Git服务器都有一个很好的UI来查看批改和批准拉取申请——所以这个解决方案不仅便宜,而且对用户也相当敌对。 5、模块化架构GitOps有3个局部:Git repo、部署流程以及一个在Git repo中自动更新版本的过程。这三者能够互相独立演变或替换。 一边是一个组件在Git repo写入,另一边是一个组件在读取。Git repo的构造成为这些组件之间的桥梁。因为这是一个相当涣散的耦合,两边能够用不同的形式甚至不同的技术栈来实现。 6、独立于工具的架构第5点中提到的模块化能够看出GitOps架构是一个能够灵便组装最佳工具的架构。当然,任何风行的Git服务器都能够实现Git局部的工作,FluxCD或ArgoCD能够负责将repo同步到集群。JenkinsX是一个解决这个过程所有局部的工具,包含创立Git repos,并在构建新的Docker镜像时用新版本更新它们。 7、复用现有常识将 Git 置于部署流程的外围,能够充分利用大多数开发人员和运维人员曾经把握的 Git 常识。不须要新的工具来浏览部署历史或施行审批流程。所有的流程都是用大家都相熟的工具来实现的。 8、比拟不同的环境当你有一个从开发到用户接受度测试(UAT)再到生产的环境链时,跟踪这些环境之间的差别是一件很麻烦的事件。多亏了存储在Git repos中的申明式配置,它使得解决环境间差别就像比拟一组YAML文件一样简略。 咱们有十分棒的工具来做这件事,所以这将不再是一个问题。更重要的是,从头开始创立一个新的环境,就像复制和粘贴这些文件到一个新的repo中一样简略。 9、开箱即用的备份因为你的环境状态存储在Git中,如果Kubernetes上的etcd产生了什么事件,你也永远不会失落数据。因为它是你集群状态的天然备份。 10、像利用程序代码一样测试你的更改你能够用测试利用程序代码的形式来测试环境中可能呈现的破坏性变动。将更改放在一个分支上,而后在其上运行 CI 流水线。你的 CI 工具将可能运行测试,并依据测试后果将 Git 中的 pull-request 状态设置为绿色或红色。一旦所有的货色都通过测试和审查,你就能够合并到master。 这听起来非常简单,但自动化测试是基础设施治理中常常被忽视的工作。尽管GitOps并没有让它变得更容易,但至多它为你提供了与你在其余中央应用的雷同的相熟工作流程。 11、高可用部署基础设施部署基础设施保持一致很重要。Git repo服务器通常曾经以复制、高可用的形式进行了设置。源代码是所有开发人员在大多数工夫都须要拜访的货色,所以应用Git作为部署的源码并不会给Git自身减少额定的累赘。

September 11, 2020 · 1 min · jiezi

关于kubernetes:Kubernetes-v119版本来了有哪些重磅更新

Kubernetes 1.19 版本终于来啦!这是2020年的第二个版本,也是迄今为止最长的公布周期,总共继续20周。它由33项加强性能组成。12个加强性能进入稳定版,18个加强性能进入测试版,13个加强性能进入alpha版。 将 Kubernetes 反对窗口减少到一年长期反对(LTS)工作组在2019年初进行的一项考察显示在以后的9个月反对期内,很大一部分 Kubernetes 用户未能降级。这一点以及考察中的其余反馈表明,如果将补丁反对期缩短至12-14个月,则30%的用户可能将其部署放弃在反对的版本上。无论用户应用的是自建版还是商业发行版,状况都是如此。因而,缩短反对期将导致超过 80% 的用户应用受反对的版本,而不是当初的 50-60%。一年一度的反对期可为用户提供所需的缓冲期,并且更合乎相熟的年度布局周期。从 Kubernetes 1.19 版本开始,反对窗口将缩短到一年。 贮存容量追踪传统上,Kubernetes 调度器基于这样的假如:集群中任何中央都能够应用额定的持久性存储,并具容量有限。拓扑束缚解决了第一点,但到目前为止,Pod 调度依然没有思考残余的存储容量可能不足以启动一个新的 pod。存储容量追踪是一个新的 Alpha 个性,它通过为 CSI 驱动程序增加一个 API 来解决这个问题,以报告存储容量,并在 Kubernetes 调度器中为 Pod 抉择节点时应用该信息。该性能可作为反对本地卷和其余容量限度较大的卷类型的动静预配置的根底。 通用长期存储Kubernetes 提供了卷插件,其生命周期与 Pod 绑定,可用作长期空间(例如内置的 emptydir 卷类型),也能够将一些数据加载到 Pod 中(例如内置的configmap 和 secret 卷类型)。新的通用暂存卷 alpha 性能容许任何现有的反对动静供给的存储驱动程序被用作 ephemeral 卷,并将该卷的生命周期绑定到 Pod。它能够用来提供不同于根磁盘的长期存储,例如长久内存或者该节点上的独立本地磁盘。反对所有用于卷供给的 StorageClass 参数。反对 PersistentVolumeClaims 反对的所有性能,如存储容量跟踪、快照和还原以及卷的大小调整。 CSI Volume 衰弱监测CSI 健康状况监控的 Alpha 版本随 Kubernetes 1.19 一起公布。该性能使 CSI 驱动程序可能与 Kubernetes 共享来自底层存储系统的异样卷情况,以便将其作为事件报告在 PVC 或 Pod 上。此性能是 Kubernetes 进行程序检测和解决单个卷衰弱问题的根底。 ...

September 10, 2020 · 1 min · jiezi

关于kubernetes:详细教程丨使用Prometheus和Thanos进行高可用K8S监控

本文转自Rancher Labs 介 绍Prometheus高可用的必要性在过来的几年里,Kubernetes的采纳量增长了数倍。很显著,Kubernetes是容器编排的不二抉择。与此同时,Prometheus也被认为是监控容器化和非容器化工作负载的绝佳抉择。监控是任何基础设施的一个重要关注点,咱们应该确保咱们的监控设置具备高可用性和高可扩展性,以满足一直增长的基础设施的需要,特地是在采纳Kubernetes的状况下。 因而,明天咱们将部署一个集群化的Prometheus设置,它不仅可能弹性应答节点故障,还能保障适合的数据存档,供当前参考。咱们的设置还具备很强的可扩展性,以至于咱们能够在同一个监控保护伞下逾越多个Kubernetes集群。 以后计划大部分的Prometheus部署都是应用长久卷的pod,而Prometheus则是应用联邦机制进行扩大。然而并不是所有的数据都能够应用联邦机制进行聚合,在这里,当你减少额定的服务器时,你往往须要一个机制来治理Prometheus配置。 解决办法Thanos旨在解决上述问题。在Thanos的帮忙下,咱们不仅能够对Prometheus的实例进行多重复制,并在它们之间进行数据去重,还能够将数据归档到GCS或S3等长期存储中。 施行过程Thanos 架构 图片起源: https://thanos.io/quick-tutor... Thanos由以下组件形成: Thanos sidecar:这是运行在Prometheus上的次要组件。它读取和归档对象存储上的数据。此外,它还治理着Prometheus的配置和生命周期。为了辨别每个Prometheus实例,sidecar组件将内部标签注入到Prometheus配置中。该组件可能在 Prometheus 服务器的 PromQL 接口上运行查问。Sidecar组件还能监听Thanos gRPC协定,并在gRPC和REST之间翻译查问。Thanos 存储:该组件在对象storage bucket中的历史数据之上实现了Store API,它次要作为API网关,因而不须要大量的本地磁盘空间。它在启动时退出一个Thanos集群,并颁布它能够拜访的数据。它在本地磁盘上保留了大量对于所有近程区块的信息,并使其与 bucket 放弃同步。通常状况下,在重新启动时能够平安地删除此数据,但会减少启动工夫。Thanos查问:查问组件在HTTP上监听并将查问翻译成Thanos gRPC格局。它从不同的源头汇总查问后果,并能从Sidecar和Store读取数据。在HA设置中,它甚至会对查问后果进行反复数据删除。HA组的运行时反复数据删除Prometheus是有状态的,不容许复制其数据库。这意味着通过运行多个Prometheus副原本进步高可用性并不易于应用。简略的负载平衡是行不通的,比方在产生某些解体之后,一个正本可能会启动,然而查问这样的正本会导致它在敞开期间呈现一个小的缺口(gap)。你有第二个正本可能正在启动,但它可能在另一个时刻(如滚动重启)敞开,因而在这些正本下面的负载平衡将无奈失常工作。 Thanos Querier则从两个正本中提取数据,并对这些信号进行反复数据删除,从而为Querier使用者填补了缺口(gap)。Thanos Compact组件将Prometheus 2.0存储引擎的压实程序利用于对象存储中的块数据存储。它通常不是语义上的并发平安,必须针对bucket 进行单例部署。它还负责数据的下采样——40小时后执行5m下采样,10天后执行1h下采样。Thanos Ruler基本上和Prometheus的规定具备雷同作用,惟一区别是它能够与Thanos组件进行通信。配 置后期筹备要齐全了解这个教程,须要筹备以下货色: 对Kubernetes和应用kubectl有肯定的理解。运行中的Kubernetes集群至多有3个节点(在本demo中,应用GKE集群)实现Ingress Controller和Ingress对象(在本demo中应用Nginx Ingress Controller)。尽管这不是强制性的,但为了缩小创立内部端点的数量,强烈建议应用。创立用于Thanos组件拜访对象存储的凭证(在本例中为GCS bucket)。创立2个GCS bucket,并将其命名为Prometheus-long-term和thanos-ruler。创立一个服务账户,角色为Storage Object Admin。下载密钥文件作为json证书,并命名为thanos-gcs-credentials.json。应用凭证创立Kubernetes sercretkubectl create secret generic thanos-gcs-credentials --from-file=thanos-gcs-credentials.json 部署各类组件部署Prometheus服务账户、Clusterroler和Clusterrolebinding apiVersion: v1kind: Namespacemetadata: name: monitoring---apiVersion: v1kind: ServiceAccountmetadata: name: monitoring namespace: monitoring---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRolemetadata: name: monitoring namespace: monitoringrules:- apiGroups: [""] resources: - nodes - nodes/proxy - services - endpoints - pods verbs: ["get", "list", "watch"]- apiGroups: [""] resources: - configmaps verbs: ["get"]- nonResourceURLs: ["/metrics"] verbs: ["get"]---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata: name: monitoringsubjects: - kind: ServiceAccount name: monitoring namespace: monitoringroleRef: kind: ClusterRole Name: monitoring apiGroup: rbac.authorization.k8s.io---以上manifest创立了Prometheus所需的监控命名空间以及服务账户、clusterrole以及clusterrolebinding。 ...

September 10, 2020 · 12 min · jiezi

关于kubernetes:Kubernetes网络插件CNI的基准测试

本文是对我之前的基准测试(2018年和2019年)的更新,该基准测试基于Kubernetes 1.19和Ubuntu 18.04,并于2020年8月更新了CNI版本。 1) 基准测试申明1.1) 自2019年4月以来的变动 ?测试您本人的集群:当初,您能够应用咱们的“ Kubernetes网络基准”工具公布的版本在您本人的集群上运行基准测试: knb (https://github.com/InfraBuilder/k8s-bench-suite)。欢送来到CNI战斗中的新挑战者:VMware Tanzu的“Antrea” 和 alauda.io的“Kube-OVN”新计划:此基准测试涵盖“ Pod-to-Pod”网络性能,但也波及到新的“ Pod-to-Service”计划,该计划波及理论测试案例。实际上,您的API容器将通过服务而不是容器IP耗费服务中的数据库(当然,咱们会在两种状况下都测试TCP和UDP)。资源耗费:当初,每个测试都有本人的资源比拟。删除了某些测试:咱们不再运行HTTP,FTP和SCP测试。咱们与社区和CNI维护者的行之有效的单干突显了iperf TCP后果与curl后果之间的差距,这是因为CNI启动的提早(在Pod启动的最后几秒钟,在理论应用案例中并不令人欣慰)。开源:所有基准测试源(脚本,CNI yml和原始后果)都能够在github上找到:https://github.com/InfraBuilder/benchmark-k8s-cni-2020-08。1.2) 基准测试协定整个协定在https://github.com/InfraBuilder/benchmark-k8s-cni-2020-08/blob/master/PROTOCOL.md中有具体阐明 请留神,以后文章仅关注具备默认内核的Ubuntu 18.04。 1.3) 抉择CNI作为基准该基准旨在比拟能够与单个yaml文件设置的CNI(因而不包含所有基于脚本的装置,如基于VPP的CNI等)。 咱们将比拟的CNI如下: Antrea v.0.9.1Calico v3.16Canal v3.16 (Flannel network + Calico Network Policies)Cilium 1.8.2Flannel 0.12.0Kube-router latest (2020–08–25)WeaveNet 2.7.02) CNI MTU tuning首先,咱们将查看MTU检测对TCP性能的影响: UDP的影响更加显著: 思考到此处显示的对性能的微小影响,咱们心愿向所有CNI维护者传播有意义的信息:请在CNI中施行MTU自动检测。 然而,如果您的确必须抉择未实现主动MTU的CNI,则须要本人对其进行调整以放弃性能。请留神,这实用于Calico, Canal 和 Weavenet。 3) CNI 基准测试 : 原始数据在本节中,咱们将比拟CNI与正确的MTU(自动检测或手动调整)。这里的次要指标是在图表中显示原始数据。 Gray : Reference (aka Bare metal)Green : bandwidth > 9 500 Mbit/sYellow : bandwidth > 9 000 Mbit/sOrange : bandwidth > 8 000 Mbit/sRed : bandwidth < 8 000 Mbit/sBlue : neutral (not-bandwidth related)3.1) Idle第一件事是在整个集群处于闲暇时建设CNI消耗量? ...

September 10, 2020 · 1 min · jiezi

关于kubernetes:Kubernetes笔记

1. 名词概念cluster:Cluster是计算、存储和网络资源的汇合,Kubernetes利用这些资源运行各种基于容器的利用。master:Master是Cluster的大脑,它的主要职责是调度,即决定将利用放在哪里运行。为了实现高可用,能够运行多个Master。node:Node的职责是运行容器利用。Node由Master治理,Node负责监控并汇报容器的状态,同时依据Master的要求治理容器的生命周期。pod:Pod是Kubernetes的最小工作单元。每个Pod蕴含一个或多个容器。Pod中的容器会作为一个整体被Master调度到一个Node上运行。controller:Kubernetes通常不会间接创立Pod,而是通过Controller来治理Pod的。Controller中定义了Pod的部署个性,比方有几个正本、在什么样的Node上运行等。为了满足不同的业务场景,Kubernetes提供了多种Controller,包含Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等。service:Kubernetes Service定义了外界拜访一组特定Pod的形式。Service有本人的IP和端口,Service为Pod提供了负载平衡。Deployment能够部署多个正本,每个Pod都有本人的IP,Service为外界拜访这些正本提供了解决形式。namespace:Namespace能够将一个物理的Cluster逻辑上划分成多个虚构Cluster,每个Cluster就是一个Namespace。不同Namespace里的资源是齐全隔离的。Kubernetes默认创立了两个Namespace:(1)default:创立资源时如果不指定,将被放到这个Namespace中。(2)kubesystem:Kubernetes本人创立的系统资源将放到这个Namespace中。kubectl:kubectl是Kubernetes集群的命令行工具,通过kubectl可能对集群自身进行治理,并可能在集群上进行容器化利用的装置部署。kubelet:kubelet 是运行在每个节点上的次要的“节点代理”,每个节点都会启动 kubelet过程,用来解决 Master 节点下发到本节点的工作,依照 PodSpec 形容来治理Pod 和其中的容器。kubelet的次要性能有:(1)pod治理,定期从所监听的数据源获取节点上 pod/container的冀望状态并治理执行。(2)容器健康检查,查看容器是否失常运行,如果容器运行出错依照重启策略解决。(3)资源监控,监控所在节点的资源应用状况,并定时向 master 报告,晓得整个集群所有节点的资源状况,对于 pod 的调度和失常运行至关重要。2. 架构k8s集群Cluster是计算、存储和网络资源的汇合,Kubernetes利用这些资源运行各种基于容器的利用。 2.1. master构造Master是KubernetesCluster的大脑,运行着的Daemon服务包含kubeapiserver、kubescheduler、kubecontrollermanager、etcd和Pod网络。 2.1.1. api serverk8s api server提供了k8s各类资源对象(pod,RC,Service等)的增删改查及watch等http rest接口,是整个零碎的数据总线和数据中心。像平时执行kubectl,理论是会将对资源的申请命令传递给api server。包含市场上有很多底层基于k8s的容器治理产品,都对api server的rest接口进行肯定封装,从而对k8s进行操作。 kubernetes api server的性能: 提供了集群治理的REST API接口(包含认证受权、数据校验以及集群状态变更);提供其余模块之间的数据交互和通信的枢纽(其余模块通过 api server查问或批改数据,只有 api server才间接操作etcd);是资源配额管制的入口;领有齐备的集群平安机制。2.1.2. schedulerScheduler负责决定将Pod放在哪个Node上运行。Scheduler在调度时会充分考虑Cluster的拓扑构造,以后各个节点的负载,以及利用对高可用、性能、数据亲和性的需要。 2.1.3. controller managerControllerManager负责管理Cluster各种资源,保障资源处于预期的状态。 ControllerManager由多种controller组成,包含replicationcontroller、endpointscontroller、namespacecontroller、serviceaccountscontroller等。不同的controller治理不同的资源。例如,replicationcontroller治理Deployment、StatefulSet、DaemonSet的生命周期,namespacecontroller治理Namespace资源。 2.1.4. etcdetcd负责保留KubernetesCluster的配置信息和各种资源的状态信息。当数据发生变化时,etcd会疾速地告诉Kubernetes相干组件。 2.2. node构造Node是Pod运行的中央,Kubernetes反对Docker、rkt等容器Runtime。Node上运行的Kubernetes组件有kubelet、kubeproxy和Pod网络。 2.2.1. kubeletkubelet是Node的agent,当Scheduler确定在某个Node上运行Pod后,会将Pod的具体配置信息(image、volume等)发送给该节点的kubelet,kubelet依据这些信息创立和运行容器,并向Master报告运行状态。 2.2.2. kube-proxyservice在逻辑上代表了后端的多个Pod,外界通过service拜访Pod。service接管到的申请是如何转发到Pod的呢?这就是kubeproxy要实现的工作。 每个Node都会运行kubeproxy服务,它负责将拜访service的TCP/UPD数据流转发到后端的容器。如果有多个正本,kubeproxy会实现负载平衡。 3. 部署服务k8s上的资源编排命令,都通过kubectl来执行,kubectl的命令有很多,这里侧重于解说两种部署形式。一种形式,通过kubectl的命令行来部署(kebectl run --optional);另一种形式,则通过启用残缺的yaml文件来部署和编排服务。 第一种形式更疾速便捷,但第二种形式更正式标准,上面都会做简略介绍。 3.1. kubectl命令kubectl 创建对象$ kubectl create -f ./my-manifest.yaml     #创立资源$ kubectl create -f ./my1.yaml -f ./my2.yaml    #应用多个文件创建资源$ kubectl create -f ./dir    #应用目录下的所有清单文件(yaml)来创立资源$ kubectl create -f https://git.io/vPieo    #应用url创立资源$ kubectl run nginx --image=nginx    #启动一个nginx实例$ kubectl explain pods    #获取pod和svc的文档kubectl 显示和查找资源$ kubectl get pods --all-namespaces    #列出所有namespace中的pod,也能够是services、deployment等$ kubectl get pods -o wide    #列出pod并显示详细信息$ kubectl get deployment my-dep    #列出指定daployment$ kubectl get pods --include-uninitialized    #列出该namespace中的所有pod,包含未初始化的应用具体输入来形容命令$ kubectl describe nodes <my-node IP or name>    #查看node节点信息$ kubectl describe pods <my-pod>    #查看pod详细信息$ kubectl get services --sort-by=.metadata.name --all-namespaces    #l列出所有service并按名称排序kubectl编辑资源$ kubectl -n codeus edit svc/c #编辑codeus命名空间下名称为c的servicekubectl Scale 资源$ kubectl scale --replicas=3 rs/foo #扩展名称为foo的资源到3个,是否应用rs取决于yaml中的编写kubectl 删除资源$ kubectl delete deployment <name>     #删除指定deployment,此办法还能够删除service等$ kubectl delete -f xxx.yaml    #通过创立此pod的yaml文件删除podkubectl 与运行中的pod交互$ kubectl -n <namespaces> logs my-podname    #查看pod日志, -f 继续查看$ kubectl port-forward my-podname 5000:6000    #转发pod中的6000端口到本地的5000端口$ kubectl exec my-podname -- ls /    #在已存在的容器中执行命令3.2. run部署根底部署的命令是 kubectl run: ...

September 10, 2020 · 4 min · jiezi

关于kubernetes:IngressNginx日志持久化与可视化多图预警

Ingress(Nginx)日志长久化与可视化(多图预警)[toc] 前言晚期咱们通常会应用goaccess或awstat来对nginx等拜访日志进行剖析和统计,但随着统计分析的多样性以及后续拜访日志的实时监控等定制化的需要越来越强烈,goaccess或awstat越来越不能满足咱们的需要.所以咱们急切须要更加灵便的日志统计分析工具,能辅助咱们对拜访日志进行统计、剖析和监控.这时候,随着elk/efk的广泛应用,nginx等拜访日志也将纳入到elk体系当中,同时elk也能满足咱们对日志的统计与剖析、监控的多样化需要.先上图 部署架构如图,以下是1个很简略的架构,也没有做缓冲和聚合,如果对日志的要求比拟高,能够在两头退出redis或Kafka 等. 为什么ingress或者nginx的日志要转换成json格局呢? 我这边简略的解释一下:,次要是2个起因: 1:便于联合elasticseach做实时监控和报警. 比方间接监控status字段,如果1分钟间断呈现20次4XX报错就间接报警,如果不转换的化,你还须要进一步解析access日志,这样带来了很多的不便. 2:便于联合elk做可视化剖析. 能够组合不同的字段,对不同的需要定制不同的可视化报表. 部署步骤一、ingress长久化步骤1. 自建kubernetes的ingress长久化ingress部署参考: https://www.pvcreate.com/index.php/archives/205/ (1) ingress增加PVC用于ingress日志存储kubectl apply -f ingress-nfs.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ingress-nfs spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi storageClassName: nfs-client-local (2) ingress增加挂载kubectl edit deployments.apps ingress-nginx-controller ...... volumeMounts: - mountPath: /data/log/ingress/ name: ingress-nfs ...... volumes: - name: ingress-nfs persistentVolumeClaim: claimName: ingress-nfs (3) ingress批改日志格局和存储地位kubectl edit configmaps ingress-nginx-controller ...

September 8, 2020 · 2 min · jiezi

关于kubernetes:Kubernetes源码分析阿里云Kubernetes关于HPA没有扩缩容的原因定位

最近应用阿里云的kubernetes容器服务,在一个利用上发现了HPA的一些奇怪的中央。如下图所示,以后使用率高于期望值使用率时,没有产生扩容事件,当以后使用率低于期望值使用率时,没有产生缩容事件。由此,通过源码剖析一下其中的过程。先大抵说下HPA的原理,当一个HPA被创立时,kubernetes外部会常见一个死循环,一直的去查看以后的metrics使用率与预期的使用率做比照。当达到扩容条件时,会扩容,而后期待3分钟才会持续下一次扩容,缩容是5分钟。当初问题来了,显著再上图中条件是达到了的,然而为什么扩容缩容都没有产生呢?翻阅Kubernetes源码发现了一个计算正本数的函数:https://github.com/kubernetes/kubernetes/blob/master/pkg/controller/podautoscaler/replica_calculator.go#L64GetResourceReplicas如下图通过一系列的pod衰弱状态判断后进入这段正本数的算法计算公式就是如官网提供的这段如下意思是用以后使用率与预期使用率之比,再乘以后正本数,向上取整数值就是预期的新正本数https://github.com/kubernetes/kubernetes/blob/6b388f06845009b8bd9963a8bd0796189b679486/pkg/controller/podautoscaler/metrics/utilization.go#L26其中上图正本数运算中的usageRatio是GetResourceUtilizationRatio函数的返回值这个函数的返回值,意思是以后使用率与预期使用率相除得出比率,如下图所以说咱们当初遇到的状况应道产生HPA行为,拿咱们的例子来说就是math.Ceil((118/110)2),比率运算约等于2.14545454而后向上取整数值该当是3,很显著应该扩容,而后math.Ceil((92/110)3),比率运算约等于2.609090909,向上取整应该是3,缩容的状况依据我的剖析,没有缩容对的,然而没有发扩容这是为什么呢?咱们提了一个阿里云工单,工单回复的算法与源码中的有出入,少了一个以后正本数的乘积运算,如下图是阿里云改了源码吗,还是我这菜鸡脱漏了一些kubernetes的一些其余的判断吗,心愿大佬们领导一下,不甚感谢!!

September 8, 2020 · 1 min · jiezi

关于kubernetes:k8s中部署kafkaeagle

k8s中部署kafka-eagle1.下载kafka-eagle镜像docker pull buzhiyun/kafka-eagle 2.部署mysql数据库mysql.yml apiVersion: v1kind: PersistentVolumeClaimmetadata: name: mysql-pv-claim namespace: infinovaiotspec: accessModes: - ReadWriteOnce resources: requests: storage: 30Gi---apiVersion: apps/v1kind: Deploymentmetadata: name: mysql namespace: infinovaiotspec: replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: 10.82.13.105/library/mysql:5.6 imagePullPolicy: IfNotPresent args: - "--ignore-db-dir=lost+found" ports: - containerPort: 3306 env: - name: POSTGRES_DB value: "kafka-eagle" - name: MYSQL_ROOT_PASSWORD value: "mysql" volumeMounts: - name: mysql mountPath: /var/lib/mysql/kafka-eagle volumes: - name: mysql persistentVolumeClaim: claimName: mysql-pv-claim---apiVersion: v1kind: Servicemetadata: name: tb-mysql namespace: infinovaiotspec: type: ClusterIP selector: app: mysql ports: - port: 3306 name: mysql---apiVersion: v1kind: Servicemetadata: name: mysql-client namespace: infinovaiotspec: type: NodePort ports: - port: 3306 targetPort: 3306 nodePort: 30006 selector: app: mysql--- 3.部署kafkakafka部署能够参考:https://github.com/Yolean/kub... ...

September 2, 2020 · 2 min · jiezi

关于kubernetes:Kubernetes-Operator基础入门

本文转自Rancher Labs 你是否已经想过SRE团队是如何无效地胜利治理简单的利用?在Kubernetes生态系统中,Kubernetes Operator能够给你答案。在本文中,咱们将钻研Operator是什么以及它们如何工作。 Kubernetes Operator这一概念是由CoreOS的工程师于2016年提出的,这是一种原生的形式来构建和驱动Kubernetes集群上的每一个利用,它须要特定畛域的常识。它提供了一种统一的办法,通过与Kubernetes API的严密单干,主动解决所有利用操作过程,而不须要任何人工干预。换句话说,Operator是一种包装、运行和治理Kubernetes利用的形式。 Kubernetes Operator模式遵循Kubernetes的外围准则之一:管制实践(control theory)。在机器人和自动化畛域,它是一种继续运行动静零碎的机制。它依赖于一种疾速调整工作负载需要的能力,进而可能尽可能精确地适应现有资源。其指标是开发一个具备必要逻辑的管制模型,以帮忙应用程序或零碎保持稳定。在Kubernetes世界中,这部分由controller解决。 在循环中,Controller是个非凡的软件,它能够对集群的变动做出响应,并执行适应动作。第一个Kubernetes controller是一个kube-controller-manager。它被认为是所有Operator的前身,Operator是起初建设的。 什么是Controller Loop?简略来说,Controller Loop是Controller动作的根底。设想一下,有一个非终止的过程(在Kubernetes中称为和解循环)在一直地产生,如下图所示: 这个过程至多察看一个Kubernetes对象,该对象蕴含无关所需状态的信息。比方: Deployment Services Secrets Ingress Config Maps 这些对象由JSON或YAML中的manifest组成的配置文件定义。而后controller依据内置逻辑,通过Kubernetes API进行继续调整,模拟所需状态,直到以后状态变成所需状态。 通过这种形式,Kubernetes通过解决一直的更改来解决Cloud Native零碎的动静性质。为达到预期状态而执行的批改实例包含: 留神到节点宕机时,要求更换新的节点。查看是否须要复制pods。如果须要,创立一个新的负载均衡器。Kubernetes Operator如何工作?Operator是一个特定应用程序的controller,它扩大了一个Kubernetes API,代替运维工程师或SRE工程师来创立、配置和治理简单的应用程序。在Kubernetes官网文档中对此有以下形容: Operator是Kubernetes的软件拓展,它利用自定义资源来管理应用程序及其组件。Operator遵循Kubernetes的准则,尤其遵循control loop。 到目前为止,你曾经理解Operator会利用察看Kubernetes对象的controller。这些controller有点不同,因为它们正在追踪自定义对象,通常称为自定义资源(CR)。CR是Kubernetes API的扩大,它提供了一个能够存储和检索结构化数据的中央——你的应用程序的冀望状态。整个操作原理如下图所示: Operator会继续跟踪与特定类型的自定义资源相干的集群事件。能够跟踪的对于这些自定义资源的事件类型有: AddUpdateDelete当Operator接管任何信息时,它将采取行动将Kubernetes集群或内部零碎调整到所需的状态,作为其在自定义controller中的和解循环(reconciliation loop)的一部分。 如何增加一个自定义资源自定义资源通过增加对你的利用有帮忙的新型对象来扩大Kubernetes性能。Kubernetes提供了两种向集群增加自定义资源的办法: 通过API Aggregation增加,这是一种高级办法,须要你建设本人的API服务器,但你有更多的管制权限。 通过自定义资源定义(CRD)增加,一种不须要简单编程常识就能够创立的简略形式,作为Kubernetes API服务器的扩大。 这两种计划满足了不同用户的需要,他们能够在灵活性和易用性之间进行抉择。Kubernetes社区对两者进行了比拟,将帮忙你决定哪种办法适宜你,但目前最受欢迎的选项是CRD: https://kubernetes.io/docs/co... 自定义资源定义(CRD)自定义资源定义(CRD)的呈现曾经有一段时间了,第一个次要的API标准是与Kubernetes 1.16.0一起公布的。上面的manifest介绍了一个例子: apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinitionmetadata: name: application.stable.example.com spec: group: stable.example.com version: v1 scope: Namespaced names: plural: application singular: applications kind: Application shortNames: - app 这个CRD能够让你创立一个名为“Application”的CR(咱们将会在下一个局部应用它)。前两行定义了apiVersion和你要创立的对象品种。 ...

September 1, 2020 · 1 min · jiezi

关于kubernetes:kubernetes中服务自定义指标

prometheus指标类型CounterCounter 类型代表一种样本数据枯燥递增的指标,即只增不减,除非监控零碎产生了重置。次要用于理解事件产生的速率的变动,通过PromQL函数能够提供相应的剖析,比方以 HTTP 利用申请量。 获取http申请的增长率rate(http_requests_total[5m])拜访前100的http申请地址topk(100,http_requests_total)次要蕴含两个办法 // 将Counter值加1Inc()// 将指定值加到counter上,如果指定值小于0会panicAdd()GuageGuage 类型代表一种样本数据能够任意变动的指标,即可增可减。罕用于像温度或者内存使用率这种指标数据,也能够示意能随时减少或缩小的“总数”,例如:以后并发申请的数量。通过PromQL函数能够提供相应的剖析 获取样本在一段时间内的变动状况计算 CPU 温度在1小时内的差别dalta(cpu_temp_celsius{host="zeus"}[1h])基于简略线性回归的形式,对样本数据的变化趋势做出预测基于 2 小时的样本数据,来预测主机可用磁盘空间在 4 个小时之后的残余状况predict_linear(node_filesystem_free{job="node"}[2h], 4 * 3600) < 0Histogram少数状况下偏向于应用某些量化指标的平均值,例如 CPU 的均匀使用率、页面的均匀响应工夫。这种形式的问题很显著,以零碎 API 调用的均匀响应工夫为例:如果大多数 API 申请都维持在 100ms 的响应工夫范畴内,而个别申请的响应工夫须要 5s,那么就会导致页面的响应工夫平局值过大,而这种景象被称为长尾问题 为了辨别是均匀的慢还是长尾的慢,最简略的形式就是依照申请提早的范畴进行分组。例如,统计提早在 0~10ms 之间的申请数有多少而 10~20ms 之间的申请数又有多少。 Histogram 在一段时间范畴内对数据进行采样(通常是申请持续时间或响应大小等),并将其计入可配置的存储桶(bucket)中,后续可通过指定区间筛选样本,也能够统计样本总数,最初个别将数据展现为直方图。 Histogram指标分为三种类型 样本的值散布在 bucket 中的数量,命名为 _bucket{le="<上边界>"}。这个值示意指标值小于等于上边界的所有样本数量// 在总共2次申请当中。http 申请响应工夫 <=0.005 秒 的申请次数为0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.005",} 0.0 // 在总共2次申请当中。http 申请响应工夫 <=0.01 秒 的申请次数为0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.01",} 0.0 // 在总共2次申请当中。http 申请响应工夫 <=0.025 秒 的申请次数为0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.025",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.05",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.075",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.1",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.25",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.5",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.75",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="1.0",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="2.5",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="5.0",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="7.5",} 2.0 // 在总共2次申请当中。http 申请响应工夫 <=10 秒 的申请次数为 2 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="10.0",} 2.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="+Inf",} 2.0所有样本值的大小总和,命名为 _sum// 理论含意:产生的2次 http 申请总的响应工夫为 13.107670803000001 秒 io_namespace_http_requests_latency_seconds_histogram_sum{path="/",method="GET",code="200",} 13.107670803000001样本总数,命名为 _count。值和 _bucket{le="+Inf"} 雷同// 理论含意:以后一共产生了 2 次 http 申请 io_namespace_http_requests_latency_seconds_histogram_count{path="/",method="GET",code="200",} 2.0SummarySummary 用于示意一段时间内的数据采样后果(通常是申请持续时间或响应大小等),但它间接存储了分位数(通过客户端计算,而后展现进去),而不是通过区间来计算。Summary 类型的样本也会提供三种指标 ...

August 31, 2020 · 2 min · jiezi

关于kubernetes:kubernetes-基础快速理解

kubernetes是什么?2014年,Google以Borg为根底,开源了kubernetes,简称k8s,一个以后最火的容器集群管理系统就此诞生。 官网:http://www.kubernets.io kubernetes三个外围性能Kubernetes - 调度kubernetes能够将容器放入集群中进行调度,比方有一个容器,须要2C2G的资源,kubernetes就会将这个容器主动的调度到集群闲暇或者有足够资源的节点上 Kubernetes - 主动复原kubernetes会对集群内的宿主机进行状态查看,如呈现故障,kubernetes会把运行在失败节点上的容器进行主动迁徙,迁徙到衰弱的资源节点下面 Kubernetes - 程度伸缩kubernetes有利用负载查看的能力,能够检测业务上所承当的负载,如果一个业务响应时长过高,或者负载很高,能够对该业务进行扩容 kubernetes个性自我修复在节点产生故障时,重启失败的容器,保障预期的正本数,并确保优雅高低线(容器启动中时不对外提供服务) 弹性伸缩依据一些指标(CPU、内存、负载等)配置主动扩容和缩容利用容器,保障在不同业务压力下的集群规模 主动部署和回滚k8s默认先部署新的容器,部署实现后,再替换老的容器,如果公布过程中产生故障,则回滚操作 服务发现和负载平衡k8s为多个容器提供对立入口(外部ip地址和一个dns名称),并负载关联所有容器,使得用户无需思考容器ip地址 秘密和配置管理治理秘密数据和应用程序配置,而不须要把敏感数据裸露在镜像里,进步敏感数据安全性,并能够将罕用的配置存储在k8s中,不便程序应用 存储编排挂载内部存储系统,无论来自本地存储、私有云(如oss)、还是网络存储,都能够作为集群资源的一部分应用,极大的进步存储应用的灵活性 定时工作提供一次性工作、定时工作,相似Linux服务器的crontab kubernetes架构kubernetes是一个比拟典型的二层架构, Master作为地方的管控节点,所有的UI、CLI、Node节点跟Master通信。UI CLI把想要的命令发给Master,Master将命令下发给Node节点进行最终的执行 kubernetes中所有的组件都会和API Server连贯,组件与组件之间,个别不进行独立的连贯,都依赖于API Server进行音讯的传送官网参考:https://kubernetes.io/docs/concepts/overview/components/ Master组件Master是集群的管制平台- master组件负责集群中的全局决策(如调度)- master组件探测并响应集群事件(当 Deployment 的理论 Pod 正本数未达到 replicas 字段的规定时,启动一个新的 Pod) Master组件能够运行在集群中的任何机器上,但为了简洁,通常会运行所有的master组件,且不在此机器上运行容器 kube-apiserver提供kubernetes的api,能够程度扩大以进步性能和高可用,kubctl等管理工具就是通过apiserver实现对kubernetes的治理 etcd分布式高可用的键值对存储组件,API server中所须要的元信息都被搁置在etcd,通过etcd保障kubernetes组件的高可用 kube-scheduler资源调度组件,监控所有新创建尚未调配到节点上的Pod,并且主动为Pod抉择一个适合的节点去运行调度的因素包含:- 单个或多个pod的资源申请 - 硬件、软件、策略的限度- 亲和性和反亲和性标准(affinity and anti-affinity specifications)- 数据本地化要求- 工作负载间相互作用 kube-controller-manager控制器过程组件,逻辑上来说,每个控制器是一个独立的过程,但为了升高复杂度,它们都被编译成一个二进制文件并在单个过程中运行这些组件包含:- 节点(Node)控制器:监听所有节点停机事件并作出响应- 正本(Replication)控制器:保护集群中的正本控制器对象所冀望的Pod正本数- 端点(Endpoints)控制器:为端点对象(joins Services & Pods)赋值- Service Account & Token控制器: 负责为新的名称空间创立 default Service Account 以及 API Access Token ...

August 29, 2020 · 1 min · jiezi

关于kubernetes:使用-K8s-进行作业调度实战分享

最近在公司的数据同步我的项目(以下简称 ZDTP)中,须要应用到散布式调度数据同步执行单元,目前应用的计划是将数据同步执行单元打包成镜像,应用 K8s 进行调度。 在 ZDTP 中,数据同步的动作可形象成一个执行单元(以下称为 worker),相似于线程执行单元 Runnable ,Runnable 放入一个队列中期待线程的调度执行,执行完 Runnable 即实现了它的使命。当用户在 ZDTP 控制台中创立同步工作并启动工作时,会依据同步工作的配置,产生若干个用于该工作的 worker,假如这些 worker 都在本地执行,能够将其包装成一个 Runnable,而后创立一个线程执行,如下图示意: 然而在单机模式下,就会遇到性能瓶颈,此时就须要散布式调度,将 worker 调度到其余机器执行: 问题是咱们如何将 worker 更好地调度到其它机器中执行呢? Worker 部署形式调研1、基于虚拟机部署 Worker Worker 在提前创立好的虚拟机中运行, 工作启动时须要依据以后 Worker 负载状况进行抉择闲暇的 Worker,相当于 Worker 是以 Agent 的模式运行,如下图示意: 随同而来的毛病次要有以下几点: Worker Agent 数量绝对固定,虚拟机创立老本高,扩/缩容麻烦;工作运行状况依赖 zk 监听机制,如果某个工作在运行中挂掉了,须要自行实现故障转移与主动重启机制,减少开发周期;Worker Agent 负载获取逻辑须要我的项目实现,准确获取负载信息实现难度大,减少开发周期。2、基于 K8s 部署 Worker 将 Worker 打包成 Docker 镜像,应用 K8s 对 worker 容器进行调度作业,并且一个 Worker 只运行一个工作,如下图示意: 应用 K8s 的长处如下: ...

August 27, 2020 · 3 min · jiezi

关于kubernetes:Kubernetes-v119-重磅发布-新版本核心主题-主要变化解读

K8sMeetup 中国社区第一工夫整顿了 v1.19 的亮点内容,为大家具体介绍此版本的次要性能。 作者:bot(才云)、Bach(才云)美国工夫 8 月 26 日,Kubernetes v1.19 正式公布,这是 2020 年的第二个新版本。受新冠疫情影响,本次版本更新距上次时隔 20 周,这让开发工作组和贡献者有更多工夫来实现工作,也有更多精力专一于 Kubernetes 我的项目之外的生存,从而保持良好的心理状态。 在他们的致力下,Kubernetes v1.19 蕴含 33 个加强性能:其中 12 个加强性能已趋于稳定,18 个进入 beta,13 个进入 alpha。 Major Themes新版本次要围绕以下主题: 将 Kubernetes 的反对周期缩短到一年2019 年初,Kubernetes 长期反对(LTS)工作组曾进行过一项考察。考察发现 Kubernetes 公布的版本通常只保护反对九个月,在保护周期内,很大一部分 Kubernetes 最终用户并没有降级。依据该考察以及考察的其余后果,工作组认为如果将新版本反对期限缩短至 12-14 个月,会帮忙 30% 的用户(无论是自建版还是商业发行版)在反对的版本上保留其部署。因而,缩短 Kubernetes 版本反对周期能够让超过 80% 的用户应用受反对的版本,而不是当初的 50-60%。 因而,从 Kubernetes v1.19 开始,新版本的反对周期将缩短至一年,这能够为最终用户提供所需的缓冲,并且与用户通常采纳的年度计划周期更加匹配。 贮存容量追踪Kubernetes 调度(Scheduling)个别基于以下假如:集群中的任何中央都能够应用附加的持久性存储,并具备有限容量。拓扑束缚解决了上述第一个问题,然而到目前为止,第二个问题还时有发生:有时 Sheduler 会因为没有思考残余的存储容量可能不足以启动新的 Pod,认为它还有可用资源,使节点被拖死,集群产生雪崩。 为了解决该问题,Kubernetes v1.19 推出了一项新的 Alpha 性能:存储容量跟踪。它能为 CSI 驱动程序增加 API 来报告存储容量,并在为 Pod 抉择节点时在 Kubernetes 调度程序中应用该信息。这个性能是反对为本地卷和其余受容量限度更大的卷类型进行动静预配置的基石。 ...

August 27, 2020 · 2 min · jiezi

关于kubernetes:kubernetes服务优雅停止

Graceful shutdown优雅进行(Graceful shutdown),在进行程序之前先实现资源清理工作。比方: 操作数据:清理、转移数据。数据库节点产生重启时须要思考反注册:程序退出之前告诉网关或服务注册核心,服务下线后再进行服务,此时不会有任何流量受到服务进行的影响。Prestop Hook个别状况当Pod进行后,k8s会把Pod从service中摘除,同时程序外部对SIGTERM信号进行解决就能够满足优雅进行的需要。但如果Pod通过注册核心向外裸露ip,并间接承受内部流量,则须要做一些额定的事件。此时就须要用到Prestop hook,目前kubernetes提供目前提供了 Exec 和 HTTP 两种形式,应用时须要通过 Pod 的 .spec.containers[].lifecycle.preStop 字段为 Pod 中的每个容器独自配置,比方: apiVersion: v1kind: Podmetadata: name: lifecycle-demospec: containers: - name: lifecycle-demo-container image: nginx lifecycle: preStop: exec: command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]pod删除流程为了不便了解Prestop Hook工作原理,上面阐明一下Pod的退出流程 API-Server承受到申请后更新Pod中的DeletionTimestamp以及DeletionGracePeriodSeconds。Pod 进入 Terminating 状态Pod会进行进行的相干解决 如果存在Prestop Hook,kubelet 会调用每个容器的 preStop hook,如果 preStop hook 的运行工夫超出了 grace period,kubelet 会发送 SIGTERM 并再等 2 秒(能够通过调整参数terminationGracePeriodSeconds以适应每个pod的退出流程,默认30s)kubelet 发送 TERM信号给每个container中的1号过程在优雅退出的同时,k8s 会将 Pod 从对应的 Service 上摘除grace period 超出之后,kubelet 发送 SIGKILL 给Pod中的所有运行容器;同上清理pause状态的containerKubelet向API-Server发送申请,强制删除Pod(通过将grace period设置为0)API Server删除Pod在etcd中的数据详情参考官网阐明:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/ ...

August 26, 2020 · 4 min · jiezi

关于kubernetes:Helm-v2的弃用时间表

向Lewis Carroll拍板致意... “The time has come,” the maintainers said, “To talk of software fates:Of upgrades -- and shipping Helm v3 -- Of bugfixes -- and k8s --”Helm v3于2019年11月公布,是社区为满足社区需要而不断改进的后果。凭借简化的客户端体验、对安全性的从新关注以及与Kubernetes API的更严密集成,Helm v3持续为Kubernetes提供通过生产测试的包治理。作为一个毕业的CNCF我的项目,Helm是云原生生态系统的要害局部。 咱们意识到,在生产环境中推出一个次要的版本变更须要工夫。Helm的维护者承诺在2020年5月之前为Helm v2提供bug修复(他们将其扩大到2020年8月),并在2020年11月之前为Helm v2提供安全补丁。当初bug修复窗口正在敞开;Helm v2.16.10将是最终的bug修复版本,2.17.0将更新下载地位。 这对Helm用户意味着什么? 2020年8月13日之后,你会看到这些变动: 如果你依然在应用Helm v2,你当初就会想要迁徙到Helm v3。Helm 3.2.4被宽泛应用并可用于生产。尽管基本上是向后兼容的,然而在执行迁徙时,你须要留神一些特定的更改。从当初开始,对Helm v2的继续反对仅限于将来三个月的安全补丁。这意味着咱们将不再承受任何拉申请,除非是通过验证的平安问题。stable和incubator的仓库将从2018年12月推出的Helm Hub上删除。在Helm Hub上找到你首选的仓库,将它们增加到配置中,并跟踪charts到新的扩散地位的迁徙。2020年11月13日之后,你会看到这些变动: 不再公布Helm v2(即便是安全补丁)没有进一步的更新Helmv2文件,文件将持续放弃,但可能进行针对v2的现有问题和新问题/PR将被敞开移交Helm公布和chart托管所有权到CNCF 社区发现Helm v3是一个极大改良的体验,并且如Helm-2to3插件的社区资源,能够帮忙你进行根本迁徙。请确保你在11月13日截止日期之前迁徙到Helmv3,因为不再接管安全补丁的操作软件是危险,最好防止。 咱们想借此机会感激社区中应用Helm或奉献问题或拉申请帮忙改善它的每个人。许多不适宜Helm自身的平凡想法,作为相干的生态系统我的项目却取得了很大的胜利。每次你向文档中提交更新,你都在帮忙其他人开始应用Helm,让他们更加高效。谢谢大家! Bridget Kromhout@bridgetkromhout 点击浏览网站原文。 CNCF (Cloud Native Computing Foundation)成立于2015年12月,隶属于Linux  Foundation,是非营利性组织。 CNCF(云原生计算基金会)致力于培养和保护一个厂商中立的开源生态系统,来推广云原生技术。咱们通过将最前沿的模式民主化,让这些翻新为公众所用。扫描二维码关注CNCF微信公众号。

August 26, 2020 · 1 min · jiezi

关于kubernetes:kubeadm简易安装k8s

简介本文次要目标是为摸索学习k8s提供一个简略的环境。学习如何应用kubeadm,在Vagrant治理的虚拟机上,装置一个繁难的3节点k8s集群。当然,理论环境的k8s集群不会这么简略,然而从能跑起来的最简装置学起更容易,也能理解k8s的根本组成部分。 1、根底软件装置k8s软件局部的装置次要是kubelet和kubectl,前者装置于每个节点上,用于连贯master节点获取信息,治理Pod,治理容器等。后者为查看、操作k8s的命令行工具。k8s反对多种容器运行环境,这里咱们抉择相熟的docker。最初,还须要装置kubeadm,用于构建一个最小化可用的k8s集群,蕴含了若干最佳化实际的内容。总之 kubelet kubeadm kubectl docker 这4个软件,就是k8s繁难装置须要的内容了。 kubelet 其实就有点像agent,每个节点都须要有,用于连贯server。装置步骤次要参考:https://developer.aliyun.com/mirror/kubernetes 首先是k8s yum源的增加,这里抉择阿里云的镜像源,国内装置会快很多。 cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF其次是软件的装置和一些配置,这里先把docker和kubelet配置为开机启动。而后敞开SELinux、敞开swap、批改内核参数、敞开防火墙。 ## 装置sudo yum install -y kubelet kubeadm kubectl docker #这里也要装置dockersudo systemctl enable docker && sudo systemctl start docker #先启动dockersudo systemctl enable kubelet #这里只配置主动启动,不必理论启动(此时还缺配置文件)## 配置sudo setenforce 0 #敞开SELinuxsudo swapoff -a && sed  -i '/swap/s/^/#/' /etc/fstab  #敞开swap,更改fstabsudo sysctl net.bridge.bridge-nf-call-iptables=1 sudo systemctl disable firewalld && sudo systemctl stop firewalld #敞开防火墙须要留神的是,kubelet在装置实现后,并不能间接启动,短少若干配置。(执行kubeadm时会生成),间接start可能会出各种问题,前面kubeadm init的时候会自行启动kubelet。这部分问题在本文最初对立提及。 2、k8s所需docker镜像获取k8s的控制面板次要由apiserver、controller-manager、scheduler、etcd四局部组成,部署在master节点上。coredns是k8s默认的DNS服务。kube-proxy,pause则部署在所有k8s节点上,kube-proxy与Service相干,而pause则是用来实现Pod内的命名空间共享等性能。上述这些组件在init初始化master节点时都会用到,能够应用 kubeadm config images list 查看镜像的具体需要,版本。 ...

August 25, 2020 · 2 min · jiezi

关于kubernetes:如何简洁优雅地部署PostgreSQL和Pgweb

本文转自Rancher Labs 介绍PostgreSQL和PgwebPostgreSQL是一款以可靠性和性能为人所熟知的开源数据库。它在很多行业和应用程序中都有利用,尤其是web开发人员的最爱。从node.js到Django再到Rails和Spring,所有支流web框架均原生反对PostgreSQL,所以其适应性在整个互联网的网站后盾零碎中是相当宽泛的。 与任何数据库一样,开发人员须要工具来应用它们。Pgweb是一个开源的、基于web的PostgreSQL客户端。它有一个十分简洁的界面,让你能够连贯到任何PostgreSQL实例来浏览数据表,运行查问和导出数据。对于轻量级的数据库工作来说,它比pgAdmin等应用程序更加轻量级和不便。 在平安方面,向互联网凋谢数据库端口是一个蹩脚的想法。须要快速访问调试运行在Kubernetes集群上的生产数据库的开发人员能够通过多种形式设置Pgweb来保障数据库的平安,并放弃其平安态势。例如,将Pgweb部署到与数据库雷同的集群中,并将其公开裸露,同时放弃数据库端口只能在网络外部拜访。将Pgweb放在Oauth2代理前面,以取得额定的一层认证,而后就能够从任何中央超级简略和超级平安地拜访数据库了。 Pgweb能够在Linux、macOS或Windows上本地运行,但咱们明天要探讨的是将它部署到你的Kubernetes集群中。在这篇文章中,咱们将把Pgweb镜像作为一个pod部署到咱们的集群中,应用Kubernetes服务裸露它,部署PostgreSQL并裸露它(但只在集群内以取得最大的安全性),而后连贯到数据库。最初,咱们将通过Rancher作为工作负载重新部署所有,看看Rancher让你的应用程序启动和运行变得如许容易。 后期筹备要实现本文的教程指南,你须要提前准备以下货色: Rancher deployment(你能够查看官网的疾速指南理解如何启动并运行Rancher:https://www.rancher.cn/quick-...)由Rancher治理的Kubernetes集群(依据这一文档导入或配置一个集群:https://rancher2.docs.rancher...)部署Pgweb创立一个名为pgweb.yaml的新文件,将以下内容粘贴进去,而后利用该文件来部署你的pod和服务。 apiVersion: v1kind: Podmetadata: labels: run: pgweb name: pgwebspec: containers: - image: sosedoff/pgweb name: pgweb ports: - containerPort: 8081---apiVersion: v1kind: Servicemetadata: labels: run: pgweb name: pgweb-svcspec: ports: - port: 8081 targetPort: 8081 protocol: TCP type: NodePort selector: run: pgwebkubectl apply -f pgweb.yamlpod/pgweb createdservice/pgweb-svc created而后获取服务信息,找到正在应用的节点端口;在本文中,它是31338。你的可能会有所不同,但个别会在30000-32767范畴内。 kubectl get svc pgweb-svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEpgweb-svc NodePort 10.96.47.248 <none> 8081:31338/TCP 9s当初在浏览器中进入一个该端口上的节点的公共IP。找到你的公关IP以及依据你的设置关上必要的防火墙端口,如果一切顺利,你将会看到Pgweb登录页面。 ...

August 25, 2020 · 1 min · jiezi

关于kubernetes:图解-K8s-核心概念和术语

我第一次接触容器编排调度工具是 Docker 自家的 Docker Swarm,次要解决过后公司外部业务我的项目部署繁琐的问题,我记得过后我的项目实现容器化之后,花在我的项目部署运维的工夫大大减少了,过后感觉这玩意还挺陈腐的,原来自动化运维能够这么玩。前面因为工作起因,很久没碰过容器方面的常识了。最近在公司的数据同步我的项目中,须要应用到散布式调度数据同步执行单元,目前应用的计划是将数据同步执行单元打包成镜像,应用 K8s 进行调度,正好趁这个机会理解一下 K8s,上面我就用图解的模式将我所了解的 K8s 分享给大家。 K8s 三大外围性能K8s 是一个轻便的和可扩大的开源平台,用于治理容器化利用和服务。通过 K8s 可能进行利用的自动化部署和扩缩容。 K8s 是比容器更上一层的架构,它能够反对多种容器技术,比方咱们相熟的 Docker,K8s 定位是一个容器调度工具,它次要具备以下三大外围能力: 1、主动调度 k8s 将用户部署提交的容器放到 k8s 集群的任意一个节点中,k8s 能够依据容器所须要的资源大小,以及节点的负载状况来决定容器放在哪个节点下面。 2、主动修复 当 k8s 的健康检查机制发现某个节点呈现问题,它会主动将该节点上的资源转移到其它节点下面实现主动复原。 3、横向主动扩缩容 在 k8s 1.1+ 版本中,有一个性能叫 “ Horizontal Pod Autoscaler”,简称 “HPA”,意思是 Pod主动扩容,它能够事后定义 Pod 的负载指标,当达到预期设定的负载指标后,就会依据指标主动触发主动动静扩容/缩容行为。 1)横向主动扩容 2)横向主动缩容 节点从下面的图能够看进去,k8s 集群的节点有两个角色,别离为 Master 节点和 Node 节点,整个 K8s 集群Master 和 Node 节点关系如下图所示: 1、Master 节点 Master 节点也称为管制节点,每个 k8s 集群都有一个 Master 节点负责整个集群的管理控制,咱们下面介绍的 k8s 三大能力都是通过 Master 节点发动的,Master 节点蕴含了以下几个组件: ...

August 24, 2020 · 2 min · jiezi

关于kubernetes:轻松管理-Kubernetes-集群的7个工具

_原文链接:https://developer.51cto.com/a... 作者:云智时代_Kubernetes正在一直放慢在云原生环境的利用,但如何以对立、平安的形式对运行于任何中央的Kubernetes集群进行治理面临着挑战,而无效的管理工具可能大大降低治理的难度。 K9sk9s是基于终端的资源仪表板。它只有一个命令行界面。无论在Kubernetes仪表板Web UI上做什么,都能够在终端应用K9s仪表板工具进行雷同的操作。k9s继续关注Kubernetes集群,并提供命令以应用集群上定义的资源。 K9s的性能包含集群的实时跟踪,应用K9s皮肤自定义视图,通过Kubernetes资源轻松遍历,向下通过选项以查看集群资源问题,提供扩大的插件来创立你本人的命令。 RancherRancher是开源容器治理平台,任何企业都能够轻松采纳Kubernetes。能够部署和治理在谷歌云GKE,AWS EKS,Azure AKS中运行的托管Kubernetes集群,也能够仅在抉择的虚拟机或裸机基础架构上部署Kubernetes。 Rancher简化了管理员的操作,次要性能包含监控集群的运行状况,设置警报和告诉,启用集中式日志记录,定义和利用全局安全策略,建设身份验证并执行后盾策略,治理和扩大基础架构等。 随着企业中Kubernetes的采纳速度,Rancher让用户能够间接拜访Kubernetes API和CLI。Rancher的新智能界面简化了应用程序治理;团队能够轻松地部署和管理工作负载,定义机密信息并治理公有注册表,配置长久卷申明,配置负载平衡和服务发现,以及治理CI管道等。 Dashboard+Kubectl+KubeadmKubernetes仪表盘基于Web的界面来部署容器利用。它能够对应用程序进行故障排除,并与资源一起治理集群自身。 能够应用仪表板来概述集群上运行的应用程序,以及创立或批改单个Kubernetes资源,例如部署作业,正本集等。能够扩大部署,也能够启动滚动更新,甚至能够应用仪表板上的部署向导重新启动pod或部署新应用程序。 Kubectl是用于与API服务进行通信,并将命令发送到主节点的命令行工具。它的隐式命令用于对Kubernetes集群API服务器的API调用。 Kubeadm是带有内置命令的工具,用于启动最小的Kubernetes集群。应用kubeadm,能够运行一些根本命令来疏导集群,创立令牌以退出集群,还原对Kubernetes集群所做的更改等。 HelmHelm是Kubernetes的软件包管理工具。它容许开发者和管理员在Kubernetes集群上打包,配置和部署应用程序和服务。它为管理员提供了对Kubernetes集群的更大控制权。 Helm的次要性能有使应用程序部署容易,标准化和可重用,通过Helm Charts轻松形容简单的应用程序,进步开发人员生产力,升高部署复杂性,加强操作筹备,放慢采纳云原生应用程序的速度,轻松回滚到以前的版本等。 KubeSprayKubeSpray是一个集群生命周期管理器,可帮忙部署可用于生产的Kubernetes集群。它应用ansible-playbook来自动化Kubernetes集群配置。 次要性能包含基于Ansible,高度可用,跨平台;风行的云提供商集成甚至是裸机,多种配置选项,多平台CI/CD等等。 默认状况下,Kubespray容许通过kube-master IP地址和端口6443近程连贯到Kubernetes集群。Kubespray最适宜于须要灵便部署的用户。它提供了许多自定义配置选项。另外,如果相熟Ansible,那么Kubespray将会十分易于应用。 Kontena LensKontena Lens是Kubernetes的智能仪表板。 作为管制Kubernetes惟一须要的管理系统。它可收费用于Mac OS,Windows和Linux操作系统。应用程序启动后,将在界面中看到所有相干集群的列表。 对于的确须要每天解决Kubernetes的用户来说,它是性能最弱小的IDE。能够确保正确设置和配置集群,并且能够更轻松、更疾速地应用集群,并从根本上进步生产率和业务速度。 Kontena Lens IDE次要性能包含能够一次治理多个集群,实时可视化集群状态,提供内置终端;装置非常简单,因为它是独立的应用程序;反对Kubernetes RBAC。通过测试可解决集群中近25000个Pod Kubernetes是一个简单的工具,Lens IDE能够帮忙初学者轻松地应用Kubernetes。它是用于治理和可视化Kubernetes集群的优良工具之一。 WKSctlWKSctl代表Weave Kubernetes系统控制,它是Weave Kubernetes平台的一部分。 WKSctl是应用GitOps进行Kubernetes配置管理的工具。GitOps只是一组实际,这些实际应用git申请以传统形式管理应用程序和根底构造。 应用WKSctl,能够通过Git提交来治理Kubernetes集群。能够降级集群或从集群增加/删除节点。 能够在2种模式下运行它:独立模式和GitOps模式。在独立模式下,它将创立一个动态集群。在GitOps模式下,它将依据git上存在的cluster.yml和machines.yml信息配置集群。 WKSctl次要性能有应用git疾速启动集群,部署失败时轻松回滚,记录更改以供审核,创立集群只须要IP地址和ssh密钥,继续验证和纠正集群状态。 写在最初:这些风行的Kubernetes管理工具能够轻松地治理Kubernetes集群。无妨抉择以上的一个工具,在你的Kubernetes集群上试试。

August 19, 2020 · 1 min · jiezi

关于kubernetes:蚂蚁集团如何在大规模-Kubernetes-集群上实现高-SLO

作者 | 田晓旭 随着 Kubernetes 逐步成为云计算的规范,企业中的 Kubernetes 利用正成为支流。依据 CNCF 2019 Kubernetes 应用调查报告的显示:目前 84% 的用户曾经在生产环境中应用 Kubernetes,生产环境中容器部署规模超过 1000 的比例是 34%,其中超过 5000 的大规模利用比例是 19%。当集群越来越大、越来越简单,集群可用性就会面临挑战。 整体指标:集群是否衰弱,所有组件是否失常工作,集群中 Pod 创立的失败数量有多少等等;追踪能力:集群中产生了什么,是否有异样,用户做了什么事件等等;起因定位:出现异常之后,找到是哪个组件出了问题;想要解决这些问题,比拟好的一个办法就是 SLO,通过定义 SLO 来形容集群的可用性,追踪集群中 Pod 的生命周期,一旦呈现失败 Pod,疾速定位异样组件。本文采访了蚂蚁团体技术专家范康和姚菁华来分享蚂蚁团体的 SLO 体系是如何建设的。 大家常会听到 SLA,其实 SLA 是 SLO 衍生进去的协定,SLA 协定会造成具备法律效力的合同,通常是服务供应商和内部客户之间签订的,而 SLO 是用于外部服务之间,定义服务所提供性能的一种冀望状态。 1 SLO 指标定义如果咱们要通过定义来形容集群的可用性,那么具体的形容指标就成为了须要解决的关键问题。在蚂蚁团体外部,集群可用性的要害指标蕴含五个:集群衰弱度、Pod 创立成功率、残留 Terminating Pod 的数量、服务在线率和故障机数量。 集群衰弱度:通常应用 Healthy,Warning,Fatal 三个值来形容,其中 Warning 和 Fatal 对应告警体系,例如 P2 告警产生,那集群就是 Warning,而 P0 告警产生,那集群就是 Fatal,必须进行解决;Pod 创立成功率:这是一个十分重要的指标,蚂蚁团体一周的 Pod 创立量在百万级别,如果成功率稳定会造成大量 Pod 失败,同时 Pod 成功率上涨也是集群异样的最直观反映;残留 Terminating Pod 的数量:有人可能会好奇为什么应用残留 Terminating Pod 的数量,而不必删除成功率?这是因为当 Pod 数量达到百万级别后,即便删除成功率达到了 99.9%,Terminating Pod 的数量也有数千,残留这么多 Pod 占用利用容量,在生产环境中是不可承受的;服务在线率:这个指标是通过探针来掂量的,探针失败则意味着集群不可用;故障机数量:这是一个节点维度的指标,故障机通常是指无奈正确交付 Pod 的物理机,集群故障机须要做到“疾速发现,疾速隔离,及时修复”,否则会对集群容量造成影响;以上指标的阈值和 SLO 性能指标都是依据业务方的增长来定义的,随着业务的一直增长,这些指标的定义也可能须要跟着做调整。 ...

August 19, 2020 · 2 min · jiezi

关于kubernetes:kubernetes-pod-级别的-jvm-监控

1.下包wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.13.0/jmx_prometheus_javaagent-0.13.0.jar2.配置java启动命令-javaagent:/data/logs/jmx-exporter/jmx_prometheus_javaagent-0.13.0.jar=33334:/data/logs/jmx-exporter/config.yaml/data/logs/jmx-exporter/jmx_prometheus_javaagent-0.13.0.jar:jar包门路33334:监控端口/data/logs/jmx-exporter/config.yaml:配置文件 java -javaagent:/data/logs/jmx-exporter/jmx_prometheus_javaagent-0.13.0.jar=33334:/data/logs/jmx-exporter/config.yaml -jar -server -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -Xms2048M -Xmx2048M -Xmn256M -Xss512K -XX:SurvivorRatio=4 -XX:+UseConcMarkSweepGC /starit-buckyshop-stat.jar --spring.profiles.active=newsuper3.配置jmx配置文件(发现所有监控项)cat /mnt/jmx-exporter/config.yaml ---startDelaySeconds: 0lowercaseOutputName: falselowercaseOutputLabelNames: falsewhitelistObjectNames: ["org.apache.cassandra.metrics:*"]blacklistObjectNames: ["org.apache.cassandra.metrics:type=ColumnFamily,*"]rules: - pattern: 'org.apache.cassandra.metrics<type=(\w+), name=(\w+)><>Value: (\d+)' name: cassandra_$1_$2 value: $3 valueFactor: 0.001 labels: {} help: "Cassandra metric $1 $2" type: GAUGE attrNameSnakeCase: false4.配置prometheuscat ~/kube-prometheus-0.5.0/manifests/prometheus-additional.yaml - job_name: 'jmx-exporter' kubernetes_sd_configs: - role: pod# metrics_path: /metrics relabel_configs: - source_labels: [__address__] action: keep regex: '(.*):(.*)' - source_labels: [__meta_kubernetes_pod_container_port_number] action: keep regex: '33334' - source_labels: [__meta_kubernetes_namespace] action: replace target_label: kubernetes_namespace - source_labels: [__meta_kubernetes_pod_name] action: replace target_label: kubernetes_pod_name scheme: http5.配置deploymentdeployment减少jmx的container ...

August 18, 2020 · 1 min · jiezi

关于kubernetes:kubernetes-pod-级别的-jvm-监控

1.下包wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.13.0/jmx_prometheus_javaagent-0.13.0.jar2.配置java启动命令-javaagent:/data/logs/jmx-exporter/jmx_prometheus_javaagent-0.13.0.jar=33334:/data/logs/jmx-exporter/config.yaml/data/logs/jmx-exporter/jmx_prometheus_javaagent-0.13.0.jar:jar包门路33334:监控端口/data/logs/jmx-exporter/config.yaml:配置文件 java -javaagent:/data/logs/jmx-exporter/jmx_prometheus_javaagent-0.13.0.jar=33334:/data/logs/jmx-exporter/config.yaml -jar -server -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -Xms2048M -Xmx2048M -Xmn256M -Xss512K -XX:SurvivorRatio=4 -XX:+UseConcMarkSweepGC /starit-buckyshop-stat.jar --spring.profiles.active=newsuper3.配置jmx配置文件(发现所有监控项)cat /mnt/jmx-exporter/config.yaml ---startDelaySeconds: 0lowercaseOutputName: falselowercaseOutputLabelNames: falsewhitelistObjectNames: ["org.apache.cassandra.metrics:*"]blacklistObjectNames: ["org.apache.cassandra.metrics:type=ColumnFamily,*"]rules: - pattern: 'org.apache.cassandra.metrics<type=(\w+), name=(\w+)><>Value: (\d+)' name: cassandra_$1_$2 value: $3 valueFactor: 0.001 labels: {} help: "Cassandra metric $1 $2" type: GAUGE attrNameSnakeCase: false4.配置prometheuscat ~/kube-prometheus-0.5.0/manifests/prometheus-additional.yaml - job_name: 'jmx-exporter' kubernetes_sd_configs: - role: pod# metrics_path: /metrics relabel_configs: - source_labels: [__address__] action: keep regex: '(.*):(.*)' - source_labels: [__meta_kubernetes_pod_container_port_number] action: keep regex: '33334' - source_labels: [__meta_kubernetes_namespace] action: replace target_label: kubernetes_namespace - source_labels: [__meta_kubernetes_pod_name] action: replace target_label: kubernetes_pod_name scheme: http5.配置deploymentdeployment减少jmx的container ...

August 18, 2020 · 1 min · jiezi

关于kubernetes:kubernetes事件监控

企业微信机器人webhookdeploymentapiVersion: apps/v1kind: Deploymentmetadata: labels: name: kube-eventer name: kube-eventer namespace: kube-systemspec: replicas: 1 selector: matchLabels: app: kube-eventer template: metadata: labels: app: kube-eventer annotations: scheduler.alpha.kubernetes.io/critical-pod: '' spec: dnsPolicy: ClusterFirstWithHostNet serviceAccount: nginx-ingress-controller containers: - image: registry.aliyuncs.com/acs/kube-eventer-amd64:v1.2.0-484d9cd-aliyun name: kube-eventer command: - "/kube-eventer" - "--source=kubernetes:https://kubernetes.default" ## .e.g,dingtalk sink demo - --sink=webhook:https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=*******************&level=Normal&kinds=Pod&header=Content-Type=application/json&custom_body_configmap=custom-body&custom_body_configmap_namespace=kube-system&method=POST env: # If TZ is assigned, set the TZ value as the time zone - name: TZ value: Asia/Shanghai volumeMounts: - name: localtime mountPath: /etc/localtime readOnly: true - name: zoneinfo mountPath: /usr/share/zoneinfo readOnly: true resources: requests: cpu: 100m memory: 100Mi limits: cpu: 500m memory: 250Mi volumes: - name: localtime hostPath: path: /etc/localtime - name: zoneinfo hostPath: path: /usr/share/zoneinfo---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: kube-eventerrules: - apiGroups: - "" resources: - events - configmaps verbs: - get - list - watch - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list","create"]---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: annotations: name: kube-eventerroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: kube-eventersubjects: - kind: ServiceAccount name: kube-eventer namespace: kube-system---apiVersion: v1kind: ServiceAccountmetadata: name: kube-eventer namespace: kube-systemconfigmapapiVersion: v1data: content: >- {"msgtype": "text","text": {"content": "[PROD集群事件警报]\n命名空间:{{ .Namespace }}\n事件级别:{{ .Type }}\n事件对象:{{ .InvolvedObject.Kind }}\n对象名称:{{ .Name }}\n产生起因:{{ .Reason }}\n事件工夫:{{ .EventTime }}\n事件信息:{{ .Message }}"}}kind: ConfigMapmetadata: name: custom-body namespace: kube-system参考文献https://github.com/AliyunContainerService/kube-eventer/blob/master/docs/en/webhook-sink.md ...

August 17, 2020 · 1 min · jiezi

关于kubernetes:可视化监控大型集群这一个工具就够了

许多企业应用Kubernetes来疾速公布新性能并进步服务的可靠性。Rancher使团队可能缩小治理其云原生工作负载的操作老本——但取得这些环境的继续可见性可能是一个挑战。 在这篇文章中,咱们将探讨如何利用Rancher内置反对的Prometheus和Grafana疾速开始监控编排工作负载。而后,咱们将向你展现如何将Datadog与Rancher集成,通过丰盛的可视化、算法告警和其余性能,帮忙你取得对这些长期环境更深刻的可见性。 Kubernetes监控所面临的挑战Kubernetes集群实质上是简单和动静的。容器以极快的速度启动和敞开:在对数千家组织的超过15亿个容器进行考察时,Datadog发现,编排容器的周转速度(一天)是未编排容器的两倍(两天)。 在这种快节奏的环境中,监控你的应用程序和基础设施比以往任何时候都重要。Rancher内置反对开源监控工具(如Prometheus和Grafana),容许你从Kubernetes集群中跟踪根本的衰弱和资源指标。 Prometheus依照预设的工夫距离从Kubernetes集群收集指标。尽管Prometheus没有可视化选项,但你能够应用Grafana内置的仪表板来显示衰弱和资源指标的总体状况,例如你的pods的CPU应用状况。 然而,一些开源解决方案并不是为了监控大型、动静Kubernetes集群而设计的。此外,Prometheus要求用户学习PromQL(这是一种专门的查询语言)以剖析和汇总他们的数据。 尽管Prometheus和Grafana能够为你的集群提供肯定水平的洞察力,但它们不能让你看到全貌。例如,你须要连贯到其中一个Rancher反对的日志解决方案,以拜访你环境中的日志。而为了排除代码级问题,你还须要部署一个应用程序性能监控解决方案。 最终,为了充沛可视化你的编排集群,你须要在一个平台上监控所有这些数据源——指标、跟踪和日志。通过向整个企业的团队提供具体的、可操作的数据,一个全面的监控解决方案能够帮忙缩小检测和解决的均匀工夫(MTTD和MTTR)。 Datadog Agent:主动发现和主动伸缩服务为了取得Rancher解决方案中每一层的继续可见性,你须要一个专门用于实时跟踪云原生环境的监控解决方案。Datadog Agent是一款轻量级的开源软件,它能够从你的容器和主机中收集指标、跟踪和日志,并将它们转发到你的账户,以便进行可视化、剖析和告警。 因为Kubernetes部署处于一直变动的状态,因而无奈手动跟踪哪些工作负载在哪些节点上运行,或者你的容器在哪里运行。为此,Datadog Agent应用Autodiscovery来检测容器何时启动或敞开,并主动开始收集你的容器和它们正在运行的服务的数据,如etcd和Consul。 Kubernetes内置的主动弹性伸缩性能能够依据需要(如CPU使用量激增)主动减少或缩小工作负载,从而帮忙进步服务的可靠性。主动伸缩还能够通过调整基础设施的规模来帮忙治理老本。 Datadog扩大了弹性伸缩这一性能,使你可能依据曾经在Datadog中监控的任何指标(包含自定义指标)主动伸缩Kubernetes工作负载。这对于依据需要的稳定来扩大集群是十分有用的,特地是在“双十一”这样的要害业务期间。假如你的公司是一家零售商,领有忙碌的在线业务。当销售正在起飞时,你的Kubernetes工作负载能够依据作为流动指标的自定义指标(如结账数量)进行主动伸缩,以确保晦涩的购物体验。无关应用Datadog主动伸缩Kubernetes工作负载的更多细节,请查看以下文章: https://www.datadoghq.com/blo... Kubernetes特定的监控性能无论你的环境是多云、多集群还是两者兼而有之,Datadog高度专业化的性能都能够帮忙你实时监控你的容器化工作负载。Datadog通过从Kubernetes、Docker、云服务和其余技术导入的tag主动丰盛你的监控数据。Tag为你的环境任意一层提供了继续的可见性,即便单个容器启动、进行或在主机间挪动,你都可能取得可视化。例如,你能够搜寻所有共享一个标签(例如,它们正在运行的服务名称)的容器,而后应用另一个标签(例如,可用性区域)来合成它们在不同区域的资源应用状况。 Datadog能够收集超过120个Kubernetes指标,帮忙你从管制立体健康状况跟踪到pod级CPU限度的所有。所有这些监控数据都能够间接在利用中拜访,而无需应用查询语言。 Datadog提供了几个性能来帮忙你摸索和可视化容器基础设施的数据。Container Map(datadoghq.com/blog/container-map/ )提供了一个Kubernetes环境的鸟瞰图,并容许你通过任何标签组合来过滤和分组容器,如docker_image、host和kube_deployment。 你还能够依据任何资源指标的实时值对容器进行色彩编码,如零碎CPU或RSS内存。这让你能够高深莫测地疾速发现资源抢夺问题,例如,如果一个节点比其余节点耗费了更多的CPU。 实时容器视图(Live Container view)能够显示基础架构中每个容器的流程级零碎指标——以两秒的粒度绘制。因为 CPU 利用率等指标可能十分不稳固,这种高度的颗粒度确保了重要的峰值不会在乐音中隐没。 Container Map和 “实时容器 "视图均容许你应用任意组合的标签(如镜像名称或云提供商)对容器进行过滤和排序。要理解更多细节,你还能够单击以查看在任何单个容器上运行的过程,并查看从该容器收集的所有指标、日志和跟踪,获取这些信息只需点击几下。这能够帮忙你调试问题,并确定是否须要调整资源的配置。 通过Datadog网络性能监控(NPM),你能够跟踪整个Kubernetes部署的实时网络流量,并疾速调试问题。从实质上讲,Docker容器只受制于可用的CPU和内存量。因而,单个容器可能会使网络饱和并使整个零碎瘫痪。 Datadog能够帮忙你轻松隔离耗费最多网络吞吐量的容器,并通过导航到该服务的相干日志或申请跟踪来确定可能的根本原因。 Datadog+Rancher协同工作通过Rancher的Datadog Helm chart,你的团队能够在几分钟内开始监控他们的Kubernetes环境。Datadog与Rancher协同工作,能够让你应用Rancher治理不同的协调环境,并部署Datadog来实时监控、排除故障和主动扩大环境。 此外,Datadog的算法监控引擎Watchdog能够发现并揭示团队成员留神性能异样(如提早峰值或高错误率)。这使得团队可能在潜在问题(例如容器重启率异样高)降级之前解决问题。 咱们曾经向你展现了Datadog如何帮忙你取得Rancher环境的全面可见性。通过Datadog,工程师能够应用APM来辨认单个申请中的瓶颈,并精确定位代码级问题,收集和剖析整个基础设施中每个容器的日志等。通过在一个平台上对立指标、日志和跟踪,Datadog打消了切换上下文或工具的须要。因而,能够放慢团队故障排除工作流程,并充分利用Rancher治理大规模动静集群的全副后劲。

August 14, 2020 · 1 min · jiezi

关于kubernetes:可视化监控大型集群这一个工具就够了

许多企业应用Kubernetes来疾速公布新性能并进步服务的可靠性。Rancher使团队可能缩小治理其云原生工作负载的操作老本——但取得这些环境的继续可见性可能是一个挑战。 在这篇文章中,咱们将探讨如何利用Rancher内置反对的Prometheus和Grafana疾速开始监控编排工作负载。而后,咱们将向你展现如何将Datadog与Rancher集成,通过丰盛的可视化、算法告警和其余性能,帮忙你取得对这些长期环境更深刻的可见性。 Kubernetes监控所面临的挑战Kubernetes集群实质上是简单和动静的。容器以极快的速度启动和敞开:在对数千家组织的超过15亿个容器进行考察时,Datadog发现,编排容器的周转速度(一天)是未编排容器的两倍(两天)。 在这种快节奏的环境中,监控你的应用程序和基础设施比以往任何时候都重要。Rancher内置反对开源监控工具(如Prometheus和Grafana),容许你从Kubernetes集群中跟踪根本的衰弱和资源指标。 Prometheus依照预设的工夫距离从Kubernetes集群收集指标。尽管Prometheus没有可视化选项,但你能够应用Grafana内置的仪表板来显示衰弱和资源指标的总体状况,例如你的pods的CPU应用状况。 然而,一些开源解决方案并不是为了监控大型、动静Kubernetes集群而设计的。此外,Prometheus要求用户学习PromQL(这是一种专门的查询语言)以剖析和汇总他们的数据。 尽管Prometheus和Grafana能够为你的集群提供肯定水平的洞察力,但它们不能让你看到全貌。例如,你须要连贯到其中一个Rancher反对的日志解决方案,以拜访你环境中的日志。而为了排除代码级问题,你还须要部署一个应用程序性能监控解决方案。 最终,为了充沛可视化你的编排集群,你须要在一个平台上监控所有这些数据源——指标、跟踪和日志。通过向整个企业的团队提供具体的、可操作的数据,一个全面的监控解决方案能够帮忙缩小检测和解决的均匀工夫(MTTD和MTTR)。 Datadog Agent:主动发现和主动伸缩服务为了取得Rancher解决方案中每一层的继续可见性,你须要一个专门用于实时跟踪云原生环境的监控解决方案。Datadog Agent是一款轻量级的开源软件,它能够从你的容器和主机中收集指标、跟踪和日志,并将它们转发到你的账户,以便进行可视化、剖析和告警。 因为Kubernetes部署处于一直变动的状态,因而无奈手动跟踪哪些工作负载在哪些节点上运行,或者你的容器在哪里运行。为此,Datadog Agent应用Autodiscovery来检测容器何时启动或敞开,并主动开始收集你的容器和它们正在运行的服务的数据,如etcd和Consul。 Kubernetes内置的主动弹性伸缩性能能够依据需要(如CPU使用量激增)主动减少或缩小工作负载,从而帮忙进步服务的可靠性。主动伸缩还能够通过调整基础设施的规模来帮忙治理老本。 Datadog扩大了弹性伸缩这一性能,使你可能依据曾经在Datadog中监控的任何指标(包含自定义指标)主动伸缩Kubernetes工作负载。这对于依据需要的稳定来扩大集群是十分有用的,特地是在“双十一”这样的要害业务期间。假如你的公司是一家零售商,领有忙碌的在线业务。当销售正在起飞时,你的Kubernetes工作负载能够依据作为流动指标的自定义指标(如结账数量)进行主动伸缩,以确保晦涩的购物体验。无关应用Datadog主动伸缩Kubernetes工作负载的更多细节,请查看以下文章: https://www.datadoghq.com/blo... Kubernetes特定的监控性能无论你的环境是多云、多集群还是两者兼而有之,Datadog高度专业化的性能都能够帮忙你实时监控你的容器化工作负载。Datadog通过从Kubernetes、Docker、云服务和其余技术导入的tag主动丰盛你的监控数据。Tag为你的环境任意一层提供了继续的可见性,即便单个容器启动、进行或在主机间挪动,你都可能取得可视化。例如,你能够搜寻所有共享一个标签(例如,它们正在运行的服务名称)的容器,而后应用另一个标签(例如,可用性区域)来合成它们在不同区域的资源应用状况。 Datadog能够收集超过120个Kubernetes指标,帮忙你从管制立体健康状况跟踪到pod级CPU限度的所有。所有这些监控数据都能够间接在利用中拜访,而无需应用查询语言。 Datadog提供了几个性能来帮忙你摸索和可视化容器基础设施的数据。Container Map(datadoghq.com/blog/container-map/ )提供了一个Kubernetes环境的鸟瞰图,并容许你通过任何标签组合来过滤和分组容器,如docker_image、host和kube_deployment。 你还能够依据任何资源指标的实时值对容器进行色彩编码,如零碎CPU或RSS内存。这让你能够高深莫测地疾速发现资源抢夺问题,例如,如果一个节点比其余节点耗费了更多的CPU。 实时容器视图(Live Container view)能够显示基础架构中每个容器的流程级零碎指标——以两秒的粒度绘制。因为 CPU 利用率等指标可能十分不稳固,这种高度的颗粒度确保了重要的峰值不会在乐音中隐没。 Container Map和 “实时容器 "视图均容许你应用任意组合的标签(如镜像名称或云提供商)对容器进行过滤和排序。要理解更多细节,你还能够单击以查看在任何单个容器上运行的过程,并查看从该容器收集的所有指标、日志和跟踪,获取这些信息只需点击几下。这能够帮忙你调试问题,并确定是否须要调整资源的配置。 通过Datadog网络性能监控(NPM),你能够跟踪整个Kubernetes部署的实时网络流量,并疾速调试问题。从实质上讲,Docker容器只受制于可用的CPU和内存量。因而,单个容器可能会使网络饱和并使整个零碎瘫痪。 Datadog能够帮忙你轻松隔离耗费最多网络吞吐量的容器,并通过导航到该服务的相干日志或申请跟踪来确定可能的根本原因。 Datadog+Rancher协同工作通过Rancher的Datadog Helm chart,你的团队能够在几分钟内开始监控他们的Kubernetes环境。Datadog与Rancher协同工作,能够让你应用Rancher治理不同的协调环境,并部署Datadog来实时监控、排除故障和主动扩大环境。 此外,Datadog的算法监控引擎Watchdog能够发现并揭示团队成员留神性能异样(如提早峰值或高错误率)。这使得团队可能在潜在问题(例如容器重启率异样高)降级之前解决问题。 咱们曾经向你展现了Datadog如何帮忙你取得Rancher环境的全面可见性。通过Datadog,工程师能够应用APM来辨认单个申请中的瓶颈,并精确定位代码级问题,收集和剖析整个基础设施中每个容器的日志等。通过在一个平台上对立指标、日志和跟踪,Datadog打消了切换上下文或工具的须要。因而,能够放慢团队故障排除工作流程,并充分利用Rancher治理大规模动静集群的全副后劲。

August 14, 2020 · 1 min · jiezi

关于kubernetes:蚂蚁是如何改进-K8s-集群敏感信息的安全防护的

在 Kubernetes 中,Secret 显得尤其重要。因为它是 K8s 中存储所有敏感信息的对象。据悉,这些敏感信息蕴含明码、集群的证书、OAuth token、ssh key 以及其余用户自定义的敏感文件等。因而,一旦 K8s 中 Secret 呈现平安问题,结果将十分重大。此外,尽管社区提供了肯定的平安防护计划,然而仍然存在诸多问题。 K8s Secret 面临着哪些平安问题?这些平安问题会带来什么影响?社区提供的解决方案存在哪些有余?......针对这些问题,InfoQ 记者采访了蚂蚁团体高级工程师秦凯伦,他专一于可信计算、系统安全和虚拟化等畛域,对 K8s Secret 有着深刻的钻研和摸索。 K8s Secret 的平安问题依据 Kubernetes 文档,Secret 是 K8s 中存储所有敏感信息的对象。事实上,如果敏感信息间接寄存于 K8s 的 Pod spec 或镜像中,不仅管控艰难,而且存在较大的安全隐患。因而,K8s 通过创立、治理、利用 Secret 对象,能够更好地管制敏感信息的用处,并升高其意外裸露的危险。 秦凯伦称,尽管引入 K8s Secret 对象,这在肯定水平上升高了意外泄露的危险(更多地是通过集中式的治理),然而 K8s Secret 对象本身的安全性,“社区默认计划中仍存在许多平安问题”。 一般来说,K8s 中,Secret 数据以纯文本的形式存储在 etcd 中,默认只有 base64 编码,未经加密。同时,共享该文件或将其检入代码库,明码容易泄露。 社区解决方案的有余针对此问题,K8s 社区提供了基于 KMS 的 K8s Secret 加密计划,谷歌云、AWS 和 Azure 均反对该计划。他说,“这尽管解决了 etcd 中 Secret 明文存储问题,但仍然有一些问题。” Secret、加密 Secret 的密钥在内存中明文寄存、易被攻破;攻击者能够混充非法用户,调用解密接口,窃取密钥;密钥一旦泄露,将导致所有数据的泄露,从而引起用户对整个零碎的信赖解体。“为此,社区和一些公司尝试为该计划中的 Plugin 加上基于硬件的平安爱护,从而晋升攻打难度。但对某些特定用户来说,爱护的覆盖面和水平仍然不够”。 ...

August 13, 2020 · 2 min · jiezi

关于kubernetes:聊聊最近很火的eBPF

如果非要说以后计算机领域最有前途的两个根底软件技术,那非eBPF和wasm莫属了。 什么是eBPF?Linux内核始终是实现监督/可察看性,网络和安全性的现实场合。可怜的是,这通常是不切实际的,因为它须要更改内核源代码或加载内核模块,并导致彼此重叠的形象层。 eBPF是一项革命性的技术,能够在Linux内核中运行沙盒程序,而无需更改内核源代码或加载内核模块。通过使Linux内核可编程,基础架构软件能够利用现有的层,从而使它们更加智能和功能丰富,而无需持续为零碎减少额定的复杂性层。 eBPF导致了网络,安全性,应用程序配置/跟踪和性能故障排除等畛域的新一代工具的开发,这些工具不再依赖现有的内核性能,而是在不影响执行效率或安全性的状况下被动从新编程运行时行为。 如果间接解释eBPF,有点不明所以。那咱们就看看有哪些基于eBPF的工程,这些工程或者你曾经晓得,或是曾经常常应用,兴许你会明确eBPF间隔咱们并不边远。 基于eBPF的我的项目1:bcc BCC是用于创立基于eBPF的高效内核跟踪和操作程序的工具包,其中包含一些有用的命令行工具和示例。 BCC简化了用C进行内核检测的eBPF程序的编写,包含LLVM的包装器以及Python和Lua的前端。它还提供了用于间接集成到应用程序中的高级库。 2:bpftrace bpftrace是Linux eBPF的高级跟踪语言。它的语言受awk和C以及DTrace和SystemTap等以前的跟踪程序的启发。 bpftrace应用LLVM作为后端将脚本编译为eBPF字节码,并利用BCC作为与Linux eBPF子系统以及现有Linux跟踪性能和连接点进行交互的库。 3:Cilium Cilium是一个开源我的项目,提供基于eBPF的联网,安全性和可察看性。它是从头开始专门设计的,旨在将eBPF的劣势带入Kubernetes的世界,并满足容器工作负载的新可伸缩性,安全性和可见性要求。 4:Falco Falco是一种行为流动监视器,旨在检测应用程序中的异样流动。 Falco在eBPF的帮忙下审核Linux内核层的零碎。它应用其余输出流(例如容器运行时度量规范和Kubernetes度量规范)丰盛了收集的数据,并容许间断监督和检测容器,应用程序,主机和网络流动。 5:Katran Katran是一个C ++库和eBPF程序,用于构建高性能的第4层负载平衡转发立体。 Katran利用Linux内核中的XDP根底构造来提供用于疾速数据包解决的内核性能。它的性能与NIC接管队列的数量成线性比例,并且应用RSS敌对的封装转发到L7负载平衡器。 6:Sysdig Sysdig是提供深层零碎可见性的简略工具,并具备对容器的原生反对。 其余基于eBPF技术的我的项目还有很多,比方kubectl-trace ,ply 等,这里不再赘述。 如何编写一个eBPF程序?在很多状况下,不是间接应用eBPF,而是通过Cilium,bcc或bpftrace等我的项目间接应用eBPF,这些我的项目在eBPF之上提供了形象,并且不须要间接编写程序,而是提供了指定基于用意的定义的性能,而后应用eBPF施行。 如果不存在更高级别的形象,则须要间接编写程序。 Linux内核心愿eBPF程序以字节码的模式加载。尽管当然能够间接编写字节码,但更常见的开发实际是利用LLVM之类的编译器套件将伪C代码编译为eBPF字节码。 在编写eBPF程序之前,须要简略理解几个概念。 1)map(映射) :BPF最令人着迷的方面之一是,内核上运行的代码和加载了该代码的程序能够在运行时应用消息传递互相通信。 BPF映射是驻留在内核中的键/值存储。任何BPF程序都能够拜访它们。在用户态中运行的程序也能够应用文件描述符拜访这些映射。只有当时正确指定数据大小,就能够在映射中存储任何类型的数据。内核将键和值视为二进制 blobs,它并不关怀您在映射中保留的内容。 BPF验证程序包含多种保护措施,以确保您创立和拜访映射的形式是平安的。当咱们解释如何拜访这些映射中的数据时,咱们也将解释这些保护措施。 当然BPF映射类型有很多,比方哈希表映射,数组映射,Cgroup 数组映射等,别离满足不同的场景。 2)验证器 BPF验证程序也是在您的零碎上运行的程序,因而,对其进行严格审查是确保其正确执行工作的指标。 验证程序执行的第一项查看是对VM行将加载的代码的动态剖析。第一次查看的目标是确保程序有预期的后果。为此,验证程序将应用代码创立有向循环图(DAG)。验证程序剖析的每个指令将成为图中的一个节点,并且每个节点都链接到下一条指令。验证程序生成此图后,它将执行深度优先搜寻(DFS),以确保程序实现并且代码不蕴含危险门路。这意味着它将遍历图的每个分支,始终到分支的底部,以确保没有递归循环。 这些是验证器在第一次查看期间可能回绝您的代码的情景,要求有以下几个方面: 该程序不蕴含管制循环。为确保程序不会陷入有限循环,验证程序会回绝任何类型的管制循环。曾经提出了在BPF程序中容许循环的倡议,然而截至撰写本文时,没有一个被采纳。该程序不会尝试执行超过内核容许的最大指令数的指令。此时,可执行的最大指令数为4,096。此限度是为了避免BPF永远运行。在第3章,咱们探讨如何嵌套不同的BPF程序,以平安的形式解决此限度。该程序不蕴含任何无法访问的指令,例如从未执行过的条件或性能。这样能够避免在VM中加载有效代码,这也会提早BPF程序的终止。该程序不会尝试越界。验证者执行的第二项查看是BPF程序的空运行。这意味着验证者将尝试分析程序将要执行的每条指令,以确保它不会执行任何有效的指令。此执行还将查看所有内存指针是否均已正确拜访和勾销援用。最初,空运行向验证程序告诉程序中的控制流,以确保无论程序采纳哪个管制门路,它都会达到BPF_EXIT指令。为此,验证程序会跟踪堆栈中所有拜访过的分支门路,并在采纳新门路之前对其进行评估,以确保它不会屡次拜访特定门路。通过这两项查看后,验证者认为程序能够平安执行。 3) hook : 因为eBPF是事件驱动的,所以ebpf是作用于具体的hook的。依据不同的作用,罕用的有XDP,trace,套接字等。 4)帮忙函数:eBPF程序无奈调用任意内核性能。容许这样做会将eBPF程序绑定到特定的内核版本,并使程序的兼容性复杂化。取而代之的是,eBPF程序能够调用帮忙函数,该函数是内核提供的家喻户晓且稳固的API。 总结平安,网络,负载平衡,故障剖析,追踪等畛域都是eBPF的主战场。 对于云原生畛域,Cilium 曾经应用eBPF 实现了无kube-proxy的容器网络。利用eBPF解决iptables带来的性能问题。 整个eBPF生态倒退比拟好,社区曾经提供了诸多工具不便大家编写本人的eBPF程序。

August 13, 2020 · 1 min · jiezi

关于kubernetes:灵魂拷问上-Kubernetes-有什么业务价值

简介: 本文整顿自 2020 年 7 月 22 日《基于 Kubernetes 与 OAM 构建对立、标准化的利用治理平台》主题线上网络研讨会。文章共分为高低两篇,本文为上篇,次要和大家介绍上 Kubernetes 有什么业务价值,以及什么是“以利用为核心”的 Kubernetes。下篇将跟大家具体分享如何构建“以利用为核心”的 Kubernetes。 本文整顿自 2020 年 7 月 22 日《基于 Kubernetes 与 OAM 构建对立、标准化的利用治理平台》主题线上网络研讨会。文章共分为高低两篇,本文为上篇,次要和大家介绍上 Kubernetes 有什么业务价值,以及什么是“以利用为核心”的 Kubernetes。下篇将跟大家具体分享如何构建“以利用为核心”的 Kubernetes。 视频回顾链接:https://www.bilibili.com/video/BV1Dv411v7P4/ 关注阿里巴巴云原生公众号,回复 “0722” 即可下载 PPT 非常感谢大家来到 CNCF 的直播,我是张磊,阿里云的高级技术专家,Kubernetes 我的项目资深维护者。同时也是 CNCF 利用交付畛域 co-chair。我明天给大家带来的分享主题是《基于 Kubernetes 与 OAM 构建对立、标准化的利用治理平台》。在封面上有个钉钉群组二维码。大家能够通过这个二维码进入线上交换群。 上 Kubernetes 有什么业务价值?明天要演讲的主题是跟利用治理或者说是云原生利用交付是相干的。首先咱们想要先答复这么一个问题:为什么咱们要基于 Kubernetes 去构建一个利用治理平台? 上图是一个实质的问题,咱们在落地 K8s 常常遇到的一个问题。尤其是咱们的业务方会问到这么一个问题,咱们上 Kubernetes 有什么业务价值?这时候作为咱们 K8s 工程师往往是很难答复的。起因在哪里呢?实际上这跟 K8s 的定位是相干的。K8s 这个我的项目呢,如果去做一个剖析的话,咱们会发现 K8s 不是一个 PaaS 或者利用治理的平台。实际上它是一个标准化的能力接入层。什么是能力接入层呢?大家能够看一下下图。 ...

August 11, 2020 · 2 min · jiezi

关于kubernetes:干货-Kubernetes-监控详解

作者:Carlos Arilla翻译:Bach(才云) 校对:bot(才云)、星空下的文仔(才云) 如果想要监控 Kubernetes,包含基础架构平台和正在运行的工作负载,传统的监控工具和流程可能还不够用。就目前而言,监控 Kubernetes 并不是件容易的事。 K8sMeetup 为什么监控 Kubernetes 很难? Kubernetes 曾经席卷了整个容器生态系统,它充当着容器分布式部署的大脑,旨在应用跨主机集群散布的容器来治理面向服务的应用程序。Kubernetes 提供了用于应用程序部署、调度、更新、服务发现和扩大的机制,然而监控 Kubernetes 呢? 尽管 Kubernetes 能够极大地简化将应用程序在容器以及跨云的部署过程,但它会为日常工作、应用程序性能治理、服务可见性以及典型的“监控->警报->故障排除”工作流程减少了复杂性。 旧版监控工具从动态指标中收集指标,用于监控服务器和服务,这些工具过来工作良好,但当初无奈失常工作。上面就是这些工具当初无奈监控 Kubernetes 的起因: Kubernetes 减少了基础架构的复杂性 为了简化应用程序部署,基础架构减少了新的复杂性层:动静配置的 IaaS、主动配置的配置管理工具以及编排平台(如 Kubernetes),它们都位于裸机或虚构基础架构与反对应用程序的服务之间,因而在管制立体上监控 Kubernetes 平安也是工作的一部分。 微服务架构 除了减少基础架构的复杂性之外,微服务还被设计了新的应用程序,其中互相通信的组件数量也会按数量级减少。每个服务散布在多个实例中,并且容器能够依据须要在根底构造中挪动。这就是监控 Kubernetes 编排状态对于理解 Kubernetes 执行工作至关重要的起因。咱们要验证服务的所有实例都已启动并运行。 原生云爆炸的规模要求 咱们须要监控零碎,这样能为高水平的服务指标收回警报,另外咱们也要保留粒度以依据须要查看各个组件。当采纳云原生架构时,它们带来了变动也带走了越来越多的小组件。这就影响了 Kubernetes 监控办法和工具。 随着指标数量的激增,传统的监控零碎已无奈跟上。尽管过来咱们能晓得每个服务组件有多少个实例以及它们位于何处,但当初状况已不再如此。当初指标通常具备肯定的基数,Kubernetes 会有一些多维级别,例如集群、节点、命名空间、Service 等。许多标签的代表属性来自于微服务的逻辑、应用程序版本、API 端点、特定资源或操作等。 另外,容器不会永远运行上来。据一份容器应用状况报告显示,22% 的容器寿命不超过 10 秒,54% 的容器寿命不到 5 分钟。这会造成很大的变动,容器 ID、Pod 名称之类的标签始终在变动,这也是咱们在解决新标签时却再也看不到它们的起因。 当初,咱们如果将度量规范的名称、标签与理论值、工夫戳一起应用,在短时间内,就将领有成千上万个数据点,即便是在小型 Kubernetes 集群中,也将生成数十万个工夫序列,如果是中型基础架构,可能就是数百万个。这就是为什么 Kubernetes 监控工具须要筹备好扩大成千上万个指标。 容器可见性有余 容器的生命周期是短暂的,它一旦死亡,外部的所有货色都将隐没,咱们无奈应用 SSH 或查看日志。容器非常适合操作,咱们能够打包、隔离应用程序,在任何中央以统一的形式部署它们,然而同时,它们同样会成为难以排除故障的黑盒。监控工具能够通过零碎调用跟踪从而提供详尽的可见性,这样咱们能够查看容器内产生的每个过程、文件或网络连接,从而更快地对问题进行故障排除。 思考到这些因素,咱们能够更好地了解为什么监控 Kubernetes 与监控服务器、VM 甚至是云实例有很大不同。 K8sMeetup ...

August 10, 2020 · 2 min · jiezi

关于kubernetes:Kubernetes-的资源管理

作者:Kim Wuestkamp翻译:Bach(才云) 校对:bot(才云)、星空下的文仔(才云) 在生产环境中应用 Kubernetes 之前,咱们应该理解 K8s 的资源管理,资源管理的外围就是 Kubernetes 调度器解决资源申请和限度。 K8sMeetup Pod 资源 在 K8s 中,一个 Pod 能够蕴含一个或多个容器,这些容器通常由 Docker 运行。 Pod 能够看做是容器的外包装,这二者会在同一台机器或节点上运行。一般来说,总的 Pod 资源就等于容器资源的总和。 资源申请和限度 为每个容器制订资源申请和限度,例如: 申请是保障失去的资源,其余 Pod 不能够应用这些资源。限度是容许应用比申请更多的资源。如果容器达到规定的限度,会被 CPU 超售并驱赶出内存。 K8sMeetup 调度器 K8s 调度器负责确定 Pod 能够在哪个节点上运行,它通过查看各种配置(例如亲和度、taints、tolerations)来实现。这里咱们仅关注次要配置:闲置资源(free resources)。当调度器做出无关“闲置资源”的决定时,它会查看两个数据:Node Allocatable 和 Node Requests。 节点的 Allocatable 与容量 调度器会查看节点的 Allocatable,它是整个节点减去 Kubelet 的保留资源。 咱们能够这样查看 Allocatable 和容量:kubectl get node worker1 -oyaml。 重要的是,无论节点上运行多少个 Pod,这些数字都不会扭转。只有节点通过 kubelet注册,它们就是固定不变的。 依据调度器开释资源 free = node allocatable — sum(all pod resource requests)这意味着调度器实际上不会间接查看节点或 Pod 的 CPU 和内存应用状况,而只会思考已申请的内容。 ...

August 10, 2020 · 2 min · jiezi

关于kubernetes:Kubernetes实战吴龙辉

Kubernetes实战吴龙辉 下载地址: https://pan.baidu.com/s/1HR9IQlOwweE4qdI_6UvdoQ 扫码上面二维码关注公众号回复100023 获取分享码 本书目录构造如下: 第 1局部 Kubernetes根底篇 第 1章 Kubernetes介绍 2 11为什么会有 Kubernetes 2 111云计算大潮 2 112不温不火的 PaaS 5 113 Docker的逆袭 5 12 Kubernetes 是什么 7 13 Kubernetes的倒退历史 8 14 Kubernetes的外围概念 9 141 Pod 9 142 Replication Controller 9 143 Service 9 144 Label 9 145 Node 9 第 2章 Kubernetes的架构和部署 10 21 Kubernetes的架构和组件 10 22 部署 Kubernetes 13 221环境筹备 14 222 运行 Etcd 15 223 获取 Kubernetes公布包 16 224 运行 Kubernetes Master组件 16 225 运行 Kubernetes Node组件 17 226 查问 Kubernetes的衰弱状态 18 227 创立 Kubernetes笼罩网络 19 23 装置 Kubernetes扩大插件 22 231 装置 Cluster DNS 23 232 装置 Cluster Monitoring 28 233 装置 Cluster Logging 36 234 装置 Kube UI 43 第 3章 Kubernetes疾速入门 46 31示例利用 Guestbook 46 32筹备工作 47 33 运行 Redis 48 331 创立 Redis Master Pod 48 332 创立 Redis Master Service 49 333 创立 Redis Slave Pod 51 334 创立 Redis Slave Service 53 34 运行 Frontend 54 341 创立 Frontend Pod 54 342 创立 Frontend Service 57 35 设置 Guestbook外网拜访 57 36 清理 Guestbook 59 第 4章 Pod 60 41国际惯例的 Hello World 60 42 Pod的基本操作 62 421 创立 Pod 62 422 查问 Pod 62 423 删除 Pod 65 424 更新 Pod 65 43 Pod与容器 65 431 镜像 66 432启动命令 69 433环境变量 70 434 端口 72 435数据长久化和共享 73 44 Pod的网络 74 45 Pod的重启策略 75 46 Pod的状态和生命周期 77 461容器状态 77 462 Pod的生命周期阶段 78 463生命周期回调函数 79 47自定义查看 Pod 81 471 Pod的健康检查 83 472 Pod的筹备情况查看 84 48 调度 Pod 85 49问题定位指南 87 491事件查问 88 492日志查问 88 493 Pod的临终遗嘱 89 494近程连贯容器 90 第 5章 Replication Controller 92 51继续运行的 Pod 92 52 Pod模板 94 53 Replication Controller和 Pod的关联 96 54弹性伸缩 99 55主动伸缩 101 56滚动降级 104 57 Deployment 107 58一次性工作的 Pod 112 第 6章 Service 114 61 Service代理 Pod 114 62 Service的虚构 IP 118 63服务代理 119 64服务发现 123 641环境变量 124 642 DNS 125 65 公布 Service 128 651 NodePort Service 128 652 LoadBalancer Service 129 653 Ingress 130 第 7章 数据卷 134 71 Kubernetes数据卷 134 72本地数据卷 135 721 EmptyDir 135 722 HostPath 136 73网络数据卷 137 731 NFS 137 732 iSCSI 138 733 GlusterFS 140 734 RBD(Ceph Block Device) 141 735 Flocker 142 736 AWS Elastic Block Store 143 737 GCE Persistent Disk 144 74 Persistent Volume和 Persistent Volume Claim 145 741 创立 Persistent Volume 147 742 创立 Persistent Volume Claim 149 75信息数据卷 151 751 Secret 151 752 Downward API 153 753 Git Repo 155 第 8章 拜访 Kubernetes API 157 81 API对象与元数据 157 82如何拜访 Kubernetes API 15983应用命令行工具 kubectl 160 831 配置 Kubeconfig 161 832 Kubernetes操作 163 833 API对象操作 164 834 Pod操作 168 835 Replication Controller操作 169 836 Service操作 170 第 2局部 Kubernetes高级篇 第 9章 Kubernetes网络 172 91 Docker网络模型 172 92 Kubernetes网络模型 173 93容器间通信 174 94 Pod间通信 176 941 Flannel实现 Kubernetes笼罩网络 177 942 应用 Open vSwitch实现 Kubernetes笼罩网络 180 95 Service到 Pod通信 183 951 Userspace模式 184 952 Iptables模式 186 第 10章 Kubernetes平安 189 101 Kubernetes平安准则 189 102 Kubernetes API的平安拜访 189 1021 HTTPS 190 1022认证与受权 191 1023 准入管制 Admission Controller 194 103 Service Account 195 1031 应用默认 Service Account 196 1032创立自定义 Service Account 199 1033 Service Account增加 Image Pull Secret 201 104容器平安 202 1041 Linux Capability 202 1042 SELinux 204105 多租户 204 第 11章 Kubernetes资源管理 206 111 Kubernetes资源模型 206 112资源申请和限度 207 113 Limit Range 210 114 Resource Quota 215 第 12章 治理和运维 Kubernetes 219 121 Daemon Pod 219 1211 Static Pod 219 1212 Daemon Set 221 122 Kubernetes的高可用性 222 123平台监控 224 1231 cAdvisor 224 1232 Heapster 228 124平台日志 230 125垃圾清理 234 1251 镜像清理 235 1252 容器清理 235 126 Kubernetes的 Web界面 235 第 3局部 Kubernetes生态篇 第 13章 CoreOS 240 131 CoreOS介绍 240 132 CoreOS工具链 241 1321 Etcd 241 1322 Flannel 241 1323 Rocket 241 1324 Systemd 241 1325 Fleet 241 133 CoreOS实际 242 1331 装置 CoreOS 242 1332 应用 CoreOS运行 Kubernetes 245 第 14章 Etcd 247 141 Etcd介绍 247 142 Etcd的构造 248 1421 Client-to-Server 249 1422 Peer-to-Peer 250 143 Etcd实际 250 1431 运行 Etcd 250 1432 Etcd集群化 251 1433 Etcd Proxy模式 258 1434 Etcd的平安模式 259 第 15章 Mesos 262 151 Mesos介绍 262 152 Mesos的架构 263 153 Marathon和 K8SM介绍 264 1531 Marathon 264 1532 K8SM 265 154 Mesos实际 266 1541 运行 Mesos 266 1542 运行 Marathon 268 1543 运行 K8SM 270 ...

August 10, 2020 · 4 min · jiezi

关于kubernetes:Kubernetes实战吴龙辉

Kubernetes实战吴龙辉 下载地址: https://pan.baidu.com/s/1HR9IQlOwweE4qdI_6UvdoQ 扫码上面二维码关注公众号回复100023 获取分享码 本书目录构造如下: 第 1局部 Kubernetes根底篇 第 1章 Kubernetes介绍 2 11为什么会有 Kubernetes 2 111云计算大潮 2 112不温不火的 PaaS 5 113 Docker的逆袭 5 12 Kubernetes 是什么 7 13 Kubernetes的倒退历史 8 14 Kubernetes的外围概念 9 141 Pod 9 142 Replication Controller 9 143 Service 9 144 Label 9 145 Node 9 第 2章 Kubernetes的架构和部署 10 21 Kubernetes的架构和组件 10 22 部署 Kubernetes 13 221环境筹备 14 222 运行 Etcd 15 223 获取 Kubernetes公布包 16 224 运行 Kubernetes Master组件 16 225 运行 Kubernetes Node组件 17 226 查问 Kubernetes的衰弱状态 18 227 创立 Kubernetes笼罩网络 19 23 装置 Kubernetes扩大插件 22 231 装置 Cluster DNS 23 232 装置 Cluster Monitoring 28 233 装置 Cluster Logging 36 234 装置 Kube UI 43 第 3章 Kubernetes疾速入门 46 31示例利用 Guestbook 46 32筹备工作 47 33 运行 Redis 48 331 创立 Redis Master Pod 48 332 创立 Redis Master Service 49 333 创立 Redis Slave Pod 51 334 创立 Redis Slave Service 53 34 运行 Frontend 54 341 创立 Frontend Pod 54 342 创立 Frontend Service 57 35 设置 Guestbook外网拜访 57 36 清理 Guestbook 59 第 4章 Pod 60 41国际惯例的 Hello World 60 42 Pod的基本操作 62 421 创立 Pod 62 422 查问 Pod 62 423 删除 Pod 65 424 更新 Pod 65 43 Pod与容器 65 431 镜像 66 432启动命令 69 433环境变量 70 434 端口 72 435数据长久化和共享 73 44 Pod的网络 74 45 Pod的重启策略 75 46 Pod的状态和生命周期 77 461容器状态 77 462 Pod的生命周期阶段 78 463生命周期回调函数 79 47自定义查看 Pod 81 471 Pod的健康检查 83 472 Pod的筹备情况查看 84 48 调度 Pod 85 49问题定位指南 87 491事件查问 88 492日志查问 88 493 Pod的临终遗嘱 89 494近程连贯容器 90 第 5章 Replication Controller 92 51继续运行的 Pod 92 52 Pod模板 94 53 Replication Controller和 Pod的关联 96 54弹性伸缩 99 55主动伸缩 101 56滚动降级 104 57 Deployment 107 58一次性工作的 Pod 112 第 6章 Service 114 61 Service代理 Pod 114 62 Service的虚构 IP 118 63服务代理 119 64服务发现 123 641环境变量 124 642 DNS 125 65 公布 Service 128 651 NodePort Service 128 652 LoadBalancer Service 129 653 Ingress 130 第 7章 数据卷 134 71 Kubernetes数据卷 134 72本地数据卷 135 721 EmptyDir 135 722 HostPath 136 73网络数据卷 137 731 NFS 137 732 iSCSI 138 733 GlusterFS 140 734 RBD(Ceph Block Device) 141 735 Flocker 142 736 AWS Elastic Block Store 143 737 GCE Persistent Disk 144 74 Persistent Volume和 Persistent Volume Claim 145 741 创立 Persistent Volume 147 742 创立 Persistent Volume Claim 149 75信息数据卷 151 751 Secret 151 752 Downward API 153 753 Git Repo 155 第 8章 拜访 Kubernetes API 157 81 API对象与元数据 157 82如何拜访 Kubernetes API 15983应用命令行工具 kubectl 160 831 配置 Kubeconfig 161 832 Kubernetes操作 163 833 API对象操作 164 834 Pod操作 168 835 Replication Controller操作 169 836 Service操作 170 第 2局部 Kubernetes高级篇 第 9章 Kubernetes网络 172 91 Docker网络模型 172 92 Kubernetes网络模型 173 93容器间通信 174 94 Pod间通信 176 941 Flannel实现 Kubernetes笼罩网络 177 942 应用 Open vSwitch实现 Kubernetes笼罩网络 180 95 Service到 Pod通信 183 951 Userspace模式 184 952 Iptables模式 186 第 10章 Kubernetes平安 189 101 Kubernetes平安准则 189 102 Kubernetes API的平安拜访 189 1021 HTTPS 190 1022认证与受权 191 1023 准入管制 Admission Controller 194 103 Service Account 195 1031 应用默认 Service Account 196 1032创立自定义 Service Account 199 1033 Service Account增加 Image Pull Secret 201 104容器平安 202 1041 Linux Capability 202 1042 SELinux 204105 多租户 204 第 11章 Kubernetes资源管理 206 111 Kubernetes资源模型 206 112资源申请和限度 207 113 Limit Range 210 114 Resource Quota 215 第 12章 治理和运维 Kubernetes 219 121 Daemon Pod 219 1211 Static Pod 219 1212 Daemon Set 221 122 Kubernetes的高可用性 222 123平台监控 224 1231 cAdvisor 224 1232 Heapster 228 124平台日志 230 125垃圾清理 234 1251 镜像清理 235 1252 容器清理 235 126 Kubernetes的 Web界面 235 第 3局部 Kubernetes生态篇 第 13章 CoreOS 240 131 CoreOS介绍 240 132 CoreOS工具链 241 1321 Etcd 241 1322 Flannel 241 1323 Rocket 241 1324 Systemd 241 1325 Fleet 241 133 CoreOS实际 242 1331 装置 CoreOS 242 1332 应用 CoreOS运行 Kubernetes 245 第 14章 Etcd 247 141 Etcd介绍 247 142 Etcd的构造 248 1421 Client-to-Server 249 1422 Peer-to-Peer 250 143 Etcd实际 250 1431 运行 Etcd 250 1432 Etcd集群化 251 1433 Etcd Proxy模式 258 1434 Etcd的平安模式 259 第 15章 Mesos 262 151 Mesos介绍 262 152 Mesos的架构 263 153 Marathon和 K8SM介绍 264 1531 Marathon 264 1532 K8SM 265 154 Mesos实际 266 1541 运行 Mesos 266 1542 运行 Marathon 268 1543 运行 K8SM 270 ...

August 10, 2020 · 4 min · jiezi

关于kubernetes:验证Kubernetes-YAML的最佳实践和策略

本文来自Rancher Labs Kubernetes工作负载最常见的定义是YAML格局的文件。应用YAML所面临的挑战之一是,它相当难以表白manifest文件之间的束缚或关系。 如果你想查看所有部署到集群中的镜像是否从受信赖的镜像仓库中提取应该怎么做?如何避免没有PodDisruptionBudgets的部署被提交到集群? 集成动态查看能够在靠近开发生命周期的时候发现错误和策略违规。而且因为围绕资源定义的有效性和安全性的保障失去了改善,你能够置信生产工作负载是遵循最佳实际的。 Kubernetes YAML文件动态查看的生态系统能够分为以下几类: API验证器:这一类工具能够针对Kubernetes API服务器验证给定的YAML manifest。 内置查看器:这一类工具捆绑了平安、最佳实际等方面的意见查看。 自定义验证器:这一类工具容许用几种语言编写自定义查看,如Rego和Javascript。 在本文中,你将学习并比拟六种不同的工具: KubevalKube-scoreConfig-lintCopperConftestPolaris让咱们开始吧! 验证Deployment在开始比拟工具之前,你应该设置一个基准。以下manifest并没有遵循最佳实际,可能存在一些问题,你能发现几个问题呢? apiVersion: apps/v1kind: Deploymentmetadata: name: http-echospec: replicas: 2 selector: matchLabels: app: http-echo template: metadata: labels: app: http-echo spec: containers: - name: http-echo image: hashicorp/http-echo args: ["-text", "hello-world"] ports: - containerPort: 5678---apiVersion: v1kind: Servicemetadata: name: http-echospec: ports: - port: 5678 protocol: TCP targetPort: 5678 selector: app: http-echo咱们将会应用这个YAML文件来比照不同的工具。 你能够在这个git仓库中找到下面的YAML清单、文件 base-valid.yaml以及文章中提到的其余manifest: https://github.com/amitsaha/k... manifest形容了一个总是在5678端口回复“Hello World”音讯的web应用程序。 你能够通过以下形式部署该应用程序: ...

August 5, 2020 · 6 min · jiezi

关于kubernetes:KubernetesSecret创建与挂载

SecretSecret 创立从文件导入至Secret$ echo -n 'admin' >./username.txt$ echo -n '1f2d1e2e67df' > ./password.txt$ kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txtsecret/db-user-pass created$ kubectl get secretNAME TYPE DATA AGEdb-user-pass Opaque 2 7sdefault-token-58nkl kubernetes.io/service-account-token 3 13d$ kubectl describe secrets/db-user-passName: db-user-passNamespace: defaultLabels: <none>Annotations: <none>Type: OpaqueData====username.txt: 5 bytespassword.txt: 12 bytes$ kubectl get secret db-user-pass -o yamlapiVersion: v1data: password.txt: MWYyZDFlMmU2N2Rm username.txt: YWRtaW4=kind: Secretmetadata: creationTimestamp: "2020-08-01T13:22:42Z" managedFields: - apiVersion: v1 fieldsType: FieldsV1 fieldsV1: f:data: .: {} f:password.txt: {} f:username.txt: {} f:type: {} manager: kubectl operation: Update time: "2020-08-01T13:22:42Z" name: db-user-pass namespace: default resourceVersion: "19559" selfLink: /api/v1/namespaces/default/secrets/db-user-pass uid: 7de7d667-9fd9-4d6e-8217-907b0715a77dtype: Opaque ...

August 1, 2020 · 2 min · jiezi

关于kubernetes:KubernetesSecret创建与挂载

SecretSecret 创立从文件导入至Secret$ echo -n 'admin' >./username.txt$ echo -n '1f2d1e2e67df' > ./password.txt$ kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txtsecret/db-user-pass created$ kubectl get secretNAME TYPE DATA AGEdb-user-pass Opaque 2 7sdefault-token-58nkl kubernetes.io/service-account-token 3 13d$ kubectl describe secrets/db-user-passName: db-user-passNamespace: defaultLabels: <none>Annotations: <none>Type: OpaqueData====username.txt: 5 bytespassword.txt: 12 bytes$ kubectl get secret db-user-pass -o yamlapiVersion: v1data: password.txt: MWYyZDFlMmU2N2Rm username.txt: YWRtaW4=kind: Secretmetadata: creationTimestamp: "2020-08-01T13:22:42Z" managedFields: - apiVersion: v1 fieldsType: FieldsV1 fieldsV1: f:data: .: {} f:password.txt: {} f:username.txt: {} f:type: {} manager: kubectl operation: Update time: "2020-08-01T13:22:42Z" name: db-user-pass namespace: default resourceVersion: "19559" selfLink: /api/v1/namespaces/default/secrets/db-user-pass uid: 7de7d667-9fd9-4d6e-8217-907b0715a77dtype: Opaque ...

August 1, 2020 · 2 min · jiezi

关于kubernetes:KubernetesConfigmap使用创建与读取方式

ConfigmapConfigmap如何创立?命令行创立$ kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charmconfigmap/special-config created$ kubectl get cmNAME DATA AGEspecial-config 2 4s$ kubectl get configmaps special-config -o yamlapiVersion: v1data: special.how: very special.type: charmkind: ConfigMapmetadata: creationTimestamp: "2020-08-01T12:14:17Z" managedFields: - apiVersion: v1 fieldsType: FieldsV1 fieldsV1: f:data: .: {} f:special.how: {} f:special.type: {} manager: kubectl operation: Update time: "2020-08-01T12:14:17Z" name: special-config namespace: default resourceVersion: "18003" selfLink: /api/v1/namespaces/default/configmaps/special-config uid: 6c116e86-d6b3-4d32-be87-d32f9a608219 基于文件创建$ kubectl create configmap nginx-config --from-file=./nginx.confconfigmap/nginx-config createdca0gu0@ca0gu0deMBP configmap % kubectl get configmap nginx-config -o yaml apiVersion: v1data: nginx.conf: | #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"' '$upstream_addr $upstream_status $request_time $upstream_response_time'; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log; server_tokens off; include mime.types; default_type application/octet-stream; sendfile on; tcp_nopush on; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 300; proxy_buffer_size 64k; proxy_buffers 4 512k; proxy_busy_buffers_size 512k; proxy_temp_file_write_size 512k; proxy_temp_path /data/nginx/proxy_temp; proxy_cache_path /data/nginx/proxy_cache levels=1:2 keys_zone=cache_one:2000m inactive=3d max_size=500g; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; upstream go { server www.cnblogs.com:80 weight=4; #server 42.121.252.58:80 weight=4; } server { listen 192.168.55.133:80; #server_name www.cnblogs.com; access_log /var/log/nginx/go.access.log main; error_log /var/log/nginx/go.error.log error; location / { proxy_cache cache_one; #proxy_cache_valid 200 304 301 302 2h; #proxy_cache_valid any 2h; #expires 1d; add_header X-Cache $upstream_cache_status; proxy_pass http://go; proxy_cache_key $uri$is_args$args; } location ~ /purge(/.*) { allow 127.0.0.1; allow 192.168.55.0/24; deny all; proxy_cache_purge cache_one $1$is_args$args; } } }kind: ConfigMapmetadata: creationTimestamp: "2020-08-01T12:19:48Z" managedFields: - apiVersion: v1 fieldsType: FieldsV1 fieldsV1: f:data: .: {} f:nginx.conf: {} manager: kubectl operation: Update time: "2020-08-01T12:19:48Z" name: nginx-config namespace: default resourceVersion: "18116" selfLink: /api/v1/namespaces/default/configmaps/nginx-config uid: 2fb95961-a780-45ea-8db3-8ba85db1270d ...

August 1, 2020 · 2 min · jiezi

关于kubernetes:K8S-生态周报-NGINX-Ingress-Controller又添新特性

「K8S 生态周报」内容次要蕴含我所接触到的 K8S 生态相干的每周值得举荐的一些信息。欢送订阅知乎专栏「k8s生态」。Conftest 正式退出 Open Policy Agent 我的项目conftest 是一个十分实用的 CLI 工具,能够用于测试/验证配置文件是否合乎预期。例如,能够通过如下内容来定义规定: package maindeny[msg] { input.kind = "Deployment" not input.spec.template.spec.securityContext.runAsNonRoot = true msg = "Containers must not run as root"}deny[msg] { input.kind = "Deployment" not input.spec.selector.matchLabels.app msg = "Containers must provide app label for pod selectors"}应用此规定去查看一个未合乎预期规定的 Deployment 的配置文件: (MoeLove) ➜ conftest test deployment.yamlFAIL - deployment.yaml - Containers must not run as rootFAIL - deployment.yaml - Deployments are not allowed2 tests, 0 passed, 0 warnings, 2 failures就会看到有相应的查看后果了。 ...

July 31, 2020 · 2 min · jiezi

关于kubernetes:GitOps初阶指南将DevOps扩展至K8S

本文转自Rancher Labs 在过来十年的编程中,呈现了一些革命性的转变。其中之一是源于围绕DevOps的实际,它将开发和运维团队整合到一个共享的工作流程中,此外还有继续集成和继续交付(CI/CD),通过CI/CD,Devops团队能够向代码库提供继续的更新。另一个改革来自于从单体代码库到基于云的微服务的迁徙,这些微服务运行在由Kubernetes等编排平台治理的容器中。 即便有Kubernetes这样的平台来编排协调,在集群零碎或云端运行的基于容器的应用程序仍旧可能是简单的、难以调配和治理的。GitOps是一套新兴的实际,旨在通过利用Devops和CI/CD世界的技术来简化这一治理工作。 GitOps的要害是基础设施即代码(IaC)的理念,它采纳与DevOps用于提供应用程序一样的办法来提供基础设施。所以,不仅是利用,还有底层的主机和网络都被形容在文件中,这些文件能够像版本控制系统中的其余代码一样,而后由自动化流程来将事实世界的利用与这些文件中形容的利用进行交融。 用GitOps的说法,版本控制系统中的代码是对于利用在生产中应该是什么样子的惟一假相起源(single source of truth)。 定义GitOpsWeaveworks是在GitOps概念遍及方面奉献最大的公司。稍后咱们会具体介绍Weaveworks在其中表演的角色,但首先,咱们先来看看该公司对GitOps的定义,它有两个方面: Kubernetes和其余云原生技术的运维模式,为对立部署、治理和监控容器化集群和利用提供了一套最佳实际。GitOps是一条通往治理利用的开发者体验之路;在这里,端到端的CI/CD流水线和Git workflow能够同时利用于运维和开发。换句话说,GitOps是一套特定的实际,旨在治理Kubernetes和相似的平台。随着越来越多的开发团队采纳DevOps实际,并将代码迁徙到云端,GitOps也将会适宜更宽泛的利用。但要理解GitOps的秘诀和它所能解决的问题,咱们须要谈谈它的组成部分。 Git定义在GitOps中Git指的是由Linus Torvalds在2005年开发的极为风行的分布式版本控制系统。Git是一个工具,它容许开发者团队在一个利用程序代码库上独特工作,存储各种代码分支,在将它们合并到生产代码之前,他们能够对这些代码进行修补。Git 的一个要害概念是拉取申请,即开发人员正式要求将他们正在编写的一些代码整合到代码库的另一个分支中。 Git 拉取申请为团队成员提供了一个合作和探讨的机会,而后再就是否应该将新代码增加到应用程序中达成共识。Git 还会存储旧版本的代码,如果出了问题,能够很容易地回滚到上一个好的版本,并能够让你疾速查看两次批改之间的变动。Git 最为人所知的局部可能是作为GitHub 这一云端托管版本控制系统的底层,但 Git 自身也是一个开源软件,能够部署在任何中央,无论是公司外部的服务器还是你的PC。 须要留神的是,尽管咱们通常认为Git是一个计算机编程工具,但实际上取决于你如何应用它。Git 很乐意将任何文本文件作为你的 “代码库”,例如,它能够被作者用来记录单干作品的编辑状况。这一点很重要,因为GitOps的外围代码库大多由申明式配置文件而非可执行代码组成。 在咱们持续之前,最初要强调一件事——只管名字中就有 “Git”,但GitOps实际上并不必要应用Git。 曾经投入使用其余版本控制软件(如Subversion)的团队也能够实现GitOps。但在Devops畛域,Git被宽泛用于实现CI/CD,所以大多数GitOps我的项目最终都会应用Git。 什么是CI/CD流程?对于CI/CD的残缺解释其实不在本文探讨的范畴内,然而因为CI/CD是 GitOps 工作的外围,因而咱们须要对其进行简略的介绍。CI/CD中的一半继续集成是由版本控制仓库(如Git)实现的。开发者能够对代码库进行继续的小改良,而不是每隔几个月或几年就推出微小的、繁多的新版本。继续部署这一块是通过被称为流水线(pipeline)的自动化零碎来实现的,这些流水线能够构建、测试和部署新的代码到生产中。 同样,咱们在这里始终在议论代码,这通常会让人联想到用C语言、Java或JavaScript等编程语言编写的可执行代码。但在GitOps中,咱们所治理的 “代码” 次要是由配置文件组成的。这不是一个小细节,而是GitOps工作的外围。正如咱们所说,这些配置文件是形容咱们的零碎应该是什么样子的 “惟一真谛起源(single source of truth)”。它们是申明式的,而不是指导性的。这意味着,配置文件不会说 “启动十台服务器”,而会简略地说 “这个零碎包含十台服务器”。 GitOps方程中的CI那一半容许开发人员疾速推出对这些配置文件的调整和改良;当自动化软件代理全力以赴确保应用程序的实时版本可能反映配置文件中的形容时,CD这一部分会以GitOps语言趋向于申明式模型。 GitOps和Kubernetes正如咱们所提到的,GitOps的概念最后是围绕治理Kubernetes利用而呈现的。通过咱们当初对GitOps的理解,让咱们重温一下Weaveworks的GitOps探讨,看看他们是如何形容如何对基于GitOps准则治理的Kubernetes进行更新的。上面是对整个流程的总结: 一个开发者为一个新性能提出Git 拉取申请。审查和批准代码,而后将其合并到主代码库中。合并会触发 CI/CD 流水线、自动测试和重建新代码,并将其部署到仓库。软件代理留神到更新,从仓库中提取新代码,并更新配置仓库中的配置文件(用YAML编写)。Kubernetes集群中的软件代理依据配置文件,检测到集群曾经过期,拉取更改,并部署新性能。Weaveworks和GitOps显然,这里的第4步和第5步做了很多沉重的工作。将Git仓库中的 "真谛起源 "与事实世界中的Kubernetes利用进行神奇同步的软件代理,就是让GitOps成为可能的魔法。正如咱们所说,在GitOps术语中,让实时零碎更像配置文件中形容的现实零碎的过程叫做交融。当实时零碎和现实零碎不同步时,那就是一致。现实状况下,交融能够通过自动化流程来实现,但自动化所能做的事件是有限度的,有时人工干预是必要的。 咱们在这里用通用术语形容了这个过程,但事实上,如果你真的去看Weaveworks的页面,咱们提到的 “软件代理” 是该公司Weave Cloud平台的一部分。“GitOps” 这个词是由Weaveworks的CEO Alexis Richardson发明的,它的局部作用是让Weaveworks平台对曾经沉迷在DevOps和CI/CD世界的开发者有吸引力。 但Weaveworks从未声称本人垄断了GitOps,GitOps更多的是一种理念和一套最佳实际,而不是某种具体的产品。 正如提供CI/CD解决方案的公司CloudBees的博客所指出的那样,GitOps代表了一种凋谢的、厂商中立的模式,它是针对亚马逊、谷歌和微软等大型云厂商推出的管理型专有Kubernetes解决方案而开发的。CloudBees提供了本人的GitOps解决方案,这个畛域的另一些玩家也是如此。 GitOps和DevOpsAtlassian是一家为麻利开发者制作了许多工具的公司,它有一篇对于GitOps的历史和目标的深度博文(https://www.atlassian.com/git... ),值得你花工夫去理解。在他们看来,GitOps代表了作为devops的理念的逻辑延长。具体来说,GitOps是对基础架构即代码(IaC)这一概念的论述,而基础架构自身就是DevOps环境下产生的一种思维。在Atlassian看来,GitOps补救了现有DevOps技术与分布式、云托管利用的非凡需要之间的要害差距,现有DevOps技术是为了解决系统管理问题而倒退起来的。各个云厂商提供的主动交融是GitOps的特别之处。 尽管GitOps明天依然专一于Kubernetes,但咱们心愿咱们曾经明确了它如何实用于更宽泛的分布式、基于云的利用世界。开源平安厂商WhiteSource的一篇博文概述了GitOps的劣势: 可察看性:GitOps零碎为简单的利用提供了监控、日志、跟踪和可视化性能,因而开发人员能够看到什么中央呈现了故障,在哪里呈现了故障。版本控制和变更治理:很显著,这是应用Git这样的版本控制系统的一个要害劣势。有缺点的更新能够轻松回滚。易于采纳:GitOps建设在许多开发人员曾经把握的开发技能之上。进步生产力:GitOps 能够像开发我的项目和 CI/CD 那样进步工作效率。审计:有了Git,每一个操作都能够追踪到一个特定的提交,这样就能够很容易地追踪到谬误的起因。即便你不应用Kubernetes,GitOps也很有可能迟早会成为你工作流程的一部分。

July 30, 2020 · 1 min · jiezi

关于kubernetes:KubernetesStatefulSetPVPVC

StatefulSet适应场景: [x] 稳固且惟一的网络标识符[x] 稳固且长久的存储[x] 有序,优雅的部署和扩大[x] 有序,优雅的删除和终止[x] 有序而主动的滚动更新通用的StatefulSet形成: [x] Headless Service[x] StatefulSet[x] volumeClaimTemplate构建NFS文件系统装置NFS文件系统$ yum install -y nfs-common nfs-utils rpcbind$ mkdir /nfsdata /nfs1$ chmod 666 /nfsdata$ chown nfsnobody /nfsdata$ cat /etc/exports/data/nfs1 *(rw,no_root_squash,no_all_squash,sync)/data/nfs2 *(rw,no_root_squash,no_all_squash,sync)$ systemctl start rpcbind$ systemctl start nfs# 在kubernetes节点或者是minikube主机上用工具挂载测试$ sudo mount -t nfs 172.16.56.138:/data/nfs1 /data$ ls /dataindex.html StatefulSet/PV/PVC实战创立PV$ cat nfs-pv.yaml apiVersion: v1kind: PersistentVolumemetadata: name: nfspv1spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: nfs nfs: path: /data/nfs1 server: 172.16.56.138 $ kubectl apply -f nfs-pv.yaml$ kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEnfspv1 10Gi RWO Retain Available nfs 5s ...

July 29, 2020 · 2 min · jiezi