# 使用 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
Last Updated: 6/17/2023, 6:57:19 PM