发布渠道

本主题介绍了发布渠道,这些渠道提供了 GKE 集群版本控制和升级的 Google Kubernetes Engine (GKE) 最佳做法。

概览

Google 经常发布 Kubernetes 更新,以提供安全更新、解决已知问题以及推出新功能。发布渠道可让客户能够平衡集群中所部署版本的稳定性和功能集。

当您在发布渠道中注册新集群时,Google 会自动管理集群及其节点池的版本和升级频率。所有渠道都提供支持的 GKE 版本,且被视为正式版 (GA)(虽然并非各个功能都如标记的那样是 GA)。这些渠道中的 Kubernetes 版本是 Kubernetes 官方版本,同时包含 GA 和 Beta 版 Kubernetes API(如标记的那样)。新的 Kubernetes 版本会先发布到快速渠道,然后随着时间的推移将升级到常规和稳定渠道。这可让您的集群订阅满足您的业务、稳定性和功能需求的渠道。

默认情况下,在 GKE 中创建的新集群会在“常规”发布渠道中注册。

您可以获得哪些渠道?

您可以获得以下发布渠道。每个渠道都在功能可用性和更新流失率之间进行权衡取舍。虽然每个渠道都有不同的资格标准,但所有渠道都提供经过测试的 Kubernetes GA 版本。

Channel 新版 Kubernetes 的可用性 属性
快速 在上游开源 GA 几周后* 尽早获取最新的 Kubernetes 版本,并在新的 GKE 功能正式发布时能立即使用它们。您的集群会经常更新以保持为可用的最新补丁程序版本,并提供较新的 Kubernetes 功能。 虽然订阅快速渠道的集群使用 GA 版本,但快速渠道最适合用于在预生产环境中测试较新的 Kubernetes 版本和 API。由于快速渠道提供最新的 GKE 版本,因此这些版本被排除在 GKE 服务等级协议 (SLA) 之外,并且可能包含没有已知解决方法的问题。
常规(默认) 通过快速渠道发布后的 2-3 个月 * 在 GKE 和 Kubernetes 功能首次发布后的合理时间内可以尽快访问,但应该基于经过较长时间段验证合格的版本。兼顾功能可用性和版本稳定性,是我们向大多数用户推荐的做法。
稳定版 通过常规渠道发布后的 2-3 个月 * 优先考虑新功能的稳定性。此渠道中的变更和新版本将最后发布,也就是经过快速渠道和常规渠道的验证之后,因而有更多验证时间

*确切的发布时间表取决于多种因素(包括开放源代码发布和修补时间表),因此可能会发生变化。如需了解最新信息,请查看 GKE 版本说明或订阅您的渠道的 RSS Feed。

如果您在发布渠道中注册集群,则该集群会在该发布渠道提供新版本时自动升级。

如果次要版本积累了一定的使用量并且在快速渠道中显示出了稳定性,则其会被提升为常规渠道。最后,次要版本会被提升为仅接收高优先级更新的稳定渠道。根据观察到的运行该版本的集群性能,每次提升都标志着稳定性和生产就绪性逐步提高。

我们会向所有发布渠道提供重要的安全补丁程序,以保护您的集群和 Google 的基础架构。

无渠道

为了更直接地管理集群的版本和节点,您可以通过指定静态 GKE 版本来选择不在发布版本中注册集群(即无渠道)。不使用发布版本意味着您需要负责管理节点升级策略。此外,您仍必须遵守 Kubernetes 版本和版本倾斜支持政策,并使用受支持的 GKE 版本

无论您的集群是否已注册发布版本,集群控制层面都会始终定期升级

一个渠道提供哪些版本?

每个发布渠道都会提供默认版本以及该渠道可用的一组版本,使您能够在升级生产环境之前使用新的可用版本让您的工作负载可操作性符合资格。这些版本已符合该特定渠道的资格标准。

  • 新的补丁程序版本至少在一周后才能成为所有渠道的默认版本。
  • 有新的次要版本可用:
    • 至少两周后才能成为快速渠道的默认版本。
    • 至少四周后才能成为常规渠道和稳定渠道的默认版本。

GKE 建议测试可用版本,以缓解与升级相关的中断故障。订阅预生产环境以接收渠道中可用的所有版本就是这样的一种方法。如果测试或验证需要更多时间,则 GKE 建议使用排除时间段来推迟自动升级。

GKE 会逐步将集群自动升级到默认版本。如果需要更好地控制升级过程,我们建议提前升级到可用的版本。当集群资源的版本等于或高于自动升级目标时,GKE 自动升级过程不会修改这些资源。集群或节点可以提前手动升级,以跳过自动升级过程。

如需查看发布渠道的默认版本和可用版本,请运行以下命令,注意将 COMPUTE_ZONE 替换为您的计算区域

gcloud container get-server-config --format "yaml(channels)" --zone COMPUTE_ZONE

了解渠道的新功能

如需了解发布渠道的新功能,请查看版本说明。除了总体版本说明之外,每个发布渠道还有单独的版本说明。

发布渠道 版本说明
快速渠道 HTMLAtom Feed
常规渠道 HTMLAtom Feed
稳定渠道 HTMLAtom Feed

我应该使用哪种渠道?

渠道仅包含 Kubernetes 的 GA 版本,并且每个渠道都代表 Kubernetes 和 GKE 版本质量和成熟度的不同级别。下图说明了发布渠道的采用周期:

发布渠道的采用周期

对于要求成熟度超过较新功能的生产工作负载,我们建议使用常规(默认)渠道或稳定渠道。

  • 如果您需要密切跟踪新功能,请考虑使用常规渠道,它可以平衡 Kubernetes OSS 版本的稳定性和新鲜度。
  • 如果您的需求注重成熟度,尤其是对于生产集群,请使用稳定渠道。

GKE 会将集群升级到符合渠道质量标准的较新版本。不过,我们建议您提前升级您的集群,因为这样可以为您带来以下好处:

  • 更好地控制您的升级,并与您的工作时间保持一致。
  • 更好地进行预测,因为 GKE 不会自动升级满足版本目标的集群(即,已手动升级到下一个目标版本的集群)。节点会自动升级到所选渠道中的推荐版本,以便与控制层面(主服务器)版本保持一致,并保护您免受漏洞和不受支持的版本倾斜的影响。

在发布渠道中注册集群

您可以在发布渠道中注册新集群或现有集群。

注册新集群

您可以使用 gcloud 或 Google Cloud Console 在发布渠道中创建和注册新集群。默认情况下,新集群会在“常规”发布渠道中自动注册;您可以选择在创建过程中指定其他渠道

控制台

  1. 转到 Cloud Console 中的 Google Kubernetes Engine 页面:

    转到 Google Kubernetes Engine

  2. 点击 创建

  3. 控制平面版本下,发布版本选项默认处于选中状态。

  4. 发布渠道下拉列表中,选择要在其中注册集群的发布渠道,或者保留常规渠道的默认值。

  5. 根据需要继续创建集群。

  6. 点击创建

gcloud

如需在特定发布渠道中创建和注册集群,请运行以下命令:

gcloud container clusters create CLUSTER_NAME \
    --zone COMPUTE_ZONE \
    --release-channel CHANNEL \
    ADDITIONAL_FLAGS

请替换以下内容:

  • CLUSTER_NAME:新集群的名称。
  • COMPUTE_ZONE:集群的计算区域
  • CHANNEL:发布渠道的类型:rapidregularstable 之一。
  • ADDITIONAL_FLAGS:您在创建集群时需要指定的任何其他标志。如需查看可选标志的完整列表,请参阅 gcloud container clusters create 文档。

注册现有集群

您可以在发布渠道中注册现有集群,前提是该集群控制层面版本可以升级到发布渠道的默认版本。这意味着发布渠道的默认版本必须与现有控制层面版本相同或至多高一个次要版本。

如需注册,请将集群发布渠道更新为所需的 CHANNEL

查找集群的渠道

您可以使用 gcloud 或 Google Cloud Console 确定集群的发布渠道。

控制台

  1. 访问 Cloud Console 中的 Google Kubernetes Engine 菜单。

    访问 Google Kubernetes Engine 菜单

  2. 点击您要检查的集群的名称。

  3. 集群基本信息下,检查发布版本字段中的值(例如常规版本)。

gcloud

gcloud container clusters describe CLUSTER_NAME \
    --zone COMPUTE_ZONE --format="value(releaseChannel.channel)"

替换以下内容:

  • CLUSTER_NAME:您的集群的名称。
  • COMPUTE_ZONE:集群的计算区域

选择新的发布渠道

在有限的情况下,支持在发布渠道之间迁移。

支持导致单个次要版本升级的转换(例如从稳定渠道迁移到常规渠道)。

由于跨 Kubernetes 次要版本进行降级存在风险,因此无法降级(例如从常规渠道迁移到稳定渠道)。同样,也不支持升级多个次要版本(例如从稳定渠道迁移到快速渠道)。

如需选择新的发布渠道,请更新集群发布渠道,将其更新为所需的 CHANNEL

如果不支持选择新的发布渠道,则我们建议您在所需渠道中创建新的集群并迁移工作负载。如果您希望使用现有的集群,则可以按照退订发布渠道,等待目标发布渠道提供作为集群的 Kubernetes 次要版本,然后按照相关说明在目标发布渠道中注册现有集群

退订发布渠道

如果您选择退订渠道,则集群的节点池将继续启用自动升级和自动修复,即使在停用发布渠道后也是如此。 一个集群不再订阅发布渠道后,您可以手动停用节点自动升级停用节点自动修复

从发布渠道退订集群时,手动升级仍会受到以下限制:

如需退订某个发布渠道,请将集群的发布渠道更新为 None 值:

gcloud container clusters update CLUSTER_NAME \
    --release-channel None

更新集群发布渠道

如需修改现有集群的发布渠道属性,请运行以下命令:

gcloud container clusters update CLUSTER_NAME \
    --release-channel CHANNEL

替换以下内容:

  • CLUSTER_NAME:您的集群的名称。
  • CHANNEL:所需的发布渠道,可以是 rapidregularstableNone 之一。

注意事项

在使用发布版本时,请牢记以下注意事项。

快速版集群和 Alpha 版集群之间的区别

使用快速发布渠道创建的集群不是 Alpha 版集群。具体区别如下:

  • 使用发布渠道的集群可以升级,并且自动升级处于启用状态,无法停用。Alpha 版集群无法升级。
  • 使用发布渠道的集群不会过期。Alpha 版集群会在 30 天后过期。
  • 在使用发布版本的集群上,未启用 Alpha 版 Kubernetes API。

检索升级目标(示例脚本)

您可以使用以下示例脚本检索集群的升级目标。该脚本会执行以下任务:

  • 使用 get-server-config API 拉取每个发布渠道的最新有效版本。
  • 检查集群的控制层面和节点池的当前版本。如果当前版本低于最新有效版本,则脚本将启动自定义升级编排(先是控制层面,然后是节点池)。如果集群不使用发布渠道,脚本将检查最新的有效稳定版本。

示例脚本:检索集群升级目标

#!/bin/bash

# semver_lt checks whether the first semver is less than the second semver.
# It returns 1 if it is less than, and 0 otherwise.
semver_lt() {
    # Get the smaller version by sorting them in ascending semver
    # and grabbing the first line.
    smaller=$(printf "$1\n$2" | sort -V | head -n1)
    if [[ ${1} == "${smaller}" && ${1} != ${2} ]]; then
            return 1
    fi
    return 0
}

# get_latest_valid gets the latest valid version for a release channel.
get_latest_valid() {
        channel=$1
        echo $(gcloud container get-server-config \
        --format="table(channels:format='table(channel,validVersions)')" |\
        grep ${channel} | cut -d"'" -f 2)
}

upgrade_master() {
    echo "Cluster $1 needs to upgrade to $2."
    # Actuate master upgrade.
}

upgrade_np() {
    echo "Node pool $1/$2 needs to upgrade to $3."
    # Actuate node pool upgrade.
}

# Get the latest valid channel versions from server-config.
stable_target=$(get_latest_valid "STABLE")
regular_target=$(get_latest_valid "REGULAR")
rapid_target=$(get_latest_valid "RAPID")
echo "stable version from gcloud: ${stable_target}"
echo "regular version from gcloud: ${regular_target}"
echo "rapid version from gcloud: ${rapid_target}"

# List the clusters by name, master version, zone, and release channel.
clusters=$(gcloud container clusters list \
  --format="table[no-heading](name,master_version(),zone,release_channel.channel)")

IFS=$'\n'
for cluster in ${clusters}
do
    echo ""
    cname=$(printf "${cluster}" | awk '{print $1}')
    master_version=$(printf "${cluster}" | awk '{print $2}')
    zone=$(printf "${cluster}" | awk '{print $3}')
    channel=$(printf "${cluster}" | awk '{print $4}')

    # Determine the target version (default to latest valid stable version).
    target=${stable_target}
    case ${channel} in
        "RAPID")
            target=${rapid_target}
            ;;
        "REGULAR")
            target=${regular_target}
            ;;
        "STABLE")
            target=${stable_target}
            ;;
        esac

    # Check if the master needs to upgrade to the target version.
    semver_lt "${master_version}" "${target}"
    need_upgrade=$?
    if [[ ${need_upgrade} -eq 1 ]]; then
        upgrade_master ${cname} ${target}
    else
        echo "Cluster ${cname} does not need to upgrade."
    fi

    # Then check if the cluster's node pools need to upgrade too.
    nps=$(gcloud container node-pools list --cluster ${cname} --zone ${zone} \
            --format="table[no-heading](name,version)")
    for np in ${nps}
    do
        np_name=$(printf "${np}" | awk '{print $1}')
        np_version=$(printf "${np}" | awk '{print $2}')

        semver_lt "${np_version}" "${target}"
        need_upgrade=$?
        if [[ ${need_upgrade} -eq 1 ]]; then
            upgrade_np ${cname} ${np_name} ${target}
        else
            echo "Node pool ${np_name} does not need to upgrade."
        fi
    done
done

后续步骤