练习 - 探索 Kubernetes 群集的功能
在本地运行 Kubernetes 时有几个选项可用。 可以在物理计算机和 VM 上安装 Kubernetes,也可以使用 Azure Kubernetes 服务 (AKS) 等基于云的解决方案。
本练习的目标是使用单节点群集探索 Kubernetes 安装。 在此练习中,你将学习如何配置和安装易于设置和拆解的 MicroK8s 环境。 然后,你会部署 Kubernetes 服务,并将其横向扩展到多个实例来托管网站。
注意
本练习是可选的,包含介绍删除和卸载在练习中使用的软件和资源的步骤。
请记住,在 Docker 中还有其他选项(如 MiniKube 和 Kubernetes 支持)可以实现相同的目的。
什么是 MicroK8s?
MicroK8s 是用于将单节点 Kubernetes 群集作为单个包部署到目标工作站和物联网 (IoT) 设备的一种选项。 Canonical 是 Ubuntu Linux 的创建者,最早开发了 MicroK8s,目前也提供相关维护。
在 Linux、Windows 和 macOS 上可安装 MicroK8s。 但是,每个操作系统的安装说明略有不同。 请选择最适合自己环境的选项。
在 Linux 上安装 MicroK8s
MicroK8s 的 Linux 安装是步骤最少的安装选项。 切换到终端窗口并运行以下说明中的命令:
安装 MicroK8s 贴靠应用。 此步骤可能需要几分钟才能完成,具体取决于 Internet 连接和桌面设备的速度。
sudo snap install microk8s --classic
成功安装后会显示以下消息。
2020-03-16T12:50:59+02:00 INFO Waiting for restart... microk8s v1.17.3 from Canonical✓ installed
现在可以在群集上安装加载项。
在 Windows 上安装 MicroK8s
若要在 Windows 上运行 MicroK8s,请使用 Multipass。 Multipass 是适用于 Linux、Windows 和 macOS 的轻型 VM 管理器。
从 GitHub 下载并安装最新版本的 Multipass for Windows。
在命令控制台中,运行 Multipass 启动命令来配置和运行 microk8s-vm 映像。 此步骤可能需要几分钟才能完成,具体取决于 Internet 连接和桌面设备的速度。
multipass launch --name microk8s-vm --memory 4G --disk 40G
收到 microk8s-vm 的启动确认后,请运行
multipass shell microk8s-vm
命令以访问 VM 实例。multipass shell microk8s-vm
一旦 multipass 工作,你就可访问 Ubuntu VM 来托管群集并安装 MicroK8。
安装 MicroK8s 贴靠应用。 此步骤可能需要几分钟才能完成,具体取决于 Internet 连接和桌面设备的速度。
sudo snap install microk8s --classic
成功安装后会显示以下消息:
2020-03-16T12:50:59+02:00 INFO Waiting for restart... microk8s v1.17.3 from Canonical✓ installed
现在可以在群集上安装加载项。
在 macOS 上安装 MicroK8s
若要在 macOS 上运行 MicroK8s,请使用 Multipass。 Multipass 是适用于 Linux、Windows 和 macOS 的轻型 VM 管理器。
在 macOS 上安装 Multipass 有两个选项。 从 GitHub 下载并安装最新版 Multipass for macOS,或使用 Homebrew 通过
brew cask install multipass
命令安装 Multipass。brew install --cask multipass
在命令控制台中,运行 Multipass 启动命令来配置和运行 microk8s-vm 映像。 此步骤可能需要几分钟才能完成,具体取决于 Internet 连接和桌面设备的速度。
multipass launch --name microk8s-vm --memory 4G --disk 40G
收到 microk8s-vm 的启动确认后,请运行
multipass shell microk8s-vm
命令以进入 VM 实例。multipass shell microk8s-vm
此时,可以访问 Ubuntu VM 来托管群集。 仍需安装 MicroK8s。 请执行以下步骤。
安装 MicroK8s 贴靠应用。 此步骤可能需要几分钟才能完成,具体取决于 Internet 连接和桌面设备的速度。
sudo snap install microk8s --classic
成功安装后会显示以下消息:
2020-03-16T12:50:59+02:00 INFO Waiting for restart... microk8s v1.17.3 from Canonical✓ installed
现在可以在群集上安装加载项。
准备群集
若要查看群集上已安装加载项的状态,请在 MicroK8s 中运行 status 命令。 这些加载项可提供服务,某些服务在之前已有介绍。 例如 DNS 功能。
若要检查安装状态,请运行
microk8s.status --wait-ready
命令。sudo microk8s.status --wait-ready
请注意,你的群集上有几个禁用的加载项。 不必担心自己不认识的加载项。
microk8s is running addons: cilium: disabled dashboard: disabled dns: disabled fluentd: disabled gpu: disabled helm3: disabled helm: disabled ingress: disabled istio: disabled jaeger: disabled juju: disabled knative: disabled kubeflow: disabled linkerd: disabled metallb: disabled metrics-server: disabled prometheus: disabled rbac: disabled registry: disabled storage: disabled
从列表中,需要启用 DNS、仪表板和注册表加载项。 下面是每种加载项的用途:
外接程序 目的 DNS 部署 coreDNS
服务。仪表板 部署 kubernetes-dashboard
服务和几个支持其功能的其他服务。 它是一种基于 Web 的通用 UI,适用于 Kubernetes 群集。注册表 部署专用注册表和多个支持其功能的服务。 若要存储专用容器,请使用此注册表。 若要安装加载项,请运行以下命令。
sudo microk8s.enable dns dashboard registry
现在,可以使用 kubectl
来访问群集。
探索 Kubernetes 群集
MicroK8s 提供了一个可用于与新的 Kubernetes 群集进行交互的 kubectl
版本。 使用此 kubectl
副本,可以并行安装其他系统范围的 kubectl
实例,而不会影响其功能。
运行
snap alias
命令,为microk8s.kubectl
提供别名kubectl
。 此步骤可简化使用。sudo snap alias microk8s.kubectl kubectl
当命令成功完成时,会显示以下输出:
Added: - microk8s.kubectl as kubectl
显示群集节点信息
回想一下前面的内容,Kubernetes 群集存在于控制平面和工作器节点之外。 让我们浏览新群集以查看安装了哪些内容。
检查群集中正在运行的节点。
我们已经了解 MicroK8s 是单节点群集安装,所以应该只会看到一个节点。 但请记住,此节点既是群集中的控制平面,又是一个工作器节点。 请通过运行
kubectl get nodes
命令来确认此配置。 若要检索群集中所有资源的相关信息,请运行kubectl get
命令:sudo kubectl get nodes
结果与以下示例类似,其中显示群集中只有一个节点,名称为 microk8s-vm。 请注意,节点处于“就绪”状态。 就绪状态表示控制平面可以在此节点上计划工作负载。
NAME STATUS ROLES AGE VERSION microk8s-vm Ready <none> 35m v1.17.3
你可以获取有关请求的特定资源的详细信息。 例如,假设你需要查找节点的 IP 地址。 若要从 API 服务器中获取额外信息,请运行
-o wide
参数:sudo kubectl get nodes -o wide
结果与以下示例类似。 请注意,现在可以看到节点的内部 IP 地址、节点上运行的 OS、内核版本和容器运行时。
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME microk8s-vm Ready <none> 36m v1.17.3 192.168.56.132 <none> Ubuntu 18.04.4 LTS 4.15.0-88-generic containerd://1.2.5
下一步是浏览群集上运行的服务。 与节点一样,可以运行
kubectl get
命令来查找群集上所运行服务的信息。sudo kubectl get services -o wide
结果与以下示例类似,但请注意,只列出了一个服务。 你之前在群集上安装了加载项,并且希望也能看到这些服务。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 37m <none>
只列出一个服务的原因是 Kubernetes 采用名为“命名空间”的概念,这在逻辑上将一个群集划分为多个虚拟群集。
若要获取所有命名空间中的全部服务,请传递
--all-namespaces
参数:sudo kubectl get services -o wide --all-namespaces
结果与以下示例类似。 请注意,群集中有三个命名空间。 它们是默认、
container-registry
和kube-system
命名空间。 可以在此处看到你安装的registry
、kube-dns
和kubernetes-dashboard
实例。 还有与一些加载项一起安装的支持服务。NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR container-registry registry NodePort 10.152.183.36 <none> 5000:32000/TCP 28m app=registry default kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 37m <none> kube-system dashboard-metrics-scraper ClusterIP 10.152.183.130 <none> 8000/TCP 28m k8s-app=dashboard-metrics-scraper kube-system heapster ClusterIP 10.152.183.115 <none> 80/TCP 28m k8s-app=heapster kube-system kube-dns ClusterIP 10.152.183.10 <none> 53/UDP,53/TCP,9153/TCP 28m k8s-app=kube-dns kube-system kubernetes-dashboard ClusterIP 10.152.183.132 <none> 443/TCP 28m k8s-app=kubernetes-dashboard kube-system monitoring-grafana ClusterIP 10.152.183.88 <none> 80/TCP 28m k8s-app=influxGrafana kube-system monitoring-influxdb ClusterIP 10.152.183.232 <none> 8083/TCP,8086/TCP 28m k8s-app=influxGrafana
现在你能看到群集上运行的服务,接下来可以在工作器节点上计划工作负载。
在群集上安装 Web 服务器
需要在群集上计划 Web 服务器以向客户提供网站。 有几个选项可供选择。 在此示例中,将使用 NGINX。
回想一下前面的内容,你可以使用 Pod 清单文件来描述 Pod、副本集和部署以定义工作负载。 你没有详细查看这些文件,因此运行 kubectl
来将信息直接传递到 API 服务器。
即使使用 kubectl
很方便,但使用清单文件是最佳做法。 使用清单文件可以在群集中轻松地前滚或回滚部署。 这些文件还有助于记录群集的配置。
若要创建 NGINX 部署,请运行
kubectl create deployment
命令。 指定用于创建 Pod 的单个实例的部署名称和容器映像。sudo kubectl create deployment nginx --image=nginx
结果与以下示例类似:
deployment.apps/nginx created
若要获取有关部署的信息,请运行
kubectl get deployments
:sudo kubectl get deployments
结果与以下示例类似。 请注意,部署的名称与你为其提供的名称匹配,并且一个具有此名称的部署处于就绪状态且可用。
NAME READY UP-TO-DATE AVAILABLE AGE nginx 1/1 1 1 18s
该部署创建了一个 Pod。 若要获取有关群集的 Pod 的信息,请运行
kubectl get pods
命令:sudo kubectl get pods
结果与以下示例类似。 请注意,Pod 的名称是生成的值,以部署的名称作为前缀,并且 Pod 的状态为“正在运行”。
NAME READY STATUS RESTARTS AGE nginx-86c57db685-dj6lz 1/1 Running 0 33s
测试网站安装
通过使用 Pod 的 IP 地址连接到 Web 服务器来测试 NGINX 安装。
若要查找 Pod 的地址,请传递
-o wide
参数:sudo kubectl get pods -o wide
结果与以下示例类似。 请注意,该命令会返回节点的 IP 地址,以及计划了工作负载的节点名称。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-86c57db685-dj6lz 1/1 Running 0 4m17s 10.1.83.10 microk8s-vm <none> <none>
若要访问网站,请在之前列出的 IP 上运行
wget
:wget <POD_IP>
结果与以下示例类似:
--2020-03-16 13:34:17-- http://10.1.83.10/ Connecting to 10.1.83.10:80... connected. HTTP request sent, awaiting response... 200 OK Length: 612 [text/html] Saving to: 'index.html' index.html 100%[==============================================================================================>] 612 --.-KB/s in 0s 2020-03-16 13:34:17 (150 MB/s) - 'index.html' saved [612/612]
缩放群集上的 Web 服务器部署
假设你突然发现访问网站的用户增加了,而网站由于这种负载开始出现问题。 你可以在群集中部署更多的站点实例,并将负载分摊到这些实例中。
若要缩放部署中的副本数,请运行 kubectl scale
命令。 指定所需的副本数以及部署的名称。
若要将 NGINX Pod 的总数调整为 3,请运行
kubectl scale
命令:sudo kubectl scale --replicas=3 deployments/nginx
结果与以下示例类似:
deployment.apps/nginx scaled
该缩放命令可用于增减实例计数。
若要检查正在运行的 Pod 数量,请运行
kubectl get
命令,并再次传递-o wide
参数:sudo kubectl get pods -o wide
结果与以下示例类似。 请注意,此时会显示三个正在运行的 Pod,其中每个 Pod 都具有唯一的 IP 地址。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-86c57db685-dj6lz 1/1 Running 0 7m57s 10.1.83.10 microk8s-vm <none> <none> nginx-86c57db685-lzrwp 1/1 Running 0 9s 10.1.83.12 microk8s-vm <none> <none> nginx-86c57db685-m7vdd 1/1 Running 0 9s 10.1.83.11 microk8s-vm <none> <none> ubuntu@microk8s-vm:~$
你需要向群集另外应用几个配置,以便有效地将网站公开为面向公众的网站。 例如,安装负载均衡器并映射节点 IP 地址。 这种类型的配置构成了以后你将探索的高级内容。 在摘要中,如果选择卸载和清理 VM,会有相关说明。