在 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 cluster
和 kops 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 的更多信息。