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

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

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

但是,对于任何非平凡的应用程序,您将不会部署“一个容器”,而是在多个主机上部署一组容器。 在本文中,我们将介绍Kubernetes ,这是一个用于自动化部署,扩展和管理容器化应用程序的开源系统。

先决条件 :本文假定您对Docker有所了解。 如果您需要复习,请查看了解Docker,容器和更安全的软件交付

Kubernetes解决什么问题?

使用Docker,您可以使用简单的命令(例如docker rundocker stop分别启动/停止容器。 与这些简单的命令允许您在单个容器上执行操作不同,没有docker deploy命令将新映像推送到一组主机。

为了解决“容器编排”这一问题,最近出现了许多工具。 最受欢迎的是MesosDocker 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映像

免费学习PHP!

全面介绍PHP和MySQL,从而实现服务器端编程的飞跃。

原价$ 11.95 您的完全免费

这是我们将要使用的应用程序: 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查看部署状态。 要查看由部署创建的Pod,请运行以下命令: 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内容达到最佳状态!

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值