教程的目标是将简单的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:

  1. curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 && \
  2. chmod +x minikube && \
  3. sudo mv minikube /usr/local/bin/

使用Homebrew安装xhyve驱动程序并设置其权限:

  1. brew install docker-machine-driver-xhyve
  2. sudo chown root:wheel $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
  3. sudo chmod u+s $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve

使用Homebrew下载kubectl命令管理工具:

  1. brew install kubectl

确定是否可以直接访问https://cloud.google.com/container-registry/网站(是否翻墙?)

  1. curl --proxy "" https://cloud.google.com/container-registry/

如果不需代理,则启动Minikube集群:

  1. minikube start --vm-driver=xhyve

如果需代理服务器,使用以下方法启动设置了代理的Minikube集群:

  1. 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文件中查看所有可用的环境 。

  1. kubectl config use-context minikube

验证kubectl配置:

  1. kubectl cluster-info

创建Node.js应用程序

下一步编写应用程序。将这段代码保存在一个名为hellonode的文件夹中,文件名server.js:

server.js

  1. var http = require('http');
  2.  
  3. var handleRequest = function(request, response) {
  4. console.log('Received request for URL: ' + request.url);
  5. response.writeHead(200);
  6. response.end('Hello World!');
  7. };
  8. var www = http.createServer(handleRequest);
  9. www.listen(8080);

运行应用:

  1. 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

  1. FROM node:6.9.2
  2. EXPOSE 8080
  3. COPY server.js .
  4. CMD node server.js

本教程使用Minikube,而不是将Docker镜像push到registry,可以使用与Minikube VM相同的Docker主机构建镜像,以使镜像自动存在。为此,请确保使用Minikube Docker守护进程:

  1. eval $(minikube docker-env)

注意:如果不在使用Minikube主机时,可以通过运行eval $(minikube docker-env -u)来撤消此更改。

使用Minikube Docker守护进程build Docker镜像:

  1. 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运行容器镜像:

  1. kubectl run hello-node --image=hello-node:v1 --port=8080

查看Deployment:

  1. kubectl get deployments

输出:

  1. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
  2. hello-node 1 1 1 1 3m

查看Pod:

  1. kubectl get pods

输出:

  1. NAME READY STATUS RESTARTS AGE
  2. hello-node-714049816-ztzrb 1/1 Running 0 6m

查看群集events:

  1. kubectl get events

查看kubectl配置:

  1. kubectl config view

有关kubectl命令的更多信息,请参阅 kubectl概述

创建Service

默认情况,这Pod只能通过Kubernetes群集内部IP访问。要使hello-node容器从Kubernetes虚拟网络外部访问,须要使用Kubernetes Service暴露Pod。

我们可以使用kubectl expose命令将Pod暴露到外部环境:

  1. kubectl expose deployment hello-node --type=LoadBalancer

查看刚创建的Service:

  1. kubectl get services

输出:

  1. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  2. hello-node 10.0.0.71 <pending> 8080/TCP 6m
  3. kubernetes 10.0.0.1 <none> 443/TCP 14d

通过—type=LoadBalancer flag来在群集外暴露Service,在支持负载均衡的云提供商上,将配置外部IP地址来访问Service。在Minikube上,该LoadBalancer type使服务可以通过minikube Service 命令访问。

  1. minikube service hello-node

将打开浏览器,在本地IP地址为应用提供服务,显示“Hello World”的消息。

最后可以查看到一些日志

  1. kubectl logs <POD-NAME>

更新应用程序

编辑server.js文件以返回新消息:

  1. response.end('Hello World Again!');

build新版本镜像

  1. docker build -t hello-node:v2 .

Deployment更新镜像:

  1. kubectl set image deployment/hello-node hello-node=hello-node:v2

再次运行应用以查看新消息:

  1. minikube service hello-node

清理删除

现在可以删除在群集中创建的资源:

  1. kubectl delete service hello-node
  2. kubectl delete deployment hello-node

或者停止Minikube:

  1. minikube stop

下一步

原文: http://docs.kubernetes.org.cn/126.html