# 使用 Minikube 在 k8s 中运行应用
教程的目标是将简单的 Hello World Node.js 应用转换为在 k8s 上运行的应用。本教程将学习如何使用自己开发的代码,将其转换为 Docker 容器镜像,然后在 Minikube 上运行该镜像。Minikube 能够在本地非常简单的创建 k8s。
# 目标
- 运行 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
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
k8s Pod 是一个或多个容器组合在一起得共享资源,本教程中的 Pod 只有一个容器。k8s 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 只能通过 k8s 群集内部 IP 访问。要使 hello-node 容器从 k8s 虚拟网络外部访问,须要使用 k8s 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
← 使用 Minikube 集群 k8s 组件 →