使用清单管理 kOps 集群 ¶
本文档也适用于使用 kops
API 使用或不使用 YAML 或 JSON 来定制 Kubernetes 集群。
目录 ¶
背景 ¶
我们喜欢把它看作集群的
kubectl
。
由于上述原因,kops
包含一个 API,该 API 为用户提供了一个功能,可以使用 YAML 或 JSON 清单来管理他们使用 kops
创建的 Kubernetes 安装。就像使用 YAML 清单部署作业一样,可以使用清单部署和管理 kops
Kubernetes 实例。所有这些值也可以通过 kops edit
的交互式编辑器使用。
以下是使用文件管理实例的好处列表。
- 能够访问命令行无法访问的 API 值,例如设置竞价实例的最大价格。
- 在不进入交互式编辑器的情况下创建、替换、更新和删除集群。此功能在自动化集群创建时非常有用。
- 能够将代表安装的文件签入源代码管理。
- 运行命令,例如
kops delete -f mycluster.yaml
。
导出集群 ¶
目前,您必须运行 kops create cluster
,然后从状态存储导出 YAML。我们计划在未来通过命令行生成 kOps YAML。以下是如何创建集群和导出 YAML 的示例。
export NAME=k8s.example.com
export KOPS_STATE_STORE=s3://example-state-store
kops create cluster $NAME \
--zones "us-east-2a,us-east-2b,us-east-2c" \
--master-zones "us-east-2a,us-east-2b,us-east-2c" \
--networking calico \
--topology private \
--bastion \
--node-count 3 \
--node-size m4.xlarge \
--kubernetes-version v1.6.6 \
--master-size m4.large \
--vpc vpc-6335dd1a \
--dry-run \
-o yaml > $NAME.yaml
上述命令导出一个 YAML 文档,其中包含集群的定义,kind: Cluster
,以及实例组的定义,kind: InstanceGroup
。
注意:如果您运行 kops get cluster $NAME -o yaml > $NAME.yaml
,您将只获得集群规范。使用上面的命令(kops get $NAME ...
)获取集群规范和所有实例组。
以下是导出 YAML 文件的内容。
apiVersion: kops.k8s.io/v1alpha2
kind: Cluster
metadata:
name: k8s.example.com
spec:
api:
loadBalancer:
type: Public
authorization:
alwaysAllow: {}
channel: stable
cloudProvider: aws
configBase: s3://example-state-store/k8s.example.com
etcdClusters:
- etcdMembers:
- instanceGroup: master-us-east-2d
name: a
- instanceGroup: master-us-east-2b
name: b
- instanceGroup: master-us-east-2c
name: c
name: main
- etcdMembers:
- instanceGroup: master-us-east-2d
name: a
- instanceGroup: master-us-east-2b
name: b
- instanceGroup: master-us-east-2c
name: c
name: events
kubernetesApiAccess:
- 0.0.0.0/0
kubernetesVersion: 1.6.6
masterPublicName: api.k8s.example.com
networkCIDR: 172.20.0.0/16
networkID: vpc-6335dd1a
networking:
calico: {}
nonMasqueradeCIDR: 100.64.0.0/10
sshAccess:
- 0.0.0.0/0
subnets:
- cidr: 172.20.32.0/19
name: us-east-2d
type: Private
zone: us-east-2d
- cidr: 172.20.64.0/19
name: us-east-2b
type: Private
zone: us-east-2b
- cidr: 172.20.96.0/19
name: us-east-2c
type: Private
zone: us-east-2c
- cidr: 172.20.0.0/22
name: utility-us-east-2d
type: Utility
zone: us-east-2d
- cidr: 172.20.4.0/22
name: utility-us-east-2b
type: Utility
zone: us-east-2b
- cidr: 172.20.8.0/22
name: utility-us-east-2c
type: Utility
zone: us-east-2c
topology:
bastion:
bastionPublicName: bastion.k8s.example.com
dns:
type: Public
---
apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
labels:
kops.k8s.io/cluster: k8s.example.com
name: bastions
spec:
image: kope.io/k8s-1.6-debian-jessie-amd64-hvm-ebs-2017-05-02
machineType: t2.micro
maxSize: 1
minSize: 1
role: Bastion
subnets:
- utility-us-east-2d
- utility-us-east-2b
- utility-us-east-2c
---
apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
labels:
kops.k8s.io/cluster: k8s.example.com
name: master-us-east-2d
spec:
image: kope.io/k8s-1.6-debian-jessie-amd64-hvm-ebs-2017-05-02
machineType: m4.large
maxSize: 1
minSize: 1
role: Master
subnets:
- us-east-2d
---
apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
labels:
kops.k8s.io/cluster: k8s.example.com
name: master-us-east-2b
spec:
image: kope.io/k8s-1.6-debian-jessie-amd64-hvm-ebs-2017-05-02
machineType: m4.large
maxSize: 1
minSize: 1
role: Master
subnets:
- us-east-2b
---
apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
labels:
kops.k8s.io/cluster: k8s.example.com
name: master-us-east-2c
spec:
image: kope.io/k8s-1.6-debian-jessie-amd64-hvm-ebs-2017-05-02
machineType: m4.large
maxSize: 1
minSize: 1
role: Master
subnets:
- us-east-2c
---
apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
labels:
kops.k8s.io/cluster: k8s.example.com
name: nodes
spec:
image: kope.io/k8s-1.6-debian-jessie-amd64-hvm-ebs-2017-05-02
machineType: m4.xlarge
maxSize: 3
minSize: 3
role: Node
subnets:
- us-east-2d
- us-east-2b
- us-east-2c
YAML 示例 ¶
使用上述 YAML 文件,用户可以添加命令行不可用的配置。例如,您可以为新实例组添加 maxPrice
值并使用竞价实例。还可以为新实例组添加节点和云标签。
apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
labels:
kops.k8s.io/cluster: k8s.example.com
name: my-crazy-big-nodes
spec:
nodeLabels:
spot: "true"
cloudLabels:
team: example
project: ion
image: kope.io/k8s-1.6-debian-jessie-amd64-hvm-ebs-2017-05-02
machineType: m4.10xlarge
maxSize: 42
minSize: 42
maxPrice: "0.35"
role: Node
subnets:
- us-east-2c
此配置将创建一个自动扩展组,其中包含 42 个 m4.10xlarge 节点,这些节点以竞价实例运行,并具有自定义标签。
要创建集群,请执行以下操作
kops create -f $NAME.yaml
kops create secret --name $NAME sshpublickey admin -i ~/.ssh/id_rsa.pub
kops update cluster $NAME --yes
kops rolling-update cluster $NAME --yes
请参阅滚动更新 文档。
更新集群规范 YAML 文件,并更新集群运行
kops replace -f $NAME.yaml
kops update cluster $NAME --yes
kops rolling-update cluster $NAME --yes
请参阅滚动更新 文档。
更多参考资料 ¶
kops
实现了一个完整的 API,它定义了上面导出的 YAML 文件中的各种元素。存在两个顶级组件;ClusterSpec
和 InstanceGroup
。
集群规范 ¶
apiVersion: kops.k8s.io/v1alpha2
kind: Cluster
metadata:
name: k8s.example.com
spec:
api:
完整的文档可通过 godoc 访问。
ClusterSpec
允许用户为 Kubernetes API 服务器日志级别、用于重用 VPC 的 VPC(NetworkID
)和 Kubernetes 版本等值设置配置。
有关 ClusterSpec
中一些元素的更多信息,请参见以下内容
要访问 kops
安装正在运行的完整配置,请执行以下操作
kops get cluster $NAME --full -o yaml
此命令将打印整个 YAML 配置。但不要使用完整的文档,您可能会遇到奇怪且独特的意外行为。
实例组 ¶
apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
name: foo
spec:
完整的文档可通过 godocs 访问。
实例组映射到 AWS 中的自动扩展组和 GCE 中的实例组。它们是在 API 级别描述一组用作主节点或节点的计算实例。
更多文档可在 实例组 文档中找到。
结语 ¶
使用基于 YAML 或 JSON 的配置来构建和管理 kOps 集群非常强大,但请谨慎使用此策略。
- 如果您不需要定义或自定义值,请让 kOps 设置该值。设置过多的值会阻止 kOps 完成其在设置集群中的工作,您可能会遇到奇怪的错误。
- 如果您遇到奇怪的错误,请尝试让 kOps 做更多的事情。
- 请谨慎操作,注意安全,并在生产环境之外进行测试!
如果您需要运行自定义版本的 Kubernetes 控制器管理器,请设置 kubeControllerManager.image
并更新您的集群。这就是使用清单管理集群的美妙之处!