文档结构  
翻译进度:已翻译     翻译赏金: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 项目

第 6 段(可获 1 积分)

所有 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 积分)

文章评论