# 在 Google Compute Engine 上运行 k8s

下面的例子用了 4 个 node 节点的虚拟机和 1 个 master 节点的虚拟机来(即集群中共有 5 个虚拟机)创建了一个 k8s 集群。

# 说明

如果您想要简化入门体验和使用 GUI 来管理群集,可以考虑使用 Google Container Engine (GKE)进行安装和管理和托管群集。如果要使用自定义二进制文件或纯原生的 k8s,请继续执行以下说明。

# 准备条件

  1. 需要 Google Cloud Platform 帐户,有关详细信息,请访问 Google Developers Console。
  2. 安装 gcloud,gcloud 可以作为 Google Cloud SDK 的一部分进行安装。
  3. 在 Google Cloud developers console 中启用 Compute Engine Instance Group Manager API。
  4. 确保在 gcloud 正确设置,可以使用 gcloud config list project 方法进行检查,通过gcloud config set project <project-id>方法来更改。
  5. 通过 gcloud auth login,确保拥有 Gcloud。
  6. (可选)为了对 GCE 进行 API 调用,还必须运行 gcloud auth application-default login。
  7. 确保你可以用命令行启动 GCE VM。
  8. 确保你可以使用 ssh 方式进入虚拟机。

# 启动群集

使用以下任一命令来安装客户端并启动集群:

curl -sS https://get.k8s.io | bash

wget -q -O - https://get.k8s.io | bash

安装完成后,将拥有一个 Master 节点主 VM 和 4 个 Node 节点的工作 VM,作为 k8s 集群来运行。

默认情况下,一些容器已经运行在集群上。如容器 kibana 和 elasticsearch 提供日志记录,而 heapster 提供监控服务。

上面提到的命令运行脚本创建的“k8s”集群。它定义了一个特定的集群配置,所以只能运行一次。

或者,可以从此页面下载并安装最新的 k8s 版本,然后运行<kubernetes>/cluster/kube-up.sh 脚本启动群集:

cd kubernetes
cluster/kube-up.sh

如果要在项目中运行多个集群,要使用不同的 Name,或者想要不同数量的工作节点,请在启动集群之前参见 /cluster/gce/config-default.sh 文件进行更详细配置。

如果遇到问题,请参考有关 troubleshooting 的部分,发布到 kubernetes-users group,或者在 Slack 上询问问题。

接下来的几个步骤将告诉你:

  1. 如何在工作站上安装命令管理工具来管理集群
  2. 如何使用集群的一些示例
  3. 如何删除集群
  4. 如何启动具有非默认选项的群集(更大的集群)

# 工作站上安装 k8s 命令管理工具

集群启动脚本将为你提供一个运行中的集群和 k8s 目录。

使用 kubectl 工具来控制 k8s 集群管理器。它可以检查集群资源,创建,删除和更新组件等等。你将会用它来查看新集群并生成示例应用程序。

使用 gcloud 在你的工作站上安装 kubectl 命令管理工具:

 gcloud components install kubectl

注意:gcloud 所捆绑的 kubectl 版本可能会比通过 get.k8s.io 安装脚本下载的版本旧。请参考 kubectl 安装 文档,了解如果在工作站上安装最新的 kubectl。

# 开始使用集群

# 检查群集

在 kubectl 中使用以下命令来查看你的群集。

$ kubectl get --all-namespaces services

显示的 services

NAMESPACE     NAME                  CLUSTER_IP       EXTERNAL_IP       PORT(S)        AGE
default       kubernetes            10.0.0.1         <none>            443/TCP        1d
kube-system   kube-dns              10.0.0.2         <none>            53/TCP,53/UDP  1d
kube-system   kube-ui               10.0.0.3         <none>            80/TCP         1d
...

通过以下命令查看在集群启动时创建的一组 pod。

$ kubectl get --all-namespaces pods

查看 pod 列表:

NAMESPACE     NAME                                           READY     STATUS    RESTARTS   AGE
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-dns-v5-7ztia                              3/3       Running   0          15m
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)。

# 运行例子

然后,通过一个简单的 nginx 示例来尝试你的新集群。

有关更完整的应用示例,请查看 examples directory。该 guestbook example 是一个很好的“入门”例子。

# 卸载集群

使用 kube-down.sh 脚本来 remove/delete/teardown 集群。

cd kubernetes
cluster/kube-down.sh

同样的,kube-up.sh 在同一个目录下将会备份。您不需要重新运行 curl 或 wget 命令:设置 k8s 集群所需的一切现在都在您的工作站上。

# 定制

上述脚本依赖于 Google Storage 来推出 k8s 版本。然后启动(默认情况下)单个主虚拟机以及 4 个工作虚拟机,你可以通过编辑 kubernetes/cluster/gce/config-default.sh 调整其中一些参数,可以在此处查看成功创建集群的脚本。

# 故障排除

# 项目设置

需要启用 Google Cloud Storage API,并启用 Google Cloud Storage JSON API。新项目默认是激活的。如果未启动,可以在 Google Cloud Console 中完成。有关详细信息,请参阅 Google Cloud Storage JSON API Overview。

还要确保已启用 Compute Engine Instance Group Manager API,并从命令行启动 GCE VM,如 GCE Quickstart 说明那样。

# 群集初始化挂起

如果 k8s 启动脚本挂起等待 API 可用,则可以通过 SSH 对 Master 和 Node 上的 VM 进行故障诊断,查看诸如/var/log/startupscript.log 这样的日志。

一旦你解决了这些问题,当再次运行 kube-up.sh 前,应该在集群创建后运行 kube-down.sh 来做一下清理。

# SSH

如果无法通过 SSH 连接到实例,请确保 GCE 防火墙没有屏蔽 VM 的 22 端口。默认情况是可以正常连接实例,但是如果编辑了防火墙规则或创建了一个新的非默认网络,则需要暴露它:

gcloud compute firewall-rules create default-ssh --network=<network-name> --description "SSH allowed from anywhere" --allow tcp:22

此外,你的 GCE SSH key 必须没有密码,或者需要使用 ssh-agent。

# Networking

这些实例必须能用私有 IP 进行通信。该脚本使用“默认”网络,该网络应该有一个名为“default-allow-internal”的防火墙规则,允许私有 IP 上的任何端口上的流量。如果默认网络中缺少此规则,或者如果更改 cluster/config-default.sh 正在使用的网络,则需要创建下字段值的新规则:

  • Source Ranges: 10.0.0.0/8
  • Allowed Protocols and Port: tcp:1-65535;udp:1-65535;icmp

# Support Level

aaS Provider Config. Mgmt OS Networking Docs Conforms Support Level
GCE Saltstack Debian GCE docs Project
Last Updated: 4/15/2023, 8:33:17 PM