2018.07.11 14:53

前端架构的三部曲Docker集群

前端架构的三部曲Docker集群


我想使用最初开发的Docker,假设在集群环境中方便地在单个服务器上使用。一个有用的工具是“Kubernetes”。我将介绍基本用法。

容器技术首次使用已有几年了。许多公司和开发人员使用容器来分发应用程序。Docker通过易于使用的界面传播容器技术。

只需要一个容器的应用程序很少见,我们将多个容器部署到多个主机。在本文中,我们介绍了Kubernetes,它可用于在开源系统上自动部署,扩展和管理容器化应用程序。

先决条件:本文面向具有Docker知识的读者。如果您认为需要有关Docker的评论请阅读了解Docker,容器和更安全的软件交付

您可以使用Kubernetes解决的问题

Docker使用命令docker rundocker stop来启动和停止容器。单个容器就足够了,但是没有docker deploy命令可以在多个主机上嵌入新映像。

有许多工具可以解决“容器的合作”。着名的工具是MesosDocker SwarmNomad和Kubernetes ,它们都包含在Docker引擎中。虽然有优点和缺点,但Kubernetes是目前使用最多的。

在Kubernetes(也被称为K8S),例如部署和缩放应用程序操作,一直完全独立于基础设施的操作的基本的。因此,如果你使用Kubernetes,你不必在一个单独的主机和虚拟机运行的代码。在Kubernetes的底层基础架构,海计算把容器被调用。

Kubernetes的概念

Kubernetes采用客户端/服务器结构。Kubernetes服务器在群集(一组主机)上运行并部署应用程序。具体来说,我们使用kubectl CLI中的客户端与集群进行交互。

Pod是由Kubernetes处理的基本单元,是由多个容器组成的组。如果两个或多个容器始终一起工作且必须位于同一个机器盒中。波德是因为它是一个方便的抽象,我们应该在第一类泊坞窗对象的建议是约也。

节点

节点是运行Kubernetes的物理或虚拟机。您可以在节点上安排pod。

标签

标签是用于标识资源的键/值对。例如,充当生产流量的pod 标记为role = production

选择

使用选择器,您可以按标签搜索和过滤资源。要收集所有生产窗格,选择器是role = production

服务

定义一组pod(更具体地说,是选择器选择的pod)并定义访问方式。例如,使用单个固定IP地址或相应的DNS名称定义它。

使用Kubernetes将Node.js应用程序部署到GKE

现在你明白Kubernetes,基本概念谷歌集装箱引擎和部署的Node.js的(称为GKE)的应用程序,以验证Kubernetes的行为。要求谷歌云平台帐户($ 300 有信用的等效采用免费试用)。

1.安装Google Choice SDK和Kubernetes

kubectl是一个命令行界面,可以对Kubernetes集群运行命令。您可以将其安装为Google Cloud SDK的一部分。安装Google Cloud SDK后,运行以下命令安装kubectl。

$ gcloud components install kubectl

Mac将是brew安装kubectl。要验证安装是否成功,请运行kubectl版本

使用您的Google云帐户设置Google云端SDK。运行gcloud init并按照说明进行操作很好。

2.创建GCP项目

Google云平台上的所有资源都是在项目下创建的,因此我们将从Web UI创建项目

从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

使用localhost:3000,确认执行结果。

4.生成集群

创建具有三个实例(虚拟机)的集群并部署该应用程序。它可以部署在直观的Web UI的Container引擎页面上。或者使用以下命令执行它。

$ 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作为机器类型,但是通过使用最小的可用机器来最小化成本。

运行以下命令并将kubectl客户端连接到群集。

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

我有一个码头图像和集群。将Docker镜像放入群集中并启动容器以实现目标。

5.将Docker镜像上传到Google容器图像注册表

由于Google容器图像注册表是云注册表,因此您可以保存图像。图像可以自动用于容器引擎集群。要保存图像,您需要使用正确的名称构建它。

制作应用程序的容器图像并标记它以进行上载。

$ 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,我们将创建一个部署规范文件,以将映像部署到集群。部署是kubernetes资源,所有kubernetes资源都可以在spec文件中以声明方式定义。通过指定此spec文件中所需的资源状态,我们考虑Kubernetes如何将资源从当前状态迁移到该状态。

我们将为初始部署创建一个spec文件。

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

是spec文件的内容。启动使用给定pod规范定义的两个pod。每个pod都有一个包含hello-world-image的容器:v1。

执行

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

运行kubectl get deployments将告诉您部署状态。运行kubectl获取 pod,部署创建的pod 知道正在运行的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

在deployment.yml文件中,我们将副本设置为2,因此pod的数量为2。

确认服务器启动。运行以下命令并检查日志。

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

7.将服务发布到Internet

要在Internet上发布服务,请创建负载平衡器并注册VM。创建Kubernetes服务

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

在后面,生成服务对象(服务是Kubernetes的资源以及部署),并且还创建了Google Cloud负载均衡器。

运行kubectl获取服务并检查服务的公共IP。控制台输出如下。

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将运行3个pod。尽管可以设置自动缩放,但它超出了本教程的范围。

9.清理

不要忘记清理资源。您的Google积分将继续下去!

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

摘要

尽管广泛涉及,但Kubernetes可以通过使用一个命令扩展更多pod服务,在pod上安装用于AWS身份验证等的秘密等来做很多事情。但是,我认为本教程的内容一开始就足够了。如果您想要做更多,尝试kubernetes.io

DIY表情

(添加http或https协议)

提交评论