尽管容器技术已经存在多年,但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/