一、使用 Minikube 创建集群
1、Kubernetes 集群
Kubernetes 协调一个高可用计算机集群,每个计算机作为独立单元互相连接工作。 Kubernetes 中的抽象允许你将容器化的应用部署到集群,而无需将它们绑定到某个特定的独立计算机。为了使用这种新的部署模型,应用需要以将应用与单个主机分离的方式打包:它们需要被容器化。与过去的那种应用直接以包的方式深度与主机集成的部署模型相比,容器化应用更灵活、更可用。 Kubernetes 以更高效的方式跨集群自动分发和调度应用容器。 Kubernetes 是一个开源平台,并且可应用于生产环境。
一个 Kubernetes 集群包含两种类型的资源:
- Control Plane 调度整个集群
- Nodes 负责运行应用
2、集群图
Control Plane 负责管理整个集群。 Control Plane 协调集群中的所有活动,例如调度应用、维护应用的所需状态、应用扩容以及推出新的更新。
Node 是一个虚拟机或者物理机,它在 Kubernetes 集群中充当工作机器的角色 每个Node都有 Kubelet , 它管理 Node 而且是 Node 与 Control Plane 通信的代理。 Node 还应该具有用于处理容器操作的工具,例如 Docker 或 rkt 。处理生产级流量的 Kubernetes 集群至少应具有三个 Node,因为如果一个 Node 出现故障其对应的 etcd 成员和控制平面实例都会丢失,并且冗余会受到影响。 你可以通过添加更多控制平面节点来降低这种风险 。
Control Plane 管理集群,Node 用于托管正在运行的应用。
在 Kubernetes 上部署应用时,你告诉 Control Plane 启动应用容器。 Control Plane 就编排容器在集群的 Node 上运行。 Node 使用 Control Plane 暴露的 Kubernetes API 与 Control Plane 通信。终端用户也可以使用 Kubernetes API 与集群交互。
Kubernetes 既可以部署在物理机上也可以部署在虚拟机上。你可以使用 Minikube 开始部署 Kubernetes 集群。 Minikube 是一种轻量级的 Kubernetes 实现,可在本地计算机上创建 VM 并部署仅包含一个节点的简单集群。 Minikube 可用于 Linux , macOS 和 Windows 系统。Minikube CLI 提供了用于引导集群工作的多种操作,包括启动、停止、查看状态和删除。
3、创建 Minikube 集群
首先确定已经安装minikube, kubectl。
minikube start
4、打开仪表板
打开 Kubernetes 仪表板。你可以通过两种不同的方式执行此操作:
打开一个新的终端,然后运行:
# 启动一个新的终端,并保持此命令运行。
minikube dashboard
现在,切换回运行 minikube start
的终端。
如果你不想 Minikube 为你打开 Web 浏览器,可以使用 --url
标志运行仪表板命令。 minikube
会输出一个 URL,你可以在你喜欢的浏览器中打开该 URL。
打开一个新的终端,然后运行:
# 启动一个新的终端,并保持此命令运行。
minikube dashboard --url
现在,切换回运行 minikube start
的终端。
5、创建 Deployment
Kubernetes Pod 是由一个或多个为了管理和联网而绑定在一起的容器构成的组。本教程中的 Pod 只有一个容器。 Kubernetes Deployment 检查 Pod 的健康状况,并在 Pod 中的容器终止的情况下重新启动新的容器。 Deployment 是管理 Pod 创建和扩展的推荐方法。
-
使用
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
-
查看 Deployment:
kubectl get deployments
输出结果类似于这样:
NAME READY UP-TO-DATE AVAILABLE AGE hello-node 1/1 1 1 1m
-
查看 Pod:
kubectl get pods
输出结果类似于这样:
NAME READY STATUS RESTARTS AGE hello-node-5f76cf6ccf-br9b5 1/1 Running 0 1m
-
查看集群事件:
kubectl get events
-
查看
kubectl
配置:kubectl config view
6、创建 Service
默认情况下,Pod 只能通过 Kubernetes 集群中的内部 IP 地址访问。 要使得 hello-node
容器可以从 Kubernetes 虚拟网络的外部访问,你必须将 Pod 暴露为 Kubernetes Service。
-
使用
kubectl expose
命令将 Pod 暴露给公网:kubectl expose deployment hello-node --type=LoadBalancer --port=8080
这里的
--type=LoadBalancer
参数表明你希望将你的 Service 暴露到集群外部。测试镜像中的应用程序代码仅监听 TCP 8080 端口。 如果你用
kubectl expose
暴露了其它的端口,客户端将不能访问其它端口。
-
查看你创建的 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
访问。
-
运行下面的命令:
minikube service hello-node
这将打开一个浏览器窗口,为你的应用程序提供服务并显示应用的响应。
7、启用插件
Minikube 有一组内置的插件, 可以在本地 Kubernetes 环境中启用、禁用和打开。
-
列出当前支持的插件:
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
-
启用插件,例如
metrics-server
:minikube addons enable metrics-server
输出结果类似于这样:
The 'metrics-server' addon is enabled
-
查看通过安装该插件所创建的 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
-
禁用
metrics-server
:minikube addons disable metrics-server
输出结果类似于这样:
metrics-server was successfully disabled
8、清理
现在可以清理你在集群中创建的资源:
kubectl delete service hello-node
kubectl delete deployment hello-node
停止 Minikube 集群:
minikube stop
可选地,删除 Minikube 虚拟机(VM):
# 可选的
minikube delete
如果你还想使用 Minikube 进一步学习 Kubernetes,那就不需要删除 Minikube。