Kubernetes

简介

什么是K8s

概述

  • k8s就是为了大规模管理容器应用的自动化工具而已
  • 如果你的业务不是以容器方式管理或者数量非常小是没有必要玩k8s

架构以及核心组件

  1. Master节点:Master节点是集群的控制面,包含以下几个核心组件:

    • kube-apiserver:它是Kubernetes API的前端,是所有操作和通信的入口点。

    • etcd:这是一个高可用性键值存储系统,用于保存所有集群数据。

    • kube-scheduler:根据资源可用性、策略、约束等因素,调度新创建的Pod到合适的工作节点上。

    • kube-controller-manager:运行了一系列的控制器,如节点控制器、副本控制器、端点控制器等。

    • cloud-controller-manager: 这是一个链接你的集群与云提供商API的桥梁,使得集群能够在云环境中运行。

  2. Worker节点:Worker节点运行着实际的应用,并由master节点进行管理。它们包括以下组件:

    • kubelet:负责维护Pods并且与Kubernetes master节点进行交互。

    • kube-proxy:在每个节点上实现了网络规则,以处理集群内部的通信。

    • vContainer Runtime:用于运行容器,如Docker、containerd等。

  3. Pods:这是Kubernetes的最小部署单元,每个Pod内包含一个或多个紧密相关的容器。

  4. Services:定义了访问和通信Pods的方式。Service可以将网络流量路由到正确的Pod。

  5. Volumes:提供存储功能,使得数据能够在Pod之间持久化。

  6. Namespaces:为集群中的资源和对象提供隔离。

  7. Ingress:管理外部访问集群内服务的规则,可实现负载均衡、SSL终止和域名基础的虚拟主机。

  8. ConfigMaps and Secrets:允许你将配置信息和敏感数据分离出来,以便安全地传递和使用。

工作原理

在Kubernetes中,用户通过API Server提交一个描述应用程序的YAML或JSON配置文件。Scheduler会根据集群资源使用情况,将应用部署到某个Node上。如果Node发生故障,Controller会自动将应用迁移到其他Node上。

部署方式

传统的服务进程管理方式

手工繁琐:需要大量的自动化工具

  1. Ansible: Ansible 是一种配置管理和自动化工具,可用于编写声明性的配置文件来定义服务器的状态。您可以使用 Ansible 来自动化服务器的设置、软件安装、配置文件管理等操作。

  2. Chef: Chef 是一个自动化平台,允许您编写基础设施即代码。您可以使用 Chef 来定义服务器的状态,并在需要时自动配置服务器和部署服务。

  3. Puppet: Puppet 是另一个配置管理工具,允许您定义服务器配置的期望状态,并确保服务器始终保持一致。

  4. SaltStack: SaltStack 是一个事件驱动的自动化工具,可以用于自动配置和管理服务器,以及执行各种任务。

  5. Jenkins: Jenkins 是一个持续集成和持续交付工具,可以用于自动化构建、部署和测试应用程序。您可以将 Jenkins 配置为监视代码仓库,并在代码提交后自动触发部署流程。

  6. Docker Compose: 如果您希望使用 Docker 容器来部署传统的服务进程,可以使用 Docker Compose 来定义和管理多个容器的部署。

  7. Terraform: 虽然 Terraform 主要用于基础设施即代码,但您可以使用它来自动化创建和管理服务器、网络、存储等资源。

  8. Kubernetes Operator: 尽管 Kubernetes 本身是一个容器编排平台,但您可以使用 Kubernetes Operator 来创建自定义控制器,以自动化管理和部署特定类型的应用程序。

部署步骤

  1. 准备环境: 在目标虚拟机或物理机上设置所需的操作系统和依赖项。这可能涉及安装操作系统、更新软件包、安装运行时环境(如Java、Node.js等)等。

  2. 安装服务进程: 将服务进程的执行文件和相关文件传输到目标机器,并将其安装到适当的位置。这可能涉及将二进制文件复制到目标目录,并设置执行权限。

  3. 配置服务: 编辑服务的配置文件,配置它所需的参数,例如端口号、数据库连接、认证凭据等。这些配置可能会存储在配置文件中,也可能存储在环境变量中。

  4. 启动服务: 使用特定的命令或脚本启动服务进程。这可以是一个简单的命令,例如 ./my-service,也可能是一系列复杂的操作。

  5. 监控和日志: 配置监控和日志记录,以便能够监视服务的运行状态和性能,以及收集服务的日志信息。

  6. 管理和维护: 随着时间的推移,您可能需要执行服务的升级、修复漏洞、处理配置更改等操作。这可能需要定期的维护和管理。

容器应用管理方式

  • Pod:Pod是Kubernetes中最小的可部署单元,它可以包含一个或多个容器。Pod提供了一个运行容器的环境,并且这些容器共享网络和存储资源。Pod可以被创建、启动、停止、删除等操作。
  • Deployment:Deployment是用来管理Pod的对象。它定义了应用程序的期望状态,Kubernetes会根据定义的副本数来创建和管理Pod。Deployment还支持滚动升级和回滚操作,可以方便地更新应用程序。
  • Service:Service是用来暴露应用程序的网络服务的对象。它为一组Pod提供了一个稳定的网络地址,并且可以通过这个地址来访问这些Pod。Service可以提供负载均衡、服务发现和服务代理等功能。
  • Ingress:Ingress是用来管理应用程序的入口流量的对象。它可以将外部流量路由到不同的Service,实现基于域名或路径的流量分发。Ingress还支持SSL/TLS终止和基本的身份验证等功能。
  • ConfigMap和Secret:ConfigMap用来存储应用程序的配置信息,可以通过环境变量或挂载文件的方式将配置信息传递给容器。Secret用来存储敏感的配置信息,如密码、API密钥等。ConfigMap和Secret可以在应用程序中被引用和使用。
  • StatefulSet:StatefulSet用来管理有状态应用程序的对象。它可以确保每个Pod有唯一的标识和稳定的网络身份,这对于需要持久化存储和有序部署的应用程序非常重要。

服务发现与负载均衡

服务发现和负载均衡是通过 Service 和 Ingress 对象来实现的。

  1. Service:
    Service 是 Kubernetes 的核心概念之一,它为一组运行相同任务的 Pod 提供了一个统一的访问接口。当 Service 创建后,Kubernetes 会自动为其分配一个 IP 地址(称为 ClusterIP),并且在整个集群内部都可以使用这个 IP 地址进行访问。

当请求到达 Service 后,Kubernetes 会根据预设的策略将请求转发给后端的 Pod。这种策略通常是轮询(Round Robin)或者是基于 Session 的粘性 Session Affinity,也可以配置更复杂的网络策略。这就完成了负载均衡的功能。

Service 还有一个重要的特性,那就是它可以做到服务发现。每个 Service 在创建时,除了会被分配一个 ClusterIP 外,还会在 Kubernetes 集群的内部 DNS 中创建一个记录。这样其他的 Pod 就可以通过 Service 的名字来找到它,而不需要知道具体的 IP 地址。

  1. Ingress:
    虽然 Service 可以提供内部的服务发现和负载均衡,但是如果我们希望从集群外部访问某个服务,就需要用到 Ingress。Ingress 是 Kubernetes 的一个对象,它定义了如何通过 HTTP 或 HTTPS 协议从集群外部访问内部的 Service。

当一个请求到达 Ingress 后,Ingress Controller 会根据预定义的规则将请求路由(Route)到相应的 Service。这样我们就可以用一个统一的入口来访问集群内部的多个服务,而不需要为每个服务都暴露一个端口出来。

另外,Ingress 还可以提供其他的功能,比如 SSL/TLS 终止、基于路径或者域名的路由,甚至是负载均衡和重试等。

存储管理

Kubernetes支持多种存储解决方案,包括本地存储、网络存储(如NFS、iSCSI、GlusterFS等)以及云存储(如AWS EBS、GCE PD等)。同时,Kubernetes还提供了Persistent Volume (PV) 和 Persistent Volume Claim (PVC) 的抽象概念,使得用户可以在不了解具体存储技术的情况下,也能使用持久化存储。

本地存储:

这是最简单的存储方式,即在Pod所在的节点上直接分配磁盘空间。但它的生命周期与Pod相同,当Pod被删除时,数据也会丢失。而且,如果Pod迁移到其他节点,数据将无法访问。因此,本地存储主要用于临时性的、不需要长期保存的数据。

网络存储:

为了解决本地存储的限制,我们可以使用网络存储。网络存储就是通过网络协议,将远程服务器上的存储资源连接到本地,使其看起来像是本地的磁盘。常见的网络存储协议包括NFS(Network File System)、iSCSI (Internet Small Computer Systems Interface) 和 GlusterFS等。这些网络存储解决方案提供了跨节点的、可共享的、持久性的存储。

云存储:

对于在公有云平台上运行的Kubernetes集群,通常会使用云存储服务,如AWS的EBS (Elastic Block Store) 或者GCE的PD (Persistent Disk)。这些云存储服务通常提供了高可用、高性能和自动备份等高级功能。

EBS

  • 是 Amazon Web Services 的一项服务,提供持久化、高性能、块级存储,可以与 AWS 的 EC2 实例一起使用。你可以创建一个 EBS 卷并将其附加到 EC2 实例上。然后,你可以像使用物理硬盘驱动器一样使用这个卷,包括文件系统、数据库或者应用程序等。EBS 提供了几种类型的卷,以满足不同的需求,例如:通用 SSD(gp2)、预配置 IOPS SSD(io1/io2)、吞吐优化 HDD(st1)、冷 HDD(sc1)和磁性(标准)。

PD

Google Cloud Platform 的一项服务,为 Google Compute Engine 和 Google Kubernetes Engine 提供持久化、高性能的块存储。你可以创建一个 PD 卷并将其附加到 GCE 或 GKE 上的虚拟机实例。PD 提供了两种类型的卷:标准硬盘(HDD)和 SSD。SSD 可以分为常规 SSD 和高性能 Provisioned IOPS SSD。

Persistent Volume (PV):

Kubernetes引入了PV和PVC的概念,以解决存储的生命周期管理问题。PV是集群中的一块独立的存储空间,它与Pod的生命周期独立,即使Pod被删除,PV中的数据也不会丢失。管理员可以预先创建多个PV,并指定其大小、访问模式(只读、读写)等属性。

Persistent Volume Claim (PVC):

用户如果需要使用PV,必须通过创建一个PVC来申请。在PVC中,用户可以指定所需的存储空间大小、访问模式等信息。然后Kubernetes会自动匹配合适的PV给用户。当不再需要这个存储空间时,用户可以删除PVC,对应的PV会被释放,但数据不会丢失,除非管理员显式地删除PV。

日志和监控

  1. 日志:Kubernetes本身不提供一个原生的日志聚合解决方案,但是它允许使用各种通用的日志聚合工具。例如:

Fluentd:一款开源数据收集器,可以整合各种类型的数据源,并将数据发送到多种类型的目标系统。

Logstash:这是Elastic Stack(ELK Stack)中的一部分,用于接收、处理和转发事件和日志消息。

Stackdriver Logging:Google Cloud Platform上的日志管理服务,也可以用于Kubernetes。

  1. 监控:Kubernetes有内建的资源利用率和性能指标,比如CPU和内存使用情况。你可以使用以下工具来可视化这些数据:

Prometheus:开源的监控和警告工具,与Kubernetes紧密集成,可以收集各种指标并提供强大的查询语言。

Grafana:开源的度量分析和可视化套件,经常与Prometheus一起使用,以图形方式展示Prometheus收集的数据。

Google Cloud Monitoring:Google Cloud Platform的服务,提供了完全托管的端到端IT运营管理平台,包括监控、日志管理和应用程序性能管理。

Kubernetes与其他技术集成

  1. 云服务提供商:Kubernetes 可以运行在各种环境中,包括公有云、私有云和混合云。AWS、Google Cloud 和 Azure 都提供了 Kubernetes 服务,如 Amazon EKS、Google GKE 和 Azure AKS。
  1. CI/CD 工具:持续集成和持续部署(CI/CD)是现代 DevOps 实践的核心组成部分。Jenkins、GitLab CI、CircleCI 等工具都可以与 Kubernetes 集成,以自动化构建、测试和部署流程。
  1. 服务网格:服务网格用于控制服务间的通信。Istio 和 Linkerd 是两个常见的服务网格,它们可以与 Kubernetes 集成,提供高级路由、负载均衡、故障注入等功能。
  1. 配置管理:Helm 是 Kubernetes 的一个包管理器,类似于 Linux 中的 apt 或 yum。你可以使用 Helm 来打包、发布和管理 Kubernetes 应用。
  1. 安全性和策略执法:Open Policy Agent (OPA) 是一个轻量级的、通用的策略引擎,可以与 Kubernetes 集成,用于策略执法。
  1. 存储系统:Kubernetes 可以与各种存储系统集成,包括云存储服务(如 AWS EBS 和 Google Cloud Storage)、分布式文件系统(如 Ceph 和 GlusterFS)和数据库系统(如 MySQL 和 PostgreSQL)。