如何在Kubernetes中部署NodeJS应用程序

时间:2020-01-09 10:34:23  来源:igfitidea点击:

说明

Kubernetes吸引了几乎所有开发人员和组织的注意力。从AWS到GCP,每个主要的云平台都提供托管的解决方案。在本教程中,我们将学习如何在Kubernetes中部署NodeJS应用程序。

我们还将学习如何在内部公开供其他服务订阅的NodeJS应用程序,以及在外部公开为公共API的方法。与部署应用程序同样重要,将介绍上下扩展服务的方式以及如何处理滚动更新。

入门

在Kubernetes中运行NodeJS应用程序,无论托管哪个平台,都需要安装以下内容。

  • Kubernetes集群(DigitalOcean,GKE,AKS,EKS)
  • 本地安装的Docker
  • Kubectl在本地安装

构建Docker镜像

为了使NodeJS应用程序能够在Kubernetes中运行,需要将其作为容器运送。在决定如何对应用程序进行容器化时,有两种思路:使用现有的NodeJS镜像或者构建自己的镜像。

使用现有的NodeJS镜像

Node为Node.js应用程序提供了官方镜像。最简单,最有效的入门方法是将应用程序容器化。以下是用于创建基本容器的Dockerfile的示例。

FROM node

WORKDIR /usr/src/app

COPY package*.json ./
COPY index.js ./
COPY ./app ./app

RUN npm install

EXPOSE 3000
CMD [ "npm", "start" ]

码头工人建造theitroad:1.0.0。

将镜像推送到Docker存储库

为了在Kubernetes中运行容器化应用程序,它必须在Docker存储库中可用。 Kubernetes集群必须可以访问该存储库,因为每次部署镜像的Pod容器时,该存储库都会被拉下。

对于刚接触Kubernetes的任何人来说,Dockerhub都是一个好的开始。它们提供公共和私有存储库,并且Kubernetes可以使用两者。例如,如果我们使用的是Google Kubernetes Engine(GKE),则可以使用Google存储库。

在本教程中,我们将使用Dockerhub作为存储库进行演示。我们将在我们的pod和部署清单中指出它。要部署我们的镜像,我们必须将其推送到Dockerhub,这需要我们首先登录。

docker login

在我们之前构建的镜像中添加标签,以便名称包括存储库。使用Dockerhub时​​,它必须以DockerID开头。

docker image tag simple-api:1.0.0 theitroad/simple-api:1.0.0

现在,将图像推送到存储库。

docker push theitroad/simple-api:0.0.1

部署到Kubernetes

创建一个豆荚

吊舱是Kubernetes集群中最小的原子部分。容器是Docker容器运行的容器,因此让我们从为NodeJS应用程序创建容器开始。

创建一个名为simple-api-pod.yml的新文件

touch simple-api-pod.yml

将以下内容添加到新文件中。

apiVersion: v1
kind: Pod
metadata:
  name: simple-api
  labels:
    name: simple-api
spec:
  containers:
  - name: simple-api
    image: theitroad/simple-api:1.0.0
    ports:
    - containerPort: 3000

上面的示例是一个非常基本的pod声明。为了更好地理解清单,下面介绍文件的不同部分。

apiVersion
apiVersion用于让Kubernetes知道在创建资源时使用哪种架构。该值是必需的,以便让Kubernetes知道在创建资源时应使用哪个版本的架构。


Kubernetes处理从Pod到入口控制器的许多资源类型。这是一个必需的密钥,可让Kubernetes知道正在创建哪种类型的资源。

元数据
元数据是我们提供有关所声明资源的详细信息的地方。

规格
规范是我们声明必须如何创建资源的地方。对于Pod,我们描述了要使用的容器镜像,容器将运行的名称以及其他详细信息,例如端口和环境变量。

启动和管理Pod

关于pod的其余操作将使用kubectl命令完成。在Kubernetes中有两种创建资源的方法,例如pod。我们可以使用kubectl create命令或者kubectl apply命令。 Kubectl apply将是本教程中的首选方法,因为它允许我们动态更新一些配置。

要创建Pod并启动它,请运行以下命令,针对为NodeJS POD创建的YAML文件。

kubectl apply -f simple-api-pod.yml

使用kubectl get pods命令可以查看正在运行的Pod列表。

kubectl get pods

如果不指定Pod,则会列出所有Pod。我们可以通过定位感兴趣的Pod的名称来缩小结果范围。

kubectl get pods simple-api

Pod详细信息和日志

kubectl get命令提供有关吊舱健康状况的非常基本的信息。当对Pod的问题进行故障排除时(如无法成功启动的原因),我们转向kubectl describe命令。

kubectl describe pod simple-api

kubectl describe命令提供的信息很有帮助。但是,有时必须通过日志调试Pod。可以使用kubectl log命令获取日志。

kubectl log simple-api

为了使应用程序填充其日志,它必须将所有内容打印到stdout。

作为服务公开

豆荚短暂存在,这意味着它们的寿命不长。这种思维方式与流行的牛,而不是经常听到和重复的绵羊咒语相匹配。

服务资源提供了到Pod中的静态输入方式。它们本身不是Pod,而是将流量定向到与其相连的任何Pod的资源。

创建名为new-api-service.yml的.new YAML资源文件。

touch simple-api-service.yml

并添加以下内容。

apiVersion: v1
kind: Service
metadata:
  name: simple-api
spec:
  selector:
    app: simple-api
  ports:
  - protocol: TCP
    port: 3000
    targetPort: 3000

使用与pod相同的命令创建服务资源。

kubectl apply -f simple-api-service.yml

创建服务后,我们可以查看有关该服务的基本信息。我们可以使用kubectl get命令来执行此操作,该命令输出基本的健康状态。

kubectl get service simple-api-service

当我们需要有关服务的更多详细信息时,可以使用kubectl describe命令。实际上,如我们所见,它可以用于Kubernetes中的任何资源。

kubectl describe service simple-api-service

创建扩展规模

豆荚是单一结构。它们对于需要扩展的服务不是很有用,这是部署资源的来源。

创建一个名为simple-api-deployment.yml的新文件

touch simple-api-deployment.yml

然后添加以下内容。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: simple-api-deployment
  labels:
    app: simple-api
spec:
  replicas: 3
  selector:
    matchLabels:
      app: simple-api
  template:
    metadata:
      labels:
        app: simple-api
    spec:
      containers:
      - name: simple-api
        image: theitroad/simple-api:1.0.0
        ports:
        - containerPort: 3000

使用kubectl apply命令创建新的部署资源。

kubectl apply -f simple-api-deployment.yml