从 AML 1.2 升级

安装 Alauda AI 集群组件

请访问 Alauda AI 集群 以获取:

WARNING

由于我们是从 AML 1.2 升级,请忽略 创建 Alauda AI 集群实例

  1. 下载 Alauda AI 集群KServeless 的操作员捆绑包。
  2. 上传 操作员捆绑包到目标集群。
  3. 将 Alauda AI 集群操作员安装 到目标集群。

升级

以下过程描述了如何从 AML 1.2 升级到 Alauda AI 1.3

在升级之前,请确保 aml-operator Pod 在 aml-operator 命名空间中已启动并运行:

kubectl -n aml-operator get pod

迁移配置文件资源

由于 Alauda AI 1.3 已删除了对 kubeflow.orgProfile 的使用,并引入了一种新的自定义资源定义 (CRD) 叫 AmlNamespace,我们需要将现有的 Profile 资源迁移到 AmlNamespace

在目标集群中执行以下脚本:

migrate-profile-resources.sh
#!/bin/bash
BASE_DOMAIN=$(kubectl -n kube-public get cm global-info -o jsonpath='{.data.labelBaseDomain}' | sed 's/"//g')
CLUSTER_NAME=$(kubectl -n kube-public get cm global-info -o jsonpath='{.data.clusterName}' | sed 's/"//g')

profiles=$(kubectl get profiles.kubeflow.org -o jsonpath='{.items[*].metadata.name}')

for profile in $profiles; do
  if kubectl get amlnamespace "$profile" &>/dev/null; then
    echo "⚠️  AmlNamespace $profile 已存在。跳过..."
    continue
  fi

  profile_yaml=$(kubectl get profiles.kubeflow.org "$profile" -o yaml)

  build_registry_file=$(mktemp)
  from_registry_file=$(mktemp)
  s3_file=$(mktemp)

  echo "$profile_yaml" | yq '.spec.plugins[] | select(.kind == "AmlConfig") | .spec.buildRegistry' > "$build_registry_file"
  echo "$profile_yaml" | yq '.spec.plugins[] | select(.kind == "AmlConfig") | .spec.fromRegistry' > "$from_registry_file"
  echo "$profile_yaml" | yq '.spec.plugins[] | select(.kind == "AmlConfig") | .spec.s3' > "$s3_file"

  amlnamespace_yaml=$(cat <<EOF
apiVersion: manage.aml.dev/v1alpha1
kind: AmlNamespace
metadata:
  name: $profile
  labels:
    $BASE_DOMAIN/cluster: $CLUSTER_NAME
spec:
  config: {}
EOF
)

  if [[ -s "$build_registry_file" && $(yq 'type' "$build_registry_file") != "null" ]]; then
    amlnamespace_yaml=$(echo "$amlnamespace_yaml" | yq ".spec.config.buildRegistry = load(\"$build_registry_file\")")
  fi

  if [[ -s "$from_registry_file" && $(yq 'type' "$from_registry_file") != "null" ]]; then
    amlnamespace_yaml=$(echo "$amlnamespace_yaml" | yq ".spec.config.fromRegistry = load(\"$from_registry_file\")")
  fi

  if [[ -s "$s3_file" && $(yq 'type' "$s3_file") != "null" ]]; then
    amlnamespace_yaml=$(echo "$amlnamespace_yaml" | yq ".spec.config.s3 = load(\"$s3_file\")")
  fi

  rm -f "$build_registry_file" "$from_registry_file" "$s3_file"

  echo "$amlnamespace_yaml" | kubectl apply -f -
  echo "✅ AmlNamespace $profile 已创建。"
done

迁移 InferenceService 资源

Alauda AI 1.3 中,KServe 引入了一个重大变化,要求 InferenceService 资源中的 model.name 必须为 kserve-container。 因此,我们需要为 accommodate 这个变化而修补所有在 AML 1.2 中创建的 InferenceService 资源。

在目标集群中执行以下脚本:

migrate-inferenceservice-resources.sh
#!/bin/bash

set -e

inferenceservices=$(kubectl get inferenceservice --all-namespaces -o jsonpath='{range .items[*]}{.metadata.namespace}{" "}{.metadata.name}{"\n"}{end}')

while IFS=" " read -r namespace svc; do
    model_name=$(kubectl -n "$namespace" get inferenceservice "$svc" -o jsonpath='{.spec.predictor.model.name}')
    if [ "$model_name" != "kserve-container" ]; then
        echo ">> 更新 $namespace/$svc..."
        kubectl -n "$namespace" patch inferenceservice "$svc" --type=json -p='[{
          "op": "replace",
          "path": "/spec/predictor/model/name",
          "value": "kserve-container"
        }]'
    fi
done <<< "$inferenceservices"

迁移 Knative CRD

由于 Knative CRD 的重大变化,您需要在升级之前将 CRD 迁移到新版本。

# 将 domainmappings 的 storageVersion 从 v1alpha1 迁移到 v1beta1
kubectl patch crd domainmappings.serving.knative.dev --type='json' -p='[
  {"op": "replace", "path": "/spec/versions/0/storage", "value": true},
  {"op": "replace", "path": "/spec/versions/1/storage", "value": false}
]'

kubectl exec -n aml-operator -it deploy/aml-operator -- /app/storageversion-migrate \
  domainmappings.serving.knative.dev

等待命令完成,命令输出应类似于:

INFO storageversion/main.go:61 迁移组资源 {"len": 1} INFO storageversion/main.go:64 迁移组资源 {"resource": "domainmappings.serving.knative.dev"} INFO storageversion/main.go:74 迁移完成

修复 Knative 配置中的意外密钥

运行以下命令以删除 Knative 配置中的 _example 密钥,这会阻止升级。

CONFIGMAPS=(
  $(kubectl -n knative-serving get configmaps -l app.kubernetes.io/name=knative-serving -o jsonpath='{.items[*].metadata.name}')
)

# 请忽略类似 `请求无效:...` 的错误消息
for cm in "${CONFIGMAPS[@]}"; do
  kubectl -n knative-serving patch configmap "$cm" --type='json' -p='[{"op": "remove", "path": "/data/_example"}]'
done

清理 Knative Serving 资源

一些 Knative Serving 资源阻止升级,因此需要手动操作。

执行以下脚本以删除有问题的资源:

cleanup-resources.sh
kubectl -n knative-serving delete pdb activator-pdb webhook-pdb

kubectl -n knative-serving patch configmap config-istio --type=json -p='[{
  "op": "remove",
  "path": "/data/gateway.knative-serving.knative-local-gateway"
}]'

kubectl -n knative-serving patch gateways.networking.istio.io knative-local-gateway --type=json -p='[{
  "op": "replace",
  "path": "/spec/selector",
  "value": {"knative": "ingressgateway"}
}]'

kubectl -n istio-system patch service knative-local-gateway --type=json -p='[{
  "op": "replace",
  "path": "/spec/selector",
  "value": {"knative": "ingressgateway"}
}]'

检索 AML 1.2 值

INFO

如果未安装,则应在集群节点上安装 helmyq 工具。

在 AML 集群中,您可以使用以下 helm 命令检索 AML 1.2 的值:

helm get values aml -n kubeflow -o yaml | tee /tmp/aml-values.yaml

请在升级过程中保留生成的 /tmp/aml-values.yaml 文件。

创建 GitLab 管理员令牌秘密

我们需要为 GitLab 管理员令牌创建一个秘密,这是运行 Alauda AI 集群 所必需的。

请按照 预配置 中的说明进行操作。

创建 MySQL 秘密

我们还需要为 Alauda AI 集群 创建一个 MySQL 秘密。

运行以下命令:

MYSQL_PASSWORD=$(kubectl -n kubeflow get secret mysql-secret -o jsonpath='{.data.password}' | base64 -d)  

kubectl create secret generic aml-mysql-secret \
  --from-literal="password=${MYSQL_PASSWORD}" \
  -n cpaas-system
  1. 从之前安装的 AML 1.2 秘密资源中检索 MySQL 密码。
  2. 创建名为 aml-mysql-secret 的 MySQL 管理员令牌秘密。
  3. 密码保存在 password 密钥下。
  4. 该秘密在 cpaas-system 命名空间下创建。

创建 Alauda AI 集群实例

最后,我们为 Alauda AI 集群 创建一个名为 defaultAmlCluster 资源以完成升级。

创建一个名为 aml-cluster.yaml 的 yaml 文件,内容如下:

aml-cluster.yaml
apiVersion: amlclusters.aml.dev/v1alpha1
kind: AmlCluster
metadata:
  name: default
spec:
  values:
    global:
      # 单节点或高可用集群
      deployFlavor: single-node
      gitlabBaseUrl: "${GITLAB_BASE_URL}"
      gitlabAdminTokenSecretRef:
        name: aml-gitlab-admin-token
        namespace: cpaas-system
      mysql:
        host: "${MYSQL_HOST}"
        port: 3306
        user: "${MYSQL_USER}"
        database: aml
        passwordSecretRef:
          name: aml-mysql-secret
          namespace: cpaas-system
    buildkitd:
      storage:
        type: emptyDir
  components:
    kserve:
      managementState: Managed
    knativeServing:
      managementState: Managed
      ingressGateway:
        domain: "*.example.com"
        certificate:
          secretName: knative-serving-cert
          type: SelfSigned
  1. 之前创建的 GitLab 管理员令牌秘密的 namenamespace
  2. 之前创建的 MySQL 秘密的 namenamespace
  3. kserve 的管理状态设为 Managed,这意味着 KServe 将由 Alauda AI 集群 安装和管理。
  4. knativeServing 的管理状态设为 Managed,这意味着 Knative Serving 将由 Alauda AI 集群 安装和管理。
  5. 用于暴露推理服务的通配符 domain。现在,保持原样。

执行以下命令以从 AML 1.2 检索必要的上下文,然后安装 Alauda AI 集群

# 从 AML 1.2 值文件中检索 GitLab 主机方案和基本信息。
GITLAB_HOST_SCHEME=$(yq -r .global.gitScheme < /tmp/aml-values.yaml)
GITLAB_HOST_BASE=$(yq -r .global.gitBase < /tmp/aml-values.yaml)
export GITLAB_BASE_URL="${GITLAB_HOST_SCHEME}://${GITLAB_HOST_BASE}"

# 从 AML 1.2 值文件中检索 MySQL 主机、端口和用户。
export MYSQL_HOST=$(yq -r .global.mysqlHost < /tmp/aml-values.yaml)
export MYSQL_PORT=$(yq -r .global.mysqlPort < /tmp/aml-values.yaml)
export MYSQL_USER=$(yq -r .global.mysqlUsername < /tmp/aml-values.yaml)

yq '((.. | select(tag == "!!str")) |= envsubst) | (.spec.values.global.mysql.port = env(MYSQL_PORT))' aml-cluster.yaml \
  | kubectl apply -f -
  1. 在之前创建的 aml-cluster.yaml 文件中插入环境变量。
  2. 创建 AmlCluster 资源以安装 Alauda AI 集群

验证

检查名为 defaultAmlCluster 资源的状态字段:

kubectl get amlcluster default

应返回 Ready

NAME READY REASON default True Succeeded

安装 Alauda AI 基础组件

请访问 Alauda AI 基础组件 获取安装说明。