在 Google Cloud 外部安裝 Kf

本文說明如何在 Google Distributed Cloud 建立的地端叢集上安裝 Kf 及其依附元件,包括 VMwareBare Metal

如果您已熟悉在 Google Cloud的 GKE 叢集上安裝 Kf 的程序,本機程序的差異主要在於:

  • 如果是內部部署安裝,則不必安裝 Config Connector。
  • 內部部署程序會使用 Docker 憑證,而非 Workload Identity。

事前準備

Google Distributed Cloud 需求

Kf 需求

  • Cloud Service Mesh

  • 供 Kf 使用的 Tekton。這項服務不會對使用者顯示。

  • 專用的 Google 服務帳戶。

設定環境變數

Linux 與 Mac

export PROJECT_ID=YOUR_PROJECT_ID
export CLUSTER_PROJECT_ID=YOUR_PROJECT_ID
export CLUSTER_NAME=kf-cluster
export COMPUTE_ZONE=us-central1-a
export COMPUTE_REGION=us-central1
export CLUSTER_LOCATION=${COMPUTE_ZONE} # Replace ZONE with REGION to switch
export NODE_COUNT=4
export MACHINE_TYPE=e2-standard-4
export NETWORK=default
export CLUSTER_PROJECT_ID=YOUR_PROJECT_ID
export CLUSTER_NAME=kf-cluster
export DOCKER_SERVER=YOUR_DOCKER_SERVER_URL
export SA_NAME=${CLUSTER_NAME}-sa
export SA_EMAIL=${SA_NAME}@${CLUSTER_PROJECT_ID}.iam.gserviceaccount.com

Windows PowerShell

Set-Variable -Name PROJECT_ID -Value YOUR_PROJECT_ID
Set-Variable -Name CLUSTER_PROJECT_ID -Value YOUR_PROJECT_ID
Set-Variable -Name CLUSTER_NAME -Value kf-cluster
Set-Variable -Name COMPUTE_ZONE -Value us-central1-a
Set-Variable -Name COMPUTE_REGION -Value us-central1
Set-Variable -Name CLUSTER_LOCATION -Value $COMPUTE_ZONE # Replace ZONE with REGION to switch
Set-Variable -Name NODE_COUNT -Value 4
Set-Variable -Name MACHINE_TYPE -Value e2-standard-4
Set-Variable -Name NETWORK -Value default
Set-Variable -Name CLUSTER_PROJECT_ID -Value YOUR_PROJECT_ID
Set-Variable -Name CLUSTER_NAME -Value kf-cluster
Set-Variable -Name DOCKER_SERVER -Value YOUR_DOCKER_SERVER_URL
Set-Variable -Name SA_NAME -Value ${CLUSTER_NAME}-sa
Set-Variable -Name SA_EMAIL -Value ${SA_NAME}@${CLUSTER_PROJECT_ID}.iam.gserviceaccount.com

設定服務帳戶

建立 Google Cloud 服務帳戶 (GSA) 和服務帳戶金鑰,供建構作業從 Container Registry 讀取/寫入資料。如果您使用其他容器登錄檔,這個步驟會有所不同,因為取得登錄檔存取憑證的方式可能不同。

  1. 建立 Kf 使用的服務帳戶:

    gcloud beta iam service-accounts create ${SA_NAME} \
        --project=${CLUSTER_PROJECT_ID} \
        --description="gcr.io admin for ${CLUSTER_NAME}" \
        --display-name="${CLUSTER_NAME}"
  2. 將讀取/寫入 Container Registry 內容所需的 storage.admin 角色指派給服務帳戶:

    gcloud projects add-iam-policy-binding ${CLUSTER_PROJECT_ID} \
        --member="serviceAccount:${SA_NAME}@${CLUSTER_PROJECT_ID}.iam.gserviceaccount.com" \
        --role="roles/storage.admin"
  3. 建立服務帳戶金鑰:

    temp_dir=$(mktemp -d)
    key_path=${temp_dir}/key.json
    gcloud iam service-accounts keys create --iam-account ${SA_EMAIL} ${key_path}
    key_json=$(cat ${key_path})
    rm -rf ${temp_dir}

在叢集上安裝軟體依附元件

  1. 安裝 Cloud Service Mesh。

    1. 按照 Cloud Service Mesh 安裝指南安裝 Cloud Service Mesh。

    2. 如果是 Google Distributed Cloud,請按照「為 Google Distributed Cloud 設定外部 IP 位址」一文的說明,將 loadBalancerIP 設為分配給叢集的 IP 位址。

  2. 安裝 Tekton:

    kubectl apply -f "https://storage.googleapis.com/tekton-releases/pipeline/previous/v0.32.1/release.yaml"

安裝 Kf

  1. 安裝 Kf CLI:

    Linux

    這項指令會為系統上的所有使用者安裝 Kf CLI。按照「Cloud Shell」分頁中的操作說明,為自己安裝。

    gcloud storage cp gs://kf-releases/v2.9.0/kf-linux /tmp/kf
    chmod a+x /tmp/kf
    sudo mv /tmp/kf /usr/local/bin/kf

    Mac

    這項指令會為系統上的所有使用者安裝 kf

    gcloud storage cp gs://kf-releases/v2.9.0/kf-darwin /tmp/kf
    chmod a+x /tmp/kf
    sudo mv /tmp/kf /usr/local/bin/kf

    Cloud Shell

    如果您使用 bash,這個指令會在 Cloud Shell 執行個體上安裝 kf。如果是其他殼層,可能需要修改指令。

    mkdir -p ~/bin
    gcloud storage cp gs://kf-releases/v2.9.0/kf-linux ~/bin/kf
    chmod a+x ~/bin/kf
    echo "export PATH=$HOME/bin:$PATH" >> ~/.bashrc
    source ~/.bashrc

    Windows

    這項指令會將 kf 下載至目前目錄。如要從目前目錄以外的任何位置呼叫,請將其新增至路徑。

    gcloud storage cp gs://kf-releases/v2.9.0/kf-windows.exe kf.exe
  2. 安裝運算子:

    kubectl apply -f "https://storage.googleapis.com/kf-releases/v2.9.0/operator.yaml"
  3. 設定 Kf 的運算子:

    kubectl apply -f "https://storage.googleapis.com/kf-releases/v2.9.0/kfsystem.yaml"

建立 Docker 憑證的 Kubernetes 密鑰

在 Kf 命名空間中,為您在服務帳戶設定中建立的 Docker 憑證建立 Kubernetes 密鑰。然後修補 Kubernetes 密鑰,以用於來源上傳的 subresource-apiserver 部署作業。

  1. 啟用並更新 Kf 運算子,將 Container Registry 做為容器登錄檔。

    export CONTAINER_REGISTRY=${COMPUTE_REGION}-docker.pkg.dev/${CLUSTER_PROJECT_ID}/${CLUSTER_NAME}
    
    kubectl patch \
    kfsystem kfsystem \
    --type='json' \
    -p="[{'op': 'replace', 'path': '/spec/kf', 'value': {'enabled': true, 'config': {'featureFlags': {'enable_appdevexperience_builds': true}, 'spaceContainerRegistry': '${CONTAINER_REGISTRY}', 'secrets':{'workloadidentity':{'googleserviceaccount':'${CLUSTER_NAME}-sa', 'googleprojectid':'${CLUSTER_PROJECT_ID}'}}}}}]"
    
    export CONTAINER_REGISTRY=gcr.io/${CLUSTER_PROJECT_ID}
    kubectl patch kfsystem kfsystem \
      --type='json' \
      -p="[{'op': 'replace', 'path': '/spec/kf', 'value': {'enabled': true, 'config': {'spaceContainerRegistry':'${CONTAINER_REGISTRY}'}}}]"
    
  2. 確認 Kf 運算子是否已建立 kf 命名空間。這項作業可能需要幾分鐘才能完成。

    kubectl get namespace kf
  3. 建立 Kubernetes 密鑰,以搭配 Docker 登錄檔使用。

    export secret_name=kf-gcr-key-${RANDOM}
    kubectl -n kf create secret docker-registry ${secret_name} \
       --docker-username=_json_key --docker-server ${DOCKER_SERVER} \
       --docker-password="${key_json}"
    
  4. 更新 Kf 運算子,指定含有 Docker 憑證的密鑰。

    kubectl patch kfsystem kfsystem \
      --type='json' \
      -p="[{'op': 'replace', 'path': '/spec/kf', 'value': {'config': {'secrets':{'build':{'imagePushSecrets':'${secret_name}'}}}}}]"
    

驗證安裝

kf doctor --retries=20