谷歌 Kubenetes 引擎高级教程(二)
五、使用谷歌 GKE 部署容器化应用
本章向读者介绍了 Google Kubernetes 引擎(GKE)上的应用部署方法,包括以下内容:
-
介绍
-
简单的应用架构概述
-
袜子店微服务应用简介
-
GKE 上的应用部署
-
删除集群
介绍
在本章中,我们将部署一个名为 sock-shop 的基于微服务架构的 web 应用。我们只是简单介绍了微服务架构及其优势,这足以帮助您理解应用的行为。
简单的应用架构概述
微服务是分布式的、松散耦合的、独立的、可部署的单元,这意味着如果任何单个服务出现故障,这不会影响其他服务。微服务通过轻量级或语言不可知的方式相互通信,例如 REST API、gRPC,或者通过排队,例如 RabbitMQ。
微服务架构的优势
微服务架构的主要优势如下:
-
**简单快速的部署:**与整体式应用相比,微服务通常体积较小,因此其部署要快得多,也容易得多。
-
**更快的发布周期:**每个微服务都是一个独立的可部署单元,这使得软件发布周期比传统应用更短,并且在部署和更新方面也支持敏捷性。
-
**高可伸缩性:**微服务通常是无状态的,更喜欢部署在容器上。每当对特定服务的需求增加时,增长可以很容易地扩大。
-
**可访问:**由于微服务通常很小,开发人员可以很容易地了解它们的功能以及如何有效地更新和增强它们,从而通过敏捷开发方法加快开发周期。
袜子店微服务应用简介
袜子商店应用是一个基于电子商务的微服务 web 应用。它是一个基于 Docker 的应用,应用的不同组件都可以被表现出来,如下架构图所示(图 5-1 )。
图 5-1
袜子商店应用架构
袜子商店应用被打包成一个 Docker 映像。它使用一个 Docker 文件,该文件包含了关于如何使用为该应用创建的基于 Kubernetes 的部署配置文件complete-demo.yaml来构建映像的指令。
Sock Shop 应用使用的与网络、持久性存储和消息队列相关的各种组件如下:
-
**节点池选择:**关于节点池的详细内容,请参见第 1章 4“GKE 联网”中“Google Kubernetes 引擎(GKE)简介”的相关讨论。Sock Shop 应用使用在创建 Kubernetes 集群时已经在第四章中创建的默认节点池。
-
**节点选择:**我们在用于在 Kubernetes 集群上部署应用的 YAML 文件的 Pod 定义中定义了节点选择。
要将窗格分配给 Kubernetes 中的节点,请使用以下命令:
-
节点选择器 : 这是通过匹配用户定义的节点标签来选择部署特定 Pod 的节点的最流行和最简单的方法。
-
**节点关联:**这个特性是在 Kubernetes 版本中引入的,是
nodeSelector的增强版。它提供了更具表现力的语法来控制如何将 pod 部署到特定节点。 -
**Pod 间关联:**Pod 间关联通过将 Pod 调度到已经运行特定 Pod 的节点上,而不是基于节点上的标签,来实现共存。
在我们的 Sock Shop 应用中,我们使用nodeSelector在特定的节点上部署 pod。参见下面的complete-demo.yaml文件的代码片段(图 5-2 )。
图 5-2
nodeSelector
服务
Kubernetes 中的服务是 pod 的逻辑集合/组。服务是轻量级的,所以我们可以在一个 Kubernetes 集群中拥有许多服务。每个服务都有一个选择器部分,其中包含要连接的 Pod 标签。参考下面的complete-demo.yaml文件片段,查看 Sock Shop 应用的服务定义(图 5-3 )。
图 5-3
服务选择器
以下是不同类型的 Kubernetes 服务:
图 5-4
负载均衡器前端服务类型
-
NodePort: 这是每个节点上的一个静态端口,在该端口上公开了一个服务,使其可以从集群外部使用。
-
ClusterIP (默认):这将在集群中的内部 IP 上公开服务,使得该服务只能从集群内部访问。
-
LoadBalancer: 这会在当前的云中创建外部负载均衡器,在我们的例子中,是在 GCP 上,并为服务分配一个固定的外部 IP。
-
在我们的 Sock Shop 应用中,我们将前端服务公开为负载均衡器,并在
complete-demo.yaml文件中将其定义为type:LoadBalancer。GKE 将部署一个外部网络负载均衡器,使用配置中提到的端口访问 sock shop 应用服务。 -
Sock Shop 应用的其他服务在集群中作为内部服务公开,并在 GKE 集群中公开和访问(图 5-4 )。
-
**持久存储数据库:**以对象的形式存储持久数据。为了存储袜子商店应用的数据,我们使用 MongoDB 和 MySQL 数据库,作为 Pods 下的一个容器运行,并在 Kubernetes 集群内部公开。
-
**消息队列:**消息队列是一种异步的服务到服务通信,广泛应用于微服务架构中。Sock Shop 应用使用 RabbitMQ,这是一个开源的消息队列框架,作为 Pods 下的一个容器运行,也在 Kubernetes 集群内部公开。
GKE 上的应用部署
以下步骤在 GKE 集群上安装 Sock Shop 应用。
图 5-5
云壳链接
-
**第一步:**打开云壳。我们将使用我们在第四章第四章中创建的同一个集群“clustertutorial ”,通过使用预装了 gcloud、docker 和 kubectl 命令行工具的 Google Cloud Shell 来部署应用。
-
要打开云壳,请执行以下操作:
-
转到谷歌云控制台。
-
点击控制台窗口顶部的活动云壳按钮,如图 5-5 所示。
-
图 5-6
云外壳会话
- 云壳会话将启动,如图 5-6 所示。
图 5-10
移动代码库
图 5-9
下载代码库
图 5-8
移动到gcptutorialmail目录
图 5-7
创建gcptutorialmail目录
-
**第二步:**首先我们会在
/home目录下创建gcptutorialmail文件夹,然后从 GitHub 克隆complete-demo.yaml文件。 -
执行以下命令在
/home目录下创建gcptutorialmail。 -
命令:
mkdir gcptutorialmail -
**输出:**前一条命令的输出应该如图 5-7 所示。
-
**第三步:**通过执行以下命令移动到
gcptutorialmail文件夹。 -
命令:
cd /gcptutorialmail -
**输出:**下面应该是前面命令的输出(图 5-8 )。
-
步骤 4: 现在,通过执行以下命令,从 Github 下载代码库。
-
命令:
git clonehttps://github.com/dryice-devops/GCP.git -
**输出:**前一条命令的结果如图 5-9 所示。
-
转到 GCP 目录,列出代码库输出,如下所示。
-
命令:
cd GCPll - List directory -
**输出:**前一条命令的结果如图 5-10 所示。
图 5-11
连接到clustertutorial集群
-
步骤 5: 通过执行以下命令连接 GKE 集群
clustertutorial。 -
命令:
gcloud container clusters get-credentials clustertutorial --zone us-central1-a --project tutorial-project-268109 -
**输出:**前一条命令的结果如图 5-11 所示。
图 5-12
设置项目 Id
-
步骤 6: 为
gcloud工具设置项目 ID。 -
命令:
gcloud config set project tutorial-project-268109 -
**输出:**前一条命令的结果如图 5-12 所示。
图 5-13
创建名称空间
-
步骤 7: 创建一个名为 sock-shop 的名称空间,作为应用部署的占位符。
-
命令:
kubectl create namespace sock-shop -
**输出:**前一条命令的结果如图 5-13 所示。
图 5-14
列表命名空间
-
现在使用下面的命令检查名称空间。
-
命令:
kubectl get namespace | grep sock-shop -
**输出:**前一条命令的结果如图 5-14
图 5-15
列表聚类
-
现在使用下面的命令检查集群列表。
-
命令:
gcloud container clusters list IP -
**输出:**前一条命令的结果如图 5-15 所示。
图 5-16
获得证书
-
现在,在部署应用之前,首先需要为容器设置凭证、区域和项目。为此,请使用以下命令。
-
命令命令
: gcloud container clusters get-credentials clustertutorial --zone us- central1-a --project tutorial-project-268109 -
**输出:**前一条命令的结果如图 5-16 所示。
-
第 8 步:部署应用。在 Kubernetes 中,pod 是最小的单位,一个应用被表示为 pod。单元也代表一个容器。部署管理应用的多个副本(称为副本),并安排它们在集群中的各个节点上运行。在我们的例子中,使用包含部署细节的
complete-demo.yaml配置文件来执行部署。我们将只运行应用的一个 Pod。
complete-demo.yaml:简要说明
complete-demo.yaml文件的不同组成部分可以描述如下:
-
apiVersion:定义 Kubernetes 的apiVersion,与 Kubernetes API 服务器交互。当创建一个对象时,apiVersion会根据 Kubernetes 版本的不同而不同。 -
kind:定义 Kubernetes 对象的类型,如集群角色、部署、服务、pod 等。对于我们的应用,kind被定义为Deployment和Service。 -
metadata:定义一个对象,如carts-db -
namespace:定义 Kubernetes 对象将创建的名称空间名称,例如 sock-shop -
replicas:复制一个 Pod -
selector:允许客户/用户识别一组对象 -
template:待复制对象的定义——在其他情况下可以自己创建的对象 -
containers:定义容器的特性 -
Name:容器的名称 -
Image:指定将使用什么 Docker 映像来创建容器。 -
Ports:Docker 容器运行的端口 -
env:Docker 镜像运行容器使用的变量 -
securityContext:securityContext字段是一个SecurityContext对象。
为容器指定了安全设置:
-
volumeMounts:这是容器中将要进行安装的路径。 -
volume: 这定义了我们将要使用的卷定义。
图 5-17
部署应用的命令输出
-
步骤 9: 运行下面的命令来部署应用。
-
命令:
kubectl apply –f complete-demo.yaml -
**输出:**前一条命令的结果如图 5-17 所示。
在 GKE,默认情况下不能从互联网访问容器,因为它们没有外部 IP 地址。为了明确地将我们的应用暴露给来自互联网的流量,我们必须在complete-demo.yaml文件中将类型定义为LoadBalancer,如图 5-18 所示。
图 5-18
YAML 代码片段
图 5-19
列出应用部署
-
步骤 10: 通过运行以下命令来验证部署。
-
命令:
kubectl get services –n sock-shop -
**输出:**前一条命令的结果如图 5-19 所示。
图 5-20
部署的应用
- 步骤 10: 一旦确定了应用的外部 IP 地址,就复制该 IP 地址。将浏览器指向一个 URL(如
http://35.188.192.249),以检查您的应用是否可访问(图 5-20 )。
删除集群
现在,您已经看到了如何将应用部署到 GKE 集群上,我们可以删除应用和集群,以清理 GCP 环境,因为运行集群是有价格标签的。要执行清理活动,我们只需从 GCP 控制台删除集群,这最终也会删除应用。按照以下步骤删除集群:
图 5-21
创建列表
- **第一步:**在 Kubernetes 控制台页面,点击 Kubernetes 引擎➤集群,如图 5-21 所示。
图 5-22
创建列表视图
- **第二步:**集群会列出创建的集群,如图 5-22 所示。
图 5-23
创建删除
-
步骤 3: 单击集群选择,并按下行尾的删除图标。等待,因为删除集群需要一些时间(图 5-23 )。
-
如上所述,除了应用之外,还需要一些时间来删除集群和相关组件。
摘要
在本章中,您学习了如何在 GKE 集群上部署微服务应用,以及如何通过删除集群来执行清理活动。在下一章中,我们将介绍 GCP 针对 GKE 提供的安全控制。
六、GKE 安全
在本章中,您将学习保护 GKE 集群的最佳实践。将讨论以下主题:
-
谷歌云共享责任模型(GCSRM)
-
基础设施安全
-
应用开发和发布安全性
介绍
IT 安全是防止对各种资产(如应用和网络、数据以及硬件资源)进行未经授权的访问的总体策略。它还保护敏感数据,维护数据完整性,并保护组织的整个生态系统免受恶意黑客的攻击。Google Cloud 的安全性是云提供商和客户的共同责任。Google 提供了一个模型,Google Cloud Shared respons ibility Model(GCS RM ),为如何处理安全需求提供指导。
谷歌云共享责任模型(GCSRM)
GCSRM 定义了 Google 及其客户在管理各种 GCP 组件和服务的安全性方面的责任。GCSRM 取决于工作负载,从底层(即硬件)开始,覆盖从底层到应用层的所有领域。对于基础设施即服务(IaaS)层,谷歌负责提供硬件、存储和网络级别的安全性,对于软件即服务(SaaS)层,它负责除访问策略和内容之外的一切。对于 GKE 这样的平台即服务(PaaS)层,谷歌的责任介于 IaaS 和 SaaS 之间。图 6-1 显示了谷歌云的共享责任模型,并详细说明了谷歌和客户在 IaaS、PaaS 和 SaaS 方面的责任。
图 6-1
谷歌云的共享责任模式
GKE 组件属于 PaaS 类别。
以下是 GKE 的组成部分,由谷歌根据其共享责任模式进行管理(表 6-1 )。
表 6-1
Google 管理的 Kubernetes 组件
|成分
|
描述
| | --- | --- | | 底层硬件\软件基础设施 | 谷歌负责硬件、固件、内核、存储、操作系统、网络等。这些组件的安全性通过数据加密、高度安全的数据中心和使用安全软件开发模式来维护。 | | 立方分布 | Google 负责 Kubernetes 版本的补丁更新,并在共享责任模式下提供 Kubernetes 的最新上游版本。 | | 集群节点操作系统 | 集群节点操作系统映像由 Google 管理,例如容器优化操作系统(COS)和 Ubuntu。如果用户选择自动升级选项,GKE 将代表用户执行升级。 | | 控制面板 | 控制面板的升级和管理是谷歌的责任。这包括 Kubernetes 主虚拟机、调度程序、API 服务器、集群 CA、身份和访问管理(IAM)验证器和授权器、审计日志配置等,以及其他控制器,如复制控制器。 |
GKE 使用经过认证的 Kubernetes 版本,该版本可确保应用在本地环境和 GKE 环境之间顺利迁移,并支持客户将单个工作负载分散到多个 GKE 环境中。GKE 还负责提供 Kubernetes 版本的一致升级。
根据共享责任模型,客户的责任是管理运行工作负载的工作节点。客户还必须定义 Pod、服务和配置的部署规则,包括设置网络策略以限制 Pod 到 Pod 的流量,并定义 Pod 安全策略。客户还负责管理工作节点上部署的应用。
Google 负责开发和发布容器运行时和 Kubernetes 组件(如 kubelet 和 kube-proxy)的补丁。客户的责任是通过选择手动模式或选择自动升级选项,使用 GKE 的集群管理功能来应用这些修补程序。
worker node 自动升级选项定期向 worker node 应用更新,包括对 worker node 操作系统和 Kubernetes 组件的更新,按照最新的稳定版本。这也包括安全补丁。对于容器映像的漏洞管理,客户负责修补和加固。GKE 使用谷歌容器注册表提供了检测映像漏洞的原生功能。此外,客户还可以使用流行的第三方产品,如 Twistlock (Palo Alto)、AquaSec 和 Sysdig,来保护他们的容器映像。
基于容器的应用可能会受到错误配置和软件错误的影响。违规可能会导致对工作负载和计算资源的未经授权的访问。以下是 GCP 容器安全的分类。
-
基础设施安全
-
应用开发安全性
-
应用发布安全性
在本章中,我们将涵盖这些类别。此外,读者还将了解保护运行在 GCP 上的容器化应用、工作负载和集群的最佳实践和方法。
基础设施安全
谷歌提供了各种安全功能来保护平台。GKE 使用谷歌云的原生功能,如身份和访问管理、审计日志、应用层机密加密和工作负载身份。GCP 还利用 Kubernetes 的本地安全特性,如基于角色的访问控制(RBAC ),根据单个用户的角色来管理对网络资源的访问。
以下是 GCP 基础设施安全的类别:
-
身份和访问管理 : GKE 利用 GCP 提供的 IAM 来管理对项目级资源的访问,并使用 Kubernetes native RBAC 来管理对 Kubernetes 集群和名称空间的访问。
-
审计日志记录: GKE 捕获 Kubernetes 日志,安全管理员可以使用这些日志进行进一步分析,并针对特定的安全事件生成警报。GKE 通过云审计日志自动记录 Kubernetes 审计日志。
-
**联网:**为了确保点对点通信的安全,GKE 利用了网络策略。通过网络策略,用户可以控制 GKE 集群的 pod 和服务之间的通信。通过 Kubernetes 的网络策略 API,我们可以创建 Pod 级防火墙规则来控制 GKE 集群中的 Pod 和服务之间的通信。
-
此外,网络策略还有助于定义单个 GKE 集群为多个应用层提供服务的场景规则。例如,您可以创建一个网络策略来确保 web 应用中的前端服务不能与支付服务(应用层)直接通信。您还可以限制特定命名空间中的 pod 和服务访问不同命名空间中的其他 pod 或服务。
-
合规性和最低主机操作系统: GKE 支持合规性认证,包括 ISO 27001、ISO 27017、ISO 27108、HIPAA 和 PCI-DSS。客户有责任确保在 GCP 服务级别(使用控制台、gcloud shell 或 API)和应用级别实施合规性控制。
-
自动升级组件: Google 负责用最新的 Kubernetes 版本给 Kubernetes 主程序打补丁。修补/升级工作节点是用户的责任。用户可以手动应用补丁程序,也可以选择自动升级选项。在自动升级场景下,GKE 负责在操作系统层进行补丁管理。
-
加密密钥和秘密加密: GKE 支持将 GCP KMS 与 GCP 管理的密钥或客户管理的加密密钥一起用于数据加密。GCP 秘密管理器提供了存储和管理秘密的功能,如二进制 blobs 或文本字符串。GCP IAM 服务用于控制对 Secret Manager 的访问。此服务可用于保护信息,如应用所需的数据库密码、密钥或 TLS 证书。GCP 秘密管理器可用于在 GKE 集群中存储敏感数据,如密码、OAuth 令牌和 SSH 密钥。
-
**集群强化:**在集群安全性方面,GKE 推荐基于 CIS GKE 库本内特基准的集群强化,这是 CIS 库本内特基准的一个子集。
-
**工作负载身份:**容器化的应用可能使用其他 GCP 服务,例如,GCP 存储或云 SQL。为了连接这些服务,应用应该使用 GCP IAM 服务对服务进行身份验证和访问。Workload Identity 使用 Google 管理的服务帐户共享身份验证凭据,遵循应用身份验证的最小特权原则。
-
**托管 SSL 证书:**容器化的应用可能需要通过互联网访问,使用 HTTPS 来确保对系统的安全访问。用户可以直接从第三方供应商那里获得并管理这些证书,或者使用 Google 提供的证书,其中证书管理和更新由 Google 自己处理。
身份和访问管理
在本节中,您将了解 GCP 为保护 GKE 基础设施而提供的身份验证类型和授权选项。Google 提供了以下向 GCP 服务验证用户身份的方法:
-
**谷歌登录:**谷歌登录提供 Gmail 和 G Suite 账户登录 GCP 控制台。
-
OAuth 2.0: GCP 支持 OAuth 2.0 协议,通过 OpenID Connect 对用户进行认证。
-
Firebase 认证 : 它通过脸书、推特和谷歌账户提供用户认证。
-
用户 API: 使用 Google App Engine 内置的 Users API 服务对 Google 和 G Suite 账户进行认证。
以下是与 GKE 服务交互的渠道:
-
谷歌云平台控制台,即 web 界面
-
Cloud SDK 和 Cloud Shell,它们提供了命令行界面
-
自定义应用的 REST API 接口
-
Kubernetes 原生 Kubernetes 实用程序
GCP 控制台
GCP 控制台是一个基于 web 的用户界面,用于创建项目和管理 GCP 资源,例如计算资源、存储、GKE 集群等。
GCP 控制台功能
-
GCP 控制台提供了一个直观的界面来管理 GCP 项目和强调服务。
-
该控制台提供了对所有 GCP 服务和 API 的轻松访问,具有特定于所有 GCP 服务和 API 的仪表板,以及对每个服务的管理资源的访问。
访问 GCP 控制台
图 6-2
谷歌云平台登录
-
**第一步:**要访问 GCP 控制台,请点击以下链接:
https://console.cloud.google.com -
链接会打开签到页面,如图 6-2 所示。
图 6-3
谷歌云平台密码
-
**第二步:**输入邮件地址,然后点击下一步按钮。
-
现在输入您的密码,点击下一步按钮,如图 6-3 所示。
图 6-4
谷歌云平台仪表板
- 成功登录后,您将看到 GCP 仪表板,从中您可以访问各种 GCP 服务,包括存储、IAM & Admin、计算引擎和 Kubernetes 引擎(图 6-4 )。
云 SDK
Cloud SDK 是 Google 为 Java、Python、GO 等流行编程语言开发的一套命令行工具。用户可以使用这些工具与存储、计算引擎、BigQuery、GKE 集群和其他 GCP 服务进行交互。拥有谷歌云账户的用户可以免费使用 Cloud SDK。
咕噜咕噜
Cloud SDK 提供了一个命令行界面,称为 gcloud shell。对于 GKE 管理,gcloud shell 可用于创建 GKE 集群,并管理 GKE 认证和 GKE 集群管理。
库布特雷
kubectl 提供了控制 Kubernetes 集群的命令。它允许部署应用、检查和管理集群资源以及查看日志。
安装云 SDK
在本节中,您将了解如何在 Red Hat 和 CentOS 中安装 Cloud SDK。Google 云计算实例已经捆绑了 Cloud SDK。如果您正在使用 Google Compute Instance,可以跳过以下步骤。
先决条件:
图 6-5
谷歌云平台创建项目
-
登录您的 Google 帐户。
-
应该为您的谷歌云项目启用计费。
-
导航到项目选择器页面,选择现有项目,或者创建一个新项目,如图 6-5 所示。
采取以下步骤在您的 Red Hat Enterprise Linux (RHEL)机器上安装 Cloud SDK(适用于不基于 GCP 的虚拟机)。
- 步骤 1: 通过执行以下代码,使用云 SDK 存储库更新
yum配置。
图 6-7
gcloud init认证 URL
图 6-6
gcloud init命令的结果
-
**第二步:**执行以下命令安装 Cloud SDK。
-
命令:
yum install google-cloud-sdk -
步骤 3: 执行以下命令触发认证过程。
-
命令:
gcloud init -
执行前面的命令后,将显示图 6-6 所示的结果。
sudo tee -a /etc/yum.repos.d/google-cloud-sdk.repo << EOM
[google-cloud-sdk]
name=Google Cloud SDK
baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOM
-
复制身份验证 URL 并将其粘贴到您的浏览器中。浏览器页面将显示验证码。将验证码粘贴回终端,如图 6-7 所示。
-
**第四步:**在浏览器窗口,审核应用权限,点击接受,输入验证码后在命令行复制粘贴返回的代码。否则,代码会自动发送到命令行工具。
-
步骤 5: 选择此配置的凭证。
-
设置好凭证后,gcloud 会提示输入此配置的默认项目。从列表中选择一个项目 ID。
-
Kubernetes 支持两种类型的帐户。第一种类型是用户帐户,即普通用户的帐户,它不由 Kubernetes 管理,不能通过 kubectl 命令创建或删除。第二种类型是服务帐户,由 Kubernetes 创建和管理。服务帐户只能由 Kubernetes 对象使用,例如 Pods。
-
在 GKE,谷歌管理的 Kubernetes 用户账户可以是谷歌云服务账户,也可以是谷歌账户。Kubernetes 服务账户和 Google 云服务账户本质上是不同的。Kubernetes 服务帐户属于定义它们的集群,而 Google 云服务帐户是 Google Cloud 项目本身的一部分。使用云身份和访问管理,Google 云服务帐户可以轻松获得对 GKE 集群以及 Google 云资源的访问权限。与 CIS GKE 基准测试建议 6.2.1 保持一致:“不要使用计算引擎默认服务帐户运行 GKE 集群。”
-
身份验证之后,我们必须为这些身份提供授权,以便在 Kubernetes 集群上创建、更新、读取或删除操作。
-
认证和授权的最佳实践:
- **禁用传统授权:**应该使用 RBAC 和云 IAM 来定义允许用户和服务帐户在 Kubernetes 集群上执行操作的策略。为了确保 RBAC 根据最小特权模型限制权限,我们必须禁用遗留授权。以下命令可用于在创建 Kubernetes 集群时禁用遗留授权。
-
命令:
gcloud container clusters create CLUSTER_NAME -no-enable-legacy-authorization -
**禁用基本认证:**基本认证通过用户名和密码对用户进行认证,这些信息以未加密的纯文本形式存储时,可能会导致暴力攻击。为了防止这种情况,必须禁用基本身份验证。从 GKE 版本 1.2 及更高版本开始,默认情况下,群集的基本身份验证处于禁用状态。
-
**禁用客户端证书:**对于使用 GKE 版本 1.12 及更高版本创建的集群,默认情况下禁用客户端证书颁发。
云 IAM 策略
本节将描述如何创建云访问和管理策略,以允许授权用户和服务帐户与 GKE 交互。通过云 IAM 策略,我们可以限制谁可以访问我们的项目以及他们可以执行什么操作。Cloud IAM 与 Kubernetes RBAC 合作,在项目级别为用户和服务帐户提供授权,RBAC 控制对 Kubernetes 对象或名称空间级别的访问。
云 IAM 角色的类型
GCP 提供以下类型的 IAM 角色:
-
预先限定的
-
原始的
-
习俗
预定义的 GKE 角色
GKE 提供了预定义的角色,这些角色提供了对特定谷歌云资源的访问。
以下是 GKE 的预定义角色:
-
roles/container.admin -
roles/container.viewer -
roles/container.hostServiceAgentUser -
roles/container.clusterAdmin -
roles/container.clusterViewer -
roles/container.developer
要查看预定义的权限,请执行以下步骤:
图 6-8
IAM & Admin
- **第一步:**点击 IAM & Admin,如图 6-8 。
图 6-9
角色
- **第二步:**点击角色选项,如图 6-9 所示。
图 6-10
过滤表
- **第三步:**在角色页面中,点击【过滤表】,如图 6-10 所示。
图 6-11
按类型筛选表并用于
-
**第四步:**现在过滤角色,如下图 6-11 :
-
类型:预定义
-
用于:Kubernetes 发动机
图 6-12
库引擎管理
- **第五步:**选择任意选项,如 Kubernetes 引擎管理,如图 6-12 所示。
图 6-14
原始角色
图 6-13
库引擎管理说明
- **第六步:**一旦选择了 Kubernetes 引擎管理选项,你就可以在屏幕右侧的面板中看到它的描述,如图 6-13 所示。
原始角色
原始云 IAM 角色是历史角色,为用户提供对所有 Google 云资源的全局和项目级访问。作为最佳实践,使用预定义的角色来保护项目和集群。基本角色有以下几种类型(参见图 6 14):
-
查看者:该角色授予只读权限。
-
编辑:除了修改对象状态的权限外,该角色还授予读取权限。
-
所有者:该角色允许编辑权限,具有设置计费和管理角色的额外权限,以及对项目及其资源的权限。
服务帐户用户角色
服务帐户用户角色(roles/iam.serviceAccountUser)可以分配给项目中的所有服务帐户,也可以分配给特定的服务帐户级别。在服务帐户上被授予服务帐户用户角色的用户可以使用它来间接访问该服务帐户可以访问的所有资源。例如,如果一个服务帐户被授予 Kubernetes 引擎集群管理员(roles/Kubernetes Engine Cluster Admin)角色,则在该服务帐户上被授予服务帐户用户角色(roles/iam.serviceAccountUser)的用户可以作为服务帐户来启动 GKE 集群。在这个流程中,用户模拟服务帐户,使用授予的角色和权限执行任务。
现在让我们回顾一下 GKE 在 GCP 的角色。
图 6-15
IAM & Admin
- **第一步:**点击 IAM &管理区,如图 6-15 。
图 6-16
角色
- **第二步:**点击角色选项,如图 6-16 所示。
图 6-17
过滤表
- **第三步:**在角色页面,点击过滤表,如图 6-17 。
图 6-18
过滤表服务帐户管理选项
- **第四步:**现在过滤角色,选择服务账户管理,然后选择服务账户管理选项,如图 6-18 所示。
图 6-19
服务帐户管理描述
- **第五步:**选择服务账户管理选项后,您会在页面右侧的面板下看到描述和权限(图 6-19 )。
服务帐户管理权限如下:
-
iam.serviceAccounts.create -
iam.serviceAccounts.delete -
iam.serviceAccounts.get -
iam.serviceAccounts.getIamPolicy -
iam.serviceAccounts.list -
iam.serviceAccounts.setIamPolicy -
iam.serviceAccounts.update -
resourcemanager.projects.get -
resourcemanager.projects.list
自定义角色
如果预定义的角色不够,我们可以定义自己的自定义角色。
基于角色的访问控制
Kubernetes 的本地 RBAC 是一种基于单个用户角色来管理集群资源访问的方法。
通过 RBAC,我们可以定义允许 Kubernetes 主体(软件、Kubernetes、用户)对 Kubernetes 实体(pod、节点)执行的操作(即获取、更新、删除)。
RBAC 用于在集群级别或在 Kubernetes 名称空间内提供对 Kubernetes 资源的访问。通过 RBAC,我们还可以控制对谷歌账户、谷歌云服务账户和 Kubernetes 服务账户的访问。
GKE 遵循 CIS GKE 基准建议 5.6.1:“使用名称空间在资源之间创建管理边界。”根据最小特权原则,建议通过创建单独的名称空间或集群,给予团队有限的访问 Kubernetes 的权限。GCP 云 IAM 和 Kubernetes RBAC 合作,以促进这一点。
Kubernetes 提供以下类型的 RBAC 权限:
-
**角色和集群角色:**用户或用户组的一组权限。角色始终局限于单个命名空间,而 ClusterRole 是群集范围的。
-
RoleBinding 和 ClusterRoleBinding: 它们分别将角色/集群角色中定义的权限授予一个用户或一组用户。RoleBindings 绑定到某个命名空间,ClusterRoleBindings 是集群全局的。
例如,在图 6-20 中,为名称空间monitoring定义了角色,并为monitoring名称空间中的所有窗格提供了只读权限(get、watch和list)。
图 6-20
不可磨灭的作用
用户和用户组分别称为主题或主题组。现在,在创建 Role/ClusterRole 之后,我们必须在 RoleBinding/ClusterRoleBinding 中将它们分配给一个主题或一组主题。
在 GKE,受试者分为以下类型(表 6-2 ):
表 6-2
GKE 主题类型
|学科
|
值类型
|
描述
| | --- | --- | --- | | 久世服务帐户 | 服务帐户 | Kubernetes 服务帐户的名称 | | 谷歌云用户帐户 | 用户 | 谷歌云的注册电子邮件地址 | | 云 IAM 服务帐户 | 用户 | 自动生成的云 IAM 服务帐户电子邮件地址 | | g 套件谷歌组地址(测试版)在一个验证的领域 | 组 | 本身是 gke-security-groups@customerdomain.com 谷歌集团成员的谷歌集团的电子邮件地址 |
我们已经定义了角色绑定,如图 6-21 所示,将podreader角色授予 GKE 主体。
图 6-21
古巴人的劳力士
审核日志记录
Kubernetes 集群生成 Kubernetes 审计日志,记录所有对 GKE 集群的 API 调用。安全管理员可以进一步分析这些日志,以便进行安全审计和监控。GKE 通过云审计日志和 Stackdriver(现在叫做 Google Operations)日志自动记录 Kubernetes 审计日志。作为最佳实践,Google 在创建 GKE 集群时默认启用云操作或 Stackdriver 日志记录。
操作系统日志不同于云审计日志和 Kubernetes 审计日志。为了访问 Kubernetes worker node (VM)操作系统级日志,用户可以使用 GCP 控制台启用 Linux 审计日志记录。
以下是审计日志的类型:
-
**管理员活动日志:**该日志包含与 API 调用和其他管理员活动相关的日志,例如修改 GKE 配置、GKE 资源元数据等。每当用户创建任何对象或更改访问管理权限时,都会在管理活动日志下记录日志。要查看管理活动日志,用户必须具有以下 Cloud IAM 角色:日志记录/日志查看器或项目/查看器。默认情况下,管理活动日志记录是启用的,不需要额外的费用。
-
**数据访问日志:**该日志记录了读取 GKE 资源的配置或元数据的 API 调用的日志。数据访问日志不会将在公共共享资源上执行的数据访问操作记录为日志。要查看数据访问日志,用户必须具有以下 Cloud IAM 角色:日志记录/私有日志查看器或项目/查看器。应该明确启用数据访问日志,这是由 GCP 收费的。
通过 Google Cloud 控制台查看管理活动日志
通过执行以下步骤,您可以查看管理活动日志。
图 6-22
日志查看器选项
-
步骤 1: 按照“访问 GCP 控制台”一节所述,使用您的凭据登录 GCP 控制台页面。
-
步骤 2: 导航到日志菜单中的日志查看器页面(图 6-22 )。
图 6-23
不可分的群集日志
- 步骤 3: 在页面顶部附近,找到用于选择资源类型的下拉菜单。从下拉菜单中,选择 Kubernetes 集群,然后指定位置或选择所有位置。如果选择一个位置,则选择一个特定的群。在我们的例子中,我们选择位置 us-central1-c,并选择 clustertutorial 作为特定的集群,如图 6-23 所示。
图 6-24
Kubernetes 集群,所有日志
- **第四步:**选择集群后,会看到所有日志,如图 6-24 所示。
图 6-25.1
选择活动日志
- 步骤 5: 右边的下一个菜单用于选择日志。在下拉菜单中选择活动,然后点击确定,如图 6-25.1 所示。
选择“活动”后,您将看到相关的详细信息,如图 6-25.2 所示。默认情况下,显示屏会显示所有日志级别。
图 6-25.2
Kubernetes 集群,活动日志
网络安全性
以下是网络安全的最佳实践和建议。
为 Kubernetes 主机启用授权网络
GKE 遵循 CIS GKE 基准建议 6.6.2:“优先选择 VPC 本地集群”,为 Kubernetes 主设备启用授权网络。启用 GKE Kubernetes 主机的授权网络功能有助于限制允许访问 GKE 集群的 IP 地址范围。Kubernetes 引擎通过 GCP IAM 服务使用传输层安全性(TLS)和身份验证来提供从公共互联网对 Kubernetes 主端点的安全访问。
授权网络通过将外部非 GCP 网络访问限制为一组特定的网络地址(例如,您的数据中心 IP 范围),提供了额外的安全层。
节点防火墙
节点防火墙机制有助于在基于计算引擎实例的 GKE 节点之间实施状态防火墙规则。防火墙规则限制或允许网络流量。通过使用网络中的标记将防火墙规则应用于实例。标记网络是应用防火墙规则和路由到特定虚拟机实例的一种有用方法。在多个 VPC 网络中,标签不必是唯一的。用户可以在创建计算实例时创建网络标记,并在以后进行编辑。
以下步骤将在现有计算实例中添加一个标记:
图 6-26
虚拟机实例页面
-
步骤 1: 如本章前面所述,登录谷歌控制台。
-
**第二步:**导航到虚拟机实例页面,如图 6-26 所示。
图 6-27
选择虚拟机实例
- **第三步:**选择一个实例,如图 6-27 所示。
图 6-28
编辑虚拟机实例
- **第四步:**在虚拟机实例详细信息页面,点击编辑选项,如图 6-28 所示。
图 6-29
虚拟机实例网络标记
- 步骤 5: 在网络标签部分,指定一个或多个标签,例如 allow-traffic-9000(图 6-29 )。
图 6-30
虚拟机实例网络标记—保存
- **第六步:**最后点击保存(图 6-30 )。
在 GKE,每个节点池都有自己的标签集,可用于管理防火墙规则。默认情况下,节点池的每个计算实例都有一个标记,用于标识特定的 Kubernetes 引擎集群(它属于哪个节点池)。该标签用于 Kubernetes 引擎自动创建的防火墙规则中。用户可以在创建集群或节点池时使用 gcloud 命令行中的- tags 标志创建自定义标记,如下所示。
在命令 1 中,我们创建了一个名为allow-9000-fwr 、的防火墙规则,通过在所有带有allow-9000标签的节点上指定一个 —allow 标志,允许内部负载均衡器访问端口 9000。
命令 2 应用这个防火墙规则,同时创建一个 Kubernetes 集群clustertutorial,它在- --tag标志中有一个定制的allow-9000标记,如下所示。
-
命令 1 :
-
gcloud compute firewall-rules create allow-9000-fwr --target-tags allow-9000 --allow tcp:9000 \--network gke --source-range 130.211.0.0/22 -
命令 2:
-
gcloud container clusters create clusterturorial --tags allow-9000
启用 Pods 安全通信的网络策略
GKE 遵循 CIS GKE 基准建议 6.6.7:“确保启用网络策略并进行适当设置。”默认情况下,Kubernetes 集群中的所有 pod 都可以相互通信。用户可以通过网络策略控制点对点通信。
网络策略是一种规范,规定了允许多组 pod 如何相互通信以及如何与其他网络端点通信。群集中的 Pod 使用分配给它们的 IP 地址(也称为 Pod IP 地址)通过网络进行连接。群集管理员可以通过使用网络策略来限制点对点通信。
网络策略资源使用标签来识别和选择特定的 pod,并定义规则来定义允许哪些流量进入所选的 pod。
一旦网络策略附加到 GKE 集群中用于选择特定 pod 的命名空间,它将根据网络策略接受或拒绝任何连接。
我们可以通过使用 Kubernetes NetworkPolicy API 创建 Pod 级防火墙规则来定义网络策略。这些防火墙规则决定哪些 pod 和服务可以在 GKE 集群内相互访问。
在 GKE,我们可以在创建 Kubernetes 集群时或之后启用网络策略实施。
GKE 提供了以下方式来启用网络策略实施:
-
通过
gcloud工具 -
通过控制台
-
按 API
在本章中,我们将介绍两种启用网络策略实施的方法(gcloud和控制台)。
通过 gcloud 命令启用网络策略实施
通过使用–enable-network-policy标志,执行以下命令,在创建新集群时启用网络策略实施。从 Cloud SDK 运行以下命令。
-
命令:
-
gcloud container clusters create cluster-name --enable-network-policy
要为现有群集启用网络策略强制,请执行以下命令。
-
**命令:**运行下面的
gcloud命令,使用标志--update-addons=NetworkPolicy=ENABLED启用插件。 -
gcloud container clusters update cluster-name --update-addons=NetworkPolicy=ENABLED
执行以下gcloud命令,在现有集群上启用网络策略强制,这反过来会重新创建集群的节点池,并启用网络策略强制。
-
命令:
-
gcloud container clusters update cluster-name --enable-network-policy
通过 Google 控制台启用网络策略
图 6-31
GKE 集群
- **第一步:**导航到云控制台中的 Google Kubernetes 引擎菜单,如图 6-31 所示。
图 6-32
GKE 创建分类按钮
- **第二步:**点击创建集群按钮(图 6-32 )。
图 6-33
GKE 集群网络选项
-
步骤 3: 按照前面章节的说明配置集群。
-
步骤 4: 在导航窗格的集群下,点击联网(图 6-33 )。
图 6-34
GKE 群集启用网络策略选项
- **第五步:**选中启用网络策略复选框(图 6-34 )。
图 6-35
GKE 集群创建选项
- **第六步:**点击创建按钮,如图 6-35 所示。
通过 Google 控制台启用现有集群的网络策略实施
图 6-36
GKE 聚类编辑
-
步骤 1: 导航到云控制台中的 Google Kubernetes 引擎菜单,如前面的“通过 Google 控制台启用网络策略”一节所示。
-
步骤 2: 点击要实施网络策略的集群,点击铅笔图标旁边的编辑(图 6-36 )。
图 6-37
GKE 集群编辑下拉菜单启用选项
- 步骤 3: 从主设备的网络策略下拉菜单中选择启用(图 6-37 )。
图 6-38
GKE 集群编辑-保存
- **第四步:**点击保存,集群更新后再次点击编辑(图 6-38 )。
图 6-39
启用节点的 GKE 群集网络策略下拉选项
-
步骤 5: 从节点的网络策略下拉菜单中选择启用(图 6-39 )。
-
**第六步:**点击保存,如图 6-38 ,第四步。
创建网络策略
为集群启用网络策略实施后,我们必须使用 Kubernetes NetworkPolicy API 定义实际的网络策略。
图 6-40 是一个在 Kubernetes 中通过 YAML 定义网络策略的例子。
图 6-40
YAML 网络策略
以下是定义网络策略的必填字段:
-
apiVersion -
kind -
metadata -
spec
本书前面的章节已经解释了apiVersion、kind和metadata字段。
spec字段包含所有那些定义给定名称空间内的网络限制的设置。
podSelector选择策略适用的一组 pod。
在这个示例策略中,选择标签为role= database的 pod。如果您没有在podSelector中指定一个值,它会考虑在metadata部分下定义的指定名称空间中的所有窗格。
policyTypes定义要限制的流量类型(入站为ingress,出站为egress,或两者都有)。如果我们不指定任何策略类型,入口将始终由default设置,如果网络策略有任何出口规则,将设置egress。
ingress包括入站流量白名单规则。
此示例策略包含一个规则,该规则匹配来自以下三个来源之一的单个端口上的流量:
-
ipBlock -
namespaceSelector -
podSelector
ingress允许连接到 TCP 端口 6379 上标签为role=database的default名称空间中的所有 Pod,从标签为role=frontend的default名称空间中的任何 Pod,以及从标签为project= demoproject的名称空间中的任何 Pod。
允许访问的 IP 地址在 172 . 17 . 0 . 0–172 . 17 . 0 . 255 和 172 . 17 . 2 . 0–172 . 17 . 255 . 255 范围内(即所有 172.17.0.0/16,除了 172.17.1.0/24),如图 6-40.1 所示。
图 6-40.1
与ingress YAML 的网络策略
egress包括出站流量白名单规则。
在本例中,egress允许从标签为role=database的default名称空间中的任何 Pod 连接到 TCP 端口 5978 上的 CIDR 10.0.0.0/24,如图 6-40.2 所示。
图 6-41
loadBalancerSourceRanges
图 6-40.2
与egress YAML 的网络策略
通过负载均衡器过滤流量
GCP 提供各种类型的负载均衡器来过滤传入的流量。例如,基于 HTTP/HTTPS 的负载均衡器将终止未授权的请求,并执行上下文感知的负载均衡决策。当我们将 Kubernetes 服务类型定义为负载均衡器时,GCP 将创建一个外部网络负载均衡器,并将其与该 Kubernetes 服务连接。Kubernetes 服务与各种 pod 连接,使用它们的标签来传递请求。通过 kube-proxy,我们可以在节点级别过滤请求。您需要通过在服务中定义loadBalancerSourceRanges配置来提供 CIDR 范围,以便将 IP 地址范围列入白名单,从而获得对服务的访问。
在以下示例中,将创建一个负载均衡器,该负载均衡器只能由 IP 地址来自 130.210.207.1 和 130.210.207.2 的客户端访问,如图 6-41 所示。
在 GKE 创建一个私人 Kubernetes 集群
私有集群的 Kubernetes 节点不能从公共互联网访问。在此环境中运行的工作负载(pod 和控制器)也与公共互联网隔离。Kubernetes master 和它的节点使用 VPC 对等技术私下相互通信。私有的 Kubernetes 集群网络提供了最大的安全性,因为服务不暴露于公共互联网。
合规性和最低主机操作系统
法规遵从性由根据相关行业或机构(如医疗保健、金融、政府等)定义的一组规则、策略、规范或法律组成。GCP 产品定期接受安全性、隐私和合规性控制的独立验证、认证、合规性验证或针对标准的审计报告。
GCP 按地区提供法规遵从性,如 EMEA、美国、亚太地区,按行业或机构提供法规遵从性。
GCP 合规产品甚至超越了报告和认证。他们还向用户提供文档、指南和法律保证,以符合法律、法规和框架。Google Kubernetes 引擎合规认证包括 ISO 27001、ISO 27017、ISO 27108、HIPAA 和 PCI-DSS。
默认情况下,GKE 使用 COS 映像来配置 GKE 节点,并且它已经预装了 Docker 运行时和 cloud-init,从而确保安全快速地部署 GKE 节点。它是一个开源项目,由谷歌在 Chromium OS 下维护。Google 实现了几个安全设计原则来构建 COS。
启用 COS 提供了以下安全优势:
-
更小的攻击面: COS 占用空间更小,减少了实例的潜在攻击面。
-
锁定: COS 实例默认包含锁定的防火墙和其他安全设置。
-
内核加固: COS 为内核启用了许多安全加固特性,比如审计、内核页表隔离、IMA 等。,以实施安全策略。
-
自动更新: COS 实例配置为自动下载每周更新作为后台。要使用最新的更新,需要重新启动。
-
**访问限制:**默认情况下,COS 不包含任何可访问的用户帐户。它通过实例或项目元数据管理用户帐户和 SSH 密钥。从 milestone 66 及更高版本开始,它还支持通过 IAM 进行访问。禁用基于密码的登录,并且不允许 root 登录。
自动升级组件
CIS GKE 基准 6.5.3 建议用户“确保为 GKE 节点启用节点自动升级”节点自动升级使 Kubernetes 集群的节点和节点池保持最新和最稳定的 Kubernetes 版本。它还确保了新的操作系统的二进制文件,节点是固定的,并且安全问题是在没有人工干预的情况下解决的。
通过云控制台实现自动升级
要启用节点池的自动升级,请执行以下步骤:
图 6-42
启用自动升级—Kubernetes 引擎菜单
- **第一步:**导航到云控制台中的 Google Kubernetes 引擎菜单,如图 6-42 所示。
图 6-43
启用自动升级
- **第二步:**选择集群选项,如图 6-43 所示。
图 6-44
启用自动升级—编辑按钮
- **第三步:**选择你的集群,点击集群编辑按钮(铅笔图标),如图 6-44 所示。
图 6-45
启用自动升级—节点池
- **第四步:**在节点池部分,点击相关节点池,如图 6-45 所示。
图 6-46
启用自动升级—编辑选项
- **第五步:**点击编辑选项,如图 6-46 所示。
图 6-47
启用自动升级—管理
- **第六步:**导航到管理区,如图 6-47 。
图 6-48
启用自动升级选项
- **第七步:**选择启用自动升级选项,如图 6-48 所示。
图 6-49
启用自动升级—保存按钮
- **第八步:**点击保存按钮(图 6-49 )。
图 6-50
启用自动升级选项
- **第九步:**保存更改后,在节点池详细信息表单的管理部分,您会看到自动升级选项已经启用,如图 6-50 所示。
当我们使用gcloud命令创建集群时,默认情况下,节点自动升级当前处于启用状态,并且在默认情况下,节点池自动升级也处于启用状态。
启用自动节点修复
节点自动修复特性使 Kubernetes 集群中的节点保持健康和正常运行。启用自动节点修复功能有助于 GKE 定期执行群集节点的运行状况检查,并在连续运行状况检查失败时启动修复过程。
您可以通过执行gcloud命令或通过云控制台来启用自动节点修复选项。
通过 gcloud 启用自动节点修复
执行以下命令创建一个启用了autorepair的集群。
-
命令:
-
gcloud container clusters create cluster-name --zone compute-zone --enable-autorepair
前面的命令在cluster-name变量中传递集群名称,在compute-zone变量中传递要创建集群的区域名称。
通过云控制台启用自动节点修复
要通过云控制台启用自动节点修复,请执行“通过云控制台启用自动升级”一节中的相同步骤,直到步骤 5,然后,对于其他更改,请执行以下步骤:
图 6-51
启用自动修复—管理
- **第一步:**进入管理版块,如图 6-51 。
图 6-52
启用自动修复—保存按钮
- **第二步:**点击保存按钮(图 6-52 )。
图 6-53
启用自动修复—节点池详细信息
- **第三步:**保存更改后,在节点池详细信息表单的管理部分,您将会看到自动修复选项已经启用,如图 6-53 所示。
加密密钥和秘密加密
默认情况下,GKE 数据是加密的。这包括连接到 GKE 节点的磁盘和存储在控制面板数据库中的 Kubernetes secrets 对象。
GCP 还提供了两个功能,客户管理的加密密钥(CMEK)和 GKE 应用,让用户能够保护和控制 GKE 环境的加密。
工作负载身份
工作负载是定义规则的对象,根据这些规则在 Kubernetes 集群中部署 pod。在本节中,您将看到保护工作负载的最佳实践。
定义 pod 的权限和访问控制
为了集群的整体安全性,我们必须通过限制它们的特权来保护容器和容器,使得特定的容器/容器不能影响在同一集群中运行的其他容器/容器。在 GKE,通过安全性,我们可以在 Kubernetes 中定义 pod、容器和文件系统的特权和权限。
GCP 提供了三种方式来授权 Pods 访问其他谷歌云资源。
-
工作负载身份
-
节点服务帐户
-
服务帐户 JSON 密钥
CIS GKE 基准建议 6.2.2 建议使用专用的 Google 云服务帐户和工作负载身份。有关该基准的更多信息,请通过以下链接访问相关站点: https://cloud.google.com/kubernetes-engine/docs/how-to/hardening-your-cluster 。
为了以安全的方式从 GKE 集群内部访问谷歌云服务,GCP 建议使用工作负载身份特性。工作负载身份支持将 Google 服务帐户映射到 Kubernetes Pod,这有助于消除在 Pod 或集群中管理服务帐户凭证 JSON 文件的潜在过载。现在,让我们按照步骤创建一个工作负载身份,它将 Google 服务帐户与 GKE 服务帐户连接起来。
图 6-55
gcloud config set ProjectID命令
图 6-54
激活云壳图标
-
步骤 1: 通过以下链接访问网站,启用 Google Kubernetes 引擎 API:
https://console.cloud.google.com/apis/library/container.googleapis.com。 -
**第二步:**点击谷歌云控制台最右上角的激活云壳图标,如图 6-54 所示。
-
**第三步:**云壳打开后,执行
gcloud config命令,设置项目 ID。 -
命令:
-
gcloud config set project tutorial-project-268109
在我们的例子中,tutorial-project-268109是我们的项目 ID(图 6-55)。
-
步骤 4: 执行以下命令,设置区域(参见图 6-56)。
-
命令:
-
gcloud config set compute/zone us-central1-c -
**第五步:**执行以下命令,对区域进行设置(图 6-57)。
-
命令:
-
gcloud config set compute/region us-central1 -
**第六步:**点击以下链接,启用云 IAM 服务账户凭证 API:
https://console.cloud.google.com/apis/api/iamcredentials.googleapis.com/。 -
步骤 7: 通过执行以下命令,创建一个启用了工作负载标识的集群。
-
命令:
-
gcloud beta container clusters create cluster-name --release-channel regular \ --workload-pool=project-id.svc.id.goog -
分别用集群名和项目 ID 替换
cluster-name和project-id。 -
我们的集群名是
clustertutorial,而tutorial-project-268109是我们的项目 ID。 -
gcloudbeta 容器集群创建clustertutorial --release-channel regular \ -
--workload-pool=tutorial-project-268109.svc.id.goog
前述内容如图 6-58 所示。
图 6-56
gcloud config set compute/zone命令
图 6-68
CI/CD 中的应用开发和发布安全控制
图 6-67
验证活动服务帐户
图 6-66
验证服务帐户
图 6-65
向 Kubernetes 服务帐户添加iam.gke.io/gcp-service-account注释
图 6-64
链接 Google 和 Kubernetes 服务帐户的命令输出
图 6-63
Kubernetes 服务帐户创建的输出
图 6-62
创建名称空间以使用 Kubernetes 服务帐户
图 6-61
创建 Google 服务帐户
图 6-60
配置 kubectl
图 6-59
创建的集群
图 6-58
创建具有工作负荷标识的集群
图 6-57
gcloud config set compute/region命令
-
创建群集需要几分钟时间。等到您收到图 6-59 中突出显示的详细信息。
-
步骤 8: 执行以下命令,配置 kubectl 与集群通信(图 6-60 )。
-
命令:
-
gcloud container clusters get-credentials clustertutorial -
步骤 9: 通过执行以下命令创建 Google 服务账户(图 6-61 )。
-
命令:
-
gcloud iam service-accounts create workload-service-account-name -
步骤 10: 通过执行下面的命令,创建用于 Kubernetes 服务帐户的名称空间
k8s-service-account-namespace(图 6-62 )。 -
命令:
-
kubectl create namespace k8s-service-account-namespace -
步骤 11: 通过执行以下命令创建 Kubernetes 服务帐户(
k8s-service-account-name)(图 6-63 )。 -
命令:
-
kubectl create serviceaccount --namespace k8s-service-account-namespace k8s-service-account-name -
k8s-service-account-namespace是在步骤 10 中创建的 Kubernetes 名称空间。 -
k8s-service-account-name是 Kubernetes 服务帐户名称。 -
步骤 12: 执行以下命令,通过在两个帐户之间创建云 IAM 策略绑定,允许 Kubernetes 服务帐户映射到 Google 服务帐户。
-
命令:
-
gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:教程-项目-268109.svc.id.goog[k8s-服务-账户-名称空间/k8s-服务-账户-名称]" \工作负载-服务-账户-名称@tutorial-project-268109.iam.gserviceaccount.com -
tutorial-project-268109是项目 ID。 -
k8s-service-account-namespace是 Kubernetes 名称空间。 -
k8s-service-account-name是 Kubernetes 服务账户。 -
workload-service-account-name是 Google 服务帐户的名称。
图 6-64 显示了链接 Google 和 Kubernetes 服务帐户的命令输出。
-
步骤 13: 使用 Google 服务帐户的电子邮件地址,通过执行以下命令,将
iam.gke.io/gcp-service-account=gsa-name@project-id注释添加到 Kubernetes 服务帐户中(图 6-65 )。 -
命令:
-
kubectl annotate serviceaccount \ --namespace k8s-service-account-namespace \ k8s-service-account-name \iam . gke . io/GCP-service-account = workload-service-account-name @ projectid . iam . gserviceaccount . com -
步骤 14: 通过执行以下命令,验证服务账户配置正确(图 6-66 )。
-
命令:
-
kubectl run -it \--generator=run-pod/v1 \--image google/cloud-sdk:slim \--serviceaccount k8s-service-account-name \ --namespace k8s-service-account-namespace \workload-identity-test -
下载
cloud-sdk映像可能需要几分钟时间。下载完成后,交互式 shell 会自动启动。执行以下命令,验证活动的服务帐户。 -
命令:
-
gcloud auth list -
如果服务帐户配置正确,Google 服务帐户电子邮件地址将被列为活动(且唯一)身份(图 6-67 )。
托管 SSL 证书
Kubernetes 提供入口对象,将基于 HTTPS 的流量路由到运行在 GKE 集群中的应用。GKE 入口控制器创建 Google Cloud HTTP(S)负载均衡器,它可以是外部的,也可以是内部的,这取决于 Kubernetes 服务的配置。为了在负载均衡器和 Kubernetes 服务之间建立安全连接,GKE 推荐使用带有 SSL 证书的 HTTPS 负载均衡器。
GCP 支持以下类型的 SSL 证书。
-
自管理证书:自管理证书是指客户可以从任何证书颁发机构获得的证书。管理和更新自我管理的证书是客户的责任。
-
Google 托管证书 : Google 托管 SSL 证书由 Google Cloud 为客户获取和管理,并自动更新。Google 管理的 SSL 证书基于客户特定的域。在写这本书的时候,所有 GKE 版本都有测试版。
应用开发和发布安全性
应用开发和发布安全大致分为三个主要阶段:
-
发展阶段
-
构建阶段
-
部署阶段
图 6-68 显示了在 GKE 的容器化应用开发和发布生命周期中执行的安全活动。
发展阶段
在开发阶段,开发人员根据业务需求开发应用代码。容器化应用的典型代码包括应用代码、单元测试代码、Docker 文件、构建基础设施的基础设施代码、测试脚本和 DevSecOps 的流水线。开发人员依靠集成开发环境(IDE)来开发源代码。IDE 提供了一个沙盒环境来开发和测试代码。一旦代码被开发出来,它就会被签入源代码管理系统。
源代码管理系统维护签入代码的版本,并用于合并和跟踪开发人员所做的代码更改。表 6-3 列出了开发阶段可用的安全控制。
表 6-3
开发阶段安全控制
|开发阶段安全控制
|
工具/活动
|
利益
| | --- | --- | --- | | 集成开发环境(IDE)安全性插件 | Synk,CodeDX,Whitesource,Fortify,Sonarlint,binskim | 使用这些工具,当开发人员编写代码时,应用代码被并行扫描和分析。除了补救方法之外,开发人员还可以在 IDE 中获得关于代码缺陷的通知或建议,这有助于他们提高编码技能和代码质量。这种做法被称为左移测试。 | | 源代码存储库安全性插件 | Gitrob,gitleaks,Google 云资源仓库 | 使用令牌或私钥与外部服务通信的应用。作为最佳实践,令牌和秘密不应该保存在源代码管理系统中。秘密和令牌应该保存在秘密保险库中,例如哈希公司的保险库或 GCP 提供的云 KMS 服务。GCP 为云资源仓库提供了内置的安全特性,以检测安全密钥,并在违反策略的情况下禁止 git 推送操作。 |
构建阶段
一旦代码被检入 SCM,通过 web hook REST API 调用 CI/CD 流水线,手工或自动触发构建阶段。在构建阶段,第一步是执行开源合规性和许可证扫描,以确定开发人员使用的开源库中的任何安全漏洞。一旦完成,按照构建工具,例如 Maven,编译代码,并执行单元测试用例。如果在构建阶段没有出现错误,静态代码分析将被启动,以发现安全漏洞,例如,使用损坏的或有风险的加密算法,应用代码中的 SQL 注入使应用容易受到攻击。检测此类漏洞的流行工具包括 SonarQube、Veracode 和 Appscan。
构建阶段的最后一步是创建称为工件的可部署单元,并存储在像 Artifactory 这样的存储库中。如果构建由于任何原因(例如,代码编译问题或单元测试失败)而失败,构建过程将停止,并向团队发送通知以纠正问题。表 6-4 列出了构建阶段可用的安全控制。
表 6-4
构建阶段安全控制
|构建阶段安全控制
|
工具/活动
|
利益
| | --- | --- | --- | | 开源合规和许可 | 黑鸭白源 | 这些工具有助于识别开发人员使用的开源库中的任何安全漏洞,并确保开发人员不违反任何开源许可。 | | 静态代码分析(SAST) | SonarQube,Veracode,Checkmarx | 静态代码分析工具根据 OWSAP 或 CVS 定义的安全规则扫描源代码和二进制文件,以检测安全漏洞,例如,使用损坏的或有风险的加密算法、SQL 注入等。,并提供解决这些问题的建议。 | | 工件安全扫描 | 工件库工具,如 JFrog Artifactory、Nexus | 工件存储库用于存储受版本控制的二进制文件,授权用户可以基于角色进行访问。通过减少对外部存储库的依赖,这提供了改进的构建稳定性。还对存储的工件进行审计。JFrog 提供 x 射线。它扫描所有存储的工件和依赖项。这提供了前所未有的可见性,使 Xray 能够确定工件中发现的任何漏洞或问题的影响。 |
开发和发布阶段
开发和发布是最后的阶段,其中工件被部署在各种环境中,例如,开发、测试和生产。构建工件的提升取决于通过测试(功能、性能、负载和压力)和安全扫描(例如 Docker 映像和容器扫描、动态应用安全)等因素。此外,启用了安全监控,以促进安全事件检测和管理。报告和仪表板用于显示来自多个工具的集合指标,为软件开发团队创建一个监控界面。
表 6-5 列出了部署和发布中使用的安全控制。
表 6-5
部署和发布阶段安全控制
|部署和发布阶段
|
工具/活动
|
利益
| | --- | --- | --- | | 容器映像安全工具 | AquaSec,TwistLock,Sysdig 安全。GCP 提供容器分析来扫描容器中的漏洞。 | 这些解决方案简化了容器强化过程,并提供了漏洞报告和建议。 | | 容器强制策略 | 黑鸭,白源 | 这些有助于识别开发人员使用的开源库中的任何安全漏洞,并确保开发人员不违反任何开源许可。 | | 动态应用安全测试(DAST) | Appscan,OWSAP ZAP,Fortify | DAST 分析工具试图通过 SQL 注入、跨站脚本等方式破解应用。DAST 在软件开发生命周期的早期识别漏洞。 | | 监控、仪表板和报告 | Stackdriver(现谷歌运营)、GCP 安全指挥中心、Sysdig、Prometheus、Splunk、Kibana、Grafana、GCP 数据工作室 | 这些解决方案通过提供监控和仪表板简化了容器化应用的操作,并帮助操作团队定期维护 GKE 基础设施和部署的应用。 | | 持续合规性和运行时安全性 | AppArmor、Seccomp、twistlock、AquaSec、Sysdig Secure | 这些解决方案对正在运行的 Docker 容器执行安全扫描,以确定安全漏洞并保护 Linux 内核免受内核级服务攻击。 |
摘要
在本章中,您了解了 GCP 为管理 GKE 的安全性而提供的各种安全性和合规性控制。您还了解了在为 GKE 平台开发应用时,如何将安全性集成到软件开发生命周期中。在下一章中,我们将了解 Grafana 仪表板和 Stackdriver(现在的 Google Operations)工具,它们可以帮助我们监控和管理我们的 GKE 基础设施。
七、使用 Stackdriver(Google Operations)和 Grafana 的 GKE 仪表板
在本章中,您将学习如何使用 Stackdriver (Google Operations)和 Grafana 为 GKE 创建仪表板。以下是涵盖的主题:
-
Google Stackdriver 介绍(云运营)
-
使用 Grafana 设置 Google stack driver(Google Operations)
Google Stackdriver 简介(Google Operations)
Google stack driver(Google Operations)是一项监控服务,为 IT 团队提供关于在 GCP 和亚马逊 Web 服务(AWS)公共云上运行的应用和虚拟机(VM)的性能数据。它基于collectd,一个收集系统和应用性能指标的开源守护程序。它包括特别关注 Kubernetes 操作符和其他 Kubernetes 特性的功能,比如 CPU 和内存利用率。可以通过其基础架构、工作负载和容器来查看集群信息。
Grafana 是一个开放的观察平台,可以作为可视化层与 Google Operations 一起使用。
在这一章中,你将学习如何使用 Helm 模板安装 Grafana。我们将使用在第五章中部署在 GKE 集群上的 Sock Shop 应用,并将 Google Operations 配置为后端,Grafana 可以使用它来创建仪表板,显示关于集群和其上运行的应用的关键可观察性细节。
使用 Grafana 设置 Google stack driver(Google Operations)
在本节中,我们将使用 Helm 图表和模板在集群中的专用名称空间(在第六章中创建)中部署 Grafana。Helm 是 Kubernetes 的开源包管理器。Grafana 内置了对 Google 操作的支持(Stackdriver)。
设置环境
图 7-2
API 仪表板导航
图 7-1
API 仪表板导航
- **第一步:**使用 Google Operations 的第一步是在你的项目(“教程项目”)上启用云资源管理器 API。为此,转到 API 仪表板屏幕(图 7-1 和 7-2 )。
图 7-3
云资源管理器 API
- 第二步:搜索云资源 API,点击链接上的云资源管理器 API(图 7-3 )。
图 7-4
启用云资源管理器 API
- 点击启用按钮(图 7-4 )。
图 7-5
启用的云资源管理器驱动程序
- **第三步:**点击启用按钮,会出现如图 7-5 所示的页面。现在,项目已经启用了云资源管理器驱动程序。
在 GKE 集群上部署和验证应用部署
由于我们在第六章末尾删除了已部署的应用,因此重复前面的步骤来部署 Sock Shop 应用。在本节中,我们通过运行以下命令来验证 Sock Shop 应用在 GKE 集群上的部署:
图 7-6
列出应用部署
-
命令:
kubectl get services –n sock-shop -
**输出:**下面的输出(图 7-6 )将是执行前面命令的结果。
图 7-7
部署的应用
- 将浏览器指向这个 URL(前面截图中的
http://35.188.192.249),检查您的应用是否可访问(图 7-7 )。
部署 Grafana
在本节中,我们使用一个 Helm 图表和模板在集群中的一个专用名称空间中部署 Grafana。Helm 是 Kubernetes 的开源包管理器。
图 7-8
Helm 初始化
-
步骤 1: 执行以下命令初始化 Helm。
-
命令:
helm init -
**输出:**执行前面的命令后会产生下面的输出(图 7-8 )。
图 7-9
Helm repo 更新
-
步骤 2: 执行以下命令更新本地 Helm 库。
-
命令:
helm repo update -
**输出:**执行前面的命令后会产生下面的输出(图 7-9 )。
图 7-10
下载 Grafana
-
**第三步:**执行以下命令下载 Grafana。
-
命令:
helm fetch stable/grafana --untar -
**输出:**图 7-10 显示了前一条命令执行后的输出。
图 7-11
在 Grafana 中创建名称空间
-
步骤 4: 通过执行以下命令,创建一个专用于 Grafana 的名称空间,该名称空间将部署在同一个集群中。
-
命令:
kubectl create ns grafana -
**输出:**执行前面的命令后会产生下面的输出(图 7-11 )。
图 7-12
在 Grafana 中创建名称空间
-
**第五步:**现在我们将使用 Helm 图表来创建
.yaml文件。执行以下命令: -
命令: (1)
helm template grafana –namespace grafana grafana > grafana.yaml -
命令: (2)
ll -
运行前面的命令列出创建的
grafana.yaml文件。 -
**输出:**图 7-12 显示了前面第一个命令的输出。
图 7-13
Grafana .yaml文件的输出
- 图 7-13 显示了执行前面第二个命令的结果输出。
图 7-14
使用 YAML 配置部署 Grafana
-
步骤 6: 现在已经创建了
.yaml文件,运行下面的命令来部署 Grafana。 -
命令:
kubectl apply -f grafana.yaml -n grafana -
**输出:**图 7-14 显示执行前一条命令后的输出。
图 7-15
Grafana 的 pod 列表
-
步骤 7: 部署后,使用以下命令验证安装。
-
命令:
kubectl get pods -n grafana -
**输出:**图 7-15 显示了前一条命令的输出。
与 Grafana 装置连接
前面的步骤将在部署 Sock Shop 应用的同一个集群中执行 Grafana 的安装。以下是用于连接 Grafana 安装的步骤。
图 7-16
Grafana 安装的密钥
-
步骤 1: 要连接 Grafana,首先使用以下命令获取密码,并复制输出。
-
命令:
kubectl get secret --namespace grafana release-name-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo -
**输出:**图 7-16 显示了前一条命令的输出。
图 7-17
将 Grafana Pod 详细信息设置到变量中
-
运行该命令后,下面是生成的输出示例。(在进入下一步之前,请检查您的具体设置值。)
-
MWQ7yUKCKT4uSSl2eP7eOYmEOC10I5423oxdyzU9 -
步骤 2: 要在当前会话中使用 Pod 名称,使用以下命令,将 Grafana Pod 的名称捕获为变量。
-
命令:
export GRAFANA_POD=$(kubectl get pods --namespace grafana -l "app=grafana,release=grafana" -o jsonpath="{.items[0].metadata.name}") -
**输出:**图 7-17 显示了前面命令的输出。
图 7-18
获取 Grafana Pod 名称
-
步骤 3: 要启用对 Grafana UI 的访问,请使用 port forwarding 命令。在运行 port forwarding 命令之前,使用第一个命令获取 Grafana Pod 名称,并将该名称复制到第二个命令中。
-
命令: (1)
kubectl get pods -n grafana -
命令: (2)
kubectl port-forward release-name-grafana-6bc7fbfc47-bhgtn 3000 -n grafana -
**输出:**图 7-18 显示了命名 Grafana Pod 的代码输出。
图 7-19
用于访问 Grafana 的端口转发详细信息
- 图 7-19 是端口转发的输出。它将设置 Grafana 在端口 3000 上运行。
图 7-20
访问 Grafana
- 步骤 4: 将端口更改为 3000 后,现在导航到云壳中的 web 预览,以访问 UI。导航至右上角的网络预览图标➤更改港口➤ 3000(图 7-20 )。
图 7-21
Grafana 登录页
-
步骤 5: 步骤 4 将在浏览器中显示 Grafana 仪表板。输入“admin”作为用户名,并输入您在步骤 1 中生成的特定于设置的密码(下面的密码用于作者的设置),如图 7-21 所示。
-
MWQ7yUKCKT4uSSl2eP7eOYmEOC10I5423oxdyzU9
图 7-22
Grafana 主页
- 输入用户名和密码后,将显示仪表盘,如图 7-22 所示。
数据源配置
图 7-23
添加数据源图标
- 第一步:点击添加数据源图标(图 7-23 )。
图 7-24
搜索数据源
- **第二步:**在搜索文本框中输入“Stack”搜索 Stackdriver (Google Operations)数据源。这将显示包括 Stackdriver (Google Operations)数据源的列表。点击选择按钮(图 7-24 )。
图 7-25
Stackdriver (Google Operations)验证屏幕
- **第三步:**选择数据源后,会出现 Stackdriver (Google Operations)认证界面(图 7-25 )。
图 7-26
上传帐户密钥文件
- **第四步:**在此屏幕上传可以从服务下载的服务账号密钥文件,如图 7-26 所示。
要下载服务帐户密钥文件,请执行以下步骤。
图 7-27
服务帐户
- 步骤 1: 点击 IAM &管理菜单下的服务账户链接(图 7-27 )。
图 7-28
服务帐户屏幕
- **第二步:**上一步会将用户重定向到以下屏幕,该屏幕列出了该项目中创建的所有服务帐户,如图 7-28 所示。
图 7-29
创建密钥
- **第三步:**点击动作栏中的三个点,点击下拉列表中的创建关键链接,如图 7-29 所示。
图 7-30
创建私钥屏幕
- **第四步:**点击创建键将显示以下画面。选择 JSON 密钥类型并点击创建按钮(图 7-30 )。
图 7-31
私钥屏幕
- **第五步:**创建按钮将显示以下保存在您电脑屏幕上的私钥(图 7-31 )。
图 7-32
服务密钥文件
- **第六步:**文件将被保存到电脑的下载文件夹中(图 7-32 )。
图 7-33
认证保存和测试屏幕
- 从图 7-26 所示的屏幕上传该服务密钥文件。点击保存&测试按钮(图 7-33 )。
图 7-34
认证成功屏幕
- 认证成功后,将显示以下屏幕(图 7-34 )。
设置 Grafana 仪表板
以下步骤将为我们的项目设置 Grafana 仪表板。
图 7-35
Grafana 仪表板屏幕
-
**第一步:**点击【创建】后点击【仪表板】,如图 7-35 所示。
-
如果需要,可以从以下链接下载 Grafana 仪表板:
https://grafana.com/grafana/dashboards。
图 7-36
Grafana 仪表板新面板屏幕
- 第二步:点击仪表板,将显示以下画面。选择添加查询(图 7-36 )。
图 7-37
Grafana 新仪表板屏幕
- 步骤 3 :在新的仪表板屏幕上选择所需的服务、指标和其他设置以获取数据(图 7-37 )。
图 7-38
Grafana 仪表板查询选择屏幕
- 步骤 4: 对于我们的目的,我们选择的服务是计算,度量是 CPU 利用率(图 7-38 )。
图 7-39
与计算 CPU 利用率相关的数据
- **第五步:**选择前面的选项,与计算 CPU 利用率相关的实时数据将开始出现,如图 7-39 所示。该数据可以根据需要进行定制。
图 7-40
服务和度量选择
- 步骤 6: 接下来,我们选择 Logging 作为服务,Log bytes 摄取作为度量(图 7-40 )。
图 7-41
日志相关数据
- **第七步:**选择我们的选项后,与我们的日志相关的实时数据将开始出现(图 7-41 )。这可以根据需要进行定制。
摘要
在本章中,我们学习了如何设置 Grafana 和使用 Grafana 仪表板来显示 Google stack driver(Google Operations)指标。在下一章中,我们将学习使用 Sysdig 进行 GKE 监控。