跳到内容

状态存储

kOps 有一个“状态存储”的概念;存储集群配置的位置。不仅在首次创建集群时会在此处存储状态,而且您还可以更改状态并将更改应用于正在运行的集群。

最终,Kubernetes 服务也将从状态存储中拉取,这样我们就不需要通过诸如用户数据之类的通道来传递所有配置。(例如,这目前是针对密钥和 SSL 密钥完成的,尽管我们必须将数据从状态存储复制到 kubelet 等组件可以读取的文件中)。

状态存储使用 kOps 的 VFS 实现,因此理论上可以存储在任何地方。截至目前,支持以下状态存储

  • Amazon AWS S3 (s3://)
  • 本地文件系统 (file://)(仅用于干运行目的,请参阅下面的说明
  • Digital Ocean (do://)
  • MemFS (memfs://)
  • Google Cloud (gs://)
  • Kubernetes (k8s://)
  • OpenStack Swift (swift://)
  • Scaleway (scw://)

状态存储只是文件;您可以将文件复制下来并放入 git(或您喜欢的版本控制系统)中。

{statestore}/config

状态存储中最重要文件之一是顶层配置文件。此文件存储集群的主要配置(实例类型、区域等)\

当您运行 kops create cluster 时,我们根据您指定的命令行选项为您创建状态存储条目。例如,当您使用 --node-size=m4.large 运行时,我们实际上会在配置中设置一行,类似于 NodeMachineType: m4.large

您在命令行上指定的配置实际上只是手动编辑配置的便捷快捷方式。您在命令行上指定的选项将合并到现有配置中。如果您想配置高级选项,或者更喜欢基于文本的配置,您可能更喜欢使用 kops edit cluster 仅编辑配置文件。

由于配置是合并的,因此这就是您在重新配置集群时只需指定更改的参数的方式 - 例如,在干运行后只需运行 kops create cluster

状态存储配置

有几种方法可以配置状态存储。按优先级排序

  • 命令行参数 --state s3://yourstatestore
  • 环境变量 export KOPS_STATE_STORE=s3://yourstatestore
  • 配置文件 $HOME/.kops.yaml
  • 配置文件 $HOME/.kops/config

本地文件系统状态存储

引入
kOps 1.17

本地文件系统状态存储 (file://) 不能用于运行集群。允许这样做是为了启用审查工作流程。

例如,在审查工作流程中,在将一组不受信任的更改应用于实际基础设施之前,检查这些更改可能很理想。如果将提交的不受信任的配置更改文件天真地由 kops replace 运行,那么 kOps 将用尚未批准的更改覆盖生产基础设施使用的状态存储。这很危险。

相反,审查工作流程可以将状态存储桶的内容下载到本地目录(使用 aws s3 sync 或类似工具),将状态存储设置为本地目录(例如 --state file:///path/to/state/store),然后运行 kops replacekops update(但仅用于干运行 - 不是 kops update --yes)。这允许审查流程对状态存储桶的本地副本进行更改,并检查这些更改,而不会触及生产状态存储桶或生产基础设施。

尝试对真实(即 kops update --yes)集群使用本地文件系统状态存储将不起作用,因为集群中的 Kubernetes 节点需要能够从同一个状态存储桶读取,而本地文件系统不会被挂载到所有 Kubernetes 节点上。理论上,集群管理员可以将状态存储放在挂载到每个节点上同一个目录的共享 NFS 卷上;但是,该用例目前尚未得到支持。

配置文件示例

$HOME/.kops/config 可能如下所示

kops_state_store: s3://yourstatestore

状态存储变体

S3 状态存储

S3 的状态存储可以通过 AWS 环境变量配置,也可以通过环境变量直接使用自定义 S3 凭据配置。s3 存储的默认值是使用 AWS 凭据。

可以通过设置环境变量 KOPS_STATE_S3_ACL 来设置存储桶的 ACL。

AWS S3 配置

通常通过 AWS 环境变量或 AWS 凭据文件配置。用于检索凭据的机制源自 AWS SDK,如下所示

config = aws.NewConfig().WithRegion(region)
config = config.WithCredentialsChainVerboseErrors(true)

其中 region 从 AWS_REGION 中获取,或者如果我们在 EC2 中运行则从 ec2 元数据中获取。默认为 us-east-1

自定义 S3 兼容存储

可以通过提供 S3 环境变量来配置自定义 S3 状态存储

  • S3_ENDPOINT:您的自定义端点
  • S3_REGION:要使用的区域
  • S3_ACCESS_KEY_ID:您的访问密钥
  • S3_SECRET_ACCESS_KEY:您的密钥

在 S3 存储桶之间移动状态

状态存储可以轻松地移动到不同的 s3 存储桶。单集群的步骤如下

  1. 使用 aws s3 sync 或类似工具,将 ${OLD_KOPS_STATE_STORE}/${CLUSTER_NAME} 中的所有文件递归地复制到 ${NEW_KOPS_STATE_STORE}/${CLUSTER_NAME} 中。
  2. 更新 KOPS_STATE_STORE 环境变量以使用新的 S3 存储桶。
  3. 运行 kops edit cluster ${CLUSTER_NAME} 或编辑集群清单 yaml 文件。更新 .spec.configBase 以引用新的 s3 存储桶。
  4. 运行 kops update cluster ${CLUSTER_NAME} --yes 将更改应用于集群。新启动的节点现在将从新的 S3 存储桶中检索它们的相关文件。旧存储桶中的文件现在可以安全地删除。

对需要移动的每个集群重复此操作。

跨账户状态存储

许多企业更喜欢运行多个 AWS 账户。在这些设置中,使用共享的跨账户 S3 存储桶作为状态可能使库存和管理更容易。假设 S3 存储桶位于账户 B 中,而 kOps 集群位于账户 A 中。为了实现这一点,您首先需要允许账户 A 访问 s3 存储桶。这可以通过在 S3 存储桶上添加以下存储桶策略来完成

{
    "Id": "123",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "123",
            "Action": [
                "s3:*"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::<state-store-bucket>",
                "arn:aws:s3:::<state-store-bucket>/*"
            ],
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<account-a>:root"
                ]
            }
        }
    ]
}

kOps 随后会将该存储桶用作远程帐户中的存储桶,包括创建适当的 IAM 策略以限制节点执行恶意操作。请注意,任何拥有完整 S3 访问权限的用户/角色都能够从状态存储中删除任何集群,但可能无法删除 S3 之外的任何实例或其他内容。

Digital Ocean (do://)

DigitalOcean 存储被配置为 S3 存储的一种变体。

OpenStack Swift (swift://)

swift 存储可以通过在环境变量中提供您的 OpenStack 凭据和配置来进行配置

  • OS_AUTH_URL: 用于身份验证的身份验证端点
  • OS_USERNAME: 要使用的用户名
  • OS_USERID: 用户 ID
  • OS_PASSWORD: 用户帐户的密码
  • OS_TENANT_ID: 租户 ID
  • OS_TENANT_NAME: 租户名称
  • OS_PROJECT_ID: 项目 ID
  • OS_PROJECT_NAME: 项目名称
  • OS_DOMAIN_ID: 域 ID
  • OS_DOMAIN_NAME: 域名称
  • OS_APPLICATION_CREDENTIAL_ID: 应用程序凭据 ID
  • OS_APPLICATION_CREDENTIAL_NAME: 应用程序凭据名称
  • OS_APPLICATION_CREDENTIAL_SECRET: 应用程序密钥

用于检索凭据的机制源自 gophercloud OpenStack SDK.

包含 OPENSTACK_CREDENTIAL_FILE 的凭据文件或从您个人凭据(位于 $HOME/.openstack/config 中)派生的配置也可以用于配置您的存储。

Google Cloud (gs://)

Google Cloud 的状态存储配置将由 Google 存储客户端 SDK 如下派生

scope := storage.DevstorageReadWriteScope

httpClient, err := google.DefaultClient(context.Background(), scope)
if err != nil {
    return nil, fmt.Errorf("error building GCS HTTP client: %v", err)
}

gcsClient, err := storage.New(httpClient)

Scaleway (scw://)

Scaleway 存储被配置为 S3 存储的一种变体。有关如何在 Scaleway 上创建存储桶的更多信息,请访问 此页面