使用Minikube在Kubernetes中运行应用

教程的目标是将简单的Hello World Node.js应用转换为在Kubernetes上运行的应用。本教程将学习如何使用自己开发的代码,将其转换为Docker容器镜像,然后在Minikube上运行该镜像。Minikube能够在本地非常简单的创建Kubernetes。

目标

  • 运行hello world Node.js应用。
  • 在Minikube上部署应用。
  • 查看应用日志
  • 更新应用镜像。

准备工作

创建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镜像。

Dockerfile 

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

下一步