在 Kubernetes 上为 AlloyDB Omni 配置内核参数

本页介绍了如何设置托管 AlloyDB Omni 数据库集群的 Kubernetes 节点,以便 AlloyDB Omni Kubernetes 操作器和 AlloyDB Omni 数据库引擎能够实现最佳性能。

通过配置内核参数,AlloyDB Omni 在处理繁重工作负载时可以更高效地使用系统内存和 IO 资源。

前提条件

开始之前,请确保您的 Kubernetes 节点运行的是 Linux 内核 6.1 或更高版本,尤其是支持 MADV_COLLAPSEMADV_POPULATE_WRITE 标志的内核。如需详细了解这些标志,请参阅 Linux madwise 文档

下表列出了运行数据库集群 Pod 的 Kubernetes 节点的必需内核参数及其对应的值:

文件
/sys/kernel/mm/transparent_hugepage/shmem_enabled
如需了解共享内存,请参阅透明超大页支持
within_sizealways
/proc/sys/vm/max_map_count
如需了解进程可以创建的内存映射区域数量,请参阅 /proc/sys/vm 文档
大于或等于 1073741824

如需使用 DaemonSet 在 Kubernetes 节点上配置内核参数,请执行以下操作:

  1. 按照向节点添加标签中的说明,将标签应用于您计划运行数据库集群的节点。

  2. 如需在标记为 LABEL_KEY=LABEL_VALUE 的节点上设置内核参数,请创建一个 DaemonSet:

    cat << EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: alloydb-omni-kernel-tuning
      namespace: DS_NAMESPACE
    spec:
      selector:
        matchLabels:
          name: alloydb-omni-kernel-tuning
      template:
        metadata:
          labels:
            name: alloydb-omni-kernel-tuning
        spec:
          volumes:
            - name: host-sys
              hostPath:
                path: /sys
          nodeSelector:
            LABEL_KEY: "LABEL_VALUE"
          restartPolicy: Always
          terminationGracePeriodSeconds: 1
          initContainers:
            - name: enable-thp-mmc
              image: INIT_IMAGE
              volumeMounts:
                - name: host-sys
                  mountPath: /sys
              securityContext:
                privileged: true
              command: ["sh", "-c", "sysctl -w vm.max_map_count=MAX_MAP_COUNT && echo within_size >/sys/kernel/mm/transparent_hugepage/shmem_enabled"]
          containers:
            - name: CONTAINER_NAME
              image: CONTAINER_IMAGE
              command: ["watch", "-n", "600", "cat", "/sys/kernel/mm/transparent_hugepage/shmem_enabled"]
    EOF
    

    替换以下内容:

    • DS_NAMESPACE:您要部署 DaemonSet 的命名空间,例如 default
    • LABEL_KEY:标签的标识符,例如 workload
    • LABEL_VALUE:与标签标识符关联的数据,例如 database
    • INIT_IMAGE:用于 init 容器的映像的名称。
    • MAX_MAP_COUNT:进程可创建的内存映射区域的数量上限,例如 1073741824
    • CONTAINER_NAME:主容器的名称,例如 main
    • CONTAINER_IMAGE:用于主容器的映像的名称,例如 latest
  3. 部署 DaemonSet 后,如需验证 Kubernetes 集群中的所有 pod 均处于 Running 状态,并且每个节点都有一个标签为 LABEL_KEY=LABEL_VALUE 的 pod,请使用以下命令:

    kubectl get pods -l LABEL_KEY=LABEL_VALUE
    

    输出示例如下所示:

    NAME                               READY   STATUS    RESTARTS   AGE
    alloydb-omni-kernel-tuning-2dkwh   1/1     Running   0          22s
    alloydb-omni-kernel-tuning-pgkbj   1/1     Running   0          19s
    
  4. 如需验证内核标志是否已成功应用,请针对部署 DaemonSet 后识别出的每个 Pod 运行以下命令:

    kubectl logs POD_NAME
    

    POD_NAME 替换为您要检查日志的 Pod 的名称。

    输出示例如下所示:

    always [within_size] advise never deny force
    

如需在 Kubernetes 节点上使用推荐的 kernel 参数部署数据库集群,请将 nodeAffinity 部分添加到数据库集群清单的以下某个部分:

  • primarySpec.schedulingConfig(适用于主实例)
  • spec.schedulingConfig(适用于读取池实例)
      nodeaffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: LABEL_KEY
              operator: In
              values:
              - "LABEL_VALUE"

如需详细了解如何在特定 Kubernetes 节点上运行数据库集群,请参阅使用调度功能将节点分配给数据库集群

验证内核参数的应用

如需验证内核参数是否已应用于数据库 pod,请执行以下操作:

  1. 如果启用了高可用性(具体而言,spec.availability.numberOfStandbys 设置为大于零的值),请验证数据库自定义资源的 DBCLUSTERPHASE 列中显示 DBClusterReady,并且 HAREADYSTATUS 列中显示 True

    kubectl get dbcluster -n DBCLUSTER_NAMESPACE DBCLUSTER_NAME
    

    替换以下内容:

    • DBCLUSTER_NAME:您要验证的数据库集群的名称。
    • DBCLUSTER_NAMESPACE:数据库集群所在的特定命名空间的名称。

    输出示例如下所示:

    NAME               PRIMARYENDPOINT   PRIMARYPHASE   DBCLUSTERPHASE   HAREADYSTATUS   HAREADYREASON
    dbcluster-sample   10.29.21.240      Ready          DBClusterReady   True            Ready
    
  2. 列出属于数据库集群的 Kubernetes Pod:

    kubectl get pods -n DBCLUSTER_NAMESPACE -l alloydbomni.internal.dbadmin.goog/dbcluster=DBCLUSTER_NAME
    
  3. 如需查看共享内存信息,请运行以下命令:

    kubectl exec -n DBCLUSTER_NAMESPACE POD_NAME -- grep Shmem /proc/meminfo
    
  4. 输出的所有条目中都必须包含非零数字。

    输出示例如下所示:

    Shmem:          126255872 kB
    ShmemHugePages: 18403328 kB
    ShmemPmdMapped:  2961408 kB
    

    如果您在任何条目中看到 0 kB,请重启相应的 pod:

    kubectl delete pod -n DBCLUSTER_NAMESPACE POD_NAME
    
  5. 在 Pod 处于 Running 状态后,重复第 1 步到第 5 步。