教程的目标是将简单的Hello World Node.js应用转换为在Kubernetes上运行的应用。本教程将学习如何使用自己开发的代码,将其转换为Docker容器镜像,然后在Minikube上运行该镜像。Minikube能够在本地非常简单的创建Kubernetes。
目标
- 运行hello world Node.js应用。
- 在Minikube上部署应用。
- 查看应用日志
- 更新应用镜像。
准备工作
- 对于OS X,需要Homebrew来安装xhyve 驱动程序。
- NodeJS。
- 在OS X上安装Docker,推荐 Docker for Mac。
创建Minikube集群
本教程使用Minikube创建本地集群,默认使用 Docker for Mac。如果在不同的平台(如Linux)上,或使用VirtualBox而不是Docker for Mac,则安装Minikube方式有些不同。有关Minikube的详细安装说明,请参考Minikube安装指南。
使用curl下载并安装最新版本Minikube:
- curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 && \
- chmod +x minikube && \
- sudo mv minikube /usr/local/bin/
使用Homebrew安装xhyve驱动程序并设置其权限:
- brew install docker-machine-driver-xhyve
- sudo chown root:wheel $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
- sudo chmod u+s $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
使用Homebrew下载kubectl命令管理工具:
- brew install kubectl
确定是否可以直接访问https://cloud.google.com/container-registry/网站(是否翻墙?)
- curl --proxy "" https://cloud.google.com/container-registry/
如果不需代理,则启动Minikube集群:
- minikube start --vm-driver=xhyve
如果需代理服务器,使用以下方法启动设置了代理的Minikube集群:
- minikube start --vm-driver=xhyve --docker-env HTTP_PROXY=http://your-http-proxy-host:your-http-proxy-port --docker-env HTTPS_PROXY=http(s)://your-https-proxy-host:your-https-proxy-port
—vm-driver=xhyve flag 指定Docker for Mac。默认的VM驱动程序VirtualBox。
设置Minikube 环境。可以在~/.kube/config文件中查看所有可用的环境 。
- kubectl config use-context minikube
验证kubectl配置:
- kubectl cluster-info
创建Node.js应用程序
下一步编写应用程序。将这段代码保存在一个名为hellonode的文件夹中,文件名server.js:
server.js
- var http = require('http');
- var handleRequest = function(request, response) {
- console.log('Received request for URL: ' + request.url);
- response.writeHead(200);
- response.end('Hello World!');
- };
- var www = http.createServer(handleRequest);
- www.listen(8080);
运行应用:
- node server.js
现在可以在http:// localhost:8080 / 中查看到“Hello World!”消息。
按Ctrl-C停止正在运行的Node.js服务器。
下一步将应用程序打包到Docker容器中。
创建Docker容器镜像
在hellonode文件夹中创建一个Dockerfile命名的文件。Dockerfile描述了build的镜像,通过现有的镜像扩展(extend)build Docker容器镜像,本教程中的镜像扩展(extend)了现有的Node.js镜像。
- FROM node:6.9.2
- EXPOSE 8080
- COPY server.js .
- CMD node server.js
本教程使用Minikube,而不是将Docker镜像push到registry,可以使用与Minikube VM相同的Docker主机构建镜像,以使镜像自动存在。为此,请确保使用Minikube Docker守护进程:
- eval $(minikube docker-env)
注意:如果不在使用Minikube主机时,可以通过运行eval $(minikube docker-env -u)来撤消此更改。
使用Minikube Docker守护进程build Docker镜像:
- docker build -t hello-node:v1 .
好了Minikube VM可以运行构建好的镜像。
创建Deployment
Kubernetes Pod是一个或多个容器组合在一起得共享资源,本教程中的Pod只有一个容器。Kubernetes Deployment 是检查Pod的健康状况,如果它终止,则重新启动一个Pod的容器,Deployment管理Pod的创建和扩展。
使用kubectl run命令创建Deployment来管理Pod。Pod根据hello-node:v1Docker运行容器镜像:
- kubectl run hello-node --image=hello-node:v1 --port=8080
查看Deployment:
- kubectl get deployments
输出:
- NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
- hello-node 1 1 1 1 3m
查看Pod:
- kubectl get pods
输出:
- NAME READY STATUS RESTARTS AGE
- hello-node-714049816-ztzrb 1/1 Running 0 6m
查看群集events:
- kubectl get events
查看kubectl配置:
- kubectl config view
有关kubectl命令的更多信息,请参阅 kubectl概述。
创建Service
默认情况,这Pod只能通过Kubernetes群集内部IP访问。要使hello-node容器从Kubernetes虚拟网络外部访问,须要使用Kubernetes Service暴露Pod。
我们可以使用kubectl expose命令将Pod暴露到外部环境:
- kubectl expose deployment hello-node --type=LoadBalancer
查看刚创建的Service:
- kubectl get services
输出:
- NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- hello-node 10.0.0.71 <pending> 8080/TCP 6m
- kubernetes 10.0.0.1 <none> 443/TCP 14d
通过—type=LoadBalancer flag来在群集外暴露Service,在支持负载均衡的云提供商上,将配置外部IP地址来访问Service。在Minikube上,该LoadBalancer type使服务可以通过minikube Service 命令访问。
- minikube service hello-node
将打开浏览器,在本地IP地址为应用提供服务,显示“Hello World”的消息。
最后可以查看到一些日志
- kubectl logs <POD-NAME>
更新应用程序
编辑server.js文件以返回新消息:
- response.end('Hello World Again!');
build新版本镜像
- docker build -t hello-node:v2 .
Deployment更新镜像:
- kubectl set image deployment/hello-node hello-node=hello-node:v2
再次运行应用以查看新消息:
- minikube service hello-node
清理删除
现在可以删除在群集中创建的资源:
- kubectl delete service hello-node
- kubectl delete deployment hello-node
或者停止Minikube:
- minikube stop