状态存储 ¶
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 replace
和 kops 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 存储桶。单集群的步骤如下
- 使用
aws s3 sync
或类似工具,将${OLD_KOPS_STATE_STORE}/${CLUSTER_NAME}
中的所有文件递归地复制到${NEW_KOPS_STATE_STORE}/${CLUSTER_NAME}
中。 - 更新
KOPS_STATE_STORE
环境变量以使用新的 S3 存储桶。 - 运行
kops edit cluster ${CLUSTER_NAME}
或编辑集群清单 yaml 文件。更新.spec.configBase
以引用新的 s3 存储桶。 - 运行
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
: 用户 IDOS_PASSWORD
: 用户帐户的密码OS_TENANT_ID
: 租户 IDOS_TENANT_NAME
: 租户名称OS_PROJECT_ID
: 项目 IDOS_PROJECT_NAME
: 项目名称OS_DOMAIN_ID
: 域 IDOS_DOMAIN_NAME
: 域名称OS_APPLICATION_CREDENTIAL_ID
: 应用程序凭据 IDOS_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 上创建存储桶的更多信息,请访问 此页面。