在之前的两篇 “Kubernetes - Create cluster using kubeadm” 介绍了如何在虚拟机上使用 kubeadm 工具创建一个 Kubernetes 集群和 “Kubernetes - Kubectl and Dashboard” 如何使用工具 kubectl 访问 Kubernetes 服务、如何安装部署 Kubernetes Dashboard 应用服务。这样就有了我们自己的开发环境,接下来就是要介绍如何在这个 Kubernetes cluster 上开发和部署应用程序。
Application to Docker Image
关于如何编写应用程序我们不做详细介绍,只是一笔带过。使用什么语言编写的应用也不重要,所以你可以选择自己熟悉和喜欢的语言。 本篇我们选择使用 Node.js 来编写一个简单的 Web Application。
Create Node.js Application
创建一个 Node.js 项目叫 kube-tiven,然后编写主 JavaScript 程序 app.js 如下
app.js
const http = require('http');
const os = require('os');
console.log("Kube-tiven server starting...");
var handler = function(req, resp) {
console.log("Received request from " + req.connection.remoteAddress);
resp.writeHead(200);
resp.end("You've hit " + os.hostname() + "\n");
};
var www = http.createServer(handler);
www.listen(8080);
为了保证下一步顺利进行,我们进行本地测试。运行 Node.js 程序并发送请求给端口号 8080,结果如下便是正确
👌
Build Docker Image
创建好应用程序,接下来就是把他打包成一个 Docker 镜像文件方便到处(到处代表任意地随便地,你不需要关心太多就可以方便地拿去用)部署。创建 Docker 镜像构建文件
Dockerfile
FROM node:8
ADD app.js /app.js
ENTRYPOINT ["node", "app.js"]
然后把应用程序构建成自己的 Docker 镜像
构建 Docker 镜像的过程如下图
把我们当创建的镜像创建为一个容器,检验一下我们的 Docker image 是否正确,发送请求到 8080 端口看到返回说明运行正确
👌
Publish your Docker Image
因为 Kubernetes 默认是从 Docker hub 网站上下载 Docker 容器镜像的,所以我们在部署应用程序之前要把应用程序的 Docker 容器镜像发布到 Docker hub 网站。
当我们 push 以 tiven/kube-tiven
这个名称的镜像时会提示不存在,因为 Docker 要求以 <UserId>/<ImageName>
格式发布镜像,而我们之前是直接标记为 kube-tiven
的镜像,所以我们需要为镜像换个标记名称
👌
Deploying Our Application
部署 Kubernetes 应用程序有多种方式,可以直接用 kubectl 命令行或者文件,还可以使用 Dashboard 界面部署。 接下来我们使用命令行部署简单的应用程序,当后面了解的概念多了,再考虑使用配置简单部署更复杂的应用。 部署过程如下图所示
简单起见,这里使用 kubectl run
运行一个容器,就像运行 Docker 命令 docker run
一样
--image=tiven/kube-tiven
参数是指定我们刚才发布的应用程序 Docker 镜像,--port=8080
参数告诉 Kubernetes 我们的应用程序进程是运行在 8080 端口上的,--generator=run/v1
参数则是说明要创建的是 ReplicationController 而不是默认的 Deployment,至于他们之间的区别后面再介绍。然后我们查看了所有的 pods 可以看到一个叫 kube-tiven-qblvj
的状态为 ContainerCreating
,因为他的 Docker Container 还在创建中,过一会再查看就会是 Running
状态了。
这里我们是查看 Pods ,而不是类似 kubectl get containers
这样的命令,因为 Kubernetes 资源类型里没有 Container 这种类型。Kubernetes 不直接管理和操作容器,而是以 Pod 概念组织和管理容器的,Pod 可以简单理解为容器组。至于为什么容器需要打包成组存在,后面再介绍。我们还可以查看这个 Pod 详细信息
可以看到此 Pod 是部署 kubenode2/192.168.99.102
主机上的,命名空间(Namespace)是 default
因为我们暂时没有为开发程序另外创建命名空间。还有他的 IP (10.36.0.2),Kubernetes 里的 IP 太复杂了,我们后面会针对网络做详细分析。Pod 还有个 Containers 节点,一个 Pod 可以包含多个 Containers。
Accessing Application
要想访问我们的应用程序,需要把它暴露成一个 Service。使用 kubectl expose
命令创建一个 Service 类型设置为 NodePort
意思是使用 Worker Node 上的端口转发来访问应用程序,因为我们是在虚拟机群上创建的 Kubernetes 集群,对于我们的本机来说集群的 Public IP 就是虚拟机节点的 IP。如果你的 Kubernetes cluster 是部署在像 GCP 这样的云服务器上的话,还可以选择使用 LoadBalancer
类型,他会为你创建一个具有公网 IP 的服务,也就是 IaaS 里的 LoadBalancer。
查看我们创建的 Service
从上面可以看到 Service 的 NodePort 属性为 31177/TCP 说明服务分配了 Worker Node 主机 31177 端口号给了我们的应用程序容器作端口号转发。那么我们要访问应用程序还需要知道其所在 Worker Node 主机的 IP 地址。你可以在 Dashboard 界面上查看到,也可以使用命令行查看,如下
至此我们拿到了应用程序所在主机的 IP 地址(192.168.99.102)和 Service 暴露的转发端口号(31177),那么就可以来访问了
参考[1.]
Comments