二进制文件自定义使用指导

背景信息

本文档介绍如何使用Custom Resource(CR)来动态配置Kubelet和Containerd组件。在bc中有对kubelet和containerd的配置cr的引用。kubelet的cr缩写为kct,containerd的cr缩写为cct。可以编辑kct和cct完成对自定义的kubelet和containerd配置项导入。

前提条件

创建集群中使用CR来完成Kubelet和Containerd配置。

使用限制

无。

使用教程

KubeletConfig CR配置

概述

KubeletConfigCR允许通过Kubernetes资源来动态配置Kubelet的配置文件和systemd服务文件,而无需手动编辑节点上的文件。

CR结构

apiVersion: bke.bocloud.com/v1beta1
kind: KubeletConfig
metadata:
  name: <config-name>
  namespace: <namespace>  # 默认为 bke-system
spec:
  kubeletConfig:
    kubelet.conf:
      raw: |
        # Kubelet 配置文件的 YAML 内容
  kubeletService:
    service:
      # Kubelet systemd 服务配置

spec字段说明

spec.kubeletConfig

用于配置Kubelet的配置文件(/var/lib/kubelet/config.yaml)。

参数 类型 是否必选 描述
kubelet.conf map[string]RawExtension 包含raw字段的配置对象
kubelet.conf.raw string Kubelet配置文件的完整YAML内容

raw 字段格式:

raw字段应包含完整的Kubelet配置文件YAML内容,例如:

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
clusterDNS:
  - 10.96.0.10
clusterDomain: cluster.local
...

kubelet.config实现对填写的kubelet.conf.raw的透传,需要由用户保证传入的配置项正确。

spec.kubeletService

用于配置Kubelet的systemd服务文件(/etc/systemd/system/kubelet.service)。

参数 类型 是否必选 描述
service KubeletService Kubelet systemd服务配置对象

kubeletService 字段说明:

参数 类型 是否必选 描述
ExecStart string 服务启动命令
Restart string 重启策略(如:always,on-failure)
RestartSec string 重启间隔时间(如:5s,10s)
StartLimitInterval string 启动限制时间窗口
StartLimitBurst int 启动限制次数
KillMode string 终止模式(如:control-group,process)
StandardOutput string 标准输出重定向 (如:journal,null)
StandardError string 标准错误重定向
SyslogIdentifier string 系统日志标识符
WorkingDirectory string 工作目录
User string 运行用户
Group string 运行组
ExecStartPre []string 启动前执行的命令列表
Environment []string 环境变量列表 (格式:KEY=VALUE)
EnvironmentFile []string 环境变量文件路径列表
CustomExtra map[string]string 自定义额外配置项(键值对)

kubelet.service是对kubelet启动时service支持的配置项。

kubelet动态传值功能

动态传值机制允许在配置文件中使用变量,这些变量会在部署时被实际值替换。这提供了极大的灵活性,使得同一份配置可以适用于不同的节点和环境。

启用变量替换

BKECluster的部署过程中,系统会自动检测KubeletConfigRef,并启用变量替换功能。变量替换会在以下两个地方生效:

  1. kubelet.conf配置
  2. kubelet.servicesystemd服务文件

表达式变量:${EXPR|command|END}

执行shell命令并将输出作为变量值。

语法

${EXPR|shell_command|END}

示例

spec:  kubeletConfig:    
  kubelet.conf:      
    raw: |        
        apiVersion: kubelet.config.k8s.io/v1beta1
        kind: KubeletConfiguration
        # 获取 CPU 核心数
        cpuManagerPolicy: "static"
        reservedSystemCPUs: "${EXPR|nproc|END}"
        # 获取内存大小(MB)
        evictionHard:
          memory.available: "${EXPR|free -m | grep Mem | awk '{print $2}'|END}Mi"
        # 获取主机名
        hostnameOverride: "${EXPR|hostname|END}"

输入图片说明说明:

  • 命令会在目标节点上执行。
  • 命令执行失败时,变量会保持原样(不替换)。
  • 命令输出会去除首尾空白字符。

kubelet配置文件kct参考

my-kubelet.yaml

apiVersion: bke.bocloud.com/v1beta1
kind: KubeletConfig
metadata:
  name: my-kubelet
  namespace: my-kubelet
  labels:
    test: "true"
    component: "kubelet"
spec:

  kubeletConfig:
    kubelet.conf:
      raw: |
        apiVersion: kubelet.config.k8s.io/v1beta1
        kind: KubeletConfiguration
        authentication:
          anonymous:
            enabled: false
          webhook:
            cacheTTL: 2m0s
            enabled: true
          x509:
            clientCAFile: /etc/kubernetes/pki/ca.crt
        authorization:
          mode: Webhook
          webhook:
            cacheAuthorizedTTL: 5m0s
            cacheUnauthorizedTTL: 30s
        address: "${EXPR|ip -4 addr show | awk '/inet / {split($2,a,"/"); print a[1]}' | grep -vE '^127\.0\.0\.1|^169\.254\.' | head -n1|END}"
        port: 10250
        readOnlyPort: 0
        cgroupDriver: systemd
        hairpinMode: promiscuous-bridge
        serializeImagePulls: false
        clusterDNS:
          - "10.96.0.10"
        clusterDomain: "cluster.local"
        healthzBindAddress: 127.0.0.1
        healthzPort: 10248
        rotateCertificates: true
        staticPodPath: /etc/kubernetes/manifests
        streamingConnectionIdleTimeout: 4h0m0s
        syncFrequency: 1m0s
        volumeStatsAggPeriod: 1m0s

  kubeletService:
    enabled: true
    serviceName: "kubelet"
    unit:
      description: "Kubernetes Kubelet (my-Test)"
      documentation: "https://kubernetes.io/docs/concepts/overview/components/#kubelet"
      after:
        - "containerd.service"
        - "network-online.target"
      wants:
        - "network-online.target"
      requires:
        - "containerd.service"
    service:
      workingDirectory: "/var/lib/kubelet"
      execStartPre:
        - "/usr/bin/mkdir -p /sys/fs/cgroup/cpuacct/system.slice/kubelet.service"
        - "/usr/bin/mkdir -p /sys/fs/cgroup/hugetlb/system.slice/kubelet.service"
      execStart: "/usr/bin/kubelet \
      --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
      --kubeconfig=/etc/kubernetes/admin.conf \
      --config=/var/lib/kubelet/config.yaml \
      --container-runtime-endpoint=unix:///run/containerd/containerd.sock \
      --pod-infra-container-image=registry.k8s.io/pause:3.9 \
      --cgroup-driver=systemd \
      --register-node=true \
      --v=2 \
      --node-ip=${EXPR|ip -4 addr show scope global | awk '/inet /{print $2}' | cut -d'/' -f1|END} \
      --hostname-override=${EXPR|hostname -i | awk '{print $1}'|END}
      "
      restart: "always"
      restartSec: 10
      startLimitInterval: 30
      startLimitBurst: 3
      killMode: "process"
      standardOutput: "syslog"
      standardError: "syslog"
      syslogIdentifier: "kubelet"
      user: "root"
      group: "root"

    install:
      wantedBy:
        - "multi-user.target"
      requiredBy: []

    variables:
      kubeletBinaryPath: "/usr/bin/kubelet"
      kubeletConfigPath: "/etc/kubernetes/kubelet.conf"
      nodeName: "test-node-01"
      nodeIP: "xx"
      containerdEndpoint: "unix:///run/containerd/containerd.sock"
      pauseImage: "registry.aliyuncs.com/google_containers/pause:3.9"

ContainerdConfig CR配置

概述

ContainerdConfigCR允许通过Kubernetes资源来动态配置Containerd的主配置文件、服务文件和镜像仓库配置。

CR结构

apiVersion: bke.bocloud.com/v1beta1
kind: ContainerdConfig
metadata:
  name: <config-name>
  namespace: <namespace>
spec:
  script:
    # 脚本配置
  service:
    # Containerd systemd 服务配置
  main:
    # Containerd 主配置文件 (config.toml)
  registry:
    # 镜像仓库配置

spec字段说明

spec.script

用于在配置Containerd前执行自定义脚本。

参数 类型 是否必选 描述
Content string 脚本内容(内联脚本)
Path string 脚本文件路径(本地文件)
Interpreter string 解释器(如:/bin/bash, /bin/sh),默认为/bin/bash
Args []string 传递给脚本的参数列表

输入图片说明说明:
ContentPath二选一,如果都提供则优先使用Content

spec.service

用于配置Containerd的systemd服务drop-in文件(/etc/systemd/system/containerd.service.d/10-override.conf)。

参数 类型 是否必选 描述
ExecStart string 服务启动命令
Slice string systemd slice单元
KillMode string 终止模式
Restart string 重启策略
RestartSec string 重启间隔时间
TimeoutStopSec string 停止超时时间
StartLimitInterval string 启动限制时间窗口
StartLimitBurst int 启动限制次数
Logging LoggingConfig 日志配置
CustomExtra map[string]string 自定义额外配置项

LoggingConfig字段:

参数 类型 是否必选 描述
StandardOutput string 标准输出重定向
StandardError string 标准错误重定向
SyslogIdentifier string 系统日志标识符
LogLevelMax string 最大日志级别

spec.main

用于配置Containerd的主配置文件 (/etc/containerd/config.toml)。

参数 类型 是否必选 描述
SandboxImage string Pod 沙箱镜像 (如:pause镜像)
Root string Containerd数据根目录,默认为/var/lib/containerd
State string Containerd状态目录,默认为/run/containerd
ConfigPath string 配置文件路径,默认为/etc/containerd/certs.d
MetricsAddress string 指标监听地址

输入图片说明说明:
如果指定了main字段,系统会根据模板生成config.toml文件。如果未指定,则使用默认配置。

spec.registry

用于配置镜像仓库的 hosts.toml文件。

参数 类型 是否必选 描述
ConfigPath string hosts.toml配置目录,默认为/etc/containerd/certs.d
Configs map[string]RegistryHostConfig 仓库配置映射,键为仓库名称

RegistryHostConfig字段:

参数 类型 是否必选 描述
Host string 仓库主机地址
Capabilities []string 支持的能力(如:pull,push,resolve)
SkipVerify bool 跳过TLS验证
PlainHTTP bool 使用HTTP而非HTTPS
Insecure bool 不安全连接
OverridePath bool 覆盖路径
TLS TLSConfig TLS配置
Auth RegistryAuthConfig 认证配置
Header map[string][]string 自定义HTTP头

TLSConfig字段:

参数 类型 是否必选 描述
CAFile string CA证书文件路径
CertFile string 客户端证书文件路径
KeyFile string 客户端私钥文件路径
InsecureSkipVerify bool 跳过TLS验证

RegistryAuthConfig字段:

参数 类型 是否必选 描述
Auth string Base64编码的认证字符串
Username string 用户名
Password string 密码
IdentityToken string 身份令牌
RegistryToken string 仓库令牌