--- title: 在谷歌计算引擎上运行 Kubernetes content_type: task --- 下面的示例创建了一个 Kubernetes 集群,其中包含 3 个工作节点虚拟机和 1 个主虚拟机(即集群中有 4 个虚拟机)。 这个集群是在你的工作站(或你认为方便的任何地方)设置和控制的。 ## {{% heading "prerequisites" %}} 如果你想要一个简化的入门体验和 GUI 来管理集群, 请考虑尝试[谷歌 Kubernetes 引擎](https://cloud.google.com/kubernetes-engine/)来安装和管理托管集群。 有一个简单的方式可以使用 Kubernetes 开发环境进行实验, 就是点击下面的按钮,打开 Google Cloud Shell,其中包含了 Kubernetes 源仓库自动克隆的副本。 [![在 Cloud Shell 中打卡](https://gstatic.com/cloudssh/images/open-btn.png)](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/kubernetes/kubernetes&page=editor&open_in_editor=README.md) 如果你想要使用定制的二进制或者纯开源的 Kubernetes,请继续阅读下面的指导。 ### 前提条件 {#prerequisites} 1. 你需要一个启用了计费的谷歌云平台账号。 更多细节请访问[谷歌开发者控制台](https://console.cloud.google.com)。 1. 根据需要安装 `gcloud`。 `gcloud` 可作为[谷歌云 SDK](https://cloud.google.com/sdk/) 的一部分安装。 1. 在[谷歌云开发者控制台](https://console.developers.google.com/apis/library) 启用[计算引擎实例组管理器 API](https://console.developers.google.com/apis/api/replicapool.googleapis.com/overview) 1. 确保将 gcloud 设置成使用你想要的谷歌云平台项目。 你可以使用 `gcloud config list project` 检查当前项目, 并通过 `gcloud config set project ` 修改它。 1. 通过运行 `gcloud auth login`,确保你拥有 GCloud 的凭据。 1. (可选)如果需要调用 GCE 的 API,你也必须运行 `gcloud auth application-default login`。 1. 确保你能通过命令行启动 GCE 虚拟机。 至少确保你可以完成 GCE 快速入门的[创建实例](https://cloud.google.com/compute/docs/instances/#startinstancegcloud)部分。 1. 确保你在没有交互式提示的情况下 SSH 到虚拟机。 查看 GCE 快速入门的[登录实例](https://cloud.google.com/compute/docs/instances/#sshing)部分。 ## 启动集群 你可以安装一个客户端,并使用这些命令的其中之一来启动集群(我们列出的两种情况,因为你的机器可能只安装了二者之一): ```shell curl -sS https://get.k8s.io | bash ``` 或 ```shell wget -q -O - https://get.k8s.io | bash ``` 这条命令结完成后,你将会有 1 个主虚拟机和 4 个工作虚拟机,它们一起作为 Kubernetes 集群运行。 默认情况下,有一些容器已经在你的集群上运行。 像 `fluentd` 这样的容器提供[日志记录](/zh/docs/concepts/cluster-administration/logging/), 而 `heapster` 提供[监控](https://releases.k8s.io/master/cluster/addons/cluster-monitoring/README.md)服务。 由上述命令运行的脚本创建了一个名称/前缀为“kubernetes”的集群。 它定义了一个特定的集群配置,所以此脚本只能运行一次。 或者,你可以通过[这个页面](https://github.com/kubernetes/kubernetes/releases)下载和安装最新版本的 Kubernetes, 然后运行 `/cluster/kube-up.sh` 脚本启动集群: ```shell cd kubernetes cluster/kube-up.sh ``` 如果你希望在项目中运行多个集群,希望使用一个不同名称,或者不同数量工作节点的集群, 请查看 `/cluster/gce/config-default.sh` 文件,以便在启动集群之前进行更细粒度的配置。 如果你遇到了问题,请参阅[错误排查](#troubleshooting)一节, 发布到 [Kubernetes 论坛](https://discuss.kubernetes.io),或者来 `#gke` Slack 频道中提问。 接下来的几个步骤会告诉你: 1. 如何在你的工作站设置命令行客户端来管理集群 2. 如何使用集群的示例 3. 如何删除集群 4. 如果以非默认选项启动集群(如规模较大的集群) ## 在你的工作站安装 Kubernetes 命令行工具 集群启动脚本将在你的工作站上留下一个正在运行的集群和一个 `kubernetes` 目录。 [kubectl](/zh/docs/reference/kubectl/kubectl/) 工具控制 Kubernetes 集群管理器。 它允许你检查集群资源,创建、删除和更新组件等等。 你将使用它来查看新集群并启动示例应用程序。 你可以使用 `gcloud` 在工作站上安装 `kubectl` 命令行工具: ```shell gcloud components install kubectl ``` {{< note >}} 与 `gcloud` 绑定的 kubectl 版本可能比 get.k8s.io 安装脚本所下载的更老。。 查看[安装 kubectl](/zh/docs/tasks/tools/install-kubectl/) 文档,了解如何在工作站上设置最新的 `kubectl`。 {{< /note >}} ## 开始使用你的集群 ### 检查你的集群 一旦 `kubectl` 存在于你的路径中,你就可以使用它来查看集群,例如,运行: ``` kubectl get --all-namespaces services ``` 应该显示 [services](/zh/docs/concepts/services-networking/service/) 集合,看起来像这样: ``` NAMESPACE NAME TYPE CLUSTER_IP EXTERNAL_IP PORT(S) AGE default kubernetes ClusterIP 10.0.0.1 443/TCP 1d kube-system kube-dns ClusterIP 10.0.0.2 53/TCP,53/UDP 1d kube-system kube-ui ClusterIP 10.0.0.3 80/TCP 1d ... ``` 类似的,你可以查看在集群启动时创建的 [pods](/zh/docs/concepts/workloads/pods/) 的集合。 你可以通过命令: ``` kubectl get --all-namespaces pods ``` 你将会看到 Pod 的列表,看起来像这样(名称和细节会有所不同): ``` NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-5f4fbb68df-mc8z8 1/1 Running 0 15m kube-system fluentd-cloud-logging-kubernetes-minion-63uo 1/1 Running 0 14m kube-system fluentd-cloud-logging-kubernetes-minion-c1n9 1/1 Running 0 14m kube-system fluentd-cloud-logging-kubernetes-minion-c4og 1/1 Running 0 14m kube-system fluentd-cloud-logging-kubernetes-minion-ngua 1/1 Running 0 14m kube-system kube-ui-v1-curt1 1/1 Running 0 15m kube-system monitoring-heapster-v5-ex4u3 1/1 Running 1 15m kube-system monitoring-influx-grafana-v1-piled 2/2 Running 0 15m ``` 一些 Pod 启动可能需要几秒钟(在此期间它们会显示 `Pending`), 但是在短时间后请检查它们是否都显示为 `Running`。 ### 运行示例 那么,看[一个简单的 nginx 示例](/zh/docs/tasks/run-application/run-stateless-application-deployment/)来试试你的新集群。 要获得完整的应用,请查看 [examples 目录](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/)。 [guestbook 示例](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/guestbook/) 是一个很好的“入门”演练。 ## 拆除集群 要移除/删除/拆除集群,请使用 `kube-down.sh` 脚本。 ```shell cd kubernetes cluster/kube-down.sh ``` 同样地,同一目录下的 `kube-up.sh` 脚本会让集群重新运行起来。 你不需要再次运行 `curl` 或 `wget` 命令:现在 Kubernetes 集群所需的一切都在你的工作站上。 ## 定制 上面的脚本依赖于谷歌存储来保存 Kubernetes 发行版本。 该脚本然后(默认情况下)会启动 1 个主虚拟机和 3 个工作虚拟机。 你可以通过编辑 `kubernetes/cluster/gce/config-default.sh` 来调整这些参数。 你可以在[这里](https://gist.github.com/satnam6502/fc689d1b46db9772adea)查看成功创建集群的记录。 ## 故障排除 {#troubleshooting} ### 项目设置 你需要启用 Google Cloud Storage API 和 Google Cloud Storage JSON API。 默认情况下,对新项目都是激活的。 如果未激活,可以在谷歌云控制台设置。 更多细节,请查看[谷歌云存储 JSON API 概览](https://cloud.google.com/storage/docs/json_api/)。 也要确保——正如在[前提条件](#prerequisites)中列出的那样—— 你已经启用了 `Compute Engine Instance Group Manager API`, 并且可以像 [GCE 快速入门](https://cloud.google.com/compute/docs/quickstart)指导那样从命令行启动 GCE 虚拟机。 ### 集群初始化过程停滞 如果 Kubernetes 启动脚本停滞,等待 API 可达, 你可以 SSH 登录到主虚拟机和工作虚拟机, 通过查看 `/var/log/startupscript.log` 日志来排除故障。 **一旦解决了这个问题,你应该在部分集群创建之后运行 `kube-down.sh` 来进行清理**,然后再运行 `kube-up.sh` 重试。 ### SSH 如果在 SSH 登录实例时遇到困难,确保 GCE 防火墙没有阻塞你虚拟机的 22 端口。 默认情况下应该可用,但是如果你编辑了防火墙规则或者创建了一个新的非默认网络, 你需要公开它:`gcloud compute firewall-rules create default-ssh --network= --description "SSH allowed from anywhere" --allow tcp:22` 此外,你的 GCE SSH 密钥不能有密码,否则你需要使用 `ssh-agent`。 ### 网络 虚拟机实例必须能够使用它们的私有 IP 彼此连接。 该脚本使用 "default" 网络,此网络应该有一个名为 "default-allow-internal" 的防火墙规则, 此规则允许通过私有 IP 上的任何端口进行通信。 如果默认网络中缺少此规则,或者更改了 `cluster/config-default.sh` 中使用的网络, 用以下字段值创建一个新规则: * 源范围:`10.0.0.0/8` * 允许的协议和端口:`tcp:1-65535;udp:1-65535;icmp` ## 支持等级 IaaS 提供商 | 配置管理 | 操作系统 | 网络 | 文档 | 符合率 | 支持等级 ---------- | --------- | ------ | ---- | --------------------------------------------------------- | ----- | ------- GCE | Saltstack | Debian | GCE | [docs](/zh/docs/setup/production-environment/turnkey/gce/) | | Project