一、NetworkPolicy基础概念 如果你希望在 IP 地址或端口层面(OSI 第 3 层或第 4 层)控制网络流量, 则你可以考虑为集群中特定应用使用 Kubernetes 网络策略(NetworkPolicy)。 NetworkPolicies 适用于一端或两端与 Pod 的连接,与其他连接无关。 Pod 可以通信的 Pod 是通过如下三个标识符的组合来辩识的 其他被允许的 Pods(例外:Pod 无法阻塞对自身的访问) 被允许的名字空间 IP 组块(例外:与 Pod 运行所在的节点的通信总是被允许的, 无论 Pod 或节点的 IP 地址) 配置前置条件 网络策略通过网络插件来实现。要使用网络策略,你必须使用支持 NetworkPolicy 的网络解决方案。 创建一个 NetworkPolicy 资源对象而没有控制器来使它生效的话,是没有任何作用的。使用支持网络策略的网络插件才可以正常使用网络策略如calico。 Pod 隔离的两种类型 Pod 有两种隔离: 出口的隔离和入口的隔离。它们涉及到可以建立哪些连接。 这里的“隔离”不是绝对的,而是意味着“有一些限制”。 另外的,....
JuiceFS文件系统
一、JuiceFS介绍 官方网站:https://juicefs.com/ github:https://github.com/juicedata/juicefs JuiceFS 是一款面向云原生设计的高性能共享文件系统,在 Apache 2.0 开源协议下发布。提供完备的POSIX兼容性,可将几乎所有对象存储接入本地作为海量本地磁盘使用,亦可同时在跨平台、跨地区的不同主机上挂载读写。JuiceFS 采用「数据」与「元数据」分离存储的架构,从而实现文件系统的分布式设计。使用 JuiceFS 存储数据,数据本身会被持久化在对象存储(例如,Amazon S3),相对应的元数据可以按需持久化在 Redis、MySQL、TiKV、SQLite 等多种数据库中。 核心特性 POSIX 兼容:像本地文件系统一样使用,无缝对接已有应用,无业务侵入性; 云原生:通过 CSI Driver 轻松地在 Kubernetes 中使用 JuiceFS; 分布式设计:同一文件系统可在上千台服务器同时挂载,高性能并发读写,共享数据; 强一致性:确认的文件修改会在所有服务器上立即可见,保证强一致性; 强悍性能:毫....
k8s之监控告警
一、k8s监控架构介绍 Prometheus(普罗米修斯)是一个最初在SoundCloud上构建的监控系统。自2012年成为社区开源项目,拥有非常活跃的开发人员和用户社区。为强调开源及独立维护,Prometheus于2016年加入云原生云计算基金会(CNCF),成为继Kubernetes之后的第二个托管项目。 Prometheus Server:Prometheus 生态最重要的组件,主要用于抓取和存储时间 序列数据,同时提供数据的查询和告警策略的配置管理; Alertmanager:Prometheus 生态用于告警的组件,Prometheus Server 会将告警发送给 Alertmanager,Alertmanager 根据路由配置,将告警信息发送给指定的人或组。Alertmanager 支持邮件、Webhook、微信、钉钉、短信等媒介进行告 警通知; Grafana:用于展示数据,便于数据的查询和观测; Push Gateway:Prometheus 本身是通过 Pull 的方式拉取数据,但是有些监控数 据可能是短期的,如果没有采集数据可能会出现丢失。Push Gatew....
k8s之Ingress详解
一、Ingress介绍 ingress主要解决集群中东西流量的访问也就是外部客户端访问k8s内部服务的流量,具体架构图如下 k8s如果使用Ingress功能,需要安装Ingress控制器,直接创建Ingress规则是没有任何效果的,官方维护的Ingress控制器有: AWS GCE nginx Ingress 控制器 二、Ingress控制器安装 2.1 安装Ingress nginx控制器 需要首先安装helm管理工具:https://github.com/helm/helm Ingress nginx控制器官方:https://kubernetes.github.io/ingress-nginx/deploy/#using-helm 首先安装helm [20:05:16 root@master01 ~]#ls helm-v3.7.2-linux-amd64.tar.gz [20:05:40 root@master01 ~]#tar xf helm-v3.7.2-linux-amd64.tar.gz [20:05:59 root@master01 ~]#cp linux-amd....
k8s日志收集
一、k8s日志收集介绍 1.1 Pod日志收集 应用程序和系统日志可以帮助我们了解集群内部的运行情况,日志对于我们调试问题和监视集群情况也是非常有用的。而且大部分的应用都会有日志记录,对于传统的应用大部分都会写入到本地的日志文件之中。对于容器化应用程序来说则更简单,只需要将日志信息写入到 stdout 和 stderr 即可,容器默认情况下就会把这些日志输出到宿主机上的一个 JSON 文件之中,同样我们也可以通过 docker logs 或者 kubectl logs 来查看到对应的日志信息。 但是,通常来说容器引擎或运行时提供的功能不足以记录完整的日志信息,比如,如果容器崩溃了、Pod 被驱逐了或者节点挂掉了,我们仍然也希望访问应用程序的日志。所以,日志应该独立于节点、Pod 或容器的生命周期,这种设计方式被称为 cluster-level-logging,即完全独立于 Kubernetes 系统,需要自己提供单独的日志后端存储、分析和查询工具。 k8s中大多数的Pod日志被输出到控制台,在宿主机的文件系统每个Pod会创建一个存放日志的文件夹/var/log/pods/这里会存放所有....
k8s高级调度污点与容忍
一、Taint与Toleration 官方文档:https://kubernetes.io/zh/docs/concepts/scheduling-eviction/taint-and-toleration/ 生产环境中的Pod并非随便调度,某些node节点可能并不一样,比如GPU节点一般比较昂贵,并不是所有Pod都需要GPU资源,所有需要管理员进行控制。节点亲和性是Pod 的一种属性,它使 Pod 被吸引到一类特定的节点(这可能出于一种偏好,也可能是硬性要求)。 污点(Taint)则相反它使节点能够排斥一类特定的 Pod。容忍度(Toleration)是应用于 Pod 上的,允许(但并不要求)Pod 调度到带有与之匹配的污点的节点上。 污点和容忍度(Toleration)相互配合,可以用来避免 Pod 被分配到不合适的节点上。 每个节点上都可以应用一个或多个污点,这表示对于那些不能容忍这些污点的 Pod,是不会被该节点接受的。 设计理念:Taint在一类服务器上打上污点,让不能容忍这个污点的Pod不能部署在打了污点的服务器上。Toleration是让Pod容忍节点上配置的污点,可以让....
helm仓库详解
一、Helm仓库介绍 Helm在k8s 中的作用类似与centos中的yum工具,Chart代表着 Helm 包。它包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定义。你可以把它看作是 Homebrew formula,Apt dpkg,或 Yum RPM 在Kubernetes 中的等价物。所以生成的Chart也需要Repository(仓库)用来提供Chart的统一管理。 Helm仓库的构成,仓库中主要的的文件有俩部分分别是Chart的压缩包以及index.yaml文件,最重要的文件其实是index.yaml文件,他的作用主要是为整个仓库的Chart包提供索引,以供helm客户端进行读取检索仓库中有那些Chart包,在helm工具第一次添加仓库时客户端会把这个文件下载到本地,如果仓库中新添加了Chart包,客户端必须使用helm repo update进行仓库的更新以获取最新的index.yaml文件。如果自行使用http服务进行仓库的搭建需要手动维护index.yaml文件。文件的生成命令为helm repo index。 这里介绍俩个Reposit....
k8s细颗粒度权限控制RBAC
一、RBAC介绍 官方文档:https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/ 基于角色(Role)的访问控制(RBAC)是一种基于组织中用户的角色来调节控制对 计算机或网络资源的访问的方法。RBAC 鉴权机制使用 rbac.authorization.k8s.io API 组来驱动鉴权决定,允许你通过 Kubernetes API 动态配置策略。要启用 RBAC,在启动api-server服务器时将 --authorization-mode 参数设置为一个逗号分隔的列表并确保其中包含 RBAC。 --authorization-mode=Example,RBAC 1.1 RBAC中的API对象 RBAC API 声明了四种 Kubernetes 对象:Role、ClusterRole、RoleBinding 和 ClusterRoleBinding。你可以像使用其他 Kubernetes 对象一样, 通过类似 kubectl 这类工具创建对象, 或修改对象。 1.Role 和 ClusterRole RB....
k8s调度准入控制
一、ResourceQuota 官方文档:https://kubernetes.io/zh/docs/concepts/policy/resource-quotas/ 当多个用户或团队共享具有固定节点数目的集群时,人们会担心有人使用超过其基于公平原则所分配到的资源量。资源配额是帮助管理员解决这一问题的工具。资源配额,通过 ResourceQuota 对象来定义,对每个命名空间的资源消耗总量提供限制。 它可以限制命名空间中某种类型的对象的总数目上限,也可以限制命令空间中的 Pod 可以使用的计算资源的总上限。 ResourceQuota作用于namespace,限制命名空间可用的资源。创建在那个命名空间就对这个命名空间生效。 示例文件 apiVersion: v1 kind: ResourceQuota metadata: name: resource-test labels: app: resourcequota spec: hard: #以下为常用的配置,其他配置请查看官方文档 pods: 50 #Pod的最大数量 requests.cpu: 0.5 #请求最大的cpu reques....
Job&CronJob
一、Job&CronJob介绍 1.1 Job介绍 官方介绍:https://kubernetes.io/zh/docs/concepts/workloads/controllers/job/ Job 会创建一个或者多个 Pods,并将继续重试Pods的执行,直到指定数量的 Pods 成功终止。 随着 Pods 成功结束,Job 跟踪记录成功完成的 Pods 个数。 当数量达到指定的成功个数阈值时,任务(即 Job)结束。 删除 Job 的操作会清除所创建的全部 Pods。 挂起 Job 的操作会删除 Job 的所有活跃 Pod,直到 Job 被再次恢复执行。 一种简单的使用场景下,你会创建一个 Job 对象以便以一种可靠的方式运行某 Pod 直到完成。 当第一个 Pod 失败或者被删除(比如因为节点硬件失效或者重启)时,Job 对象会启动一个新的 Pod。 你也可以使用 Job 以并行的方式运行多个 Pod。 使用场景:一般用于部署服务时执行初始化操作,一般只需要部署新服务时才会进行创建,执行完毕后一般就没有用了。 1.2 CronJob介绍 官方介绍:https://kub....
k8s存储入门
一、Volumes介绍 官方文档:https://kubernetes.io/zh/docs/concepts/storage/volumes/ Container(容器)中的磁盘文件是短暂的,当容器崩溃时,kubelet会重新启动容器,但最初的文件将丢失,Container会以最干净的状态启动。另外,当一个Pod运行多个Container时,各个容器可能需要共享一些文件。Kubernetes Volume可以解决这两个问题。一些需要持久化数据的程序才会用到Volumes,或者一些需要共享数据的容器需要volumes。 日志收集的需求:需要在应用程序的容器里面加一个sidecar,这个容器是一个收集日志的容器,比如filebeat,它通过volumes共享应用程序的日志文件目录。 Docker也有卷的概念,但是在Docker中卷只是磁盘上或另一个Container中的目录,其生命周期不受管理。虽然目前Docker已经提供了卷驱动程序,但是功能非常有限,例如从Docker 1.7版本开始,每个Container只允许一个卷驱动程序,并且无法将参数传递给卷。 另一方面,Kubernetes....
TLS bootstrapping原理详解
一、TLS启动引导介绍 官方文档:https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/ 启动引导这些组件的正常过程,尤其是需要证书来与 kube-apiserver 安全通信的工作节点,可能会是一个具有挑战性的过程,因为这一过程通常不受 Kubernetes 控制, 需要不少额外工作。 这也使得初始化或者扩缩一个集群的操作变得具有挑战性。 为了简化这一过程,从 1.4 版本开始,Kubernetes 引入了一个证书请求和签名 API 以便简化此过程。 1.1 kubelet 初始化过程 当工作节点启动时,kubelet 执行以下操作 寻找自己的 kubeconfig 文件 检索 API 服务器的 URL 和凭据,通常是来自 kubeconfig 文件中的 TLS 密钥和已签名证书 尝试使用这些凭据来与 API 服务器通信 假定 kube-apiserver 成功地认证了 kubelet 的凭据数据,它会将 kubelet 视为 一个合法的节点并开....
kubernetes集群备份与恢复
一、k8s集群备份与恢复 k8s集群服务所有组件都是无状态服务,所有数据都存储在etcd集群当中,所以为保证k8s集群的安全可以直接备份etcd集群数据,备份etcd的数据相当于直接备份k8s整个集群。 但是备份etcd及备份整个集群,有些场景比如迁移服务,只想备份一个namespace,就无法使用备份etcd的方式来备份,所以我们这里引用velero工具,Velero(以前称为Heptio Ark)可以为您提供了备份和还原Kubernetes集群资源和持久卷的能力,你可以在公有云或本地搭建的私有云环境安装Velero。 二、k8s备份-备份etcd etcd有多个不同的API访问版本,v1版本已经废弃,etcd v2 和 v3 本质上是共享同一套 raft 协议代码的两个独立的应用,接口不一样,存储不一样,数据互相隔离。也就是说如果从 Etcd v2 升级到 Etcd v3,原来v2 的数据还是只 能用 v2 的接口访问,v3 的接口创建的数据也只能访问通过 v3 的接口访问。 2.1 etcd v2版本数据备份与恢复 备份数据 #V2版本帮助信息 [16:11:16 root@k8....
ConfigMap&Secret
一、ConfigMap 官方文档:https://kubernetes.io/zh/docs/concepts/configuration/configmap/ 1.1 ConfigMap介绍 在微服务架构中,大多数的服务的配置文件都是与服务本身分开的,由统一的配置中心进行管理,服务启动后会到配置中心读取自己的配置文件之后启动服务。Kubernetes中也提供了一个配置文件的api就是configmap。 ConfigMap 将您的环境配置信息和容器镜像解耦,便于应用配置的修改。 注意:ConfigMap 并不提供保密或者加密功能。 如果你想存储的数据是机密的,请使用Secret, 或者使用其他第三方工具来保证你的数据的私密性,而不是用 ConfigMap。 ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1 MiB。如果你需要保存超出此尺寸限制的数据,你可能希望考虑挂载存储卷或者使用独立的数据库或者文件服务。 1.2 ConfigMap的创建 创建方式 可以编写yaml文件,使用kubectl命令指定yaml文件进行创建 可以直接使....
Service
一、kubernetes的服务调用 服务的访问分为俩种形式分别是服务之间的调用(南北流量),用户流量的访问(东西流量),k8s中提供的南北流量的解决方法是使用service,东西流量的解决方案是ingress。当然这里只介绍service。 传统架构的南北流量架构图 k8s中使用service的南北流量 Service架构 二、Service资源介绍 Service主要用于Pod之间的通信,由于Pod是一种临时资源可能随时会被调度重建,重建后Pod的IP地址也会进行变化,由于Pod的IP地址不确定性,我们无法使用Pod的IP地址来进行服务的访问,所以k8s中加入了一个service资源用来解决Pod的访问。Service一般会通过选择器选择一个或一组Pod,之后通过iptables或者ipvs的方式进行代理,service的请求会被转发到自己所代理的Pod。service资源创建后只要不进行修改他的IP地址就不会变化相对来说他的IP地址是固定的,k8s中还引用了dns组件用来解析service资源的名称得到他的IP地址,所以集群中访问service,可以直接通过service的名....
HPA
Horizontal Pod Autoscaler(HAP),是一个Pod 水平自动扩缩(Horizontal Pod Autoscaler) 可以基于 CPU 利用率自动扩缩 ReplicationController、Deployment、ReplicaSet 和 StatefulSet 中的 Pod 数量。 除了 CPU 利用率,也可以基于其他应程序提供的自定义度量指标来执行自动扩缩。 Pod 自动扩缩不适用于无法扩缩的对象,比如 DaemonSet。 Pod 水平自动扩缩特性由 Kubernetes API 资源和控制器实现。资源决定了控制器的行为。 控制器会周期性地调整副本控制器或 Deployment 中的副本数量,以使得类似 Pod 平均 CPU 利用率、平均内存利用率这类观测到的度量值与用户所设定的目标值匹配。 一、HAP自动扩缩容 HAP的api版本有三个分别是: HPA v1为稳定版自动水平伸缩,只支持CPU指标,需要安装metrics-server V2为beta版本,分为v2beta1(支持CPU、内存和自定义指标) v2beta2(支持CPU、内存、自定义....
Label与Selector
Label:对k8s中各种资源进行分类、分组,添加一个具有特别属性的一个标签。 Selector:通过一个过滤的语法进行查找到对应标签的资源 一、Label & Selector 官方文档:https://kubernetes.io/zh/docs/concepts/overview/working-with-objects/labels/ 当Kubernetes对系统的任何API对象如Pod和节点进行“分组”时,会对其添加Label(key=value形式的“键-值对”)用以精准地选择对应的API对象。而Selector(标签选择器)则是针对匹配对象的查询方法。注:键-值对就是key-value pair。 例如,常用的标签tier可用于区分容器的属性,如frontend、backend;或者一个release_track用于区分容器的环境,如canary、production等。 1.1 Label的介绍 label可以给k8s中大多数资源进行标签的定义,主要作用为用于指定对用户有意义且相关的对象的标识属性,但并不对资源工作参数任何影响。 标签是键值对。有效的标签键有两个段....
kubernetes之控制器资源
一、 RC&RS Replication Controller(复制控制器,RC)和ReplicaSet(复制集,RS)是两种简单部署Pod的方式。因为在生产环境中,主要使用更高级的Deployment等方式进行Pod的管理和部署,这俩个控制器一般很少使用。 1.1 Replication Controller 官方文档:https://kubernetes.io/zh/docs/concepts/workloads/controllers/replicationcontroller/ Replication Controller(简称RC)可确保Pod副本数达到期望值,也就是RC定义的数量。换句话说,Replication Controller可确保一个Pod或一组同类Pod总是可用。 如果存在的Pod大于设定的值,则Replication Controller将终止额外的Pod。如果太小,Replication Controller将启动更多的Pod用于保证达到期望值。与手动创建Pod不同的是,用Replication Controller维护的Pod在失败、删除或终止时会....
kubernetes之Pod资源
一、Pod介绍 官方文档:https://kubernetes.io/zh/docs/concepts/workloads/pods/ Pod是Kubernetes中最小的单元,它由一组、一个或多个容器组成,每个Pod还包含了一个Pause容器,Pause容器是Pod的父容器,主要负责僵尸进程的回收管理,通过Pause容器可以使同一个Pod里面的多个容器共享存储、网络、PID、IPC等。 Pod在生产环境中基本不单独使用,一般都是配合控制器来使用 Pod结构图 二、Pod示例文件 yaml演示文件 apiVersion: v1 # 必选,API的版本号 kind: Pod # 必选,类型Pod metadata: # 必选,元数据 name: pod # 必选,符合RFC 1035规范的Pod名称 namespace: default # 可选,Pod所在的命名空间,不指定默认为default,可以使用-n 指定namespace labels: # 可选,标签选择器,一般用于过滤和区分Pod app: pod #可以写多个 annotations: #可选,注释列表,可以写多个 a....
kubernetes基础概念
一、kubernetes基础 Kubernetes是谷歌以Borg为前身,基于谷歌15年生产环境经验的基础上开源的一个项目,Kubernetes致力于提供跨主机集群的自动部署、扩展、高可用以及运行应用程序容器的平台。 有了docker为什么还需要使用kubernetes 在真正的业务场景中一般会部署大量的业务容器,而直接使用裸容器的方式来管理业务容器环境是比较吃力的,但是也有一些其他工具提供了docker单机编排的功能如docker-compose,并且在某些程序需要使用多个副本来实现高可用或增加负载节点时docker也无法直接提供支持而kubernetes可以使用控制器来实现容器的多个副本以及一些更高级的功能。并且在某些业务容器运行过程当中会出现一些假死的状态,需要请求健康检查接口来判断容器是否存活的场景时dockers也无法提供支持而kubernetes中可以直接使用探针进行监控检测。kubernetes会极大的减少运维人员的工作量。 集群架构如下 集群架构说明 kubernetes分为master节点与node节点是一个主从架构,master节点是整个集群的管理控制中是不建议运....