跳到内容

使用清单管理 kOps 集群

本文档也适用于使用 kops API 使用或不使用 YAML 或 JSON 来定制 Kubernetes 集群。

目录

背景

我们喜欢把它看作集群的 kubectl

由于上述原因,kops 包含一个 API,该 API 为用户提供了一个功能,可以使用 YAML 或 JSON 清单来管理他们使用 kops 创建的 Kubernetes 安装。就像使用 YAML 清单部署作业一样,可以使用清单部署和管理 kops Kubernetes 实例。所有这些值也可以通过 kops edit 的交互式编辑器使用。

您可以在 此处此处 查看当前 kOps 支持的所有选项。

以下是使用文件管理实例的好处列表。

  • 能够访问命令行无法访问的 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 文件中的各种元素。存在两个顶级组件;ClusterSpecInstanceGroup

集群规范

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 并更新您的集群。这就是使用清单管理集群的美妙之处!