文档结构  
翻译进度:已翻译     翻译赏金:10 元 (?)    ¥ 我要打赏

容器技术已经存在多年,而 Docker 才正直把它推向主流。许多公司和开发者现在都使用容器来发布他们的应用。Docker 提供了简单易用的容器界面。

然而,对于任何不简单的应用程序,你不需要部署“一个容器”,而是部署多个主机上的一组容器。本文中,我们会看到 Kubernetes,这是一个开源系统,用于自动化部署、扩展、管理容器中的应用。

先决条件:本文假设读者已经熟悉 Docker。如果你需要复习,可以看看理解 Docker、容器和更安全的软件发布

 

第 1 段(可获 1.26 积分)

Kubernetes 解决什么问题?

本作者的更多内容

有了 Docker,你可以使用像 docker run 或者 docker stop 这样的简单命令来分别开始/停止某个容器。这些简单的命令可以让你操作单个窗口,docker deploy 命令用来将新的映像推送到一组主机中。

近来出现了不少工具,旨在解决“容器流程”的问题。最流行的那些包括 MesosDocker Swarm (现在是 Docker 引擎的一部分)、Nomad,以及 Kubernetes。他们都有各自的利弊,不过 Kubernetes 可能是最好的一个。

 

第 2 段(可获 1.3 积分)

Kubernetes(也称作 'k8s')提供了强大的抽象,把诸如发布、伸缩之类的应用程序操作从最基础设施的操作中解耦出来。因此,使用 Kubernetes,你不需要专门的主机或虚拟机来运行代码,Kubernetes 会把基础设施看作一个计算的海洋,用以放置容器。

Kubernetes 概述

Kubernetes 拥有客户端/服务器架构。Kubernetes 服务器运行在集群(一组主机)上,你可以在上面部署应用。一般你会使用客户端来与集群进行交互,比如 kubectl 命令行工具就是其中一个客户端。

第 3 段(可获 1.23 积分)

Pods

Pod 是一组容器,是 Kubernetes 处理的基本单元。如果有两个或更多容器总是共同协作,必须放在同一个计算机止,那就把它们做成 pod。pod 是非常有用的抽象,甚至有人提议把它们作为一级 docker 对象。

节点

节点是物理机器或虚拟机,运行着 Kubernetes,可用于规划 pod。

标签

标签是用于标识资源的键/值对。比如,你可以将所有提供生产通信的 pod 标记为“role=production”。

 

第 4 段(可获 1.29 积分)

选择器

选择功能让你可以通过标签来搜索/过滤资源。从前面的示例中,可以通过 “role=production” 选择器获得所有生产 pod。

服务

服务定义了一套 pod (一般通过“选择器”选择) 以及访问它们的手段,比如单个固定 IP 地址及其对应的 DNS 名称。

使用 Kubernetes 在 GKE 上部署 Node.js 应用

现在我们都已经了解了 Kubernetes 的概念,让我们来看看它是如何在Google Container Engine(即GKE)上部署 Node.js 应用的。你需要有 Goolge 云平台账号(Google提供了价值$300的免费试用)。

 

第 5 段(可获 1.43 积分)

1. 安装 Google Cloud SDK 和 Kubernetes 客户端

kubectl 是 Kubernetes 集群的命令行客户端。它可作为 Google Cloud SDK 的一部分进行安装。在完成 Google Could SDK 安装之后,运行下面的命令来安装 kubectl:

$ gcloud components install kubectl

如果你使用 Mac,通过 brew install kubectl 来安装。云 kubectl version 可以验证是否安装成功。

你还要使用 Google Could 账户的凭据来设置 Google Could SDK。运行 gcloud init 然后跟随提示就好。

2. 创建 GCP 项目

所有 Google 云平台都需要在项目中创建,所以从 Web 界面创建一个

使用 CLI 设置默认的项目 ID,运行如下命令:

gcloud config set project {PROJECT_ID}

3. 为你的应用创建 Docker 映像

这里有我们在使用的应用:express-hello-world。你可以在 Dockerfile 中看到我们使用已经存在于 dockerhub 的 Node.js 映像。现在我们运行下面的命令来创建自己应用的映像:

$ docker build -t hello-world-image . 

在本地可以这样运行应用:

docker run --name hello-world -p 3000:3000 hello-world-image
第 7 段(可获 0.99 积分)

访问 localhost:3000 就能得到响应。

4. 创建集群

接下来我们会创建包含三个实例(虚拟机)的集群,并在上面部署我们的应用。你可以进入容器引擎页面,使用直观的 Web 页面来操作这项操作,也可以运行这个命令:

$ gcloud container clusters create {NAME} --zone {ZONE} 

运行下面的命令在 us-east1-b 中创建名为 hello-world-cluster 的集群

$ gcloud container clusters create hello-world-cluster --zone us-east1-b --machine-type f1-micro 

这将启动包含三个节点的集群。我们使用 f1-micro 作为机器类型,因为它是基本的类型,成本最低。

第 8 段(可获 1.05 积分)

命令下面的命令将 kubectl 客户端连接到集群:

gcloud container clusters get-credentials hello-world-cluster --zone us-east1-b

现在我们有一个 Docker 映像和一个姓名。我们想将映像部署到集群上并启动容器,以此提供服务并响应请求。

5. 上传 Docker 映像到 Google 容器映像注册表

Google 容器映像注册表是一个云注册表,你可以将你的映像推送推送上去,这些映像会自动在你的容器引擎集群中生效。为了能推送映像,你需要使用合适的名称对其进行构建。

第 9 段(可获 1.05 积分)

要构建这个应用的容器映像并标记上传,需要运行下面的命令:

$ docker build -t gcr.io/{PROJECT_ID}/hello-world-image:v1 .

v1 是映像的标签

下一步是上传刚刚构建的映像:

$ gcloud docker -- push gcr.io/{PROJECT_ID}/hello-world-image:v1

6. 首次部署

现在我们在云端有一个集群和一个映像了。我们来使用 Kubernetes 把映像部署到集群中。我们创建一个 deployment  规范文件来做这个事情。部署是 Kubernetes 的一种资源,所有 Kubernetes 资源都可以通过规范文件来进行声明式的定义。这个规范文件规定资源所需的状态,然后 Kubernetes 会计算如何从当前状态转到理想状态。

 

第 10 段(可获 1.35 积分)

让我们为第一次部署来创建一个:

deployment.yml

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: hello-world-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels: # labels to select/identify the deployment
        app: hello-world  
    spec:     # pod spec                  
      containers: 
      - name: hello-world 
        image: hello-world-image:v1 # image we pushed
        ports:
        - containerPort: 3000

这个规范文件显示:按照给定的pod规范启动两个pods。每个pod 应该包含有一个使用我们推送的hello-world-image:v1镜像的容器。

第 11 段(可获 0.46 积分)

现在运行:

$ kubectl create -f deployment.yml --save-config

你可以通过运行 kubectl get deployments 看到部署状态。要查看部署创建的 pod,运行这个命令:kubectl get pods。你可以看到运行中的 Pod:

$ kubectl get pods
NAME                                     READY     STATUS    RESTARTS   AGE
hello-world-deployment-629197995-ndmrf   1/1       Running   0          27s
hello-world-deployment-629197995-tlx41   1/1       Running   0          27s

注意,我们有两个 Pod 正在运行,因为我们在 deployment.yml 文件中设置 replicas 为 2。

第 12 段(可获 0.58 积分)

要想确定服务已经启动,通过运行下面的命令进行检查:

$ kubectl logs {pod-name}  # kubectl logs hello-world-deployment-629197995-ndmrf

7. 向互联网公开服务

为了向互联网公开服务,你必须把虚拟机置于负载均衡器之后。为此我们创建一个 Kubernetes 服务。

$ kubectl expose deployment hello-world-deployment --type="LoadBalancer"

它在幕后创建了一个服务对象 (与部署类似,服务也是 Kubernetes 的资源),还创建了一个 Google 云的负载均衡器。

运行 kubectl get services 来查看服务公共 IP。控制台输出应该像这样:

 

第 13 段(可获 1 积分)
NAME                     CLUSTER-IP       EXTERNAL-IP      PORT(S)          AGE
hello-world-deployment   10.103.254.137   35.185.127.224   3000:30877/TCP   9m
kubernetes               10.103.240.1     <none>           443/TCP          17d

浏览http://<EXTERNAL-IP>:<PORT>来访问服务。您也可以购买自定义域名并使其指向这个IP。

8. 扩容你的服务

假设您的服务开始获得更多的流量,需要增加更多应用程序实例。要在这种情况下扩大规模,只用编辑你的deployment.yml文件并改变副本的数量,例如, 3 然后运行kubectl apply -f deployment.yml 不一会儿你会有三个pods运行。还可以设置自动伸缩,但这超出了本教程的范围。

第 14 段(可获 1.19 积分)

9. 清理

不要忘记在完成后清理资源, 否则,他们会继续吃掉你的谷歌信用!

$ kubectl delete service/hello-world-deployment
$ kubectl delete deployment/hello-world-deployment
$ gcloud container clusters delete hello-world-cluster --zone us-east1-b 

总结

我们在本教程涵盖了很多内容但对Kubernetes而言,这仅仅是入门。你可以做更多事情,例如用一个命令将服务扩展到更多的pods,或是像AWS凭证一样为物件在pods上挂载秘密等等。然而,这足以让你开始。 去 kubernetes.io上学习更多的吧!

这篇文章被同行Graham Cox评审。感谢所有的SitePoint审稿人让SitePoint的内容做到最好!

第 15 段(可获 1.5 积分)

文章评论