Kubernetes 初体验 -- 用 Kubernetes 部署一个 Web 服务
介绍
前面的几篇文章从概念层面介绍了Kubernetes
是什么,它的内部架构是怎样的。并且也在电脑上安装了Minikube
--拥有一个单节点的Kubernetes
集群,让我们能够在自己的电脑上开始体验Kubernetes
。今天的文章我准备和大家一起一步步地尝试做一个Go
应用程序的Docker
镜像,把它部署到Minikuebe
上运行。今天的文章不需要什么基础,Kubernetes
的新手朋友们先一起上车学起来。
应用程序代码
我们用Go
写一个简单的HTTP Server
,Server
侦听3000端口包含"/"
和"/health_check"
两个路由,今天文章的关注点不在怎么用Go
开发程序所以都是Hello World
级别的代码,就不更多解释了,直接看代码吧。
制作程序镜像
接下来开始制作包含应用程序代码的Docker
镜像。关于docker
相关的使用方法和如何编写Dockerfile
,可以在公众号里回复关键字docker获取完整的参考笔记。
dockerfile
在应用程序的根目录添加名为Dockerfile
的文件,在文件里添加如下指令:
build 镜像
在Dockerfile
所在的目录下执行docker build
构建镜像
docker
会依据Dockerfile
里的指令构建镜像,整个构建的过程类似下面:
验证镜像
这一步其实可以省略,不过为了确保制作的镜像是没有问题,我们通过docker run
命令用这个镜像运行容器验证一下。
在这里,我们指示docker
从镜像go-app-img
运行容器,将主机端口3333
绑定到容器的内部端口3000
,以后台模式(-d)运行容器,给此容器命名为go-app-container
,并在容器结束运行后自动删除容器(--rm)。
打开浏览器输入localhost:3333
访问到的页面输出会是:
推送镜像到DockerHub
测试镜像没问题后,将镜像推送到DockerHub
,到时候Kubernetes
在部署应用时会根据指定的镜像名称从DockerHub
上拉取镜像(镜像源是可配置的,不一定非得是DockerHub
,可以是私有镜像仓库)。
用Dockerfile
重新构建镜像,指定镜像仓库名。构建完成后将镜像然后推送到DockerHub
上。
上面仓库名中的kevinyan001
是我自己的DockerHub
账号,你们可以直接使用下面的命令拉取我的镜像使用,不过还是建议每个人动手制作自己的镜像。
Kubernetes部署应用
部署应用开始需要先定义预期状态,就是在yaml
文件里声明具体的Kubernetes
对象的各种预期的状态。然后让Kubernetes
创建对象,之后它会始终驱动集群的当前状态向预期状态移动(比如有节点挂了,会新起节点替代挂掉的节点)。部署完应用后后我们还需要通过Service
向外部暴露应用,这样才能访问运行在Kubernetes
集群里的应用。
下面我们来一步步递进地执行这三个步骤。
开始之前我们需要启动一下Minikube
如果你还没有安装可以参照《Minikube-运行在笔记本上的Kubernetes集群》里的安装步骤
定义预期状态
在部署清单文件(deployment.yaml
)中定义预期状态
Kubernetes Deployment
对象(清单文件的kind
里指定的)表示运行在集群中的应用。文件里还指定了应用需要一个副本运行(replicas
),以及运行的容器名和容器的镜像、资源大小等信息。
Deployment
是Kubernetes
对象的一种,还有其他很多种对象分别对应Kubernetes
里的不同类型的资源。
部署应用
使用上面定义的deployment.yaml
创建Deployment
对象来运行Go
应用程序的容器:
暴露应用
应用部署完后还不能从外部直接访问,需要把刚才Deployment
对象运行的应用程序作为Kubernetes
的一个Service
对外暴露。
通过kubectl get svc
查询Service
可以得到主机的31425
端口映射到了Kubernetes
运行着应用的容器的3000
端口。在浏览器里使用Kubernetes
集群IP加NodePort
即可访问到Kubernetes
部署的Go
应用程序。
打开浏览器通过192.168.64.4:31425
(以自己实践时查到的IP和端口为准)访问应用程序定义的两个路由的结果如下:
总结
今天的文章简单的总结了一下将应用程序部署到Kubernetes
集群的步骤,Kubernetes
里有很多种对象来代表其内部的各种资源,今天部署应用用到的Deployment
就是其中的一种,kubectl
会根据.yaml
文件中的配置信息请求Kubernetes
的apiServer
创建各种对象,我们后续要做的就是继续研究清楚这些常用到的Kubernetes
对象。由于鄙人也是刚开始学习,难免有表达不精确的地方,还请见谅。
微信关注公众号「网管叨bi叨」每周教会你一个进阶知识。
版权声明: 本文为 InfoQ 作者【网管】的原创文章。
原文链接:【http://xie.infoq.cn/article/47b737e53d298e880c39800ce】。未经作者许可,禁止转载。
评论