Kubernetes-Helm
十二、Helm 在没使用 helm 之前,向 kubernetes 部署应用,我们要依次部署 deployment、svc 等,步骤较繁琐。况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,helm通过打包的方式,支持发布的版本管理和控制,很大程度上简化了 Kubernetes 应用的部署和管理。 Helm 本质就是让 K8s 的应用管理(Deployment,Service 等 ) 可配置,能动态生成。通过动态生成 K8s 资源清单文件(deployment.yaml,service.yaml)。然后调用Kubectl自动执行K8s资源部署。 Helm 是官方提供的类似于 YUM 的包管理器,是部署环境的流程封装。Helm 有两个重要的概念:chart和release: chart 是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板、参数定义、依赖关系、文档说明等。chart 是应用部署的自包含逻辑单元。可以将 chart 想象成 apt、yum 中的软件安装包。 release 是 chart 的运行实例,代表了一个正在运行的应用。当 c ...
hexo自动更新文章修改时间
一、问题描述 在部署完Github Action实现自动部署博客之后,存在一个问题,每次更新时,由于是云函数部署,所有的文章的更新时间都会改变,目前只能通过为文章添加updated字段再提交才能避免这种情况。 但是每次更新文章都要手动去修改updated,这么麻烦的事情当然要交给程序去做。想过用python但是考虑到有些人可能没有python环境,而使用hexo部署博客的人肯定都有node环境,因此采用js来完成。 二、解决方案 首先,如果你之前没有为文章添加updated字段,需要先添加上。 1 为现有的文章添加updated字段 如果你现有文章已经有updated字段,此步骤可以跳过。 代码参考:批量写入文件的修改时间,原来的代码在多次运行时,重复添加字段,我对其做了优化,重复运行也只会添加一个updated字段。 创建js文件:博客根目录/source/_posts/writeupdatetime.js,文件内容如下 12345678910111213141516171819202122232425262728293031323334353637383940414243444 ...
Kubernetes-计算资源管理
十一、计算资源管理 到目前为止,我们在创建pod时并不关心它们使用CPU和内存资源的最大值。但是在某些场景下,为一个pod配置资源的预期使用量和最大使用量是pod定义中的重要组成部分。通过设置这两组参数,可以确保pod公平地使用Kubernetes集群资源,同时也影响着整个集群pod的调度方式。 1 基本概念 1.1 请求和约束 如果 Pod 运行所在的节点具有足够的可用资源,容器可能(且可以)使用超出对应资源 request 属性所设置的资源量。不过,容器不可以使用超出其资源 limit 属性所设置的资源量。 1.2 资源类型 CPU 和内存都是资源类型。每种资源类型具有其基本单位。 CPU 表达的是计算处理能力,其单位是 Kubernetes CPUs。 内存的单位是字节。 CPU 和内存统称为计算资源,或简称为资源。计算资源的数量是可测量的,可以被请求、被分配、被消耗。它们与API 资源不同。 API 资源(如 Pod 和 Service)是可通过Kubernetes API服务器读取和修改的对象。 1.3 Kubernetes中的资源单位 CPU资源的约束和请求以CPU为单位 ...
Kubernetes-API Server的访问控制
十、API Server的访问控制 Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server是集群内部各个组件通信的中介,也是外部控制的入口。所以Kubernetes的安全机制基本就是围绕保护API Server来设计的。 在第八章中,提到API服务器的安全防护流程,当请求到达 API 时,它会经历多个阶段,如下图所示: Kubernetes使用了认证(Authentication)、鉴权(Authorization)、准入控制(Admission Control)三步来保证API Server的安全。 1 认证 API服务器接收到的请求会经过一个认证插件的列表,列表中的每个插件都可以检查这个请求和尝试确定谁在发送这个请求。列表中的第一个插件可以提取请求中客户端的用户名、用户ID和组信息,并返回给API服务器。API服务器会停止调用剩余的认证插件井继续进入授权阶段。 认证分为两种: 客户端认证:控制k8s组件对API服务器的访问,比如kubectl、Controller Manager、Scheduler、kubelet、kube- ...
Kubernetes-高级调度
九、高级调度 在第八章中,介绍了调度器的工作过程,以及调度器的过滤和打分行为,这些操作都是k8s的自主行为,用户并不需要干预。而高级调度就是指Kubernetes允许你去影响pod被调度到哪个节点。 1 污点和容忍度 1.1 介绍污点和容忍度 首先要介绍的高级调度的两个特性是节点污点, 以及pod对于污点的容忍度,这些特性可以阻止pod调度到特定节点。 先来看看现有节点的污点信息,默认情况下,一个集群中的主节点需要设置污点,这样才能保证只有控制面板pod才能部署在主节点上: 1kubectl describe node k8s-master 输出的结果如下(部分): 1234567891011121314151617Name: k8s-masterRoles: masterLabels: beta.kubernetes.io/arch=amd64 beta.kubernetes.io/os=linux kubernetes.io/a ...
Kubernetes-运行原理
八、运行原理 此处,你应该已经熟悉Kubernetes能提供什么以及做了什么。现在,是时候了解下它们是怎么被实现的了。 1 Kubernetes架构 在第一章中,介绍过Kubernetes的架构,现在来回顾一下。Kubernetes集群分为两部分: Kubernetes控制平面(主节点) 工作节点 控制平面负责控制并使得整个集群正常运转。控制平面包含如下组件: Kubernetes API Server,控制面板所有的其他组件都要和它通信 Scheduler,调度器,为应用分配工作节点 Controller Manager,控制管理器执行集群级别的功能,比如复制组件、持续跟踪工作节点等 etcd分布式可监控存储,它能够持久化存储集群配置 这些组件用来存储、管理集群状态, 但它们不是运行应用的容器。工作节点是真正运行应用的地方。主要包含如下组件: Docker等容器 Kubelet,能够与主节点控制面板的API Server通信,还可以部署、监控、维护它所在节点的容器 Proxy,它负责组件之间的负载均衡和服务发现 除了控制平面(和运行在节点上的组件, 还要有几个附加组件, ...
Kubernetes-有状态服务
七、有状态服务 了解完数据卷之后,你知道了如何运行一个单实例pod和无状态的多副本pod,还有如何通过持久化存储运行一个有状态pod。可以运行几个多副本的web服务pod实例,运行一个提供持久化存储的单数据库pod实例,这个持久化存储可以是简单的pod卷,也可以是一个绑定到持久卷上的持久卷声明。但是是否可以通过ReplicaSet来复制数据库pod呢? 1 运行每个实例都有单独存储的多副本 ReplicaSet通过一个pod模板创建多个pod副本。这些副本除了它们的名字和IP地址不同外,没有别的差异。如果pod模板里描述了一个关联到特定持久卷声明的数据卷,那么ReplicaSet的所有副本都将共享这个持久卷声明,也就是绑定到同一个声明的持久卷。如下图: ReplicaSet里的所有pod共享相同的持久卷声明和持久卷。因为是在pod模板里关联声明的,又会依据pod模板创建多个pod副本,则不能对每个副本都指定独立的持久卷声明。那如何运行一个pod的多个副本,让每个pod都有独立的存储卷? 1.1 手动创建pod 可以手动创建多个pod,每个pod使用一个独立的持久卷声明,但是因为没有一 ...
Kubernetes-存储
六、存储 现在来了解容器是如何访问外部磁盘存储的,以及如何在它们之间共享存储空间。容器中的文件在磁盘上是临时存放的,这给容器中运行的较重要的应用程序带来一些问题: 当容器崩溃时文件丢失。kubelet会重新启动容器,但容器会以干净的状态重启。当容器被重建时,我们可能希望新的容器可以在之前容器结束的位置继续运行,比如在物理机上重启进程。可能不需要(或者不想要)整个文件系统被持久化, 但又希望能保存实际数据的目录。 同一Pod中运行多个容器时,我们可能希望容器之间能够共享文件,但容器本身是彼此隔离的。 Kubernetes 卷(Volume)这一抽象概念能够解决这两个问题。它们不像pod这样的顶级资源,而是被定义为pod的一部分,并和pod共享相同的生命周期(临时卷)。这意味着在pod启动时创建卷,并在删除pod时销毁卷。因此,在容器重新启动期间,卷的内容将保持不变,在重新启动容器之后,新容器可以识别前一个容器写入卷的所有文件。针对第二个问题,如果一个pod包含多个容器,那这个卷可以同时被所有的容器使用。 1 卷介绍 Kubernetes的卷是pod的一个组成部分,因此像容器一样在po ...
Kubernetes-服务
五、服务 假设现在通过Deployment部署了一些pod,这些pod是一些网络服务,即它们需要根据外部请求做出响应(比如这些pod提供了网上商城的服务)。如果是传统部署,只需要在配置文件中明确指出服务器的IP地址或者域名即可被外界访问,但是在k8s中不可以,因为: pod存在生命周期,它们是短暂的,它们会根据系统的各种情况被删除,然后再次重建 k8s在启动前会给调度到节点上的pod分配IP地址,因此客户端不能提前知道pod的IP地址 多个pod可能提供同一个服务,每个pod都有自己的IP地址,但客户端的访问只需要一个固定的IP地址 为了解决以上问题,k8s提供了一种资源——Service(服务),简称为svc。 1 基础概念 Kubernetes的服务是一种为一组功能相同的pod提供单一不变的接入点的资源。当服务存在时,它的IP地址和端口不会改变。客户端通过这个IP地址和端口号建立连接,这些连接会被路由到提供该服务的任意一个pod上。前端客户端不应该也没必要知道每个单独的提供服务的pod的地址,这样这些pod就可以在集群中随时被创建或移除。 举个例子,一个应用分为两部分,有很多p ...
Kubernetes-介绍
一、介绍 1 Kubernetes的发展和基础概念介绍 如今,大型单体应用正被逐渐分解成小的、可独立运行的组件,我们称之为微服务。微服务彼此之间解耦, 所以它们可以被独立开发、部署、升级、伸缩。这使得我们可以对每一个微服务实现快速迭代, 并且迭代的速度可以和市场需求变化的速度保持一致。但随着部署组件的增多和数据中心的增长,配置、管理并保持系统的正常运行变得越来越困难,我们需要一些自动化的措施,包括自动调度、配置、监管和故障处理。这正是Kubernetes的用武之地。 Kubernetes 简称 K8S,是google公司2014年对外开源的一个容器集群管理系统,它可以帮助你轻松部署和管理容器化的应用。随着容器平台的逐渐发展,多机容器编排的需求也逐渐增长,当一个公司拥有成千上万台机器时,一个优秀的容器编排系统可以帮助提升基础设施的利用率,变相地为公司节省了数百万美元。Kubernetes 提供了完善的管理工具,这些工具涵盖了开发、部署测试、运维监控在内的各个环节。Kubernetes具有完备的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、 ...