跳至内容

在 GCE 上使用 kOps 入门

确保你已经安装了 kOps安装了 kubectl,以及安装了gcloud 工具.

你需要一个 Google Cloud 帐户,并确保 gcloud 已使用 gcloud init 登录到你的帐户。

你应该确认基本命令(如 gcloud compute zones list)是否正常工作。

你还需要配置默认凭据,使用 gcloud auth application-default login

创建状态存储

kOps 需要一个状态存储,用于保存你的集群的配置。Google Cloud 最简单的配置是将其存储在同一帐户的 Google Cloud Storage 存储桶中,所以我们先从这里开始。

因此,只需创建一个空存储桶 - 你可以使用任何(可用的)名称 - 例如 gsutil mb gs://kubernetes-clusters/

此外,与其每次都键入 --state 参数,不如导出 KOPS_STATE_STORE 环境变量会更容易

export KOPS_STATE_STORE=gs://kubernetes-clusters/

你也可以将它放在你的 ~/.bashrc 或类似文件中。

创建我们的第一个集群

kops create cluster 创建你将在 kOps 中使用的集群对象和实例组对象

PROJECT=`gcloud config get-value project`
kops create cluster simple.k8s.local --zones us-central1-a --state ${KOPS_STATE_STORE}/ --project=${PROJECT}

你现在可以列出 kOps 状态存储(我们创建的 GCS 存储桶)中的集群对象。

> kops get cluster --state ${KOPS_STATE_STORE}

NAME                CLOUD        ZONES
simple.k8s.local    gce          us-central1-a

这表明你已配置了一个名为 simple.k8s.local 的集群对象。集群保存 kubernetes 集群的集群范围配置 - 例如 kubernetes 版本和使用的授权策略。

kops 工具应该感觉很像 kubectl - kOps 使用与 kubernetes 相同的 API 机制,因此它应该表现得相似,不过现在你正在管理 kubernetes 集群,而不是管理 kubernetes 集群上的对象。

你可以通过以下操作查看你的集群对象的详细信息

kops get cluster --state ${KOPS_STATE_STORE}/ simple.k8s.local -oyaml

apiVersion: kops.k8s.io/v1alpha2
kind: Cluster
metadata:
  name: simple.k8s.local
spec:
  api:
    loadBalancer:
      type: Public
  authorization:
    alwaysAllow: {}
  channel: stable
  cloudProvider: gce
  configBase: gs://kubernetes-clusters/simple.k8s.local
  etcdClusters:
  - etcdMembers:
    - instanceGroup: master-us-central1-a
      name: a
    name: main
  - etcdMembers:
    - instanceGroup: master-us-central1-a
      name: a
    name: events
  iam:
    legacy: false
  kubernetesApiAccess:
  - 0.0.0.0/0
  kubernetesVersion: 1.7.2
  masterPublicName: api.simple.k8s.local
  networking:
    kubenet: {}
  nonMasqueradeCIDR: 100.64.0.0/10
  project: my-gce-project
  sshAccess:
  - 0.0.0.0/0
  subnets:
  - name: us-central1
    region: us-central1
    type: Public
  topology:
    dns:
      type: Public

类似地,你也可以使用以下命令查看你的实例组

> kops get instancegroup --state ${KOPS_STATE_STORE}/ --name simple.k8s.local

NAME                    ROLE    MACHINETYPE     MIN    MAX    SUBNETS
master-us-central1-a    Master  n1-standard-1   1      1      us-central1
nodes                   Node    n1-standard-2   2      2      us-central1

实例组是另一个主要的 kOps 对象 - 实例组管理一组云实例,然后这些云实例在 kubernetes 中注册为节点。你有多个实例组用于不同类型的实例/节点 - 在我们的简单示例中,我们有一个用于我们的主节点(它只有一个成员),还有一个用于我们的节点(我们配置了两个节点)。

当我们使用 kOps 重新配置集群时,我们将看到更多关于集群对象和实例组的内容。但是,让我们继续创建第一个集群。

创建集群

kops create cluster 在我们的状态存储中创建了集群对象和实例组对象,但实际上并没有在 GCE 中创建任何实例或其他云对象。为此,我们将使用 kops update cluster

kops update cluster 不使用 --yes 将向你显示将要进行的所有更改的预览;在实际进行更改之前,查看 kOps 将要做什么非常有用。

运行 kops update cluster simple.k8s.local 并查看更改。

我们现在终于可以创建该对象了:kops update cluster simple.k8s.local --yes

(如果你还没有创建 SSH 密钥,你将不得不 ssh-keygen -t rsa

你的集群在后台创建 - kOps 实际上创建了运行实例的 GCE 托管实例组;这确保即使实例被终止,它们也会由 GCE 自动重新启动,你的集群将自我修复。

几分钟后,你应该能够执行 kubectl get nodes,你的第一个集群应该已准备就绪!

享受

此时,你拥有一个 kubernetes 集群 - 用于执行此操作的核心命令与 kops create clusterkops update cluster 一样简单。kOps 中还有更多功能,kubernetes 本身也有更多功能,因此我们在这里提供了一些起点。但是,完成后,不要忘记删除你的集群.

删除集群

使用完集群后,你应该删除它以释放云资源。kops delete cluster 是该命令。在不使用 --yes 运行时,它将显示一个将要删除的对象的预览

> kops delete cluster simple.k8s.local
TYPE                    NAME                                                    ID
Address                 api-simple-k8s-local                                    api-simple-k8s-local
Disk                    a-etcd-events-simple-k8s-local                          a-etcd-events-simple-k8s-local
Disk                    a-etcd-main-simple-k8s-local                            a-etcd-main-simple-k8s-local
ForwardingRule          api-simple-k8s-local                                    api-simple-k8s-local
Instance                master-us-central1-a-9847                               us-central1-a/master-us-central1-a-9847
Instance                nodes-0s0w                                              us-central1-a/nodes-0s0w
Instance                nodes-dvlq                                              us-central1-a/nodes-dvlq
InstanceGroupManager    a-master-us-central1-a-simple-k8s-local                 us-central1-a/a-master-us-central1-a-simple-k8s-local
InstanceGroupManager    a-nodes-simple-k8s-local                                us-central1-a/a-nodes-simple-k8s-local
InstanceTemplate        master-us-central1-a-simple-k8s-local-1507008700        master-us-central1-a-simple-k8s-local-1507008700
InstanceTemplate        nodes-simple-k8s-local-1507008700                       nodes-simple-k8s-local-1507008700
Route                   simple-k8s-local-715bb0c7-a7fc-11e7-93d7-42010a800002   simple-k8s-local-715bb0c7-a7fc-11e7-93d7-42010a800002
Route                   simple-k8s-local-9a2a08e8-a7fc-11e7-93d7-42010a800002   simple-k8s-local-9a2a08e8-a7fc-11e7-93d7-42010a800002
Route                   simple-k8s-local-9c17a4e6-a7fc-11e7-93d7-42010a800002   simple-k8s-local-9c17a4e6-a7fc-11e7-93d7-42010a800002
TargetPool              api-simple-k8s-local                                    api-simple-k8s-local

Must specify --yes to delete cluster

在仔细检查你要删除的是否完全是你想要删除的对象后,运行 kops delete cluster simple.k8s.local --yes

最佳实践

以下是使用 kOps 在 GCP 上创建和管理 Kubernetes 集群时的一些最佳实践。

使用抢占式实例来降低成本。

抢占式实例与普通计算实例具有相同的规格,但可能随时被更高优先级的实例抢占。使用抢占式实例可以将你的计算成本降低高达 ~90%,因此,如果你的工作负载是容错的,这种策略将非常有利。请注意,GCE 会优雅地处理抢占,为你提供 30 秒的关闭时间,以便你能够安全地将状态/进度检查点以备日后恢复。

要创建一个抢占式实例的实例组,请按照上面的说明创建你的集群,然后通过执行以下步骤将你的实例组更新为使用抢占式实例

  • 运行 kops edit ig <instance-group-name> 以编辑实例组配置。
  • 在实例组 spec 中添加键值对 gcpProvisioningModel: SPOT
spec:
  gcpProvisioningModel: SPOT
  • 运行 kops update cluster --yes,然后运行 kops rolling-update cluster --yes 以更新实例组。
  • 你可以在Google Cloud Platform 开发者控制台上验证此操作是否成功,方法是导航到 Compute Engine,单击你的特定节点实例(默认情况下,它的名称将类似于 nodes-<zone>)以调出实例详细信息,然后在管理 > 可用性策略下,应该有一个名为 VM Provisioning Model: Spot 的设置。

使用区域或多区域集群以获得高可用性

默认情况下,kOps 将在一个区域中创建一个 k8s 集群实例。如果影响该特定数据中心的事件(甚至影响你的 VM 实例运行的特定服务器机架)发生,这可能会导致集群的可用性问题。建议的解决方案是使用**多区域**集群。

具体来说,建议控制平面(主节点)和工作节点都**在区域内的 3 个或更多区域中运行**,以确保在数据中心出现故障时控制平面和工作节点的可用性。

创建具有高可用性的多区域集群的示例,其中控制平面和节点都在区域内的 3 个区域中运行

kops create cluster \
--master-zones=us-central1-a,us-central1-b,us-central1-c \
--zones=us-central1-a,us-central1-b,us-central1-c \
--node-count=2
${CLUSTER_NAME}

后续步骤

现在你已经拥有了一个可用的 kOps 集群,请通读针对生产环境设置的指南,了解有关如何为生产工作负载配置 kOps 的更多信息。