为 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
如需了解共享内存,请参阅透明 Hugepage 支持
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 节点上部署数据库集群,请在数据库集群清单的以下一个部分中添加 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 步。