谷歌 Kubenetes 引擎高级教程(一)
一、GKE 简介
本书的第一章将向您介绍容器、微服务应用以及相关的监控和管理工具生态系统。它还着眼于容器及其周围的生态系统是如何组装的。涵盖了以下主题:
-
Docker 简介
-
Kubernetes 的概论
-
管理库帐户
-
容器生态系统的 GCP 容器解决方案
-
谷歌库比厄引擎
-
容器注册表
-
网络
-
云运行
-
安朵斯
Docker 简介
随着现代应用开发的容器化技术的兴起,Docker 现在被广泛用作容器化框架。容器是一种将应用和依赖项捆绑到它自己的独立包中的方法。应用作为流程成功运行所需的一切现在都在容器中被捕获和执行。这实现了跨环境的标准化和一致性,因为现在容器将总是预加载运行应用服务所需的所有先决条件/依赖项。现在,您可以在个人工作站上开发应用代码,然后安全地将其部署到生产级基础设施上运行。因此,人们在依赖操作系统(OS)或虚拟化软件方面面临的问题不再适用于容器基础设施(图 1-1 )。
图 1-1
Docker 建筑
Docker 消除了开发系统和产品中发布的软件之间的差异。Docker 容器在用于开发软件的相同操作系统配置中工作。
以下是 Docker 生态系统的一些组成部分(图 1-2 ):
图 1-2
Docker 管理界面(CLI 和 API)
-
Docker 客户端: Docker 用户可以通过客户端与 Docker 进行交互。
-
Docker 主机:Docker 主机提供了运行容器化应用的基础环境。它提供了从 Docker 守护程序、映像、容器和网络到存储的所有必要的基础架构基础组件。
-
Docker 映像: Docker 映像相当于操作系统模板或虚拟机映像,主要区别在于它不打包操作系统,而是包含应用二进制文件和运行应用所需的所有依赖项。通过使用这些映像,我们可以实现跨基础设施的应用可移植性,而无需担心所使用的基础设施技术。
-
**注册表:**注册表用于管理 Docker 映像。注册中心主要有两种类型:公共注册中心和私有注册中心。这是 Docker 映像存储的地方,可以在容器上进行实例化。
-
Docker 引擎: Docker 引擎支持开发、打包、部署和运行应用。
-
Docker 守护进程: Docker 守护进程是管理 Docker 映像、容器、网络和存储卷的核心进程。
-
Docker Engine REST API: 这是容器化应用用来与 Docker 守护进程交互的 API。
-
Docker CLI: Docker CLI 提供了一个命令行界面,用于与 Docker 守护程序进行交互。
Kubernetes 的概论
Kubernetes 是一个开源的容器管理(编排)工具,它在容器上提供了一个抽象层,利用 REST APIs 来管理容器群。Kubernetes 本质上是可移植的,并支持在各种公共和私有云平台上运行,如物理服务器、GCP、AWS、Azure、OpenStack 或 Apache Mesos。
与 Docker 类似,Kubernetes 也遵循客户端-服务器架构。它有一个主服务器,用于管理部署了容器化应用的目标节点。它还有一个服务发现的特性。
主服务器由各种组件组成,包括 kube-apiserver、etcd 键值存储、kube-controller-manager、cloud-controller-manager、kube-scheduler 和用于 Kubernetes 服务的 DNS 服务器。节点组件包括 kubelet 和 kube-proxy(图 1-3 )。
图 1-3
不可思议的建筑
主网点
以下是主节点上的主要组件:
-
etcd 集群:etcd 集群是一个分布式键值存储,用于存储 Kubernetes 集群数据(比如 pod 的数量、它们的状态、名称空间等。)、API 对象和服务发现细节。
-
kube-apiserver :这个 Kubernetes API 服务器为容器管理活动提供了一个编程接口,比如使用 REST APIs 的 Pods 管理、服务和复制集/控制器。
-
kube-controller-manager :用于管理控制器进程,如节点控制器(用于监控和响应节点健康状况)、复制控制器(用于维护 Pod 数量)、端点控制器(用于服务和 Pod 集成)、服务帐户和令牌控制器(用于 API/令牌访问管理)。
-
云控制器管理器:它管理与基础云提供商交互的控制器进程。
-
kube-scheduler :这有助于根据资源利用率管理跨目标节点的 Pod 放置。它考虑了资源需求、硬件/软件/安全策略、相似性规范等。,然后决定运行 Pod 的最佳节点。
节点 ( W 兽人) C omponent
以下是节点(工作)组件上的主要组件:
-
Kubelet :运行在 worker 节点上的代理组件。它的主要目的是确保容器在 Pod 中运行。Kubernetes 管理范围之外的任何容器都不由 Kubelet 管理。这确保了 worker 节点、Pods 及其容器处于健康状态,并向 Kubernetes 主节点报告这些指标。
-
kube-proxy :运行在 worker 节点上的代理服务,用于管理 Pod 间的联网和通信。
管理库帐户
kubectl是一个用于 Kubernetes 集群管理的命令行工具,使用 kube-apiserver 公开的 API。
立方结构工作负载
Kubernetes 工作负载包括以下主要组件:
-
Pod :一个或多个容器的逻辑集合,这些容器构成了一个应用,并被表示为工作节点上正在运行的进程。Pod 打包应用容器、存储、网络和运行容器所需的其他配置。pod 可以横向扩展并支持应用部署策略,如滚动更新和蓝绿色部署,旨在减少应用停机时间和升级期间的风险。
-
Service :这为一个或多个由策略绑定的 pod 的集合提供了一个接口。由于 Pod 的生命周期本质上是短暂的,因此即使后端 Pod 突然死亡,服务也有助于确保应用访问无忧。
-
名称空间:名称空间是一个逻辑结构,用于在多个用户之间划分集群资源。您可以使用带有命名空间的资源配额来管理多个应用团队的资源消耗。
-
部署:部署代表一个或多个正在运行的 pod 的集合。它与部署控制器密切合作,以确保 Pod 是可用的,符合 Pod 规范中提到的用户规范。
GCP 简介
谷歌云平台 (GCP)是谷歌的公共云产品,为最终客户提供一系列 IaaS/PaaS 服务。谷歌云平台(GCP)是谷歌提供的一套云计算服务。它们运行在谷歌内部为自己的终端用户产品使用的相同基础设施上,如谷歌搜索、谷歌照片、YouTube、Gmail 等。GCP 服务定位于现代应用开发用户,并在数据存储、大数据分析、人工智能和容器化领域提供一些独特的服务。谷歌继续创新和加强其产品。
GCP 提供广泛的服务,可分为以下几个领域:计算和托管、存储、网络、大数据和机器学习。为了构建云应用,GCP 提供了各种产品。表 1-1 中显示了一些受欢迎的服务。
表 1-1
GCP 服务
|服务
|
描述
| | --- | --- | | 谷歌计算引擎 | 帮助创建运行操作系统的虚拟机,并允许在云中创建不同的计算机 | | 谷歌库比厄引擎 | 使用 Kubernetes 作为托管服务,帮助管理 Container Orchestrator 以及部署、扩展和发布 | | 谷歌云功能 | 帮助实现事件驱动的无服务器云平台,并创建代码形式的基础设施,即由代码设计和实现的基础设施 | | 谷歌容器注册(GCR) | Google Container Registry 在 GCP 上提供安全、私有的 Docker 映像存储。它为团队提供了一个单一的位置来管理 Docker 映像、执行漏洞分析,并通过细粒度的访问控制来决定谁可以访问什么。 | | Google Stackdriver(现在称为 Google Operations) | 帮助公共云用户获得性能和诊断数据。Stackdriver (Google Operations)提供了对 Google 云和 AWS 云环境的支持,使其成为一个混合云解决方案。 |
容器生态系统的 GCP 容器解决方案
GCP 提供各种服务来运行容器生态系统。从提供完全托管环境的Google Cloud Run,到提供集群管理的 Kubernetes Engine 。 谷歌计算引擎 提供自助式计算基础设施。总的来说,GCP 为运行容器提供了一个理想的解决方案。GCP 还提供使用容器所需的工具,从开发到生产。
**云构建 和 容器注册表 提供 Docker 镜像存储和管理,以高安全标准和高效网络为后盾。谷歌的容器优化操作系统提供了一个轻量级、高度安全的操作系统,预装了 Docker 和 Kubernetes 运行时(图 1-4 )。
图 1-4
GCP 容器生态系统服务
表 1-2 提供了容器生态系统 GCP 服务的详细信息。
表 1-2
容器生态系统的 GCP 服务详情
|GCP 解决方案名称
|
特征
|
用户需求
| | --- | --- | --- | | 库柏发动机 | 全自动容器编排,包括健康监控、节点自动扩展、升级、修复和回滚仅关注应用组件,而非虚拟机提供高度可用的异构和多区域集群 | 用户将在生产环境中获得高度管理、安全和可扩展的容器。在虚拟机池的容器上高效运行基于微服务的应用不再需要专注于管理集群软件或基础架构 | | 计算引擎 | 促进虚拟机级别的自动扩展、自动修复、滚动更新、多区域部署和负载均衡没有容器编排。考虑将 Kubernetes 引擎用于托管 Kubernetes 的自动化容器编排。直接访问专用硬件,包括本地固态硬盘、GPU 和 TPU | 允许将容器化应用与现有 IaaS 基础设施轻松集成轻松地为每个虚拟机部署一个容器采用容器,即使您还不熟悉编排工具。准备就绪后,迁移到 Kubernetes 引擎,进行完整的编排。 | | 云运行 | 快速自动缩放支持自定义域,将您的服务与您的域对应起来代码运行时付费。 | 没有语言障碍;在完全管理的无服务器环境中使用任何语言和任何库构建和运行公共或私有微服务 | | App 引擎灵活环境 | 完全托管的 PaaS 服务,在一个容器中运行应用通过内置的自动扩展和负载均衡提供自动高可用性零停机升级的应用版本控制对微服务、授权、SQL 和 NoSQL 数据库、日志记录、安全扫描和内容交付网络的本机支持 | 在容器中部署应用引擎应用的定制运行时构建高度可靠且可扩展的服务应用或组件,无需处理服务器、集群或基础设施关注基础设施控制上的代码编写和开发速度 |
谷歌库比厄引擎
今天,Kubernetes 是业界领先的容器编排工具。所有主要的云提供商都提供托管 Kubernetes 服务。
谷歌向其客户提供托管的 Kubernetes 服务,称为谷歌 Kubernetes 服务、或谷歌 Kubernetes 引擎(GKE) 。GKE 帮助管理容器化的环境,这有助于开发基于微服务的应用,并使用谷歌基础设施管理和扩展客户的容器化应用。它使用 Kubernetes APIs、命令和资源来部署和管理应用、执行管理任务、设置策略以及监控部署的应用的健康状况。
当 GKE 集群运行时,它提供了 GCP 提供的高级集群管理功能的优势。其中包括
-
计算引擎实例的 GCP 负载均衡
-
节点池用于指定群集中的节点子集,以增加灵活性
-
自动扩展集群的节点实例数
-
集群节点软件的自动升级
-
节点自动修复以维护节点健康和可用性
-
使用 Stackdriver (Google operations)进行日志记录和监控,以便了解您的集群
图 1-5 显示了 GKE 组件。
图 1-5
GKE 组件
GKE 通过 Kubernetes Master 组织其平台。每个容器集群都有一个主端点,由 Kubernetes 引擎管理。主服务器提供了集群的统一视图,并且通过其可公开访问的端点,成为与集群交互的入口。
受管主节点还运行 Kubernetes API 服务器,该服务器为 REST 请求提供服务,在工作节点上安排 Pod 的创建和删除,并将 Pod 信息(比如开放的端口和位置)与服务信息同步。
比较 EKS、AKS 和 GKE
现在让我们比较一下三家云提供商提供的 Kubernetes 服务的特点:亚马逊网络服务(AWS)的亚马逊弹性 Kubernetes 服务(EKS),微软 Azure 的 Azure Kubernetes 服务(AKS),以及谷歌云的 GKE。
亚马逊弹性库柏服务
EKS 是 AWS 上提供的托管容器服务。它与其他 AWS 服务进行了丰富的集成,如 CI/CD 流水线、Cloudwatch 和 Cloudformation 等。由于 EKS 是基于 Kubernetes 的,所以它可以处理行业中大多数流行的用例,并作为应用的部署目标以及日志和应用性能指标的数据源。
如果你已经有了大量的 AWS 足迹,或者正在使用 Kubernetes 进行试验,或者想要将工作负载从 Kubernetes 迁移到其他云,那么 EKS 是一个不错的选择。
蓝色 Kubernetes 服务
AKS 是 Azure 提供的托管容器服务,运行在 Azure 公共云、政府云以及本地 Azure Stack 上。它与其他 Azure 服务无缝集成,并管理工作节点。它还提供了与微软其他跨平台开发工具的集成,包括 VS Code 和 DevOps(以前的 Visual Studio Team Services)。
如果你是一个微软商店,并且对另一个云没有强烈的愿望,AKS 是一个不错的选择。
谷歌库比厄引擎
GKE 是 Kubernetes 的托管服务,可在谷歌云平台上使用。GKE 为市场提供部署应用的服务,并为正常运行时间提供最高的服务级别协议(SLA)保证。它使用 Istio 服务网格和 gVisor 保护运行中的容器。它还有一个正在开发的内部产品,作为谷歌的 Anthos 产品的一部分,用于专用硬件上的混合/多云环境。
表 1-3 比较了 AK、EKS 和 GKE 的特点。
表 1-3
GKE、阿克苏和 EKS 的特点比较
| |竞开通讯之星
|
问
|
EKS
| | --- | --- | --- | --- | | 库比厄版本 | gke.27 | One point one five | One point one five | | 多 AZ | 是 | 部分的 | 是 | | 升级 | 自动/按需 | 按需 | 不清楚 | | 自动缩放 | 是 | 自我部署 | 自我部署 | | 网络策略 | 是 | 自我部署 | 自我部署 | | 持久卷 | 是 | 是 | 是 | | 负载均衡 | 是 | 是 | 是 | | CLI 支持 | 部分的 | 是 | 是 | | 服务网格 | 伊斯蒂奥 | 发展中 | 是(应用网格) | | 角色访问控制 | 是 | 是 | 是 | | 服从 | HIPAA、SOC、ISO、PCI DSS | HIPAA、SOC、ISO、PCI DSS | HIPAA、SOC、ISO、PCI DSS | | 应用秘密加密 | 是 | 不 | 不 | | 服务等级协议 | 99.5%(区域)99.95%(地区) | 99.5% | 99.9% | | 市场 | 是 | 不 | 不 | | 定价 | GCE 机器和其他资源的标准成本 | 节点虚拟机和其他资源的标准成本 | 每个群集 0.10 美元/小时,外加 EC2 实例和其他资源的标准成本 |
GKE 建筑
Google Kubernetes 引擎由一个集群组成,该集群至少有一个主机器和多个称为节点的工作机器。Kubernetes 系统的编排是在主机和节点机的帮助下运行的。任何 GKE 生态系统的基本单位是集群。代表在集群上运行的应用的对象如下图所示(图 1-6 )。
图 1-6
GKE 建筑
集群主机
Kubernetes 控制面板进程和 Kubernetes API 服务器、调度程序和核心资源控制器都在集群主服务器上运行。当集群被创建或删除时,GKE 管理主服务器的生命周期。升级运行在主服务器上的 Kubernetes 版本是由 GKE 根据用户的要求自动或手动完成的。
集群管理器和 Kubernetes API
与集群管理器的交互是通过 Kubernetes API 调用来执行的。主服务器通过 Kubernetes API 服务器进程处理请求。Kubernetes API 调用可以通过 gRPC/HTTP、kubectl 进行,也可以通过与云控制台中的 UI 进行交互。
节点
工作节点是由 GKE 创建的单个计算引擎虚拟机实例。一个节点运行服务来支持 Docker 容器。这些包括 Docker 运行时和 Kubernetes 节点代理(kubelet),它与主节点通信,负责启动和运行在该节点上调度的 Docker 容器。
节点机器的类型
节点具有不同类型的标准计算引擎机器类型。默认类型是 n1-standard-1,有一个虚拟 CPU 和 3.75GB 内存。机器类型的详细信息可从以下网址获得: https://cloud.google.com/compute/docs/machine-types /。
-
节点操作系统镜像:节点运行一个专用操作系统镜像,例如 Linux RHEL、Ubuntu,用于运行容器。创建集群时,我们可以选择在节点池中使用哪种类型的操作系统映像。
-
集群类型 : GKE 提供了创建集群时可以使用的各种类型的集群。创建群集类型后,不能更改。
-
单区域集群:单区域集群有一个主节点,也称为控制面板,在单个区域中运行,管理同一区域中运行的节点上的工作负载。
-
多区域集群:这是在单个区域中运行的控制面板的单个副本,并且具有在多个区域中运行的节点。
-
区域集群:在一个给定的区域内,这些控制面板的多个副本运行在多个区域中,节点也运行在一个控制面板副本运行的每个区域上。
-
节点池:一组具有相同配置类型的节点称为节点池。池中的每个节点都有一个 Kubernetes 节点标签“cloud.google.com/gke-nodepool, ”,其值是节点池的名称。节点池可以包含一个或多个节点。创建群集时,所提供的节点数量和类型将成为默认节点池。不同大小和类型的额外自定义节点池可以添加到群集。任何给定节点池中的所有节点都彼此相同。
容器注册表
Google Cloud Container Registry 是托管 Docker 映像的私有注册表。可以通过 HTTPS 端点访问 Container Registry,您可以从任何其他系统或云或您自己的系统管理、推送和提取 Google Cloud 提供的虚拟机实例的 Docker 映像。
Cloud Container Registry 是一个高度安全的私有注册表,只对拥有有效访问权限的用户开放。它检测映像中的漏洞,并确保安全的容器映像部署。它使用最新的基于漏洞的数据库,确保映像将扫描新的恶意软件。
当您将代码提交到云源代码库、GitHub 或 Bitbucket 时,它会自动构建映像并将其推送到私有注册表中。用户可以轻松设置 CI/CD 流水线,集成到云构建或直接部署到 Google Kubernetes 引擎、App Engine、云功能或 Firebase。容器登记支持 Docker 映像清单 V2 和 OCI 映像格式。
网络
本节概述了 Google Kubernetes 引擎网络的核心概念。Kubernetes 使用声明性语言来定义应用如何部署,应用如何相互通信以及如何与 Kubernetes 平面通信,以及客户端如何访问部署的应用。
在为应用使用 Kubernetes orchestration 时,应用及其主机的网络设计是针对 pod、服务和外部客户端通信而设计的,而不是考虑主机或虚拟机是如何连接的。
Kubernetes 的高级软件定义网络(SDN)支持在同一区域集群中跨不同区域的 pod、服务和节点进行数据包路由和转发。Kubernetes 和 Google Cloud 还根据您在 Google Cloud 上的 Kubernetes 部署和集群配置的声明性模型,在每个节点上动态配置 IP 过滤规则、路由表和防火墙规则。
服务、pod、容器和节点使用 IP 地址和端口进行通信。Kubernetes 提供不同类型的负载均衡来将流量导向正确的 pod。
-
ClusterIP :分配给服务的 IP 地址。在其他文档中,它可能被称为“集群 IP”该地址在服务的生命周期内是稳定的,这将在本章的“GCP 简介”一节中讨论。
-
Pod IP :分配给给定 Pod 的 IP 地址。正如“GCP 简介”中所讨论的,这是短暂的
-
节点 IP :分配给给定节点的 IP 地址。
云运行
要在云中部署和运行基于容器的应用,需要能够管理服务器、网络安全和存储复杂性的服务。
Google Cloud 提供了这样一种服务,叫做 Cloud Run。它是无服务器的,使您能够运行通过 web 请求和发布/订阅事件调用的无状态容器。Cloud Run 构建在开放的 cloud native 标准之上,支持应用的可移植性。
主要特征
云运行的主要功能如下:
-
**使用任何语言、二进制或库:**它允许使用任何编程语言或系统库。
-
使用容器工作流和标准: Cloud Run 利用容器工作流和标准,如 Docker、容器注册表和云构建。
-
定价: GCP 为其云运行服务提供按使用付费服务。
安朵斯
Anthos 是 Google 的多云应用平台,它基于一次构建,随处运行的概念,对现有的应用进行现代化改造。
Anthos 不是一个单一的产品,而是一堆执行应用现代化、云迁移以及多云和混合云管理的多种服务。Anthos 支持内部和云环境之间的一致性,并有助于加速应用开发(图 1-7 )。
图 1-7
Anthos 组件
Anthos 的组成部分
GK 花序
安索斯 GKE 组件提供全面的容器管理,快速安装和谷歌验证升级。
Google Cloud Console 为跨内部和云环境管理集群提供了单一控制台视图。
Anthos 配置管理
这实现了快速和安全的应用部署,并允许您为应用于 Kubernetes 集群的管理策略创建一个通用配置,无论是在本地还是在云中。
Anthos 服务网格
管理复杂微服务架构的全托管服务网格。它全面简化了运营服务,从流量管理和网格遥测到保护服务之间的通信。
尽管对 Anthos 的详细讨论不在本书的范围之内,我们还是提供了对 GKE 及其组件的广泛讨论。
摘要
在这一章中,我们讨论了容器生态系统的发展,Docker 和 Kubernetes 架构,以及容器技术的优势和挑战。下一章从建立 GCP 环境的实际练习开始。**
二、在 GCP 上设置环境
这本书的第二章向你介绍了在 GCP 上设置一个环境。您还将学习如何注册一个 Google 帐户,并为 GCP 容器生态系统建立一个环境。本章涵盖以下主题:
-
注册谷歌云
-
为谷歌 GKE 设置环境
-
容器支持服务
注册谷歌云
让我们从 GCP 开始吧。第一步是注册进入 GCP。下面介绍了注册所需的步骤,主要针对首次用户。
注册该平台的首要先决条件是一个谷歌账户。GCP 使用谷歌账户进行访问管理和认证。如图 2-1 所示,在浏览器窗口输入网址 https://cloud.google.com/free# 。
图 2-1
谷歌云平台
点击免费开始按钮,将弹出以下登录屏幕(图 2-2 )。
图 2-2
GCP 登录屏幕
系统会提示您输入一个 Google 帐户。如果您没有 Google 帐户,请按照创建帐户流程创建一个。
Note
如果帐户已经登录,您将被重定向到 GCP 控制台(图 2-3 和 2-4 )。
图 2-4
GCP 项目激活
图 2-3
GCP 控制台
如果您有资格获得免费等级,系统会提示您输入帐户详情,如图 2-5 所示。
图 2-5
GCP 自由层注册,步骤 1
选择您的国家,同意服务条款,然后单击继续按钮。这将带您进入第 2 步,如图 2-6 所示,在这里您可以创建并选择您的支付模式。提供所需的账单详情;但是,请注意,除非您手动升级,否则自动借记不会发生。
图 2-6
GCP 自由层注册,步骤 2
当您创建付款模式并登录时,右侧面板会显示详细信息,如图 2-7 所示。
图 2-7
GCP 自由层信息
正如你所看到的,谷歌提供了为期 12 个月的 300 美元的免费试用信用,这不仅足以探索书中的所有练习,还可以进一步评估 GCP。一旦您指定了所有的细节,点击开始我的免费试用按钮。
完成注册需要一段时间。一旦必要的验证完成,您将被重定向到 Google 控制台,您就可以开始了。
点击虚拟机创建控制台上的创建按钮,激活将用于创建虚拟机的 GCP 计算引擎服务(图 2-8 )。
图 2-8
通过控制台为虚拟机创建激活 GCP 计算引擎
单击页面右上角的激活按钮。它会提示你升级。点击升级(图 2-9 )。
图 2-9
虚拟机创建控制台升级
根据提示刷新页面(图 2-10 )。
图 2-10
虚拟机创建控制台刷新提示
一旦激活过程完成,将显示以下屏幕(图 2-11 )。
图 2-11
激活后屏幕
为谷歌 GKE 设置环境
设置 GCP CLI
gcloud 命令行界面(CLI)是管理 GCP 的主要 CLI 工具。
Google Cloud SDK(软件开发工具包)提供了多种命令行工具来与 GCP 进行交互,即
-
gcloud : GCP 的主要 CLI
-
gsutil :与谷歌云存储交互的命令行界面
-
bq :与 Google BigQuery 交互的命令行界面
-
kubi CTL:kubi engine CLI
您可以使用 gcloud CLI 来执行许多常见的平台任务,无论是从命令行还是在脚本中,以及通过 Jenkins/Ansible 等其他自动化工具。
例如,您可以使用 it gcloud CLI 来创建和管理
-
Google 计算引擎虚拟机实例和其他资源
-
Google Cloud SQL 实例
-
Google kuble engine cluster(Google kuble engine 群集)
-
Google Cloud Dataproc 集群和作业
-
Google Cloud DNS 管理的区域和记录集
-
Google 云部署管理器部署
您还可以使用 gcloud CLI 部署 App Engine 应用并执行其他相关任务。gcloud CLI 是 Google Cloud SDK 的一部分。
默认情况下,SDK 仅安装一般可用性级别的 gcloud CLI 命令。名为 alpha 和 beta 的 SDK 组件提供了额外的功能。这些组件允许您使用 gcloud CLI 与 Google Cloud Bigtable、Google Cloud Dataflow 和云平台的其他部分在早于正式发布的版本级别上协同工作。
表 2-1 描述了 gcloud CLI 命令发布级别。
表 2-1
gcloud CLI 命令发布级别
|释放水平
|
标签
|
描述
| | --- | --- | --- | | 一般利用率 | 没有人 | 命令被认为是完全稳定的,可用于生产。对于中断当前功能的命令,会给出预先警告,并记录在发行说明中。 | | 贝塔 | 贝塔 | 命令在功能上是完整的,但可能仍有一些突出的问题。对这些命令的重大更改可能会事先不通知。 | | 希腊字母的第一个字母 | 希腊字母的第一个字母 | 命令是早期版本,可能会更改,恕不另行通知。 |
安装 SDK 时,默认情况下不会安装 alpha 和 beta 组件。您必须使用 gcloud components 的install命令单独安装这些。如果您尝试运行 alpha 或 beta 命令,而相应的组件没有安装,gcloud 命令行工具会提示您安装它。
gcloud CLI 版本与 SDK 的版本号相同。目前的 SDK 版本是 278.0.0。
Note
gcloud 命令行工具在 Google Cloud Shell 中自动可用。如果您使用的是 Cloud Shell,则无需手动安装 gcloud CLI 即可使用。
GCP 云壳
Google Cloud Shell 为你提供了对托管在 GCP 上的计算资源的命令行访问,并且可以从 GCP 控制台获得。Cloud Shell 让您可以轻松管理您的云平台控制台项目和资源,而不必安装 Google Cloud SDK 和其他工具。有了 Cloud Shell,Cloud SDK gcloud 命令和其他你需要的实用工具在你需要的时候随时可用。
创建项目
项目本质上是一个容器,用于重组与特定云项目相关的所有 IT 和非 IT 资源。每个项目都由一些特定参数标识,如下所示(表 2-2 )。
表 2-2
项目参数
|参数
|
描述
| | --- | --- | | 名字 | 这是用来识别和描述一个项目。该名称仅供用户参考,可随时更改。免费层访问允许创建 24 个项目。 | | 项目标识 | 这是用于在全球范围内标识项目的唯一字符串。它是从项目名称开始创建的。可以编辑和更改项目 ID。要创建项目 ID,可以使用任何小写字母、数字和连字符。唯一的要求是该名称是唯一的。输入唯一 ID 后,就不能再更改了。 | | 项目编号 | 这是一个由 GCP 自动生成的参数。您不能管理或更改此号码。 |
要创建新项目,请单击“创建新项目”按钮。这导致以下步骤:
-
转到云控制台中的管理资源页面。
-
在页面顶部的“选择组织”( Select organization)下拉列表中,选择要用来创建项目的组织。如果您是免费试用用户,请跳过这一步。
-
单击创建项目。
图 2-12
新项目详细信息屏幕
-
在出现的新项目窗口中,输入项目名称并选择一个计费账户(如适用)(图 2-12 )。
请记住,项目 ID 必须有一个唯一的名称,该名称将在所有 Google Cloud 项目中使用。(上图中的项目名称已经被占用,对您不起作用。)项目名称将是 PROJECT_ID。
图 2-13
新项目视图
- 输入完新项目的详细信息后,单击“创建”。新项目将被选中,如下图所示(图 2-13 )。
发射云壳
从左上角工具栏上的 GCP 控制台云壳图标激活谷歌云壳(图 2-14 )。
图 2-14
云壳按钮
将显示以下画面。点击继续(图 2-15 )。
图 2-15
云壳屏
点击继续按钮后,点击启动云壳按钮,启动云壳会话(图 2-16 )。
图 2-16
云壳开始屏幕
配置和连接到环境应该需要几分钟时间。上述活动是一次性的。下一次,点击外壳按钮将导致以下屏幕(图 2-17 )。
图 2-17
云壳屏
这个虚拟机装载了您需要的所有开发工具。它提供了一个持久的 5GB 主目录,运行在谷歌云上,极大地增强了网络性能和认证。你在这个实验室的大部分工作,如果不是全部的话,都可以通过简单的浏览器或谷歌 Chromebook 来完成。
一旦连接到 Cloud Shell,您应该首先检查您已经通过了身份验证,并且项目已经设置为您的 PROJECT_ID。
在 Cloud Shell 中运行以下命令,确认您已经过身份验证。
图 2-18
列出项目命令输出
-
命令 : gcloud 配置列表项目
-
输出:输出应该显示如下(图 2-18 )。
在计算引擎中创建虚拟机实例
本节解释了如何使用谷歌云控制台在计算引擎中创建 Linux VM 实例(图 2-19 )。
图 2-19
云控制台页面—虚拟机实例选项
- 在云控制台选项上,点击虚拟机实例链接,如图 2-19 所示。
图 2-20
云控制台页面—创建虚拟机选项
- 从云控制台选项中,点击创建按钮,创建一个新实例(图 2-20 )。
图 2-21
云控制台页面—创建实例页面
- 在创建实例页面的引导盘部分,点击更改,开始配置引导盘(图 2-21 )。
图 2-22
配置启动盘
- 在公共映像选项卡上,选择您首选的操作系统和版本。在这种情况下,我们选择 Debian 版本 9(图 2-22 )。
图 2-23
选择防火墙规则
- 在防火墙部分,为您的防火墙选择所需的规则。在这种情况下,我们选择允许 HTTP 流量(图 2-23 )。
图 2-24
虚拟机实例页面状态图标
-
单击“创建”创建实例。
请给实例一些时间来启动。实例准备就绪后,它会在虚拟机实例页面上以绿色状态图标列出(图 2-24 )。
图 2-25
虚拟机实例仪表板
- 在虚拟机实例列表中,在您想要连接的实例所在的行中单击 SSH(图 2-25 )。
图 2-26
虚拟机实例终端
- 现在你有了一个与你的 Linux 实例交互的终端窗口,如图 2-26 所示。
在创建的虚拟机上设置 CLI
在本节中,我们将在上一节中创建的新虚拟机上设置 CLI。
图 2-27
软件包下载页面
- 步骤 1: 登录到前面创建的虚拟机。在
https://cloud.google.com/sdk/docs/downloads-versioned-archives从 SDK 包中选择合适的下载,向下滚动找到需要安装的包(图 2-27 )。
图 2-28
软件包下载页面
- 右键单击突出显示的包并选择复制链接地址(图 2-28 )。
图 2-29
pwd命令的输出
-
步骤 2: 检查当前工作目录,运行 package download 命令,使用上一步复制的链接下载 SDK 包。
-
命令:
pwd—检查当前工作目录 -
输出:
pwd的结果显示如下(图 2-29 )。
图 2-30
wget命令的输出
-
输出:
wget的结果显示如下(图 2-30 )。
图 2-31
使用 ls 命令列出下载的包,输出如上
-
下载后,SDK 包可以列出如下。
-
命令:
ls -
输出:
ls命令的结果显示如下(图 2-31 )。
图 2-32
解压缩包命令输出
-
步骤 3: 使用下面的命令解压 SDK 包。
-
命令:
tar -xvf google-cloud-sdk-279.0.0-linux-x86_64.tar.gz -
**输出:**前一条命令的结果显示如下(图 2-32 )。
图 2-33
取消文件列表输出
-
可以按如下方式列出未加灰的文件,使用
-
命令:
ls –lrt -
**输出:**前一条命令的结果将显示如图 2-33 所示。
图 2-36
安装 SDK 输出屏幕—续
图 2-35
安装 SDK 输出屏幕—续
图 2-34
安装 SDK 输出屏幕—续
-
步骤 4: 在同一个目录中使用以下命令安装 SDK。
-
命令:
./google-cloud-sdk/install.sh -
**输出:**前一条命令的结果显示如下(图 2-34 、 2-35 、 2-36 )。
-
按 y 键。
-
**第五步:**安装完成后,必须初始化 gcloud 才能执行命令。
在本地计算机上配置 Google Cloud CLI
采取以下步骤来配置 Google Cloud SDK。
图 2-38
SDK 初始化输出
图 2-37
SDK 初始化
-
使用以下命令初始化 SDK。
命令 :
gcloud init(图 2-37 )**输出:**前面命令的结果如下(图 2-38 )。
如何获取项目 ID
要获取项目 ID,返回到项目列表并复制适当的项目 ID,如图 2-39 所示。如图 2-40 所示输入项目 ID,并按下回车键继续(图 2-39 )。
图 2-40
SDK 初始化输出
图 2-39
选择一个项目屏幕
云壳连接到谷歌项目。
在 Cloud Shell 中运行以下命令,确认您已经过身份验证。
命令: gcloud config list project(图 2-43 )
图 2-41
SDK 初始化输出—续
**输出:**前面命令的结果如下(图 2-44 )。
图 2-44
列出项目输出屏幕
图 2-43
列表项目屏幕
图 2-42
SDK 初始化输出—续
容器支持服务
随着容器技术的兴起,出现了支持企业可以在容器上运行关键任务工作负载的生态系统的需求。容器技术的引入和微服务架构的应用需要监控解决方案。监控解决方案现在需要管理大量对象的非短暂和短暂服务的数据。从由如此多的服务组成的应用中收集数据已经变得非常复杂。对于容器服务,需要考虑以下细微差别:
- 容器的生命周期短**:如果用于托管微服务,容器会根据特定时间点的需求不断地被供应和停用。这可能会导致循环,在早上,一个容器主机集群中充满了属于工作负载 A 的微服务,而在下午,同一台主机正在为应用 b 提供服务。这意味着某台主机上的安全违规、性能低下或停机对业务的影响将会非常不同,具体取决于发生的时间。**
*** 一个微服务可以被 多个应用利用:由于不同的应用经常共享相同的微服务,监控工具必须能够动态地判断微服务的哪个实例影响了哪个应用。
* **容器的临时性质****:当基于容器映像触发新容器的组装时,必须立即提供网络连接、存储资源以及与其他所需企业服务的集成。这种动态供应会影响相关和不相关基础设施组件的性能。**
*** **更多级别需要关注**:对于 Kubernetes,企业 IT 必须在节点(主机服务器)、pod(主机集群)和单个容器级别进行监控。此外,必须在虚拟机和存储级别以及微服务级别进行监控。
* **不同的容器管理框架**:亚马逊 EC2 容器服务运行在亚马逊自产的管理平台上,而谷歌自然支持 Kubernetes(VMware 也是),Docker 支持 Swarm。容器监控解决方案必须意识到这些容器管理平台之间的差异。
* **微服务变化快且频繁**:基于微服务的应用的异常检测比标准应用要困难得多,因为由微服务组成的应用处于不断变化之中。新的微服务被添加到应用中,现有的微服务以非常快的顺序更新,从而导致不同的基础架构使用模式。监控工具需要能够区分由有意更改引起的“正常”使用模式和必须解决的实际“异常”。****
****表 2-3 解释了在容器生态系统的多个层面收集的各种指标。
表 2-3
容器技术发展的度量分解视图
|  |为了获得容器化应用的完整可见性,您现在必须拥有来自各种组件的数据,这些数据构成了运行容器的基础设施。这意味着您必须监控以下内容:
-
应用服务程序
-
POD 和容器
-
运行容器的集群
-
服务/Pod/集群通信网络
-
运行群集的主机操作系统/机器
根据解决方案的利弊,选择正确的监控工具集当然很重要。以下是市场上可用于容器生态系统的选项(表 2-4 )。
表 2-4
容器生态系统的工具
|功能
|
服务
|
描述
| | --- | --- | --- | | 监视 | Prometheus | Prometheus 是历史最悠久、最受欢迎的开源容器监控解决方案之一。这是一个云计算原生计算基金会(CNCF)项目,提供强大的查询功能、可视化和警报。 | | 报告和仪表板 | 格拉凡娜 | Grafana 是一个流行的用于容器环境的报告仪表板工具。它能够利用来自 Prometheus 和其他来源的数据,在 Kubernetes 环境中可视化信息。 | | 监视 | 顾问 | cAdvisor 是另一个容器资源监控工具,它工作在 worker 节点级别,而不是 Pod 级别。它能够发现工作节点上运行的所有容器,并提供关于 CPU、内存、文件系统等的指标。该解决方案不提供指标数据的长期存储,也不提供用于推动运营团队洞察的分析服务。 | | 监视 | 希普斯特 | Heapster 在后端使用 kubelet 和 cAdvisor 聚合多个节点的监控数据。与 cAdvisor 不同,Heapster 工作在 Pod 级别,而不是工作节点级别。 | | 监控和安全 | Sysdig 监控和保护 | Sysdig Monitor 通过跨多种容器技术和云提供从应用服务到 Pod、容器到节点级可用性、性能和故障的端到端可见性,帮助监控容器应用。此外,Sysdig 安全容器映像和集群级安全漏洞视图。 | | 监视 | 动态跟踪 | 收购 Ruxit 后,Dynatrace 现在拥有了一套新的工具,可用于容器监控和报警。利用基于代理的方法,它可以发现和获取与容器化应用服务、pod、容器、工作节点等相关的数据。 | | 监视 | 应用动力学 | 该应用和业务性能软件从安装在主机上的代理收集数据,并使用 Docker APIs 收集数据。 | | 日志管理 | 流利 | 这是一个统一日志记录层的开源收集器。 | | 监视 | 已收集 | 这是一个小守护进程,它定期收集系统信息,并提供存储和监控容器指标的机制。 | | 监视 | 云原生 | 领先的云提供商,如 AWS (Cloudwatch)、Azure (Azure Monitor)和 Google Cloud (Stackdriver 或 Google Operations)都有自己的本地机制来监控 AWS EKS、Azure AKS 和 Google GKE 上的容器生态系统。 | | 安全 | 水上安全 | Aqua Container Security Platform 提供精细的上下文感知安全性,同时自动化整个从映像到生产的流程,使企业能够专注于部署和运行应用。 | | 安全 | Sysdig 安全性 | Sysdig 是一个统一的平台,提供诸如监控、故障排除和警报等服务,提供对动态分布式环境的深入了解。它捕获、关联和可视化全栈数据,并提供一个用于报告的控制面板。 | | 安全性 | 扭锁 | Twistlock Cloud 原生网络安全平台为容器化环境提供全生命周期安全。Twistlock 有助于安全扩展和放心部署容器。 | | 安全性和网络 | 伊斯蒂奥 | Istio 是一个开源服务网格,它透明地分层到现有的分布式应用上。它包括 API,允许它集成到任何日志平台或遥测或策略系统中。它成功且高效地运行分布式微服务架构,并提供统一方式来保护、连接和监控微服务。 | | 注册表 | 海港 | Harbor 是一个开源的容器映像注册表,它通过基于角色的访问控制来保护映像,扫描映像中的漏洞,并将映像签名为可信。Harbor 提供合规性、性能和互操作性,有助于跨云原生计算平台(如 Kubernetes 和 Docker)一致、安全地管理映像。 | | CI/CD | 大三角帆 | Spinnaker 是一个开源、多云、持续的交付平台,有助于快速、安全地发布软件变更,不会出现任何问题。它结合了强大而灵活的流水线管理系统,并与主要的云提供商集成。 | | CI/CD | Jenkins | Jenkins 是一个流行的开源自动化服务器,它提供了许多插件来支持构建、部署和自动化项目构建和发布。 | | 以下为代码 | 安塞波 | Ansible 是一个流行的基础架构代码自动化工具,基础架构和应用团队使用它来自动化任务,如供应、应用部署、安全管理等。这使得应用和 IT 团队能够提高生产力、质量和安全性,从而为企业提供服务。 | | 以下为代码 | 仿地成形 | Terraform 是一个安全有效地构建、更改和版本控制基础设施的工具。Terraform 可以管理现有的和受欢迎的服务提供商以及定制的内部解决方案。Terraform 与云无关。配置文件描述了运行单个应用或整个数据中心所需组件的平台化。Terraform 生成一个执行计划,描述它将做什么来达到期望的状态,然后执行它来构建所描述的基础设施。随着配置的变化,Terraform 能够确定发生了什么变化,并创建可以应用的增量执行计划。Terraform 可以管理的基础设施包括低级组件,如计算实例、存储和网络,以及高级组件,如 DNS 条目、SaaS 功能等。 | | 以下为代码 | Google 部署管理器 | 部署管理器是一个 Google 云基础设施部署服务,它自动创建和管理 Google 云资源。 | | 建立关系网 | 科林斯饭店 | CoreDNS 是一个弹性的、松散的 DNS 服务器,可以作为 Kubernetes 集群 DNS 工作。CoreDNS 项目由 CNCF 主持。 | | 应用编程接口管理 | 使者 | 特使在 Kubernetes 与大使一起作为 API 网关工作。Ambassador 作为一个专门的控制面板,将 Envoy 的功能作为 Kubernetes 注释公开。 | | 以下为代码 | Helm | Kubernetes 应用可以使用 Helm 进行管理。为此,Helm 使用图表来定义应用部署细节。它有助于安装和升级复杂的应用。就版本控制、共享创建和发布而言,图表很容易管理。 | | 安全 | 法尔科 | 这是一个开源的云原生运行时安全工具,通常用作 Kubernetes 威胁检测引擎。Falco 在运行时捕捉意外的应用行为和威胁警报。 | | 监控、分析和报告 | 软体 | Splunk 产品有助于搜索、分析和可视化从 IT 基础设施或业务的不同组件收集的数据。它可以从应用、网站等收集数据。,一旦配置了数据源,它就会对数据流进行索引。索引数据流被解析成一系列可以进一步搜索和可视化的独立事件。 |
摘要
在这一章中,你已经看到了如何在 GCP 建立一个环境。我们还讨论了监控和管理容器生态系统所涉及的复杂性。我们讨论了用于监控和管理基于容器的应用的重要开源和企业工具。在下一章中,我们从设置 GKE 的实际练习开始,然后部署我们的第一个容器化应用。****
三、使用 Google 容器注册表的容器映像管理
在本章中,将向读者介绍谷歌容器注册(GCR)服务,他们将了解以下内容:
-
Google 容器注册中心简介
-
设置 Google 容器注册表
-
将 Docker 映像推入 GCP 容器注册表
-
管理和保护 GCP 容器注册表
Google 容器注册中心简介
Container Registry 是管理 Docker 映像、执行漏洞分析以及控制哪些用户可以访问哪些映像的单一位置。GCR 为 CI/CD 和安全性提供了广泛的集成功能,从而使开发人员和管理员能够以安全的策略驱动方式轻松管理映像。它提供了在您提交代码到云资源仓库、GitHub 或 Bitbucket 时自动构建和推送映像到私有注册表的特性。
Google Container Registry 提供了在软件部署周期的早期阶段检测漏洞的功能。它可以评估容器映像对于部署是否安全。Google Container Registry 使用与二进制授权的本机集成来定义策略,并防止部署与设置的策略冲突的映像。它可以触发容器映像的自动锁定,从而禁止将有风险的映像部署到 Google Kubernetes 引擎。借助区域性私有存储库,您可以将映像存储在欧洲、亚洲或美国的计算实例附近,并访问 Google 的全球网络,以实现快速部署。以下是 GCR 的主要特征:
-
**漏洞扫描:**此功能支持扫描 Docker 映像容器,以识别漏洞。它可以识别 Ubuntu、Debian 和 Alpine 的软件包漏洞。
-
**标记:**标记映像可确保更好的可管理性。从 GCP 控制台可以轻松地添加和删除标记。
-
在代码或标签改变时构建触发器: GCR 允许在代码库的代码或标签改变时自动构建触发容器映像。此功能还提供了构建详细信息的整合视图,例如源步骤、日志和步骤。
设置 Google 容器注册表
设置 GCR 非常简单明了。以下步骤解释了如何快速设置 GCR 服务。
在第二章中,你学习了如何创建谷歌计算引擎。我们将使用同一个计算引擎实例来演示从 GCP 容器注册中心提取映像和将映像推送到该注册中心。对于本演示以及Pull和Push命令的执行,我们必须首先在计算引擎实例上安装 Docker 版本 18.03。按照以下步骤安装 Docker。
图 3-1
更新列表包命令
-
**第一步:**登录之前创建的虚拟机。
-
步骤 2: 运行下面的命令来更新现有的包列表。
-
命令:
sudo apt update(图 3-1 )
图 3-2
更新列表包输出
- **输出:**前面命令的结果如下(图 3-2 )。
图 3-3
软件包安装命令
-
第三步:安装几个先决条件包,允许
apt在 HTTPS 上使用包。 -
命令:
sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common(图 3-3 )
图 3-5
包安装输出
图 3-4
包安装输出
-
**输出:**前面命令的结果如下(图 3-4 和 3-5 )。
-
输入 y。
图 3-6
添加 GPG 键盘命令
-
第 4 步:将官方 Docker 存储库的 GPG 密钥添加到您的系统中。
-
命令:
curl -fsSLhttps://download.docker.com/linux/debian/gpg| sudo apt-key add –(图 3-6 )
图 3-7
添加 GPG 键输出
- **输出:**前面命令的结果如下(图 3-7 )。
图 3-8
将 Docker 存储库添加到 ATP 命令和输出中
-
步骤 5 :将 Docker 存储库添加到 APT 源代码中。
-
命令:
sudo add-apt-repository "deb [arch=amd64]https://download.docker.com/linux/debian$(lsb_release -cs) stable"(图 3-8 )
图 3-9
更新包命令
-
步骤 6 :用新添加的 repo 中的 Docker 包更新包数据库。
-
命令:
sudo apt update(图 3-9 )
图 3-10
更新包输出
- 输出:前面命令的结果如下(图 3-10 )。
图 3-11
正在安装 Docker 策略
-
第 7 步:执行以下命令安装 Docker repo。
-
命令:
apt-cache policy docker-ce -
输出:结果如下(图 3-11 )。
图 3-12
安装 Docker 命令
-
第 8 步:最后,通过执行以下命令安装 Docker。
-
命令:
sudo apt install docker-ce(图 3-12 )
图 3-13
安装 Docker 输出
- 输出:结果如图 3-13 所示。
图 3-14
安装 Docker 输出—续
- 输入 Y(图 3-14 )。
图 3-15
验证安装 Docker 命令/输出
-
步骤 9 :通过执行下面的查询,验证 Docker 已经成功安装。
-
命令/输出:
sudo systemctl status docker(图 3-15 )
图 3-16
sudo特权命令
-
要在没有
sudo的情况下执行 Docker 命令,请执行以下操作: -
步骤 1 :执行以下查询。
-
命令:
sudo usermod -aG docker ${USER}(图 3-16 )
图 3-17
验证 Docker 组权限
-
第二步:注销再登录,看应用效果。通过键入以下命令,确认您的用户现在已添加到 Docker 组中:
-
命令/输出:
id –nG(图 3-17 )
将 Docker 映像推入 GCP 容器注册表
图 3-18
正在初始化 Google 帐户
-
**第一步:**使用之前创建的帐户 ID 登录。在我们的例子中,我们使用 gcptutorialmail@gmail.com 将映像推送到 GCP 注册中心。使用以下命令重新初始化,并在出现提示时输入 1 来选择配置。
-
命令/输出:
gcloud init(图 3-18 )
图 3-19
正在初始化 Google 帐户
- **第二步:**选择选项 2,配置账户进行图片上传操作(图 3-19 )。
图 3-21
登录代码
图 3-20
初始化 Google 帐户—续
- **第三步:**输入“2”后,会要求你继续,输入“y”,在浏览器上打开屏幕显示的链接,复制验证码,粘贴到“输入验证码:”的屏幕上,你就成功登录了(图 3-20 和 3-21 )。
图 3-22
计算引擎区域
- 步骤 4: 在步骤 3 之后,系统将要求您从显示的列表中选择计算引擎区域。输入相应的数字。在我们的例子中,
us-central1的数字是 8(图 3-22 )。
图 3-23
计算引擎区域—续
-
现在,将映像推入 GCP 容器注册表的 CLI 设置已经准备就绪。
-
**第 5 步:**在第 4 步之后,为了测试将映像推入 GCP 容器注册中心,我们将首先从 Docker Hub 下载一个示例
nginx映像。使用以下命令检查下载。 -
命令: 1)
docker pull nginx这将从公共 Docker Hub 中拉出映像nginx;2)docker images这将列出本地机器上存在的映像。 -
输出:前面命令的结果如下(图 3-23 )。
图 3-24
映像列表
-
步骤 6: 在步骤 5 之后,我们必须标记映像,以将其上传到容器注册表。标记后,可以使用以下第二个命令将其列出。
-
命令: 1)
docker tag nginx gcr.io/flowing-garage-267211/nginx:v1这将在映像被推入 GCP 容器之前对其进行标记,该映像需要成为版本和映像。 -
docker images这将列出本地机器中存在的所有映像。
-
输出:前一条命令的结果如下(图 3-24 )。
图 3-25
Docker 推送映像
-
步骤 7: 在步骤 6 之后,我们现在将把映像推入容器注册中心,使用下面的命令来标记需要被版本化的映像,以便它可以被推入 GCP 容器。
-
命令:
docker push gcr.io/flowing-garage-267211/nginx:v1 -
输出:前一条命令的结果如下(图 3-25 )。
图 3-26
映像导航
- 可以通过 GCP 控制台在容器注册表中查看该映像。导航到工具➤容器注册➤映像,如图 3-26 所示。
图 3-27
推送映像视图
- 点击映像链接,以下页面将显示映像列表(图 3-27 )。
图 3-28
移除映像
-
步骤 8: 在步骤 7 之后,我们将从 GCP 容器注册中心提取映像。
-
在此之前,我们将删除本地虚拟机上的可用映像。
-
命令: 1)
docker images2)docker rmi gcr.io/flowing-garage-267211/nginx:v13)docker images -
**输出:**前面命令的结果如下(图 3-28 )。
图 3-29
拉动映像
-
步骤 9: 在步骤 8 之后,我们将使用以下命令从 GCP 容器注册中心获取映像。
-
命令: 1)
docker images2)docker pull gcr.io/flowing-garage-267211/nginx:v13)docker images -
**输出:**下面的快照显示本地机器上没有映像。使用前面的命令,我们从 GCP 容器注册表中提取映像(图 3-29 )。
管理和保护 GCP 容器注册表
将映像复制到新注册表
让我们想象一个场景,来自另一个项目的用户需要访问我们在实践练习中使用的项目中的映像。为了演示这个用例,我们将首先使用以下步骤创建另一个项目。
图 3-30
创建新项目
- 步骤 1: 点击项目名称,如下图所示,打开选择项目窗口。单击新项目链接。输入项目名称(在本例中为“教程项目”),然后单击 Create 按钮。弹出通知将显示消息“创建项目:教程项目”(图 3-30 )。
图 3-31
新项目列表视图
- **第二步:**再次点击项目名称下拉菜单,新建的项目将出现在选择项目窗口中(图 3-31 )。
图 3-34
API 仪表板导航—续
图 3-33
API 仪表板导航—续
图 3-32
API 仪表板导航
-
步骤 3: 如果您可以访问两个注册表,那么可以使用命令行将一个映像从一个注册表复制到另一个注册表。现在尝试将项目“我的第一个项目”的容器注册表中的
nginx:v1映像复制到新创建的项目“教程项目”的容器注册表中 -
要执行复制操作,您必须为新项目(教程项目)启用 API 注册表。为此,进入 API 仪表板屏幕,如图 3-32 、 3-33 和 3-34 所示。
图 3-35
API 仪表板导航—续
-
单击启用按钮。
-
现在,针对教程项目启用了 API 服务(图 3-35 )。
图 3-36
将映像复制到存储库输出
-
步骤 4: 在步骤 3 之后,运行下面的命令,将镜像复制到教程项目容器的注册表中。
-
命令:
gcloud container images add-tag \gcr.io/flowing-garage-267211/nginx:v1 \gcr.io/tutorial-project-268109/nginx:v1 -
**输出:**结果如下所示(图 3-36 )。
图 3-38
粘贴到教程项目
图 3-37
从我的第一个项目复制
- 执行命令后,映像从一个项目复制到另一个项目。参见图 3-37 和 3-38 获取快照。
从容器注册表中删除映像
要演示从 GCP 容器注册表中删除映像,请运行以下命令。
图 3-39
映像已从注册表中删除
-
命令:
gcloud container images delete gcr.io/tutorial-project-268109/nginx:v1 -
**输出:**结果如图 3-39 所示。
图 3-40
空白映像注册表视图
- 删除后,可以检查一下教程项目的 GCP 容器注册表会不会显示任何映像(图 3-40 )。
漏洞扫描映像
映像漏洞可能会对现有系统产生巨大影响。这可能导致整个系统故障或系统被恶意利用。GCP 的容器分析服务提供映像元数据的漏洞扫描和存储。容器分析对容器注册表中的映像存储运行扫描,并监控扫描的漏洞报告,以保持其更新。容器分析是一个两阶段的过程。
-
每当一个新的映像被推入容器注册表时,容器分析服务就根据容器清单扫描该映像的漏洞并存储元数据。每次将映像重新上传到容器注册表中时,都会更新相同的元数据,从而跟踪映像扫描漏洞报告。这个过程被称为增量扫描。
-
接下来,它对扫描映像的元数据进行持续监控,以检测新的漏洞。它不断检查和更新漏洞信息,创建新的事件,并删除不再有效的事件。这个过程叫做连续分析。
漏洞结果是映像的漏洞事件列表。它还包含扫描的严重级别,分为严重、高、中、低和最低。
现在让我们为上传到容器注册表中的示例应用映像设置漏洞扫描。
设置漏洞扫描
图 3-42
API 仪表板导航 API 和服务
图 3-41
API 仪表板导航
- 步骤 1: 要启用镜像的漏洞扫描,必须启用项目的容器扫描 API。遵循这些步骤(图 3-41 和 3-42 )。
图 3-43
API 仪表板—容器扫描 API
- 搜索容器扫描 API(图 3-43 )。
图 3-44
API 仪表板导航—容器扫描 API—续
- 点击启用(图 3-44 )。
图 3-45
API 仪表板导航—启用容器服务 API
- 现在,我的第一个项目启用了容器扫描 API 服务(图 3-45 )。
图 3-46
拉动 Docker 映像
- **第二步:**在第一步之后,从 Docker Hub 中拉出一个应用镜像(如 wordpress)进行漏洞扫描(图 3-46 )。
图 3-52
映像漏洞详细信息
图 3-51
映像漏洞
图 3-50
映像检查
图 3-49
映像被推入存储库
图 3-48
映像标签
图 3-47
映像列表
- 步骤 4: 在步骤 3 之后,检查 GCP 控制台上的映像。你可以看到“漏洞”列出现在 wordpress 图片行中。点击“修复/全部”链接,查看图片漏洞扫描详情(图 3-50 、 3-51 、 3-52 )。
-
在存储库中推送映像(图 3-49 )。
-
标签映像(图 3-48 )。
-
步骤 3: 检查本地机器上的映像下载,标记映像,并将其推入容器注册表,这将自动触发容器映像扫描,如下所示:
-
命令: 1
) docker images2)docker tag wordpress gcr.io/flowing-garage-267211/wordpress:v13)docker push gcr.io/flowing-garage-267211/wordpress:v1 -
输出:
- 获取映像列表(图 3-47 )。
摘要
在本章中,您了解了 GCP 容器注册中心,如何设置容器注册中心,以及如何从 GCP 容器注册中心获取和推送映像。在下一章中,您将看到如何在开始应用部署之前设置 GKE 网络元素。
四、GKE 网络
本章解释了如何在 GKE 建立网络环境,还涵盖了使用各种场景的每个子组件的各种使用案例。讨论了以下主题:
-
Google Kubernetes 引擎介绍(GKE)
-
GKE 网络术语
-
容器之间的通信
-
同一节点上的 pod 之间的通信
-
不同节点上的 pod 之间的通信
-
pod 与服务的通信
-
pod 与互联网的通信(外部世界)
-
服务的负载均衡
-
从外部负载均衡器到服务的通信
-
从内部负载均衡器到服务的通信
-
GKE 群组的部署
Google Kubernetes 引擎介绍(GKE)
GKE 是谷歌云平台(GCP)的平台即服务(PaaS)组件,是托管在 GCP 的 Kubernetes 的托管版本。它有助于管理部署环境,包括扩展和容器化应用。
GKE 使用 Kubernetes 开源集群管理系统。Kubernetes 层提供了管理机制,例如执行管理任务、设置策略和监控部署工作负载的健康状况。GKE 集群还用于部署和管理应用。
Google Cloud 上的 Kubernetes
GKE 为集群管理提供了各种高级功能,包括:
-
一种节点池功能,用于指定群集中的节点子集,以便于管理
-
集群节点实例的自动扩展
-
节点群集软件的自动升级
-
一个自动修复节点来维护其健康和可用性
-
使用 GCP stack driver(Google Operations)记录和监控集群可见性
GKE 集群需要至少有一个 Kubernetes 的主组件和工作组件。以下是 GKE 集群生态系统的主要组成部分:
-
**集群主机:**该组件运行 Kubernetes 控制面板进程,包括调度程序、API 服务器和其他控制器。集群主服务器的生命周期由 GKE 管理。
-
集群主机和 Kubernetes API: 与集群主机的任何交互都由 Kubernetes API 调用来管理,以执行只读或读/写操作。对集群主服务器的传入 API 请求通过运行在集群主服务器上的 Kubernetes API 进程进行管理。最终用户可以通过 Rest API 调用、kubectl 或 GCP 控制台触发 Kubernetes API 调用。
-
**节点:**Kubernetes 集群的 Worker 节点通常被称为节点。节点是由 GKE 根据用户在配置时提供的配置自动创建的单个计算引擎虚拟机实例。利用一个节点来运行由一个或多个 pod 组成的服务,以运行应用。一个节点通常包括容器运行时和 Kubernetes 节点代理(kubelet ),它与集群主节点通信以执行各种管理任务。
-
**节点机器的类型:**节点有不同类型的标准计算引擎机器类型。默认类型是 n1-standard-1,有一个虚拟 CPU 和 3.75GB 内存。通过以下链接,您可以访问可用机器类型的详细信息:
https://cloud.google.com/compute/docs/machine-types。 -
**节点操作系统镜像:**节点使用专用操作系统镜像,例如 Linux RHEL 和 Ubuntu,用于运行容器。创建群集时,用户可以选择在节点池中使用哪种类型的操作系统映像。
-
-
**节点池:**一组具有相同配置类型的节点。池中的每个节点都有一个 Kubernetes 节点标签
cloud.google.com/gke-nodepool,它的值是节点池的名称。节点池可以包含一个或多个节点。创建集群时,可以指定节点的数量和类型,这将成为默认的节点池。我们可以向群集中添加不同大小和类型的额外自定义节点池。任何给定节点池中的所有节点都彼此相同。 -
**节点映像:**创建 GKE 集群或节点池时,我们必须选择在每个节点上运行的操作系统映像。GKE 为集群提供了以下节点映像选项:
-
人的本质
-
Windows 操作系统
-
谷歌的容器优化操作系统
-
使用 containerd 的容器优化操作系统
-
带有容器的 ubuntu
-
GKE 提供了各种类型的集群,在创建集群时可以从中进行选择。一旦创建,集群的类型就不能更改。以下是可以使用 GKE 创建的集群类型:
-
单区集群:
单区域集群使用单个主节点,也称为控制面板,在单个区域中运行,并管理在同一区域中运行的节点上的工作负载。根据托管应用工作负载的可用性和弹性要求,在设置 GKE 集群时可以利用以下任一选项。
-
多区域集群:
多区域群集使用在单个区域中运行的控制面板的单个副本,并且具有在多个区域中运行的节点。
-
区域集群:
在给定区域内,在多个区域和节点中运行的控制面板的多个副本也在控制面板的副本运行的每个区域上运行。
GKE 中的网络类似于虚拟化和云环境中的网络,但是因为容器是不同的部署模型,所以底层网络元素也不同。GKE 联网的目的是确保在 Pods 中运行的各种服务之间进行通信,它还应该支持与容器生态系统之外的其他服务的连接。当我们使用 GKE 部署基于微服务的应用时,我们必须在 GCP 上规划我们的网络,以确保满足所有特定于容器的要求。用户现在必须设计 GKE 网络,重点关注 pod、服务和外部接口之间的连接。
GKE 的高级软件定义网络支持通过声明性配置管理的许多功能,包括路由、IP 过滤规则、防火墙规则等。让我们从 GKE 的一些网络概念开始。
GKE 网络术语
在讨论 GKE 的网络之前,读者应该了解用于识别 Google Kubernetes 网络组件的各种术语。
网络命名空间
网络命名空间提供与底层主机网络接口隔离的逻辑网络。网络命名空间充当网络栈的副本,并为在命名空间下运行的进程提供独立环境的假象。
虚拟以太网设备
虚拟以太网设备就像是将 Pod 连接到节点的真实以太网的隧道。该隧道的两端在节点侧由 vethX 表示,在 Pod 侧由 ethX 表示,其中 X 对应于适当位置的设备数量。
布里奇斯
网桥的工作原理是第 2 层(L2)级交换,将数据从一个 Pod 传输到集群中的另一个 Pod。网桥维护转发表,其中保存了先前获取的 MAC 地址和端口的映射,并使用 MAC 地址执行 L2 传输。
Iptables
Iptables 用于处理网络和端口转发规则集。它使用内核级的“netfilter”规则来配置 Kubernetes 服务的所有路由。
服务
服务是服务于单一目的的 pod 的集合。例如,一个应用可以有一个应用和一个 DB 层,对应于后端的多个 pod。这些 pod 将被归入不同的类别,并通过服务进行通信。
这样,如果后端发生任何 Pod 更改,应用层服务仍然能够与数据库层服务对话,因为应用环境和数据库环境之间的交互点是通过服务进行的。App-Db 交互如图 4-1 所示。
图 4-1
应用-数据库交互
多维数据集代理
Kube-proxy 是 Kubernetes 中一个重要的二进制文件,它运行在集群中的每个节点上,并构成 Kubernetes 控制面板的一部分。它负责将流量从服务路由到特定的 pod。它将服务中的所有流量分流,并将其路由到正确的节点。在 Kubernetes 版本 1.2 中,kube-proxy 现在拥有对 iptables 的权限,并且可以将 netfilter 规则插入到节点名称空间中。反过来,网络过滤器将流量重定向到服务。
HTTP(S)负载均衡器
Google Cloud 的外部 HTTP(S)负载均衡器是一个全球分布式负载均衡器,用于在互联网上公开应用。它部署在全球范围内的 Google Presence Points(pop ),为用户提供低延迟的 HTTP(S)连接。任播路由用于负载均衡器 IPs,允许互联网路由确定到其最近的 Google 负载均衡器的最低成本路径。
GKE 入口部署外部 HTTP(S)负载均衡器,为作为后端的 pod 提供本地全局负载均衡。
节点端口
节点端口服务是将外部流量直接发送到您的服务的最原始的方式。顾名思义,NodePort 在所有节点(虚拟机)上打开一个特定的端口,发送到该端口的任何流量都会被转发到该服务。
GKE IP 地址分配
GKE 分配的 IP 地址类型包括:
- 节点 IP: 分配给给定节点的 IP 地址称为节点 IP。每个节点从群集的虚拟专用云(VPC)网络接收一个 IP 地址。此 IP 地址支持与群集中其他节点的通信。这个 IP 地址也被控制组件 kubelet 和 kube-proxy 用来连接到控制面板 Kubernetes API 服务器。
该节点还接收要分配给在该节点上运行的 pod 的 IP 地址池。默认情况下,GKE 为此分配一个/24 CIDR 块。
-
Pod IP: 分配给给定 Pod 的 IP 地址称为 Pod IP。该 IP 地址由该 Pod 中运行的所有容器共享,它用于将这些容器连接到集群中的其他 Pod。
-
集群 IP: 分配给服务的 IP 地址称为集群 IP。该地址是从群集的 VPC 网络分配的。Kubernetes 从集群的可用服务 IP 地址池中为每个服务分配一个稳定的 IP 地址。集群 IP 在集群中是唯一的,不会改变。仅当从群集中删除服务时,才会释放 IP 地址。
当 Pod 部署在节点上时,GKE 会在节点的 Linux 内核中为 Pod 创建一个网络名称空间。网络命名空间使用虚拟网络接口(VNI)将节点的物理网络与 Pod 连接起来。这使得通信流能够从 Pod 通过主机的物理网络。这充当在同一节点上运行的 pod 的网桥,并且还被 pod 用来向节点外发送分组。
在 Pod 中运行的所有容器都使用 Pod 的网络命名空间来访问网络。所有容器都连接到同一个网络接口。
默认情况下,每个单元都可以连接到群集中的其他单元。您可以通过配置设置对其进行限制。通过使用服务 IP 而不是 POD IP 来启用对服务的访问,因为 POD 可以被 GKE 破坏和创建。服务具有稳定的 IP 地址和端口,并提供跨 pod 的负载均衡。
Pods 和服务之间的连接由运行在每个节点上的 kube-proxy 组件管理。
容器之间的通信
在这一节中,我们将介绍容器如何在 Pod 内部相互通信。初始化时,每个 Pod 都会收到一个唯一的 IP 和网络名称空间。如前所述,pod 共享相同的名称空间,并使用 localhost 相互通信。因为名称空间是共享的,所以基于配置容器的不同端口进行通信。图 4-2 中描述了一个多容器容器。
图 4-2
多容器容器
同一节点上的 pod 之间的通信
Kubernetes 中的每个 Pod 都被分配了一个 IP 地址,Pod 之间的通信就是在这个 IP 地址上进行的。集群中的每个 Pod 都有自己的名称空间,它与节点根名称空间交互,以便与其他 Pod 通信。
每个 Pod 接收一个名为 eth0 的虚拟以太网设备。此 eth0 连接到主机节点(VM)中的虚拟以太网设备。从容器到 pod 的流量通过这个虚拟连接。
当一个 Pod 启动与另一个 Pod 的通信时,它向自己的 eth0 发出请求,eth 0 通过隧道将消息发送到机器节点的虚拟以太网设备。
现在我们知道了请求如何到达根名称空间,下一个问题是数据如何从根名称空间流向另一个 Pod。这是通过网桥实现的。
网桥的工作原理与提供 L2 级交换机并使用地址解析协议(ARP)来发现 MAC 地址的原理相同。网桥将收到的消息广播给所有连接的设备,并将做出响应的设备的 MAC 地址存储在一个表中。连接过程如下:
-
从容器生成到达 Pod eth0 的请求。
-
该请求通过虚拟以太网设备隧道传输到相应的虚拟 vethx 接口。
-
从那里,请求经过一个桥,该桥维护节点内所有连接的 Pod 的记录,并将请求传输到目的地 Pod。
-
该请求会发送到与目标 Pod 建立的虚拟以太网设备。
使用桥连接命名空间如图 4-3 所示。
图 4-3
使用桥连接命名空间
不同节点上的 pod 之间的通信
在本节中,我们将使用从“同一节点上的 pod 之间的通信”一节中获得的知识来查看消息请求如何在放置在两个不同节点上的两个不同 pod 之间流动,如下面的数据包流图所示(图 4-4 )。
图 4-4
不同节点上的 pod 之间的数据包移动
在图 4-4 中,pod1 正试图与位于不同节点上的 pod4 通信。
该请求将由 pod1 中的容器生成,它将到达 pod1 的虚拟以太网 eth0,并通过隧道到达根名称空间中存在的网桥。
网桥将根据 ARP 找到相关的目的地 Pod。请求将失败,因为目标驻留在不同的节点上。
网桥最终会将数据包发送到位于虚拟机网络接口控制器(NIC)eth 0 节点上的默认网关,数据包从这里进入跨越 GKE 集群的底层 GKE 网络。这是底层节点或虚拟机所在的网络。
默认情况下,GCP 为专用 IP 网络提供反欺骗保护,但是对于 GKE 集群中的节点,反欺骗功能被禁用,通过该功能,网络中的流量可以到达与集群关联的其他节点。
在集群虚拟机部署期间,GKE 会启用以下设置:
-
每个节点虚拟机都被配置为路由器。
-
对虚拟机禁用反欺骗保护。
-
为节点中的每个虚拟机添加一个静态路由,以便数据包从节点的 NIC eth0 通过相关路由进入 GCP 云网络。数据包到达目的节点的 eth0,然后通过网桥和虚拟以太网设备将其发送到目的 pod4。
pod 与服务的通信
Kubernetes 中的服务扮演着关键的角色,因为它们在 Pods 之上提供了一个抽象层。初始化时会向服务提供一个群集 IP。
Pod 和服务之间的通信遵循不同于 Pod-Pod 通信的方法(图 4-5 )。
图 4-5
pod 和服务之间的数据包移动
信息包沿着相同的路线(如前几节所述)到达网桥。对于 Kubernetes 中的服务级事件通信,数据包在从 eth0 进入默认网关路由之前,会通过 iptables 进行过滤,其中数据包的目的地会更改为后端的相关 Pod。
因此,通过服务,Kubernetes 提供集群负载均衡,将流量路由到连接到服务后端的各种 Pods。
pod 与互联网的通信(外部世界)
在本节中,我们将讨论 pod 与外界之间的数据流,如下图所示(图 4-6 )。
图 4-6
将数据包从 pod 路由到互联网
数据分组的路径是相当相同的,直到它到达网桥,在那里 ARP 将失败,并且数据将被发送到节点的以太网端,即 veth0。如果我们按照传统的方式将数据包从节点以太网端发送到外部世界(互联网),数据包必然会失败,因为私有云网络内的互联网网关网络地址转换(NAT)只能理解 VM 地址。
在将数据传递到节点以太网设备之前,iptables 会执行源 NAT,并将数据包源从 Pod IP 更改为节点 VM-IP,以便网络网关能够以正确的方式对其进行处理。数据将到达互联网网关,在那里将执行另一个 NAT,以将来源从 VM-IP 更改为外部 IP,因此,数据包将到达公共互联网。相同的反向路径将有助于数据包到达目的地 Pod。在每一步都将执行 IP 拆除,其中 IP 地址将被转换,并且分组源和目的地将被改变,直到到达正确的 Pod。
服务的负载均衡
为了使服务可以从网络和/或集群外部访问,并获取服务内部的数据,GKE 使用三种类型的负载均衡器来控制访问。一个服务可以同时使用多种类型的负载均衡器。
外部负载均衡器
外部负载均衡器管理来自群集外部和 VPC 环境外部的流量,并使用一般 GCP 环境转发规则将流量路由到指定节点。通过在服务定义中将服务的“类型”字段设置为负载均衡器,可以初始化外部负载均衡器。当带有负载均衡器的服务被初始化时,GCP 云控制器启动为该服务创建负载均衡器,并返回一个外部 IP 地址,该地址可被提供给外部系统,以便通过该负载均衡器与服务进行交互。
内部负载均衡器(TCP/UDP)负载均衡器
内部负载均衡器管理来自 GKE 集群外部,但来自在 GCP 建立的虚拟云环境内部的流量。
HTTP(s)负载均衡器(在第 7 层)
这是另一种类型的外部负载均衡器,它使用 GKE 的入口资源管理服务和基于 RESTful web 服务 API 的应用之间的流量。
从外部负载均衡器到服务的通信
通过互联网从 IP 通告到外部网络的流量被转发到负载均衡器,然后被发送到连接到集群的所有节点,因为它不理解容器组件和底层网络(如服务)。
节点上的 Iptables 规则将使用 kube-proxy 在集群内设置的内部负载均衡规则,将数据包分成两部分,并将其发送到正确的目的地 Pod。图 4-7 描述了数据包如何从互联网发送到服务。
图 4-7
从互联网发送到服务的数据包
内部负载均衡器
内部负载均衡器被初始化,以便在驻留在集群外部但与集群内的服务在同一 Google cloud 网络上的应用之间提供通信流。服务定义中指定的注释和类型初始化内部负载均衡器。
内部负载均衡器从群集的 VPC 子网接收 IP 地址,而不是外部 IP 地址。VPC 网络中的应用或服务可以使用此 IP 地址与群集中的服务进行通信。
初始化内部负载均衡器的语法对应于服务定义中的以下模式。
-
annotations:cloud.google.com/load-balancer-type: "Internal"
-
type: LoadBalancer
从内部负载均衡器到服务的通信
从内部负载均衡器到服务的通信采用以下路径。
图 4-8
从外部节点发送到服务的数据包
-
来自驻留在 Google Cloud 环境中的源/应用的流量到达负载均衡器。
-
作为一个 GCP 负载均衡器,它不能看到底层的 Kubernetes 组件(如服务、Pods 等)。),内部负载均衡器上的传入流量将被发送到特定节点。
-
当流量到达给定节点时,该节点使用其 iptables NAT 表来选择一个 Pod,即使该 Pod 在不同的节点上,并将数据包发送到目的节点,如图 4-8 所示。
HTTP(S)负载均衡器
为了允许基于 REST API 的应用与集群中的服务进行交互,使用了 HTTP(S)负载均衡器。它在网络的 HTTP/HTTPS 协议范围内工作,并向服务公开来自集群外部的 HTTP/HTTPS 协议路由。
HTTP(S)负载均衡器提供一个稳定的 IP 地址,您可以使用它将请求路由到各种后端服务。
在 GKE 集群中,通过创建 Kubernetes 入口对象来创建和配置 HTTP(S)负载均衡器。入口对象必须与一个或多个服务对象相关联,每个服务对象与一组 pod 相关联。
为了让入口对象工作,Kubernetes 主节点必须为服务分配一个端口。这样,定向到群集节点端口的任何流量都将被发送到服务。
为了公开节点端口以接受流量,入口对象由 GKE 入口控制器初始化,该控制器创建 Google Cloud HTTP(S)负载均衡器,并根据初始化的入口对象中定义的内容对其进行配置,为所有其他后端服务提供稳定的 IP 地址。
从 HTTP(S)负载均衡器到服务的通信
HTTP 负载均衡器与服务之间的通信遵循与外部负载均衡器相似的路径,但略有不同,如下所述:
图 4-9
将 HTTP/HTTPS 协议流量从外部路由到服务
-
主要区别在于,入口将允许您执行基于 URL 的服务和相关 pod 路由。
-
这里,源是试图访问基于 URL 的路径的客户端 IP,例如
/dryicelabs/ *。流量将到达由 GKE 入口控制器初始化的谷歌云负载均衡器。 -
根据 GCLB 上的负载共享配置,流量将从负载均衡器(源)定向到位于负载均衡器后面的一个节点(目标)端口。
-
当我们声明一个服务定义时,我们指定一个节点端口。这将在集群中的每个节点上分配一个端口,该端口将代理对服务的请求。
-
在节点 3,iptables 拦截流量,目的地更改为 Pod3,它位于一个服务中,该服务响应正确的 NodePort 请求。
-
数据包最终将遵循内部路由方法从节点 3 到达正确的 Pod3,因为 Pod4 和 Pod5 属于侦听不同端口的服务。(参见图 4-9 。)
GKE 群组的部署
在本节中,您将学习如何使用 GCP 控制台创建 GKE 集群和配置网络选项,同时设置集群。为了满足设置集群的先决条件,请执行以下步骤。
图 4-10
库页引擎
- 导航到谷歌云控制台中的 Kubernetes 引擎页面(图 4-10 )。
图 4-11
选择一个项目
- 创建或选择一个项目。在我们的例子中,我们将选择先前创建的“教程项目”(图 4-11 )。
图 4-12
立方引擎 tab
- 在 GCP 控制台中,导航至左栏中的 Kubernetes 引擎选项卡(图 4-12 )。
图 4-13
创建集群选项
- 点击集群选项卡并选择创建集群(图 4-13 )。
集群基础
图 4-14
区域选择选项
-
在为“群集基本信息”显示的第一个选项卡中,指定群集的名称和位置类型。
GKE 为集群提供了两种位置类型:地带和区域。
**区域:**选择区域位置类型将显示组织计算引擎中可用的区域列表(图 4-14 )。
在位置类型中选择一个区域会将集群的组件(主节点+节点)放在一个区域环境中。
**区域:**区域位置类型表示集群组件将跨越多区域环境(默认情况下,区域集群创建三个主控制器,跨越三个不同的区域)。如果选中,区域位置类型将显示所有可用区域的位置(图 4-15 )。
图 4-15
区域选择选项
图 4-16
节点位置选择选项
-
指定节点位置将节点放置在选定的位置类型中。
通过选择多个区域可以提高可用性(图 4-16 )。
图 4-17
主版本选择选项
-
选择群集的主版本。在主版本选择框中有两个选项:发布通道和静态版本。
为了自动更新集群,用户可以选择发布频道。
要手动更新集群,请选择静态版本(图 4-17 ),并在下拉框中选择适合 GKE 集群的版本。
节点池
在 GKE 中,默认情况下,将创建一个至少包含一个节点池的新群集。节点池是在该群集中创建的节点组的模板。创建群集后,可以添加和删除更多的节点池,其过程如下所述。
图 4-28
节点安全详细信息
图 4-27
网络详细信息
图 4-26
CPU 平台和 GPU 详细信息
图 4-25
机器配置详细信息
图 4-24
CPU 平台和 GPU 详细信息
图 4-23
内存优化详细信息
图 4-22
网络详细信息
-
服务账户:运行在 VM 上的应用使用服务账户调用 Google Cloud APIs。使用控制台菜单上的权限创建服务帐户,或者使用默认服务帐户(如果可用)。
-
访问范围:选择授予虚拟机的 API 访问类型和级别。默认为对存储和服务管理的只读访问权限、对云日志记录和监控的写访问权限以及对服务控制的读/写访问权限。
-
屏蔽选项:屏蔽功能包括可信的 UEFI 固件和 vTPM,并附带用于 GKE 节点的安全引导和完整性监控选项。
-
启用完整性监控:完整性监控允许您使用云监控来监控和验证受保护节点的运行时引导完整性。
-
启用安全启动:安全启动有助于保护您的节点免受启动级和内核级恶意软件和 rootkits 的攻击。
-
-
节点安全:下一个选项卡指定节点池的安全设置(图 4-28 )。
-
计算优化:如果您的工作负载需要更高的计算处理能力,请选择此选项(图 4-25 、 4-26 和 4-27 )。
-
内存优化:如果您想要内存更高的机器,请选择此选项。机器类型的选择取决于您计划在集群上运行的工作负载的类型。如果您的工作负载需要比 CPU 处理能力更高的内存,您可以选择内存优化型(图 4-23 和 4-24 )。
-
联网:(见图 4-22 。)
-
每个节点的最大单元数:指定每个节点的最大单元数。默认值为 110。
-
网络标签:标签代表应用于每个节点的防火墙规则。
-
-
Machine family: We will select a general-purpose machine from the relevant tab (Figure 4-20 & Figure 4-21).
图 4-21
CPU 平台和 GPU 详细信息
图 4-20
机器配置详细信息
-
Specify the name and version of the nodes in the cluster (Figure 4-18).
图 4-18
节点池详细信息
-
接下来的列对应于群集中的基本节点设置,即
-
大小:集群中的节点数
-
启用自动缩放:如果启用,该功能将动态创建或删除节点。
-
启用自动升级:自动节点升级有助于使节点保持最新版本的 Kubernetes。
-
启用自动修复:如果选中此设置,将监控节点,并在遇到任何错误时开始修复节点。
-
启用激增升级:激增升级会在短时间内创建额外的节点,以减少升级造成的中断。
-
设置:下一个选项卡对应于使用前面的节点池创建新节点时的设置。
-
Image Type: Users can select customized images from the drop-down for the created nodes (Figure 4-19).
图 4-19
映像类型下拉菜单
-
节点元数据
当使用现有节点池创建新节点时,将使用节点元数据设置。它包括以下设置(图 4-29 )。
图 4-29
无间隙标签
-
Kubernetes 标签:这些标签应用于这个节点池中的每个 Kubernetes 节点。Kubernetes 节点标签可以在节点选择器中使用,以控制如何将工作负载调度到您的节点。
-
节点污点:这些设置将应用于该节点池中的每个 Kubernetes 节点。Kubernetes 污点可以与容忍度一起使用,以控制如何将工作负载调度到您的节点。
-
GCE 实例元数据:这些项目将出现在该节点池中每个节点的计算引擎实例元数据中。
自动化
此设置为自动维护、自动扩展和自动配置设置了群集级别的标准。编辑节点池以实现自动化,例如自动扩展、自动升级和修复(图 4-30 )。
图 4-30
自动化细节
-
启用维护窗口:要指定定期维护的时间,启用维护窗口。通常,例行的 Kubernetes 引擎维护可能随时在集群上运行。
-
维护排除:为了指定不进行常规、非紧急维护的时间,最多设置三个维护排除。通常,例行的 Kubernetes 引擎维护可能随时在集群上运行。
-
启用垂直窗格自动缩放:垂直窗格自动缩放会自动分析和调整容器的 CPU 请求和内存请求。
-
启用节点自动配置:所有节点用于计算总群集资源,包括非自动扩展节点池中的节点。对所有自动扩展的节点池实施限制,包括您手动创建的节点池。
建立关系网
控制台中的网络栏将对应于 pod 中的应用如何在集群内外进行通信(图 4-31 )。
图 4-31
网络细节
第一项检查对应于环境中群集的可访问性,并提供两种选择:
-
私有集群:私有集群提供隔离节点连接互联网/外部世界的能力。私有集群中的节点没有公共 IP。
-
公共集群:公共集群中的节点将拥有与之相关联的公共 IP。
-
网络和子网:用户可以选择将托管集群的网络和子网详细信息。Kubernetes 集群所在的网络和子网决定了它能够与哪些其他计算引擎资源进行通信。
高级网络选项
图 4-32
高级网络细节
-
启用 VPC 本地流量路由(使用别名 IP):如果用户希望集群使用别名 IP 范围进行通信并将流量从一个 pod 路由到另一个 pod,则可以启用该设置,从而提供与谷歌云平台服务的更安全的本地集成(图 4-32 )。
-
自动创建二级范围:默认情况下,该设置使 Kubernetes 引擎能够管理集群使用的二级范围。
-
Pod 地址范围:集群中的所有 Pod 都被分配一个该范围内的 IP 地址。输入网络范围内的一个范围。如果留空,将从网络中选取默认范围
-
每个节点的最大 Pods 数:该值用于优化将集群的 IP 地址范围划分为节点级别的子范围。
-
服务地址范围:集群服务将从这个 IP 地址范围中分配一个 IP 地址。
-
启用节点内可见性:启用节点内可见性使您的节点内 Pod 到 Pod 流量对 GCP 网络结构可见。通过此功能,您可以对节点内流量使用 VPC 流量日志记录或其他 VPC 功能。
-
Enable node local DNS cache:node local DNS cache 通过在集群节点上运行 DNS 缓存代理作为 daemonSet 来提高集群 DNS 性能。此设置在 1.15 版和更高版本中可用。
-
启用 HTTP 负载均衡:需要 HTTP 负载均衡附加组件来使用带有 Kubernetes 入口的 Google 云负载均衡器。如果启用,将安装一个控制器来协调将负载均衡配置更改应用到您的 GCP 项目。
-
启用主授权网络:可以启用主授权网络来阻止不受信任的非 GCP 源 IP 通过 HTTPS 访问 Kubernetes 主服务器。
-
启用网络策略:Kubernetes 网络策略 API 允许集群管理员指定允许哪些 Pods 相互通信。
安全
默认情况下,安全性包括 IAM 处理的集群认证和 Google 管理的加密。它包括以下部件(图 4-33 )。
图 4-33
安全细节
-
启用二进制授权:二进制授权允许对部署到 Kubernetes 集群的映像进行策略控制。
-
启用屏蔽 GKE 节点:屏蔽 GKE 节点为加入集群的节点提供强加密身份。
-
启用应用层秘密加密:使用您在云 KMS 中管理的密钥保护您在 etcd 中的秘密。秘密已经在存储层加密了。
-
启用工作负载标识:这允许您从 Kubernetes 引擎工作负载安全地连接到 Google APIs。
-
启用 GKE Google Groups:GKE Google Groups 允许您将角色授予 G Suite Google Group 的所有成员。
-
启用传统授权:启用传统授权以支持现有集群或工作流的集群内权限。阻止完全的 RBAC 支持。
-
启用基本身份验证:基本身份验证允许用户使用用户名和密码向群集进行身份验证,该用户名和密码在传输时可能不保密。禁用后,您仍然可以使用客户端证书或 IAM 向集群进行身份验证。
-
发布客户端证书:客户端使用这个 base 64 编码的公共证书向集群端点进行身份验证。证书不会自动轮换。它们很难撤销。为了最大限度地提高安全性,请禁用此选项。您仍然可以使用基本身份认证(不推荐)或 IAM 向集群进行身份认证。
[计]元数据
该选项卡对应于可以添加来组织集群的数据(图 4-34 )。
图 4-34
元数据详细信息
特征
创建集群时,您可以为其添加各种功能,如监控、计量和仪表板,以维护集群(图 4-35 )。
图 4-35
功能详情
-
启用针对 Anthos 的云运行:针对 Anthos 的云运行使您能够使用云运行体验轻松地将无状态应用和功能部署到该集群。Cloud Run for Anthos 可根据请求自动管理底层资源并扩展您的应用。
-
启用 Kubernetes 引擎监控 : Kubernetes 引擎监控通过将事件、系统指标和日志汇总到一个视图中来提高可观察性。
-
启用云 TPU :这用于加速集群中的机器学习工作负载。
-
Enable Kubernetes Dashboard(add-on):这是一个用于 Kubernetes 集群的 web UI。
-
启用 GKE 使用情况计量 : GKE 使用情况计量允许您查看您的集群的资源使用情况,按 Kubernetes 名称空间和标签进行分类,并将使用情况归属于有意义的实体。
-
Enable Istio :这是一个服务网格,在 Kubernetes 引擎中运行的服务之间提供监控、流量控制和安全性。如果启用,Istio 组件将安装在您的集群中。
-
启用应用管理器:这是一个 GKE 控制器,用于管理应用的生命周期。
-
启用计算引擎持久磁盘 CSI 驱动程序:启用计算引擎持久磁盘 CSI 驱动程序的自动部署和管理。此功能是使用 gcePersistentDisk 树内卷插件的替代方法。
集群管理仪表板
集群管理控制面板提供了所有已创建集群的摘要列表。上面创建的集群可以从下面查看(图 4-36 )。
图 4-36
集群管理仪表板
在第五章中,我们不会删除使用前面的配置创建的集群,而是使用同一个集群来部署 sock-shop 应用。
摘要
在本章中,我们讲述了 GKE 网络的基础知识,并学习了如何根据最佳实践,使用所需的各种设置来设置 GKE 集群。在下一章中,我们将介绍 GKE 上的应用部署。