Kubernetes简介:如何部署Node.js Docker应用

  • Post author:
  • Post category:其他


一队工人用起重机将容器装到鲸鱼的背上。 Kubernetes和Docker。

尽管容器技术已经存在多年,但Docker确实使它成为主流。 现在,许多公司和开发人员都使用容器来运送其应用程序。 Docker提供了一个易于使用的界面来处理容器。

但是,对于任何非平凡的应用程序,您将不会部署“一个容器”,而是在多个主机上部署一组容器。 在本文中,我们将介绍

Kubernetes

,这是一个用于自动化部署,扩展和管理容器化应用程序的开源系统。


先决条件

:本文假定您对Docker有所了解。 如果您需要复习,请查看

了解Docker,容器和更安全的软件交付

Kubernetes解决什么问题?

使用Docker,您可以使用简单的命令(例如

docker run



docker stop

分别启动/停止容器。 与这些使您可以在单个容器上进行操作的简单命令不同,没有

docker deploy

命令将新映像推送到一组主机。

近年来出现了许多工具来解决“容器编排”这一问题。 最受欢迎的是

Mesos



Docker Swarm

(现在是Docker引擎的一部分),

Nomad

和Kubernetes。 所有这些都各有利弊,但可以说,Kubernetes在这一点上的作用最大。

Kubernetes(也称为“ k8s”)提供了强大的抽象功能,使应用程序操作(如部署和扩展)与基础架构操作完全脱钩。 因此,在使用Kubernetes时,您无需使用在其上运行代码的单个主机或虚拟机,而是将Kubernetes视为底层基础架构,将其视为放置容器

的计算之海

Kubernetes概念

Kubernetes具有客户端/服务器架构。 Kubernetes服务器在将要部署应用程序的

群集

(一组主机)上运行。 通常,您通常使用客户端(例如

kubectl

CLI)与集群进行交互。

豆荚

吊舱是Kubernetes处理的一组容器的基本单位。 如果有两个或多个始终需要一起工作的容器,并且应该在同一台机器上,则将它们设置为

pod

。 Pod是一个有用的抽象,甚至有人

提出

使它们成为一流的docker对象的建议。

节点

节点是运行Kubernetes的物理或虚拟机,可以在其上调度Pod。

标签

标签是用于标识资源的键/值对。 例如,您可以使用“角色=生产”来标记服务生产流量的所有

pods

选择器

选择使您可以按标签搜索/过滤资源。 在上一个示例之后,要获取所有生产吊舱,您的选择器应为“ role = production”。

服务

服务定义了一组Pod(通常由“选择器”选择)和访问它们的方式,例如单个稳定IP地址和相应的DNS名称。

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

现在,我们已经了解了Kubernetes的基本概念,让我们通过在

Google容器引擎

(称为GKE)上部署Node.js应用程序来了解它的实际作用。 您将需要一个相同的Google Cloud Platform帐户(Google提供了

300美元



免费试用额度

)。

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


kubectl

是用于针对Kubernetes集群运行命令的命令行界面。 您可以将其安装为

Google Cloud SDK

的一部分。 安装Google Cloud SDK后,运行以下命令以安装

kubectl

$ gcloud components install kubectl

或在Mac上执行

brew install kubectl

。 要验证安装,请运行

kubectl version

您还需要使用您的Google云帐户的凭据设置Google Cloud SDK。 只需运行

gcloud init

并按照说明进行即可。

2.创建一个GCP项目

所有Google Cloud Platform资源都是在一个项目下创建的,因此请

从Web UI中创建一个

通过运行以下命令来设置使用CLI时的默认项目ID:

gcloud config set project {PROJECT_ID}

3.创建应用程序的Docker映像

这是我们将要使用的应用程序:

express-hello-world

。 您可以在看到

Dockerfile

,我们使用的是从现有的Node.js图像

dockerhub

。 现在,我们将通过运行以下内容来构建应用程序映像:

$ docker build -t hello-world-image . 

通过运行以下命令在本地运行该应用程序:

docker run --name hello-world -p 3000:3000 hello-world-image

如果您访问

localhost:3000

,则应该得到响应。

4.创建集群

现在,我们将创建一个具有三个实例(虚拟机)的集群,并在其上部署我们的应用程序。 您可以通过相当直观的Web UI进行操作,方法是转到

容器引擎页面

或运行以下命令:

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



us-east1-b

通过运行在

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

因此,现在我们有了一个码头工人镜像和一个集群。 我们希望将该映像部署到我们的集群并启动容器,这些容器将为请求提供服务。

5.将Docker映像上传到Google Container Image Registry

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在我们的集群上部署该映像。 我们将通过创建

deployment

规范文件来做到这一点。 部署是kubernetes资源,所有kubernetes资源都可以由spec文件

声明性地

定义。 该规范文件指示该资源的所需状态,而Kubernetes指出了如何从当前状态转到所需状态。

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


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,其中每个Pod由给定的pod规范定义。 每个Pod应该有一个包含我们推送的

hello-world-image:v1

容器。

现在,运行:

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

您可以通过运行

kubectl get deployments

来查看部署状态。 要查看由部署创建的容器,请运行以下命令:

kubectl get pods

。 您应该看到正在运行的吊舱:

$ 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文件中将副本设置为2。

要确保服务器已启动,请通过运行以下命令检查日志:

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

7.将服务公开到Internet

要将服务公开给Internet,您必须将VM置于负载平衡器之后。 为此,我们创建了一个Kubernetes

Service

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

在幕后,它创建了一个

service

对象(服务是Kubernetes资源,例如Deployment),还创建了Google Cloud负载均衡器。

运行

kubectl get services

以查看

kubectl get services

的公共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

文件并将

replicas

数更改为3,然后运行

kubectl apply -f deployment.yml

,您将立即运行三个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凭证之类的

secret

。但是,这足以让您入门。 前往

kubernetes.io

了解更多!


本文由

Graham Cox

同行评审。


感谢所有SitePoint的同行评审人员使SitePoint内容达到最佳状态!

From:

https://www.sitepoint.com/kubernetes-deploy-node-js-docker-app/