在 Kubernetes 中使用 Deployment 进行应用程序的管理与部署是非常常见的,Deployments 是 Kubernetes 中一种资源类型,用于描述应用程序副本数量的期望状态,并且自动化部署应用程序更新。
术语解释
在开始之前,先了解一下几个常见的 Kubernetes 术语:
- Pods:Kubernetes 最小的调度单元,一个 Pod 代表一个正在运行的进程或服务
- ReplicaSets:ReplicaSets 用于确保指定数量的 Pod 副本正在运行,它可以创建、删除、调整 Pod 的数量。
- Deployment:Deployment 可以控制 ReplicaSets,配合 ReplicaSets 可以实现自动化部署和自动化 scaling。
Deployment 的使用
使用 Deployment 可以实现应用程序的自动化部署、更新和扩展。在以下示例中,我们将使用一个简单的 Node.js 应用程序来演示如何使用 Deployment 进行部署。
我们的应用程序代码如下所示,它可以监听 HTTP 请求并返回一个 "Hello World!" 的响应:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- -------- - ---------- ----- ---- - ---------------- -- ----- ----- ------ - ----------------------- ---- -- - -------------- - ---- ----------------------------- -------------- -------------- ----------- --- ------------------- --------- -- -- - ------------------- ------- -- ------------------------------ ---
在我们的项目根目录下创建一个 Dockerfile 文件,然后将以下内容添加到该文件中:
-- -------------------- ---- ------- ---- ------- ------- ---- --- - ---- --- ---- ------- ------ ---- --- -------- --------
然后将该 Dockerfile 构建为一个 Docker 镜像。如果你还不熟悉如何构建 Docker 镜像,可以参考 Docker 官方文档。
在我们创建 Deployment 前,需要创建一个叫做 Namespace 的资源类型,Namespace 是指一个逻辑上的分区,用于隔离集群资源。在 Kubernetes 中默认有一个名为 default 的 Namespace。
接下来,我们需要创建一个 Deployment,将我们的 Docker 镜像部署到 Kubernetes 中。在创建 Deployment 之前,我们需要先创建一个名为 Deployment.yaml 的文件,然后将以下内容添加到该文件中:
-- -------------------- ---- ------- ----------- ------- ----- ---------- --------- ----- ------------------ ------- ---- ------- ----- --------- - --------- ------------ ---- ------- --------- --------- ------- ---- ------- ----- ----------- - ----- ------- ------ -------------------- ------ - -------------- ----
在上面的内容中,我们定义了一个名为 example-deployment 的 Deployment。replicas 字段指定了我们需要启动的 Pod 副本数量,这里是 3 个。
selector 字段用于选择需要启动的 Pod,这里选择的是所有具有 app=example 标签的 Pod。
template 字段定义了我们启动 Pod 的配置,这里我们定义了一个名为 example 的 container,使用我们之前构建的 Docker 镜像,并将容器端口暴露为 3000。
然后我们可以使用 kubectl 命令来部署该 Deployment:
$ kubectl apply -f Deployment.yaml
创建 Deployment 后,我们可以使用 kubectl get deploy 命令来查看 Deployment 的状态:
$ kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE example-deployment 0/3 3 0 26s
它告诉我们我们的 Deployment 名称为 example-deployment,目前它正在尝试运行 3 个 Pod 副本。
使用 kubectl get pods 命令可以查看 Pod 的状态:
$ kubectl get pods NAME READY STATUS RESTARTS AGE example-deployment-6c7bc6ddb-p547j 0/1 ContainerCreating 0 55s example-deployment-6c7bc6ddb-rz5m5 0/1 ContainerCreating 0 55s example-deployment-6c7bc6ddb-s25bn 0/1 ContainerCreating 0 55s
我们可以看到,目前有 3 个 Pod 正在创建。
使用 kubectl logs 命令可以查看某个 Pod 的日志:
$ kubectl logs example-deployment-6c7bc6ddb-p547j Server running at http://0.0.0.0:3000/
现在我们可以使用 kubectl expose 命令将我们的 Deployment 暴露为一个 Service:
$ kubectl expose deploy example-deployment --type=NodePort --name=example-service
现在我们访问 Kubernetes 集群中的任意节点的 NodePort 端口,就可以访问到我们的应用程序了。例如,如果 NodePort 端口为 32519,我们可以通过以下 URL 访问应用程序:
http://<NodeIP>:32519
Deployment 的更新
使用 Deployment 进行应用程序更新是一个非常方便的功能。我们可以在不影响现有流量的情况下,平滑地将我们的应用程序升级到新的版本。
首先,我们需要更新我们的 Dockerfile,或者我们可以构建另一个 Docker 镜像来代表我们的新版本。
然后,我们只需要更新我们的 Deployment.yaml 文件并将 image 字段更改为新的镜像名称和版本,然后再次运行 kubectl apply 命令即可:
$ kubectl apply -f Deployment.yaml
Kubernetes 现在会自动创建新的 Pod,使用新的镜像,然后要求旧的 Pod 逐渐退役。
我们可以使用 kubectl get pods 命令来查看 Pod 的状态。我们会看到一个新的 Pod 开始运行,并且旧的 Pod 正在逐渐关闭:
$ kubectl get pods NAME READY STATUS RESTARTS AGE example-deployment-54f78489cf-dfvxw 1/1 Running 0 8s example-deployment-6c7bc6ddb-kvwnp 1/1 Terminating 0 2m48s example-deployment-6c7bc6ddb-p547j 1/1 Terminating 0 6m19s example-deployment-6c7bc6ddb-rz5m5 1/1 Terminating 0 6m19s example-deployment-6c7bc6ddb-s25bn 1/1 Terminating 0 6m19s
Scaling
使用 Deployment 还可以轻松地实现 Pod 副本的缩放。我们只需要更新 Deployment,将 replicas 字段更改为新的值,并再次运行 kubectl apply 命令即可:
$ kubectl scale deployment example-deployment --replicas=5
Kubernetes 现在会启动两个新的 Pod 副本,从而使总副本数量达到 5 个:
-- -------------------- ---- ------- - ------- --- ---- ---- ----- ------ -------- --- ----------------------------------- --- ------- - ----- ----------------------------------- --- ----------------- - -- ----------------------------------- --- ----------------- - -- ---------------------------------- --- ----------- - ----- ---------------------------------- --- ----------- - ----- ---------------------------------- --- ----------- - ----- ---------------------------------- --- ----------- - -----
结论
在本文中,我们介绍了如何使用 Kubernetes 中的 Deployment 进行应用程序的部署、更新和扩展。通过使用 Deployment,在我们的应用程序版本更新时非常方便。并且还可以轻松地扩展应用程序的副本数量,以满足流量的需求。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6770aa9be9a7045d0d7fa3a9