4.2. 管理 Kubernetes 群集

自助服务用户可以部署随时可用的 Kubernetes 簇,这些簇具有持续的存储用于管理容器化的应用程序。

Kubernetes 群集包含下列组件:

表 4.2.1 Kubernetes 组件

组件

名称和版本

底层操作系统

Fedora 29 Atomic 主机

容器运行时

Docker 1.13.1

网络插件

Flannel with VXLAN

创建 Kubernetes 簇的先决条件是:

  • Kubernetes 即服务组件。它可以与计算簇一起部署,或者以后部署(请参见 Creating the Compute ClusterManaging Add-On Services)。

  • 相互连接 Kubernetes 主节点和工作线程节点的网络。它可以是共享的物理网络或通过虚拟路由器链接到物理网络的虚拟网络。虚拟网络需要具有指定的网关和 DNS 服务器。

  • 将安装在主节点和工作线程节点上的 SSH 密钥。

  • 用于所有 Kubernetes 节点的足够资源,考虑其 Flavor。

重要

它还要求在其中创建 Kubernetes 簇的网络与以下默认网络不重叠:

  • 10.100.0.0/24—用于 pod 级网络

  • 10.254.0.0/16—用于分配 Kubernetes 群集 IP 地址

要创建 Kubernetes 簇,请在 Kubernetes 簇屏幕上,单击右侧的创建。将打开一个窗口,可以在其中设置簇参数:

  1. 集群部分中,选择 Kubernetes 版本、输入簇名称,并选择 SSH 密钥。

    ../_images/ss_kubernetes1_ac.png
  2. 网络部分中,选择一个在上述先决条件中提到的虚拟路由器。还建议选中使用浮动 IP 地址框。在此情况下,将为 Kubernetes 节点指派公共 IP 地址,从而简化对它们的访问。

    ../_images/ss_kubernetes2_ac.png
  3. 主节点部分中,选择一个规格,然后选择是否为主节点启用高可用性。如果启用高可用性,则创建三个主节点实例。它们将在“活动/活动”模式下工作。

    ../_images/ss_kubernetes3_ac.png
  4. 容器卷部分中,选择存储策略,然后在主节点和工作线程节点上输入卷的大小。

    ../_images/ss_kubernetes4_ac.png
  5. 工作线程部分中,设置大量工作线程以创建并选择每个工作线程的规格。

    ../_images/ss_kubernetes5_ac.png
  6. 最后,单击创建

将开始创建 Kubernetes 簇。主节点和工作线程节点将显示在虚拟机屏幕上,而其卷将显示在屏幕上。

在簇准备就绪后,单击 Kubernetes 访问以获取有关如何访问仪表板的说明。

要删除 Kubernetes 簇,请在 Kubernetes 簇屏幕上单击它并单击删除。主和工作线程 VM 将与其卷一起删除。

4.2.1. 为 Kubernetes Pod 使用持久化卷

Kubernetes 允许使用计算卷作为持久化 pod 存储。持久化卷 (PV) 独立于 pod 存在,这意味着在 pod 加载到的卷删除之后,此类卷仍持续。此 PV 可以加载到其他 pod 用于访问在其上存储的数据。您可以动态调配 PV,无需手动创建它们,或者使用存在于计算簇上的卷静态调配。

4.2.1.1. 创建存储类

在 Acronis Cyber Infrastructure 中,存储类会映射到在管理面板中定义的计算存储策略。需要为 Kubernetes 簇中的所有存储操作创建一个存储类。

要创建存储类,请在 Kubernetes 仪表板上单击 + CREATE 并指定定义此对象的 YAML 文件。例如:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: mysc
provisioner: csi-cinderplugin
parameters:
  type: default

此清单描述了使用存储策略默认的存储类 mysc。存储策略必须存在于计算簇中,并按存储空间配额指定给当前项目。

4.2.1.2. 动态调配持久化卷

持久化卷可以通过持久化卷声明 (PVC) 动态调配。针对特定存储类、访问模式和大小的 PV 的 PVC 请求。如果簇中存在合适的 PV,则它绑定到声明。如果合适的 PV 不存在但可以调配,则将创建新卷并绑定到该声明。Kubernetes 使用 PVC 来获取支持它的 PV 并将其加载到 pod。

重要

Pod 和它所使用的持久化卷声明必须存在于相同的命名空间中。

可以按以下步骤将 PV 动态调配给 pod:

  1. 通过仪表板访问 Kubernetes 簇。单击 Kubernetes 访问获取说明。

  2. 在 Kubernetes 仪表板上,按照 创建存储类 中所述创建存储类。

  3. 创建持久化卷声明。要这样做,请单击 + CREATE 并指定以下 YAML 文件:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: mypvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      storageClassName: mysc
    

    此清单会指定持久化卷声明 mypvc,该声明会从存储类 mysc 请求一个至少 10 GB 的卷,该卷可以在读写模式下由一个节点进行加载。

    创建 PVC 将触发指定声明要求的持久化卷的动态调配。然后 Kubernetes 将其绑定到声明。

    ../_images/ss_kubernetes6.png
  4. 创建 pod 并将 PVC 指定为其卷。要这样做,请单击 + CREATE 并输入以下 YAML 文件:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP
        volumeMounts:
          - mountPath: /var/lib/www/html
            name: mydisk
      volumes:
      - name: mydisk
        persistentVolumeClaim:
          claimName: mypvc
          readOnly: false
    

    此配置文件描述 pod nginx,它使用持久化卷声明 mypvc。绑定到声明的持久化卷可以在 nginx 容器内的 /var/lib/www/html 处访问。

4.2.1.3. 静态调配持久化卷

可以使用持久化卷的静态调配将现有计算卷加载到 pod。要加载计算卷,请执行以下操作:

  1. 在自助服务面板中,获取所需卷的 ID。

    ../_images/ss_kubernetes7_ac.png
  2. 通过仪表板访问 Kubernetes 簇。单击 Kubernetes 访问获取说明。

  3. 在 Kubernetes 仪表板上,按照 创建存储类 中所述创建存储类。

  4. 创建持久化卷。要这样做,请单击 + CREATE 并指定以下 YAML 文件:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        pv.kubernetes.io/provisioned-by: csi-cinderplugin
      name: mypv
    spec:
      accessModes:
      - ReadWriteOnce
      capacity:
        storage: 10Gi
      csi:
        driver: cinder.csi.openstack.org
        fsType: ext4
        volumeHandle: c5850e42-4f9d-42b5-9bee-8809dedae424
      persistentVolumeReclaimPolicy: Delete
      storageClassName: mysc
    

    此清单会从存储类 mysc 指定持久化卷 mypv,该卷有 10 GB 的存储空间以及允许它在读写模式下由一个节点进行加载的访问模式。PV mypv 使用 ID 为 c5850e42-4f9d-42b5-9bee-8809dedae424 的计算卷作为备份存储。

  5. 创建持久化卷声明。在定义 PVC 之前,确保 PV 已创建并具有状态“可用”。现有 PV 必须满足声明对存储大小、访问模式和存储类的要求。单击 + CREATE 并指定以下 YAML 文件:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: mypvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      storageClassName: mysc
    

    创建的持久化卷声明 mypvc 后,卷 mypv 会绑定到它。

    ../_images/ss_kubernetes8.png
  6. 创建 pod 并将 PVC 指定为其卷。在 动态调配持久化卷 中从步骤 3 使用该示例。

    在自助服务面板中,计算卷将加载到运行 Kubernetes pod 的虚拟机。

    ../_images/ss_kubernetes9_ac.png

4.2.2. 在 Kubernetes 中创建外部负载均衡器

在 Kubernetes 中,可以创建具有外部负载均衡器的服务,该负载均衡器提供从公用网络对服务的访问。负载均衡器将收到可公开访问的 IP 地址,并将传入请求路由到 Kubernetes 群集节点上的正确端口。

要创建具有外部负载均衡器的服务,请执行以下操作:

  1. 通过仪表板访问 Kubernetes 簇。单击 Kubernetes 访问获取说明。

  2. 在 Kubernetes 仪表板上,创建部署和 LoadBalancer 类型的服务。要这样做,请单击 + CREATE 并指定定义这些对象的 YAML 文件。例如:

    • 如果已在共享的物理网络中部署了 Kubernetes 群集,则指定以下清单:

      apiVersion: apps/v1beta1
      kind: Deployment
      metadata:
        name: nginx
      spec:
        replicas: 2
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx
              ports:
              - containerPort: 80
      ---
      kind: Service
      apiVersion: v1
      metadata:
        name: load-balancer
        annotations:
          service.beta.kubernetes.io/openstack-internal-load-balancer: "true"
      spec:
        selector:
          app: nginx
        type: LoadBalancer
        ports:
        - port: 80
          targetPort: 80
          protocol: TCP
      

      上述清单描述了具有两个 pod 的副本集的部署 nginx,以及具有 LoadBalancer 类型的服务负载均衡器。用于服务的批注指出负载均衡器将是内部的。

      创建负载均衡器后,将从共享的物理网络为其分配一个 IP 地址,并且可以在此外部端点上访问它。

      ../_images/ss_kubernetes11.png
    • 如果您已通过虚拟路由器链接到物理网络的虚拟网络中部署了 Kubernetes 群集,可以使用上述 YAML 文件,无需负载均衡器服务的批注部分。创建的负载均衡器将从物理网络收到一个浮动 IP 地址,并且可以在此外部端点上访问它。

负载均衡器还将出现在自助服务面板上,可以在其中监视其性能和运行状况。例如:

../_images/ss_kubernetes12_ac.png