你好,Minikube

本教程向你展示如何使用 Minikube 在 Kubernetes 上运行一个应用示例。 教程提供了容器镜像,使用 NGINX 来对所有请求做出回应。

教程目标

  • 将一个示例应用部署到 Minikube。
  • 运行应用程序。
  • 查看应用日志。

准备开始

本教程假设你已经安装了 minikube。 有关安装说明,请参阅 minikube start

你还需要安装 kubectl。 有关安装说明,请参阅安装工具

创建 Minikube 集群

minikube start

打开仪表板

打开 Kubernetes 仪表板。你可以通过两种不同的方式执行此操作:

打开一个新的终端,然后运行:

# 启动一个新的终端,并保持此命令运行。
minikube dashboard

现在,切换回运行 minikube start 的终端。

如果你不想 Minikube 为你打开 Web 浏览器,可以使用 --url 标志运行仪表板命令。 minikube 会输出一个 URL,你可以在你喜欢的浏览器中打开该 URL。

打开一个新的终端,然后运行:

# 启动一个新的终端,并保持此命令运行。
minikube dashboard --url

现在,切换回运行 minikube start 的终端。

创建 Deployment

Kubernetes Pod 是由一个或多个为了管理和联网而绑定在一起的容器构成的组。本教程中的 Pod 只有一个容器。 Kubernetes Deployment 检查 Pod 的健康状况,并在 Pod 中的容器终止的情况下重新启动新的容器。 Deployment 是管理 Pod 创建和扩展的推荐方法。

  1. 使用 kubectl create 命令创建管理 Pod 的 Deployment。该 Pod 根据提供的 Docker 镜像运行容器。

    # 运行包含 Web 服务器的测试容器镜像
    kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- /agnhost netexec --http-port=8080
    
  1. 查看 Deployment:

    kubectl get deployments
    

    输出结果类似于这样:

    NAME         READY   UP-TO-DATE   AVAILABLE   AGE
    hello-node   1/1     1            1           1m
    
  1. 查看 Pod:

    kubectl get pods
    

    输出结果类似于这样:

    NAME                          READY     STATUS    RESTARTS   AGE
    hello-node-5f76cf6ccf-br9b5   1/1       Running   0          1m
    
  1. 查看集群事件:

    kubectl get events
    
  1. 查看 kubectl 配置:

    kubectl config view
    
  1. 查看 Pod 中容器的应用程序日志。

    kubectl logs hello-node-5f76cf6ccf-br9b5
    

    输出类似于:

    I0911 09:19:26.677397       1 log.go:195] Started HTTP server on port 8080
    I0911 09:19:26.677586       1 log.go:195] Started UDP server on port  8081
    

创建 Service

默认情况下,Pod 只能通过 Kubernetes 集群中的内部 IP 地址访问。 要使得 hello-node 容器可以从 Kubernetes 虚拟网络的外部访问,你必须将 Pod 暴露为 Kubernetes Service

  1. 使用 kubectl expose 命令将 Pod 暴露给公网:

    kubectl expose deployment hello-node --type=LoadBalancer --port=8080
    

    这里的 --type=LoadBalancer 参数表明你希望将你的 Service 暴露到集群外部。

    测试镜像中的应用程序代码仅监听 TCP 8080 端口。 如果你用 kubectl expose 暴露了其它的端口,客户端将不能访问其它端口。

  1. 查看你创建的 Service:

    kubectl get services
    

    输出结果类似于这样:

    NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    hello-node   LoadBalancer   10.108.144.78   <pending>     8080:30369/TCP   21s
    kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP          23m
    

    对于支持负载均衡器的云服务平台而言,平台将提供一个外部 IP 来访问该服务。 在 Minikube 上,LoadBalancer 使得服务可以通过命令 minikube service 访问。

  1. 运行下面的命令:

    minikube service hello-node
    

    这将打开一个浏览器窗口,为你的应用程序提供服务并显示应用的响应。

启用插件

Minikube 有一组内置的插件, 可以在本地 Kubernetes 环境中启用、禁用和打开。

  1. 列出当前支持的插件:

    minikube addons list
    

    输出结果类似于这样:

    addon-manager: enabled
    dashboard: enabled
    default-storageclass: enabled
    efk: disabled
    freshpod: disabled
    gvisor: disabled
    helm-tiller: disabled
    ingress: disabled
    ingress-dns: disabled
    logviewer: disabled
    metrics-server: disabled
    nvidia-driver-installer: disabled
    nvidia-gpu-device-plugin: disabled
    registry: disabled
    registry-creds: disabled
    storage-provisioner: enabled
    storage-provisioner-gluster: disabled
    
  1. 启用插件,例如 metrics-server

    minikube addons enable metrics-server
    

    输出结果类似于这样:

    The 'metrics-server' addon is enabled
    
  1. 查看通过安装该插件所创建的 Pod 和 Service:

    kubectl get pod,svc -n kube-system
    

    输出结果类似于这样:

    NAME                                        READY     STATUS    RESTARTS   AGE
    pod/coredns-5644d7b6d9-mh9ll                1/1       Running   0          34m
    pod/coredns-5644d7b6d9-pqd2t                1/1       Running   0          34m
    pod/metrics-server-67fb648c5                1/1       Running   0          26s
    pod/etcd-minikube                           1/1       Running   0          34m
    pod/influxdb-grafana-b29w8                  2/2       Running   0          26s
    pod/kube-addon-manager-minikube             1/1       Running   0          34m
    pod/kube-apiserver-minikube                 1/1       Running   0          34m
    pod/kube-controller-manager-minikube        1/1       Running   0          34m
    pod/kube-proxy-rnlps                        1/1       Running   0          34m
    pod/kube-scheduler-minikube                 1/1       Running   0          34m
    pod/storage-provisioner                     1/1       Running   0          34m
    
    NAME                           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
    service/metrics-server         ClusterIP   10.96.241.45    <none>        80/TCP              26s
    service/kube-dns               ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP       34m
    service/monitoring-grafana     NodePort    10.99.24.54     <none>        80:30002/TCP        26s
    service/monitoring-influxdb    ClusterIP   10.111.169.94   <none>        8083/TCP,8086/TCP   26s
    
  1. 禁用 metrics-server

    minikube addons disable metrics-server
    

    输出结果类似于这样:

    metrics-server was successfully disabled
    

清理

现在可以清理你在集群中创建的资源:

kubectl delete service hello-node
kubectl delete deployment hello-node

停止 Minikube 集群:

minikube stop

可选地,删除 Minikube 虚拟机(VM):

# 可选的
minikube delete

如果你还想使用 Minikube 进一步学习 Kubernetes,那就不需要删除 Minikube。

接下来