练习 - 探索 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 安装是步骤最少的安装选项。 切换到终端窗口并运行以下说明中的命令:

  1. 安装 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 管理器。

  1. GitHub 下载并安装最新版本的 Multipass for Windows。

  2. 在命令控制台中,运行 Multipass 启动命令来配置和运行 microk8s-vm 映像。 此步骤可能需要几分钟才能完成,具体取决于 Internet 连接和桌面设备的速度。

    multipass launch --name microk8s-vm --memory 4G --disk 40G
    
  3. 收到 microk8s-vm 的启动确认后,请运行 multipass shell microk8s-vm 命令以访问 VM 实例。

    multipass shell microk8s-vm
    

    一旦 multipass 工作,你就可访问 Ubuntu VM 来托管群集并安装 MicroK8。

  4. 安装 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 管理器。

  1. 在 macOS 上安装 Multipass 有两个选项。 从 GitHub 下载并安装最新版 Multipass for macOS,或使用 Homebrew 通过 brew cask install multipass 命令安装 Multipass。

    brew install --cask multipass
    
  2. 在命令控制台中,运行 Multipass 启动命令来配置和运行 microk8s-vm 映像。 此步骤可能需要几分钟才能完成,具体取决于 Internet 连接和桌面设备的速度。

    multipass launch --name microk8s-vm --memory 4G --disk 40G
    
  3. 收到 microk8s-vm 的启动确认后,请运行 multipass shell microk8s-vm 命令以进入 VM 实例。

    multipass shell microk8s-vm
    

    此时,可以访问 Ubuntu VM 来托管群集。 仍需安装 MicroK8s。 请执行以下步骤。

  4. 安装 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 功能。

  1. 若要检查安装状态,请运行 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
    
  2. 从列表中,需要启用 DNS、仪表板和注册表加载项。 下面是每种加载项的用途:

    外接程序 目的
    DNS 部署 coreDNS 服务。
    仪表板 部署 kubernetes-dashboard 服务和几个支持其功能的其他服务。 它是一种基于 Web 的通用 UI,适用于 Kubernetes 群集。
    注册表 部署专用注册表和多个支持其功能的服务。 若要存储专用容器,请使用此注册表。

    若要安装加载项,请运行以下命令。

    sudo microk8s.enable dns dashboard registry
    

现在,可以使用 kubectl 来访问群集。

探索 Kubernetes 群集

MicroK8s 提供了一个可用于与新的 Kubernetes 群集进行交互的 kubectl 版本。 使用此 kubectl 副本,可以并行安装其他系统范围的 kubectl 实例,而不会影响其功能。

  1. 运行 snap alias 命令,为 microk8s.kubectl 提供别名 kubectl。 此步骤可简化使用。

    sudo snap alias microk8s.kubectl kubectl
    

    当命令成功完成时,会显示以下输出:

    Added:
      - microk8s.kubectl as kubectl
    

显示群集节点信息

回想一下前面的内容,Kubernetes 群集存在于控制平面和工作器节点之外。 让我们浏览新群集以查看安装了哪些内容。

  1. 检查群集中正在运行的节点。

    我们已经了解 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
    
  2. 下一步是浏览群集上运行的服务。 与节点一样,可以运行 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-registrykube-system 命名空间。 可以在此处看到你安装的 registrykube-dnskubernetes-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 很方便,但使用清单文件是最佳做法。 使用清单文件可以在群集中轻松地前滚或回滚部署。 这些文件还有助于记录群集的配置。

  1. 若要创建 NGINX 部署,请运行 kubectl create deployment 命令。 指定用于创建 Pod 的单个实例的部署名称和容器映像。

    sudo kubectl create deployment nginx --image=nginx
    

    结果与以下示例类似:

    deployment.apps/nginx created
    
  2. 若要获取有关部署的信息,请运行 kubectl get deployments

    sudo kubectl get deployments
    

    结果与以下示例类似。 请注意,部署的名称与你为其提供的名称匹配,并且一个具有此名称的部署处于就绪状态且可用。

    NAME    READY   UP-TO-DATE   AVAILABLE   AGE
    nginx   1/1     1            1           18s
    
  3. 该部署创建了一个 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 安装。

  1. 若要查找 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>
    
  2. 若要访问网站,请在之前列出的 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 命令。 指定所需的副本数以及部署的名称。

  1. 若要将 NGINX Pod 的总数调整为 3,请运行 kubectl scale 命令:

    sudo kubectl scale --replicas=3 deployments/nginx
    

    结果与以下示例类似:

    deployment.apps/nginx scaled
    

    该缩放命令可用于增减实例计数。

  2. 若要检查正在运行的 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,会有相关说明。