新的 Apigee Hybrid 安裝和管理預先發布版


預覽使用者指南:
Apigee hybrid v1.8 的新安裝和管理程式預覽。


本文內容:

預覽


本文適用於 Apigee 營運人員 (負責安裝/管理/管理 Apigee Hybrid 安裝作業的使用者)。如要按照本文的指示操作,您必須先在支援的 Kubernetes 平台上安裝 Apigee Hybrid。建議您建立一個 Apigee 評估組織,並嘗試以下步驟。

意見回饋

請將此過程的回饋發送至 Apigee-hybrid-install-preview@google.com。


總覽

新的 Apigee 混合式安裝體驗使用 kubectl 安裝 Apigee 元件,並將 Apigee Hybrid 的安裝和管理與 Kubernetes 設定編排工具(如 Kustomize)整合在一起。加強驗證及顯示安裝中的元件,可提升偵錯能力,並改善整體安裝程序。

安裝指令碼 apigee-hybrid-setup.sh 提供簡單的工具,方便您進行基本安裝。您可以利用它來建立混合安裝,然後使用 kubectl 對其進行修改以滿足您的需求,或者您可以使用 kubectl 從頭開始建立混合安裝。 所有 Apigee Hybrid 設定屬性都儲存在 YAML 檔案中,每個主要元件各有一個檔案。這樣就能更精細地控管 Kubernetes 環境中的混合式安裝作業。您可以在 GitHub 存放區中找到設定檔和安裝指令碼。

新安裝程序異動

Apigee 正在改變 Apigee hybrid 的安裝流程,原因如下:

  • Apigee hybrid 的新安裝方法可以與現有的 Kubernetes CI/CD 工具(如 Argo、Flux 或 Anthos Config Management)集成,這些工具不使用 overrides.yaml 設定檔。
  • Apigee Hybrid 提供apigeectl,這項自訂範本工具可產生 Kubernetes 資訊清單 (以及其他項目),用於在 Kubernetes 叢集中安裝及管理 Apigee Hybrid。新的安裝和管理流程提供了與其他軟體供應商類似的體驗。
  • 新流程透過自動建立具有必要權限、TLS 憑證的服務帳戶、預先填入預設值和其他必要的基礎元素,實現快速的基本安裝。

必要條件

使用這個預先發布版本前,請務必符合下列先決條件:

預先發布版

這個預覽版適用於 Apigee Hybrid 1.8.x 版。後續版本的 Apigee hybrid 不受支援。

Apigee Hybrid 設定

在開始實際安裝 Apigee Hybrid 之前,您需要完成以下文件章節中列出的說明:

  1. 專案和機構設定
  2. 混合運行時設定

工具

此外,您還需要在工作站上下載並設定以下工具:

  • curl
  • 執行 apigee-hybrid-setup.sh 腳本需要 docker。按照「取得 Docker」頁面的操作說明安裝 Docker。
  • 大多數 Linux/UNIX 系統都應提供 envsubst。如為 macOS 和其他系統,請按照這個存放區的操作說明操作。
  • 應該安裝jq。下載 jq。
  • kpt 下載 kpt。

  • kubectl 1.23 以上版本。請參閱 Kubernetes 文件中的 安裝工具: kubectl。

本指南中使用的常用變數

本指南會在幾個步驟中使用下列環境變數。您可以在指令列或指令碼中定義它們,也可以在輸入指令時替換指令中的文字。

  • APIGEE_NAMESPACE:您的 Apigee 命名空間。預設值為apigee。 不過,您可以使用不同的命名空間。
  • CLUSTER_NAME: 要安裝 Apigee hybrid 的叢集的名稱。 這是您在步驟 1:建立集群中建立的集群
  • CLUSTER_LOCATION: 叢集區域。本指南中的步驟假設您使用的是區域叢集。如果您使用的是區域集群,請參閱步驟 1:建立集群中的說明。
  • ENV_GROUP: Apigee hybrid 安裝的環境群組名稱。這是您在步驟 3:建立環境群組中建立的環境群組。 您可以建立多個環境群組。
  • ENV_NAME: Apigee hybrid 安裝的環境群組名稱。這是您在步驟 3:建立環境群組中建立的環境群組。 您可以建立多個環境群組。
  • INSTALL_DIR: Apigee hybrid 的安裝目錄。預設情況下,這是您下載安裝程式的目錄的 apigee-hybrid-install/ 子目錄,例如:/myhybrid/apigee-hybrid-install/。 這是 Apigee Hybrid Setup Folder Structure 中記錄的檔案結構的根目錄。
  • INSTANCE_DIR: 特定 Apigee hybrid 執行個體的目錄。預設情況下,第一個實例名為 instance-1。實例目錄是 ${INSTALL_DIR}/overlays/instances/ 的子目錄。您可以為混合實例指定任何名稱。請參閱多實例安裝。
  • ORG_NAME: 您的 Apigee hybrid 組織的名稱。這必須與您的 Google Cloud 項目 ID 相同。請參閱:步驟 2:建立組織。

Apigee 混合動力基本安裝

要快速安裝 Apigee Hybrid 而無需進行大量自訂,您可以使用以下兩步驟流程。


  • 單一環境
  • 單一環境群組
  • 建立一個 Google Cloud 服務帳戶,並將其用於所有單獨的元件。
  • 所有加密金鑰和密碼的預設值。

  1. 下載安裝檔
  2. 運行設定

下載安裝文件

請複製 GitHub 倉庫 https://github.com/apigee/apigee-hybrid-install/releases/tag/preview-1 下載並準備安裝檔案:

  1. 複製存放區:

    git clone https://github.com/apigee/apigee-hybrid-install.git
    
  2. 導航至克隆倉庫所在的目錄:

    cd apigee-hybrid-install
    
  3. 從 preview-1 標籤建立分支:

    git branch preview-1 preview-1
    git checkout preview-1
    
  4. 使設定指令碼可執行:

    chmod +x ./tools/apigee-hybrid-setup.sh
    

    克隆的儲存庫將具有類似於 Apigee Hybrid 安裝資料夾結構 中所述的結構:

運行設定

執行位於 tools/ 資料夾內的 apigee-hybrid-setup.sh 殼層指令碼。

./tools/apigee-hybrid-setup.sh --cluster-name $CLUSTER_NAME --cluster-region $CLUSTER_LOCATION --org $ORG_NAME --setup-all

如果遇到錯誤,請嘗試再次執行腳本。


您可能還想使用以下其他選項:

  • --env $ENV_NAME 指定 Apigee 環境的名稱。
  • --envgroup $ENV_GROUP 指定環境組。
  • --ingress-domain $HOSTNAME 指定您為環境群組提供的主機名稱。
  • --gcp-project-id $PROJECT_ID 指定您的 Google Cloud 雲端專案的 ID。

如需更多選項,請參閱以瞭解腳本。

執行過程中出現的任何錯誤都會列印到標準輸出。

腳本成功完成後,基本混合安裝即完成。您可以按照 建立和部署新的 API Proxy 中的詳細說明,透過建立範例 Proxy 來測試您的安裝。

客製化 Apigee Hybrid 安裝

如要進一步控管安裝作業,進階使用者可以按照下列步驟操作 (對於下列許多步驟,您可以選擇手動執行,或使用殼層指令碼自動執行該步驟):



下載安裝文件

下載並準備安裝檔:

  1. 複製 https://github.com/apigee/apigee-hybrid-install/ 的 GitHub 存放區

    克隆的儲存庫將具有類似於 Apigee Hybrid 安裝資料夾結構 中所述的結構:

  2. cd 進入 apigee-hybrid-install/ 目錄

  3. 使設定指令碼可執行:

    chmod +x ./tools/apigee-hybrid-setup.sh
    

建立命名空間

在叢集中建立一個 Kubernetes 命名空間,其中將包含所有 Apigee 叢集元件。

kubectl create namespace apigee


如果您為命名空間選擇了其他名稱,則可以選擇遵循以下三個選項之一:

  • (建議)在 編輯資源 yamls 中預填值時使用 --namespace={YOUR_NAMESPACE_NAME}。
  • 執行以下兩個命令:

    1. 使用 kpt 指定 Apigee 命名空間:

      kpt fn eval "${INSTALL_DIR}/overlays/" \
        --image gcr.io/kpt-fn/apply-setters:v0.2.0 -- \
        APIGEE_NAMESPACE="${APIGEE_NAMESPACE}"
      # This is for replacing the namespace in istio discoveryAddress which cannot be
      # achieved with kpt
      
    2. 使用 sed 取代 istio discoveryAddress 中的命名空間:

      sed -i -E -e "s/(discoveryAddress: apigee-ingressgateway-manager\.).*(\.svc:15012)/\1${APIGEE_NAMESPACE}\2/" "${INSTALL_DIR}/overlays/controllers/istiod/apigee-istio-mesh-config.yaml"
      
  • 或者,您可以手動將資源逐一變更為您選擇的命名空間中要建立的資源。

使用來自私有倉庫的 Docker 映像(可選)

您可以選擇不使用公開託管的圖片,而可以使用您自己的私人儲存庫中的圖片:

  1. 第一步是將所有映像推送到您的私人倉庫,這可以透過按照 apigee-pull-push | Apigee X 中的步驟來完成。預設情況下,圖像會標記其對應的 Apigee Hybrid 版本,建議您不要編輯這些標籤。此外,我們也建議您不要編輯圖片名稱,這樣才能按照「圖片中心」的說明建構最終圖片路徑。
  2. 將 apigee-hybrid-config.yaml 檔案中 imageHub 欄位的值設定為私有倉庫主機路徑。(詳情請參閱Image Hub)。

    imageHub: "your.private.repo/apigee/hybrid"
    

這將確保所有 Apigee hybrid 元件都使用您私有存放區中的映像。

此外,您可能還想為 controller 和 Apigee 入口閘道使用私有鏡像,為此,您需要編輯 apigee-controller-deployment.yaml 和 apigee-ingressgateway-manager-deployment.yaml 文件,並將所有 image 文件中的私有鏡像。



配置 imagePullSecrets(可選)

  1. 建立一個包含用於對私人儲存庫進行驗證的憑證的 kubernetes secret。請參閱 從私有註冊表中拉取映像,以瞭解如何建立金鑰。
  2. 一旦建立了金鑰,剩下的就是引用該金鑰,這可以透過編輯檔案 apigee-hybrid-config.yaml 並將 imagePullSecret 欄位的值設為先前建立的金鑰的名稱,並在對應的 kustomization.yaml 檔案中啟用 imagePullSecret 元件來完成。

如果您在兩個地方都指定了 imagePullSecrets,則 apigee-controller-manager.yaml 檔案中的那個將優先。


配置轉送代理(可選)

可以透過向 apigee-hybrid-config.yaml 檔案中新增 forwardProxy 欄位來設定轉送代理程式。例如:

  forwardProxy: |
    scheme: HTTP
    host: 10.12.0.47
    port: 3128

指定入口 TLS 證書

使用腳本

./tools/apigee-hybrid-setup.sh --create-ingress-tls-certs

有關此標誌的更多詳細信息,請參閱 - 以瞭解腳本。

手動

您需要提供 Istio 入口閘道的 TLS 憑證。您可以:

這裡我們將以自簽名憑證為例進行說明。可以使用以下方法產生自簽名憑證(假設 DOMAIN 已正確設置,並且應該與您的環境群組中設定的主機名稱相符):

openssl req -nodes -new -x509 -keyout ./tls.key -out ./tls.crt -subj '/CN='$DOMAIN'' -days 3650

這將會建立兩個名為tls.key和tls.crt的檔案。

接下來,您需要建立一個具有以下格式的金鑰。您可以使用 kubectl create 或 kubectl apply,如「使用自訂憑證/金鑰對作為憑證簽署機構(選用)」所述:

apiVersion: v1
kind: Secret
metadata:
  name: "{ORG_NAME}-{ENV_GROUP_NAME}"
  namespace: {$APIGEE_NAMESPACE}
type: Opaque
data:
  cert: |
    {BASE64_ENCODED_TLS_CRT}
  key: |
    {BASE64_ENCODED_TLS_KEY}

---

使用 kubectl create 建立金鑰的範例:

kubectl create secret tls {ORG_NAME}-{ENV_GROUP_NAME} \
  --cert="tls.crt" \
  --key="tls.key" \
  -n {$APIGEE_NAMESPACE}


更新 Ingress 部署作業

如要建立/修改 Ingress 部署作業,您必須在 bases/initialization/crds/customresourcedefinition-apigeeorganizations.apigee.cloud.google.com.yaml 中修改 ApigeeOrganization 自訂資源的 spec.components.ingressGateways 欄位。

預設情況下,我們會建立一個帶有預設參數的入口部署(預設值將顯示在 CR 參考文件中 ):

ingressGateways:
- name: "prod-1"

範例:

A. 覆寫傳入服務欄位

ingressGateways:
- name: "prod-1"
  serviceSpec:
    annotations:
      {KEY}: ${VALUE}
    loadBalancerIP: ${IP}

B. 更改副本最小值/最大值

ingressGateways:
- name: "prod-1"
  ​​autoScaler:
    minReplicas: 4
    maxReplicas: 10

C. 新增新的入口部署

ingressGateways:
- name: "prod-1"
- name: "prod-2"

設定自訂 Google Cloud 服務帳戶



使用腳本

./tools/apigee-hybrid-setup.sh --create-gcp-sa-and-secrets  --namespace APIGEE_NAMESPACE

其中 APIGEE_NAMESPACE 是您的自訂命名空間。預設命名空間為apigee。

有關標誌的更多詳細信息,請參閱以瞭解腳本。

手動

Google Cloud 服務帳戶金鑰必須以密碼形式儲存在叢集中。密鑰 YAML 檔案應具有以下結構:

apiVersion: v1
kind: Secret
metadata:
  name: "{NAME}"
  namespace: {APIGEE_NAMESPACE}
type: Opaque
data:
  client_secret.json: |
    {BASE64_ENCODED_SA_KEY}

如要進一步瞭解所有必要服務帳戶和密鑰名稱,請參閱「Google Cloud 服務帳戶」一節。

您可以選擇其他密鑰名稱,但必須在該密鑰名稱使用的元件中進行相應變更。舉例來說,如果您決定將執行階段服務帳戶密鑰的名稱從 apigee-runtime-svc-account-${ORG_NAME}-${ENV_NAME} 變更為 my-runtime-svc,就必須在該環境的 apigee-environment.yaml 中進行相應變更



使用工作負載標識


設定自訂 Google Cloud 服務帳號或使用工作負載標識,二者選其一為必填項。


必要條件

使用工作負載身分前,請確認 GKE 叢集已啟用支援功能。詳情請參閱「更新節點集區 | Apigee X」。

啟用工作負載身份

有關如何在安裝前啟用工作負載標識的詳細信息,請參閱 Kustomize 和組件 下的 工作負載標識 部分。

編輯資源 YAML 文件

元件 YAML 中的某些位置必須包含正確的機構、環境和環境群組名稱。您可以手動設定這些值,也可以使用殼層指令碼自動填入這些值。

使用腳本

./tools/apigee-hybrid-setup.sh --fill-values

建立初始化資源和控制器

#Additional steps for openshift
kubectl apply -k ${INSTALL_DIR}/overlays/initialization/openshift
//apigee datastore
kubectl apply -f ${INSTANCE_DIR}/overlays/instances/${INSTANCE_DIR}/datastore/components/openshift-scc/scc.yaml
//telemetry
kubectl apply -f ${INSTANCE_DIR}/overlays/instances/${INSTANCE_DIR}/telemetry/components/openshift-scc/scc.yaml

#Create Apigee initialization kubernetes resources
kubectl apply -f ${INSTALL_DIR}/overlays/initialization/namespace.yaml
kubectl apply -k ${INSTALL_DIR}/overlays/initialization/certificates
kubectl apply --server-side --force-conflicts -k ${INSTALL_DIR}/overlays/initialization/crds
kubectl apply -k ${INSTALL_DIR}/overlays/initialization/webhooks
kubectl apply -k ${INSTALL_DIR}/overlays/initialization/rbac
kubectl apply -k ${INSTALL_DIR}/overlays/initialization/ingress

# Create controller config and controller
kubectl apply -k ${INSTALL_DIR}/overlays/controllers

# Wait for the controllers to be available
kubectl wait deployment/apigee-controller-manager deployment/apigee-ingressgateway-manager -n "${APIGEE_NAMESPACE}" --for=condition=available --timeout=2m

# Create the datastore and redis secrets first and then the rest of the secrets.
kubectl apply -f ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}/datastore/secrets.yaml
kubectl apply -f ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}/redis/secrets.yaml
kubectl apply -f ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}/environments/${ENV_NAME}/secrets.yaml
kubectl apply -f ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}/organization/secrets.yaml

授予同步器服務帳戶與控制平面互動的權限

按照「步驟 8:啟用同步處理工具存取權」一節中的步驟操作,將服務帳戶名稱 (apigee-non-prod 或 apigee-synchronizer) 替換為 apigee-all-sa,也就是新安裝程序建立的服務帳戶名稱。


★ 重要事項:請務必按照「啟用同步器存取權」一節中的操作說明,變更服務帳戶名稱。否則無法啟用同步處理工具存取權。


建立 Apigee 資料平面組件

如果您在前面的步驟中變更了任何資源的名稱,則需要對引用該資源的其他 YAML 檔案進行相應的變更。完成上述步驟後,請使用以下範例中的命令:

# Create the rest of the resources.
kubectl apply -k ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}

安裝所有組件。

等待資源啟動

kubectl wait "apigeedatastore/default" \
"apigeeredis/default" \
"apigeeenvironment/${ORG_NAME}-${ENV_NAME}" \
"apigeeorganization/${ORG_NAME}" \
"apigeetelemetry/apigee-telemetry" \
-n "${APIGEE_NAMESPACE}" --for="jsonpath=.status.state=running" --timeout=15m

在自訂命名空間中自訂 cert-manager 的安裝

請依照下列步驟自訂 cert-manager 運行所在的命名空間。

如果 cert-manager 安裝在叢集中 cert-manager 命名空間以外的其他命名空間,則需要更新用於建立 Apigee 根憑證的命名空間。

  1. 編輯 customization.yaml 檔案,建立憑證:$INSTALL_DIR/overlays/initialization/certificates/kustomize.yaml
  2. 在檔案結尾加入下列內容。

    - patch: |-
    - op: replace
      path: /metadata/namespace
      value: "gk-cert-manager"
    target:
    group: cert-manager.io
    version: v1
    kind: Certificate
    name: apigee-root-certificate
    
  3. 儲存檔案

客製化和組件

總覽

新的混合安裝繼承了 Kustomize 的理念,即以 Bases 和 Overlays 的形式建構 YAML 檔案。

  • 基礎文件是由 Apigee 提供的文件,這些文件可能會在每個新的 Hybrid 版本之間發生變化。您無需修改這些文件。這些檔案包含 Apigee 提供的一些預設值。頂層 bases/ 資料夾下的所有文件都包含這些基礎文件
  • 疊加層會保留使用者設定,並做為修改 Base 中指定預設值的方法。頂層 overlays/ 資料夾下的所有檔案都包含這些疊加層



如何使用元件

頂層 overlays/ 目錄中的子資料夾經過結構化處理,因此您可以在 kustomization.yaml 檔案中註解 (或取消註解) 特定行,啟用 (或停用) 某項額外功能。

例如,overlays/instances/{INSTANCE_NAME}/telemetry 資料夾結構如下所示:

telemetry
├── components
│   ├── http-proxy
│   ├── imagepullsecret
│   ├── logger
│   ├── metrics
│   ├── nodeselector
│   ├── openshift-scc
│   ├── workload-identity-logger
│   └── workload-identity-metrics
├── apigee-telemetry.yaml
└── kustomization.yaml

以下是telemetry/kustomization.yaml檔案預設可能的樣子:

resources:
- apigee-telemetry.yaml

components:
- ./components/metrics
# - ./components/workload-identity-metrics
# - ./components/logger
# - ./components/workload-identity-logger
# - ./components/http-proxy
# - ./components/nodeselector/
# - ./components/imagepullsecret
# - ./components/openshift-scc

我們可以看到 ./components/logger 已註解,這表示我們預設未啟用 uGoogle Clod 記錄器。要啟用該功能,只需取消註解該行程式碼,如下所示:

components:

- ./components/logger

同樣地,要停用指標,您可以註解掉 ./components/metrics 行:

...
components:
...
# - ./components/metrics
…

以下各節將說明所有這類各種元件、使用時機和設定方式。

OpenShift

對於希望在 OpenShift 叢集中安裝 Apigee Hybrid 的用戶,您可能需要在執行安裝之前啟用一些元件/資源 。(如果您不使用腳本執行安裝,則需要執行此操作)。需要修改的文件有:

  • overlays/initialization/openshift/kustomization.yaml 。 在 resources: 部分下,取消註解:

    # - ../../../bases/initialization/openshift/
    
  • overlays/instances/{INSTANCE_NAME}/datastore/kustomization.yaml 取消註解:

    # - ./components/openshift-scc
    

    並取消註解「components:」欄位 (如果仍為註解)。

  • overlays/instances/{INSTANCE_NAME}/telemetry/kustomization.yaml 取消註解:

    # - ./components/openshift-scc
    

    如果「components:」欄位仍被註解掉,請取消註解。

然後您可以繼續進行安裝步驟。

imagepullsecret

當您的私有儲存庫中儲存了映像時,即可啟用此元件。要從私人儲存庫拉取圖像,您可以建立一個 Kubernetes Secret,其中包含您的身份驗證詳細信息,然後可以在其中引用此 Secret。有關說明,請參閱 配置 imagePullSecrets(可選)。有關更多信息,請參閱 Kubernetes 文件中的 從私有鏡像倉庫拉取鏡像 | Kubernetes。

語言:

  • overlays/controllers/apigee-controller
  • overlays/controllers/istiod
  • overlays/instances/{INSTANCE_NAME}/datastore
  • overlays/instances/{INSTANCE_NAME}/environments/{ENV_NAME}
  • overlays/instances/{INSTANCE_NAME}/organization
  • overlays/instances/{INSTANCE_NAME}/redis
  • overlays/instances/{INSTANCE_NAME}/telemetry

啟用:

根據需要,在對應的 kustomization.yaml 檔案中取消註解「./components/imagepullsecret/」行。

需要進行的修改:

  • components/imagepullsecret/patch.yaml
    • 必要 將相關的金鑰名稱加入 spec.template.spec.imagePullSecrets 中的清單中

用法:

  1. 如果您尚未安裝 Apigee Hybrid,您可以繼續執行安裝步驟,這些變更將在安裝過程中套用。
  2. 如果您已安裝 Apigee Hybrid,則需要使用以下命令套用這些新變更:

    kubectl apply -k overlays/instances/{INSTANCE_NAME}
    

nodeselector

這個元件可讓您在特定節點上排定 Apigee 資源的 Pod。詳情請參閱「將 Pod 指派給節點 | Kubernetes」。

語言:

  • overlays/controllers/apigee-controller
  • overlays/controllers/istiod
  • overlays/instances/{INSTANCE_NAME}/datastore
  • overlays/instances/{INSTANCE_NAME}/environments/{ENV_NAME}
  • overlays/instances/{INSTANCE_NAME}/organization
  • overlays/instances/{INSTANCE_NAME}/redis
  • overlays/instances/{INSTANCE_NAME}/telemetry

啟用:

根據需要,在對應的 kustomization.yaml 檔案中取消註解「./components/nodeselector」行。

需要進行的修改:

  • components/nodeselector/patch.yaml
    • 可選 將節點選擇器標籤的值從 apigee-runtime 或 apigee-data 變更為所需的值。

用法:

  1. 如果您尚未安裝 Apigee Hybrid,您可以繼續執行安裝步驟,這些變更將在安裝過程中套用。
  2. 如果您已安裝 Apigee Hybrid,則需要使用以下命令套用這些新變更:

    kubectl apply -k overlays/instances/{INSTANCE_NAME}
    

工作負載身份

Apigee Hybrid 生態系統中的各種容器需要權限才能向 Apigee 控制平面 / 管理平面發出某些 API 呼叫。Workload Identity 是授予 Pod (和其中的容器) 這些權限的方法之一。想要瞭解更多相關信息,可以閱讀以下資源: - Workload Identity 簡介:為您的 GKE 應用程式提供更佳的身份驗證 | Google Cloud 博客 - 使用 Workload Identity | Kubernetes Engine 文件 | Google Cloud

語言:

  • overlays/instances/{INSTANCE_NAME}/datastore
  • overlays/instances/{INSTANCE_NAME}/environments/{ENV_NAME}
  • overlays/instances/{INSTANCE_NAME}/organization
  • overlays/instances/{INSTANCE_NAME}/redis
  • overlays/instances/{INSTANCE_NAME}/telemetry

先決條件:

在使用工作負載識別之前,您需要在 Google Cloud 專案中使用以下命令授予相關權限:

    gcloud iam service-accounts add-iam-policy-binding \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:${ORG_NAME}.svc.id.goog[${APIGEE_NAMESPACE}/${KSA_NAME}]" \
        ${GSA_NAME}@${ORG_NAME}.iam.gserviceaccount.com

其中: - ${ORG_NAME} - 您的 Apigee 組織的名稱。 - ${APIGEE_NAMESPACE} - 已安裝 Apigee 元件的 Kubernetes 命名空間。通常情況下,除非使用者在安裝過程中明確更改,否則該值為 apigee - ${KSA_NAME} - Kubernetes 命名空間的名稱。您需要對Kubernetes 服務帳戶中提到的每個 Kubernetes 服務帳戶執行此命令 - ${GSA_NAME} - Google Cloud 服務帳戶的名稱。如果您在安裝過程中沒有進行任何更改,則此值為 apigee-all-sa。如果為各個元件設定多個 Google Cloud 服務帳戶,則需要將 KSA_NAME 與對應的 GSA_NAME 進行比對。您可以比較 Google Cloud 服務帳號 中的表格與 Kubernetes 服務帳號 中的表格,以找到等效項。

啟用:

根據需要,在對應的 kustomization.yaml 檔案中取消註解 ./components/workload-identity 行。請注意,在遙測中,我們為 metrics 和 logger 元件提供了單獨的工作負載標識插件,可以單獨啟用。

用法:

  1. 如果您尚未安裝混合部署,您可以按照上一節所述啟用工作負載標識,然後繼續安裝,安裝程序將自動使用工作負載標識。
  2. 如果您已安裝 Apigee Hybrid,則需要使用以下命令套用這些新變更:

    kubectl apply -k overlays/instances/{INSTANCE_NAME}
    

http-proxy

您可以在以下每個元件中設定代理伺服器,以便該元件的流量通過為該元件配置的 http 代理程式。您可以為每個 Apigee 元件單獨配置代理程式。

語言:

  • overlays/instances/{INSTANCE_NAME}/datastore
  • overlays/instances/{INSTANCE_NAME}/environments/{ENV_NAME}
  • overlays/instances/{INSTANCE_NAME}/organization
  • overlays/instances/{INSTANCE_NAME}/telemetry

啟用:

根據需要,在對應的 kustomization.yaml 檔案中取消註解「./components/http-proxy/」行。

需要進行的修改:

  • components/http-proxy/patch.yaml 可以在 spec.httpForwardProxy
      下配置以下參數
    • scheme: 必需 HTTP 或 HTTPS 之一
    • host:必要:Proxy 的主機位址
    • port: 必需 埠號
    • username: 可選 與您的代理程式關聯的使用者名
    • password: 可選 存取代理程式的密碼

用法:

  1. 如果您尚未安裝 Apigee Hybrid,您可以繼續執行安裝步驟,這些變更將在安裝過程中套用。
  2. 如果您已安裝 Apigee Hybrid,則需要使用以下命令套用這些新變更:

    kubectl apply -k overlays/instances/{INSTANCE_NAME}
    

日誌記錄器和指標

您可以單獨啟用或停用 overlays/instances/{INSTANCE_NAME}/telemetry 中的日誌記錄器或指標。記錄器預設為停用,指標則為啟用。啟用或停用它們只需在 telemetry/kustomization.yaml 檔案中取消註解或註解相應的行即可。

gcs-backup 和 gcs-restore

這個 kustomize 元件可用於將 Cassandra 資料庫備份及還原至 Google Cloud Storage。

語言:

  • overlays/instances/{INSTANCE_NAME}/datastore

先決條件:

  1. 下載具有儲存物件管理員角色的 Google Cloud 服務帳戶金鑰。

    • 如果您使用腳本執行安裝且未使用工作負載標識,則可以重複使用腳本建立的 service-accounts 資料夾下提供的已下載金鑰。
    • 您也可以使用 create-service-account.sh 腳本來建立一個新的服務帳戶並下載其金鑰:

      ./tools/create-service-accounts=.sh --env prod --profile apigee‑cassandra
      
  2. 下載金鑰後,您需要建立名為 apigee-cassandra-backup-and-restore-gcp-sa-key 的 Kubernetes Secret,方法是使用下列指令:

    kubectl create secret generic "apigee-cassandra-backup-and-restore-gcp-sa-key" \
              --from-file="dbbackup_key.json=${PATH_TO_SA_KEY}" \
              -n "${APIGEE_NAMESPACE}"
    

    其中:

    • ${PATH_TO_SA_KEY} - 包含服務帳戶金鑰的檔案路徑。
    • ${APIGEE_NAMESPACE} - 已安裝 Apigee 元件的 Kubernetes 命名空間。除非在安裝期間明確變更,否則通常是 apigee

或者,您可以使用範本檔案 templates/secret-apigee-cassandra-backup-and-restore-gcp-sa-key.yaml 來建立此金鑰。

啟用:

  • 如果要啟用備份,請取消註解資料儲存 kustomization.yaml 檔案中的「./components/gcs-backup」行。
  • 如果要還原備份,請取消註解資料儲存 kustomization.yaml 檔案中的「./components/gcs-restore」行。

僅修改備份

  • components/gcs-backup/apigee-datastore-patch.yaml
    • 必要 更改 DATABASE_STORAGE_BUCKET 環境變數的值,該變數的格式為 gs://BUCKET_NAME,指向需要備份資料的 Google Cloud Storage 儲存桶。描述與此處描述的 dbStorageBucket 相符。
  • components/gcs-backup/cron-patch.yaml
    • 必要:變更 spec.schedule,指定備份頻率。此欄位接受標準的 Crontab 計劃格式。描述與此處描述的日程表 相符。
    • 必要 更改 DATABASE_STORAGE_BUCKET 環境變數的值,該變數的格式為 gs://BUCKET_NAME,指向需要備份資料的 Google Cloud Storage 儲存桶。描述與此處描述的 dbStorageBucket 相符。
    • 選用:變更 HTTP_PROXY_URL 的值,指向已設定的 Proxy。格式如下:
      • http://${USERNAME}:${PASSOWORD}@${HOST_IP_ADDRESS}:${HOST_PORT}
      • https://${USERNAME}:${PASSOWORD}@${HOST_IP_ADDRESS}:${HOST_PORT}
      • http://${HOST_IP_ADDRESS}:${HOST_PORT}
      • http://${HOST_IP_ADDRESS>:${HOST_PORT}

執行備份

您可以使用以下命令執行備份:

kubectl apply -k overlays/instances/{INSTANCE_NAME}

若要套用您的變更並啟用備份:

僅限還原的修改項目

  • components/gcs-restore/apigee-datastore-patch.yaml
    • 必要 更改 DATABASE_STORAGE_BUCKET 環境變數的值,該變數的格式為 gs://BUCKET_NAME,指向需要備份資料的 Google Cloud Storage 儲存桶。描述與此處描述的 dbStorageBucket 相符。
  • components/gcs-restore/job-patch.yaml
    • 必要 更改 DATABASE_STORAGE_BUCKET 環境變數的值,該變數的格式為 gs://BUCKET_NAME,指向需要備份資料的 Google Cloud Storage 儲存桶。
    • 必要:變更 BACKUP_SNAPSHOT_TIMESTAMP 環境變數的值。 說明與還原作業相符:snapshotTimestamp 請參閱此處。
    • 可選 更改 HTTP_PROXY_URL 的值,使其指向已配置的任何代理程式。 格式可以如下:
      • http://${USERNAME}:${PASSOWORD}@${HOST_IP_ADDRESS}:${HOST_PORT}
      • https://${USERNAME}:${PASSOWORD}@${HOST_IP_ADDRESS}:${HOST_PORT}
      • http://${HOST_IP_ADDRESS}:${HOST_PORT}
      • http://${HOST_IP_ADDRESS}:${HOST_PORT}

執行恢復操作:

有關恢復備份的背景信息,請參閱恢復備份 | Apigee X | Google Cloud

  1. 建立新的 Kubernetes 叢集,並在其中建立新的命名空間,用於還原混合式執行階段部署作業。您不能使用與原始混合安裝相同的叢集和命名空間。
  2. 除了您想要的任何其他設定外,請使用上述設定將 Hybrid 安裝到新叢集:

    • 您可以在新的命名空間中使用基本安裝和安裝混合方式:
    ./tools/apigee-hybrid-setup.sh \
    --cluster-name $CLUSTER_NAME \
    --cluster-region $CLUSTER_LOCATION \
    --namespace ${NEW_APIGEE_NAMESPACE}
    
  3. 恢復完成後,舊命名空間中的所有資源都可以刪除並切換到新命名空間。

有關更多信息,請參閱恢復備份。

非 GCS 備份和非 GCS 恢復

這個 kustomize 元件可用於將 Cassandra 資料庫備份及還原至 Google Cloud Storage。

語言:

  • overlays/instances/{INSTANCE_NAME}/datastore

必要條件:

  1. 可以利用現有文件中關於 設定伺服器和 SSH 的步驟。
  2. 根據上述步驟,您需要使用 SSH 私鑰,該私鑰位於按照前面步驟產生的「ssh_key」檔案中。然後,我們將建立一個名為 apigee-cassandra-backup-and-restore-gcp-sa-key 的 Kubernetes Secret,其中包含此 SSH 私鑰。



    可以使用以下命令建立 Kubernetes Secret:

    kubectl create secret generic "apigee-cassandra-backup-and-restore-key-file" \
            --from-file="key=${PATH_TO_SSH_PRIVATE_KEY}" \
            -n "${APIGEE_NAMESPACE}"
    

    其中:

    • ${PATH_TO_SSH_PRIVATE_KEY} - 包含 SSH 私鑰的檔案路徑
    • ${APIGEE_NAMESPACE} - 已安裝 Apigee 元件的 Kubernetes 命名空間。通常情況下,這會是 Apigee,除非在安裝過程中明確變更。

    或者,您也可以使用範本檔案 templates/secret-apigee-cassandra-backup-and-restore-key-file.yaml 建立這個密鑰。

啟用:

  • 如果要啟用備份,請取消註解資料儲存 kustomization.yaml 檔案中的「./components/non-gcs-backup」行。
  • 如果要還原備份,請取消註解資料儲存 kustomization.yaml 檔案中的「./components/non-gcs-restore」行。

僅供備份使用的修改

  • components/non-gcs-backup/apigee-datastore-patch.yaml
    • 必要 變更 BACKUP_SERVER_IP 的值。描述與此處所述的 BACKUP_SERVER_IP 相符。
    • 必需 更改 BACKUP_STORAGE_DIR 的值。描述與此處描述的 BACKUP_STORAGE_DIR 匹配。
  • components/non-gcs-backup/cron-patch.yaml
    • 必要:變更 spec.schedule,指定備份頻率。此欄位接受標準的 Crontab 計劃格式。描述與此處描述的日程表 相符。
    • 必要 變更 BACKUP_SERVER_IP 的值。描述與此處所述的 BACKUP_SERVER_IP 相符。
    • 必要:變更 BACKUP_STORAGE_DIR 的值。描述與此處描述的 BACKUP_STORAGE_DIR 匹配。
    • 可選 更改 HTTP_PROXY_URL 的值,使其指向已配置的任何代理程式。格式如下:
      • http://${USERNAME}:${PASSOWORD}@${HOST_IP_ADDRESS}:${HOST_PORT}
      • https://${USERNAME}:${PASSOWORD}@${HOST_IP_ADDRESS}:${HOST_PORT}
      • http://${HOST_IP_ADDRESS}:${HOST_PORT}
      • http://${HOST_IP_ADDRESS}:${HOST_PORT}

執行備份

您可以使用以下命令執行備份:

kubectl apply -k overlays/instances/{INSTANCE_NAME}

若要套用您的變更並啟用備份:

僅供備份使用的修改

  • components/non-gcs-restore/apigee-datastore-patch.yaml
    • 必要 變更 BACKUP_SERVER_IP 的值。描述與此處描述的BACKUP_SERVER_IP 相符。
    • 必需 更改 BACKUP_STORAGE_DIR 的值。說明符合BACKUP_STORAGE_DIR 這裡所述的內容。
  • components/non-gcs-restore/job-patch.yaml
    • 必要 變更 BACKUP_SNAPSHOT_TIMESTAMP 環境變數的值。描述與此處描述的restore:snapshotTimestamp 相符。
    • 必要 變更 BACKUP_SERVER_IP 的值。描述與此處描述的BACKUP_SERVER_IP 相符。
    • 必要 變更 BACKUP_STORAGE_DIR 的值。說明符合BACKUP_STORAGE_DIR 這裡所述的內容。
    • 可選 變更 HTTP_PROXY_URL 的值以指向任何已配置的代理程式。格式可以如下:
      • http://${USERNAME}:${PASSOWORD}@${HOST_IP_ADDRESS}:${HOST_PORT}
      • https://${USERNAME}:${PASSOWORD}@${HOST_IP_ADDRESS}:${HOST_PORT}
      • http://${HOST_IP_ADDRESS}:${HOST_PORT}
      • http://${HOST_IP_ADDRESS}:${HOST_PORT}

執行恢復操作:

有關復原備份的概述,請參閱 Cassandra 復原概述。

  1. 建立一個新的 Kubernetes 集群,並分配一個新的命名空間,用於恢復混合運行時部署。您不能使用與原始混合安裝相同的叢集和命名空間。
  2. 使用上述設定安裝 Hybrid 到新叢集,並視需要進行其他設定: 您可以選擇使用基本安裝方式,並在新命名空間中安裝 Hybrid:

    ./tools/apigee-hybrid-setup.sh \
      --cluster-name $CLUSTER_NAME \
      --cluster-region $CLUSTER_LOCATION \
      --namespace ${NEW_APIGEE_NAMESPACE}
    

    或者,您也可以按照自訂 Apigee Hybrid 安裝程序,根據自己的選擇設定項目。

  3. 恢復完成後,舊命名空間中的所有資源都可以刪除並切換到新命名空間。

    有關更多信息,請參閱在遠端伺服器上安排備份。

http-client

有關說明,請參閱 啟用 HTTP 用戶端 | Apigee。

語言:

  • overlays/instances/${INSTANCE_NAME}/route-config/${ENV_GROUP}

啟用:

在對應的 route-config/${ENV_GROUP}/kustomization.yaml 檔案中,取消註解「./components/http-client」行

需要進行的修改:

  • 不需要進行任何強制修改。

用法:

  1. 如果您尚未安裝 Apigee Hybrid,您可以繼續執行安裝步驟,這些變更將在安裝過程中套用。
  2. 如果您已安裝 Apigee Hybrid,請使用下列指令套用這些新變更:

    kubectl apply -k overlays/instances/{INSTANCE_NAME}
    

non-sni-client

等同於現有的「如何設定非 SNI 用戶端 | Apigee」。

語言:

  • overlays/instances/${INSTANCE_NAME}/route-config/${ENV_GROUP}

啟用:

取消註解對應 route-config/${ENV_GROUP}/kustomization.yaml 檔案中的「./components/non-sni-client」行

需要進行的修改:

  • components/non-sni-client/apigee-route.yaml
    • 必需 credentialName 描述與 credential_name 此處描述 相符。

用法:

  1. 如果您尚未安裝 Apigee Hybrid,您可以繼續執行安裝步驟,這些變更將在安裝過程中套用。
  2. 如果您已安裝 Apigee Hybrid,請使用下列指令套用這些新變更:

    kubectl apply -k overlays/instances/{INSTANCE_NAME}
    

http-and-non-sni-client

如需操作說明,請參閱「Enable support for both non-SNI and HTTP clients | Apigee」(啟用非 SNI 和 HTTP 用戶端支援 | Apigee)。

啟用:

取消註解對應 route-config/${ENV_GROUP}/kustomization.yaml 檔案中的「./components/http-and-non-sni-client」行

要進行的修改:

  • components/http-and-non-sni-client/apigee-route.yaml
    • 必需 credentialName 描述與 credential_name 此處描述 相符。

用法:

  1. 如果您尚未安裝 Apigee Hybrid,您可以繼續執行安裝步驟,這些變更將在安裝過程中套用。
  2. 如果您已安裝 Apigee Hybrid,請使用下列指令套用這些新變更:

    kubectl apply -k overlays/instances/{INSTANCE_NAME}
    

多區域

此元件可用於配置多區域 Cassandra 部署。 更多信息,請參閱GKE 和 GKE on prem 上的多區域部署

啟用:

取消註解 datastore/kustomization.yaml 檔案中的「./components/multi-region」行

要進行的修改:

  • components/multi-region/cassandra-data-replication.yaml

    • 必要 source.region 用於複製資料的來源 Cassandra 資料中心名稱。可透過在來源集群中使用以下命令進行識別:
    kubectl get apigeedatastore -n ${APIGEE_NAMESPACE} -o=jsonpath='{.items[*].spec.components.cassandra.properties.datacenter}'
    
  • components/multi-region/patch.yaml

    • 必要 spec.components.properties.multiRegionSeedHost 任何來源 Cassandra Pod 的 Pod IP。我們可以使用:
    kubectl get pods -n ${APIGEE_NAMESPACE} -o wide
    
    • 若要列出所有 pod 並取得任何 Cassandra pod 的 IP 位址,請使用下列命令:
    kubectl get pods -o wide -n apigee
    

    輸出內容應大致如下:

    NAME                      READY   STATUS      RESTARTS   AGE   IP          NODE                                          NOMINATED NODE
    apigee-cassandra-default-0        1/1     Running     0          5d    10.0.0.11   gke-k8s-dc-2-default-pool-a2206492-p55d
    apigee-cassandra-default-1        1/1     Running     0          5d    10.0.2.4    gke-k8s-dc-2-default-pool-e9daaab3-tjmz
    apigee-cassandra-default-2        1/1     Running     0          5d    10.0.3.5    gke-k8s-dc-2-default-pool-e589awq3-kjch
    

有關更多信息,請參閱“GKE、GKE on prem 和 AKS 上的多區域部署”中的 GKE 先決條件:

用法:

當您在新叢集中設定 Apigee Hybrid 並且已經有一個可用的 Apigee Hybrid 設定時,使用此元件才比較有意義。

  1. 新叢集和現有叢集都需要使用相同的 TLS 證書,以確保 Cassandra pod 之間能夠正常通訊。因此,我們需要從現有叢集複製 apigee-root-certificate 密碼,並在新叢集中使用:
  2. 執行作業:

    kubectl config get-contexts
    
    • 若要取得所有 Kubernetes 上下文的列表,請執行
    kubectl config use-context SOURCE_CLUSTER_CONTEXT
    

    其中 SOURCE_CLUSTER_CONTEXT 是來源 Kubernetes 叢集上下文的名稱。

  3. 將根憑證金鑰儲存在檔案中:

    kubectl get secret/apigee-root-certificate -n cert-manager -o yaml > apigee-root-certificate.yaml
    
  4. 將叢集上下文切換到要安裝 Apigee Hybrid 的新叢集。

    kubectl config use-context ${NEW_CLUSTER_CONTEXT}
    
  5. 在新叢集中建立根密鑰:

    kubectl -n cert-manager apply -f apigee-root-certificate.yaml
    
  6. 禁用建立新的根憑證。這將確保我們不會創造新的apigee-root-certificate最終會覆蓋我們在上一步建立的文件。

  7. 在 overlays/initialization/certificates/kustomization.yaml 檔案中取消註解下列程式碼行:

    # components:
    # - ./components/disable-apigee-root-certificate-generation
    
  8. 繼續完成 Apigee Hybrid 的其餘安裝,可以使用 基本 Apigee Hybrid 安裝 或 自訂 Apigee Hybrid 安裝。 例如,在完成 Apigee Hybrid 基本安裝 後,您可以執行以下操作:

    ./tools/apigee-hybrid-setup.sh --cluster-name $CLUSTER_NAME --cluster-region $CLUSTER_LOCATION
    
  9. 使用以下命令驗證重建狀態。



    kubectl -n ${APIGEE_NAMESPACE} get apigeeds -o json | jq ".items[].status.cassandraDataReplication"
    
  10. 從記錄檔驗證重建程序。此外,請使用 nodetool status 指令驗證資料大小:

    kubectl logs apigee-cassandra-default-0 -f -n ${APIGEE_NAMESPACE}
    kubectl exec apigee-cassandra-default-0 -n ${APIGEE_NAMESPACE}  -- nodetool -u ${JMX_USER} -pw ${JMX_PASSWORD} status
    
  11. 使用以下命令驗證重建狀態。



    kubectl -n apigee get apigeeds -o json | jq ".items[].status.cassandraDataReplication"
    

    結果應該類似:

    {
    "rebuildDetails": {
    "apigee-cassandra-default-0": {
      "state": "complete",
      "updated": 1623105760
    },
    "apigee-cassandra-default-1": {
      "state": "complete",
      "updated": 1623105765
    },
    "apigee-cassandra-default-2": {
      "state": "complete",
      "updated": 1623105770
    }
    },
    "state": "complete",
    "updated": 1623105770
    }
    

    另請參閱:多區域部署。

  12. 從 components/multi-region/patch.yaml 中刪除以下幾行:

      properties:
        multiRegionSeedHost: {IP_ADDRESS} # To be modified. REQUIRED
    
  13. 套用變更:

    kubectl apply -k overlays/instances/{INSTANCE_NAME}
    

概念

圖片中心

Docker 容器映像通常採用以下格式指定:

${REGISTRY_HOST_PATH}/${IMAGE_NAME}:${IMAGE_TAG}

或使用摘要的項目,例如:

${REGISTRY_HOST_PATH}/${IMAGE_NAME}@${DIGEST}

Apigee 使用了「影像中心」的概念,在上述格式中指的是 ${REGISTRY_HOST_PATH}。圖片中心的預設值為gcr.io/apigee-release/hybrid/。

(使用 DIGEST 的圖像需要在每個子組件中單獨設定)

Apigee 透過組合以下值來建立最終影像路徑:

  • 「Image Hub」可以在apigee-hybrid-config.yaml中被覆蓋(有關如何覆蓋 Image Hub 的詳細步驟,請參閱使用來自私有倉庫的 docker 映像部分)。
  • IMAGE_TAG 的值取自 version 字段,該字段存在於每個單獨的 components 的 yaml 檔案中(例如,apigee-organization.yaml)。Apigee 會為映像檔加上 Apigee Hybrid 版本標記,也就是說,Apigee Hybrid 1.8 版的標記為 IMAGE_TAG 1.8
  • IMAGE_NAME 由映像將要使用的容器的名稱隱含決定。例如,對於 apigee-runtime 容器,IMAGE_NAME 將是 apigee-runtime。

因此,影像路徑的完整範例為 gcr.io/apigee-release/hybrid/apigee-runtime:1.8.0

這樣就建構出了最終的鏡像路徑,然後該路徑將在各個容器各自的 pod 中使用它。

Google Cloud 服務帳戶

Google Cloud 服務帳號是應用程式用來向 Google API 發出授權呼叫的帳號。您可以下載 Google Cloud 服務帳戶金鑰,然後將其用於身份驗證。Apigee 希望用戶透過建立金鑰來提供服務帳戶金鑰。以下是元件名稱以及它查找服務帳戶金鑰的預設金鑰名稱:

元件 子元件 包含服務帳戶金鑰的預設 Kubernetes 金鑰名稱
組織
connectAgent apigee-connect-agent-gcp-sa-key-${ORG_NAME}
觀察者 apigee-watcher-gcp-sa-key-${ORG_NAME}
市場 apigee-mart-gcp-sa-key-${ORG_NAME}
udca apigee-udca-gcp-sa-key-${ORG_NAME}
ingressGateways 不適用
環境
執行階段 apigee-runtime-gcp-sa-key-${ORG_NAME}-${ENV_NAME}
udca apigee-udca-gcp-sa-key-${ORG_NAME}-${ENV_NAME}
同步器 apigee-synchronizer-gcp-sa-key-${ORG_NAME}-${ENV_NAME}
遙測
個指標 apigee-metrics-gcp-sa-key
containerLogs apigee-logger-gcp-sa-key

Kubernetes 服務帳戶

Kubernetes 服務帳號為叢集中的 Pod 提供身分。預設情況下,Apigee 控制器會自動建立這些。但是,如果您想要覆寫建立過程(例如,當您使用 工作負載標識 時),則可以透過在各種子元件中指定 podServiceAccountName 欄位來實現。

元件及其各自的子元件列表,您可以在其中指定 Kubernetes 服務帳戶,以及啟用工作負載身分修補程式時 Kubernetes 服務帳戶的預設名稱。

元件 子元件 預設名稱(啟用工作負載標識補丁後可用)
組織
connectAgent apigee-connect-agent-svc-account-${ORG_NAME}
觀察者 apigee-watcher-svc-account-${ORG_NAME}
市場 apigee-mart-svc-account-${ORG_NAME}
udca apigee-udca-svc-account-${ORG_NAME}
環境
同步器 apigee-synchronizer-svc-account-${ORG_NAME}-${ENV_NAME}
udca apigee-udca-svc-account-${ORG_NAME}-${ENV_NAME}
執行階段 apigee-runtime-svc-account-${ORG_NAME}-${ENV_NAME}
資料儲存
cassandra apigee-datastore-svc-account
遙測
metricsApp apigee-metricsApp-svc-account
metricsProxy apigee-metricsProxy-svc-account
metricsAdapter apigee-metricsAdapter-svc-account
containerLogs apigee-container-logs-svc-account

工作負載身分

工作負載身分允許在 GKE 中執行的 pod(使用 kubernetes 服務帳戶)直接向 Google Cloud API 進行驗證,而無需 Google Cloud 服務帳戶金鑰。

新增環境

.
├── ...
├── instances/instance1/components
│   ├── ...
│   ├── environments
│   │   ├── dev
│   │   │   └── apigee-environment.yaml
│   │   │   └── secrets.yaml
│   │   └── new-env-name (new)
│   │       └── apigee-environment.yaml (new)
│   │       └── secrets.yaml (new)
└── ...

新增環境非常簡單:

  1. 在 environments 目錄(或您設定的任何資料夾結構)內建立一個新資料夾
  2. 將 apigee-environment.yaml 檔案從任何現有環境複製到新資料夾。
  3. 如果您希望為新環境建立新的服務帳戶和加密金鑰,請將 secrets.yaml 複製到新資料夾中,並適當地重命名金鑰,以便將其與其他現有環境區分開來(通常是透過新增環境名稱作為後綴來完成的)。
  4. 對 apigee-environment.yaml 進行適當的更改,例如:
    • 更改環境名稱
    • 如果需要建立新的服務帳戶和加密金鑰,則需要在 yaml 檔案中正確引用它們。
  5. 應用 yaml:
kubectl apply -f components/environments/new-env-name/secrets.yaml
kubectl apply -f components/environments/new-env-name/apigee-environment.yaml

在 Apigee 資料儲存中使用強制刪除

如果由於任何原因導致資料儲存刪除無法進行,現在無論叢集的當前狀態如何,都可以使用以下命令強制刪除 Apigee 資料儲存。





  1. 刪除 apigee 命名空間中的 apigeeds:

    Kubectl delete -n apigee apigeeds default
    

    如果此步驟卡住,您可以使用 CTRL + C 退出。

  2. 編輯一個新的 apigeeds:

    Kubectl edit -n apigee apigeeds default
    
  3. 在 Apigee 資料存儲規範中新增/更新 forceDelete 字段

    spec:
    forceDelete: true
    
  4. 儲存檔案並結束。

現在請等待資料存放區刪除完成。刪除所有 Cassandra 資源可能需要幾分鐘。

理解劇本

apigee-hybrid-setup.sh 腳本執行一些基本驗證,並協助自動化一些步驟,否則如果您想要更詳細的自訂,則需要按照 自訂 Apigee Hybrid 安裝 中記錄的步驟進行操作。即使進行了自訂安裝,您仍然可以部分使用腳本來幫助完成某些任務。

您可以執行 ./tools/apigee-hybrid-setup.sh --help 查看支援的標誌列表,並獲得有關腳本的一些額外幫助。目前支援以下標誌:

  • --namespace 預設情況下,腳本會安裝 apigee 命名空間中的所有元件。你可以透過使用此標誌指定命名空間名稱來更改此行為。
  • --org 用來提供 Apigee 組織的名稱。如果未指定,則預設為 gcloud 中目前選定的 Google Cloud 項目
  • --envgroup 用於提供組織內環境群組的名稱。如果未指定,則會嘗試查詢控制層 API 以確定環境群組的名稱。如果找到多個環境群組,則傳回錯誤並退出腳本。
  • --env 用來提供組織內部環境的名稱。如果未指定,系統會嘗試查詢控制層 API,判斷環境名稱。如果找到多個環境,或者該環境不屬於環境群組,則傳回錯誤,腳本退出。
  • --cluster-name Kubernetes 叢集名稱。
  • --cluster-region Kubernetes 叢集所在的區域
  • --gcp-project-id Kubernetes 叢集所在的 Google Cloud 雲端專案 ID
  • --ingress-domain 指定將用於為 istio ingress-gateway 產生自簽名 TLS 憑證的主機名稱/網域名稱。如果沒有指定,則會嘗試透過查詢控制層 API 來確定環境群組的值。如果在確定環境群組時出現問題,或為環境群組配置了多個主機名,則會傳回錯誤並退出腳本。
  • --generate-internal-tls-certs 這將產生一個名為 apigee-ca 的 Kubernetes Secret,其中包含我們產生的憑證和金鑰對。
  • --create-ingress-tls-certs 這將在 istio-system 命名空間內產生一個名為 {ORG_NAME}-{ENV_GROUP_NAME} 的金鑰(源自組織和環境群組名稱),其中包含用於 TLS 通訊的憑證和金鑰對。用於產生這些憑證的網域名稱源自於 envgroup 配置中的值。如果出現衝突(例如,當我們找到多個域時),將顯示相應的錯誤訊息。
  • --create-gcp-sa-and-secrets 在 Google Cloud 雲端專案中建立一個 Google Cloud 服務帳戶,下載金鑰,然後建立包含該金鑰的 Kubernetes Secret。金鑰名稱可在 Google Cloud 服務帳號 中找到。
  • --fill-values 在各種 YAML 中需要 org、env、envgroup 和其他名稱值的位置,將這些值替換為實際值。
  • --apply-configuration 這會建立憑證簽發者、自訂資源定義、Webhook、角色和控制器資源。資源將按正確的順序創建,命令將阻塞,直到所有資源都處於正常狀態。
  • -- rename-directories 將環境和環境群組重新命名為正確的環境和環境群組的名稱。
  • --verbose 顯示詳細輸出以進行偵錯。
  • --help 顯示使用資訊。
  • --setup-all 這將執行此腳本可以執行的所有任務

Apigee Hybrid 安裝資料夾結構

apigee-hybrid-setup 資料夾預設具有以下層級結構:

.
├── bases
│   ├── controllers
│   │   ├── apigee-controller
│   │   │   ├── apigee-controller-deployment.yaml
│   │   │   └── kustomization.yaml
│   │   └── apigee-ingressgateway-manager
│   │       ├── apigee-ingressgateway-manager-deployment.yaml
│   │       └── kustomization.yaml
│   ├── datastore
│   │   └── backup-and-restore
│   │       ├── backup
│   │       │   ├── cronjob.yaml
│   │       │   └── kustomization.yaml
│   │       ├── common
│   │       │   ├── kustomization.yaml
│   │       │   ├── rbac.yaml
│   │       │   └── tls-certificate.yaml
│   │       └── restore
│   │           ├── job.yaml
│   │           └── kustomization.yaml
│   └── initialization
│       ├── certificates
│       │   ├── certificates-and-issuers.yaml
│       │   └── kustomization.yaml
│       ├── crds
│       │   ├── customresourcedefinition-apigeedatastores.apigee.cloud.google.com.yaml
│       │   ├── customresourcedefinition-apigeedeployments.apigee.cloud.google.com.yaml
│       │   ├── customresourcedefinition-apigeeenvironments.apigee.cloud.google.com.yaml
│       │   ├── customresourcedefinition-apigeeorganizations.apigee.cloud.google.com.yaml
│       │   ├── customresourcedefinition-apigeeredis.apigee.cloud.google.com.yaml
│       │   ├── customresourcedefinition-apigeerouteconfigs.apigee.cloud.google.com.yaml
│       │   ├── customresourcedefinition-apigeeroutes.apigee.cloud.google.com.yaml
│       │   ├── customresourcedefinition-apigeetelemetries.apigee.cloud.google.com.yaml
│       │   ├── customresourcedefinition-cassandradatareplications.apigee.cloud.google.com.yaml
│       │   └── kustomization.yaml
│       ├── openshift
│       │   ├── kustomization.yaml
│       │   └── scc.yaml
│       ├── rbac
│       │   ├── apigee-controller
│       │   │   ├── kustomization.yaml
│       │   │   └── rbac.yaml
│       │   └── apigee-embedded-ingress-controller
│       │       ├── cluster-role-bindings.yaml
│       │       ├── cluster-roles.yaml
│       │       ├── kustomization.yaml
│       │       └── service-account.yaml
│       └── webhooks
│           ├── kustomization.yaml
│           ├── mutatingwebhookconfiguration.yaml
│           └── validatingwebhookconfiguration.yaml
├── CONTRIBUTING.md
├── docs
│   └── api_references
│       ├── v1alpha1.md
│       └── v1alpha2.md
├── kokoro
│   ├── build.sh
│   ├── common.cfg
│   ├── continuous.cfg
│   ├── presubmit.cfg
│   └── release.cfg
├── LICENSE
├── overlays
│   ├── controllers
│   │   ├── apigee-controller
│   │   │   ├── apigee-hybrid-config.yaml
│   │   │   ├── components
│   │   │   │   ├── imagepullsecret
│   │   │   │   │   ├── kustomization.yaml
│   │   │   │   │   └── patch.yaml
│   │   │   │   └── nodeselector
│   │   │   │       ├── kustomization.yaml
│   │   │   │       └── patch.yaml
│   │   │   └── kustomization.yaml
│   │   ├── apigee-ingressgateway-manager
│   │   │   ├── apigee-ingressgateway-manager-deployment-patch.yaml
│   │   │   ├── apigee-istio-mesh-config.yaml
│   │   │   ├── components
│   │   │   │   ├── imagepullsecret
│   │   │   │   │   ├── kustomization.yaml
│   │   │   │   │   └── patch.yaml
│   │   │   │   └── nodeselector
│   │   │   │       ├── kustomization.yaml
│   │   │   │       └── patch.yaml
│   │   │   └── kustomization.yaml
│   │   └── kustomization.yaml
│   ├── initialization
│   │   ├── certificates
│   │   │   ├── apigee-ingressgateway-manager-certificate-patch.yaml
│   │   │   ├── apigee-serving-cert-patch.yaml
│   │   │   ├── components
│   │   │   │   └── disable-apigee-root-certificate-generation
│   │   │   │       └── kustomization.yaml
│   │   │   └── kustomization.yaml
│   │   ├── crds
│   │   │   └── kustomization.yaml
│   │   ├── ingress
│   │   │   ├── envoyfilter-1.11.yaml
│   │   │   └── kustomization.yaml
│   │   ├── namespace.yaml
│   │   ├── openshift
│   │   │   ├── kustomization.yaml
│   │   │   └── scc.yaml
│   │   ├── rbac
│   │   │   ├── apigee-controller
│   │   │   │   └── kustomization.yaml
│   │   │   ├── apigee-ingressgateway-manager
│   │   │   │   └── kustomization.yaml
│   │   │   └── kustomization.yaml
│   │   └── webhooks
│   │       ├── kustomization.yaml
│   │       ├── mutatingwebhookconfiguration.yaml
│   │       └── validatingwebhookconfiguration.yaml
│   └── instances
│       └── instance1
│           ├── datastore
│           │   ├── apigee-datastore.yaml
│           │   ├── components
│           │   │   ├── gcs-backup
│           │   │   │   ├── apigee-datastore-patch.yaml
│           │   │   │   ├── cron-patch.yaml
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── tls-certificate-patch.yaml
│           │   │   ├── gcs-restore
│           │   │   │   ├── apigee-datastore-patch.yaml
│           │   │   │   ├── job-patch.yaml
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── tls-certificate-patch.yaml
│           │   │   ├── http-proxy
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── patch.yaml
│           │   │   ├── imagepullsecret
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── patch.yaml
│           │   │   ├── multi-region
│           │   │   │   ├── cassandra-data-replication.yaml
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── patch.yaml
│           │   │   ├── nodeselector
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── patch.yaml
│           │   │   ├── non-gcs-backup
│           │   │   │   ├── apigee-datastore-patch.yaml
│           │   │   │   ├── cron-patch.yaml
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── tls-certificate-patch.yaml
│           │   │   ├── non-gcs-restore
│           │   │   │   ├── apigee-datastore-patch.yaml
│           │   │   │   ├── job-patch.yaml
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── tls-certificate-patch.yaml
│           │   │   ├── openshift-scc
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── scc.yaml
│           │   │   └── workload-identity
│           │   │       ├── kustomization.yaml
│           │   │       ├── patch.yaml
│           │   │       └── service-accounts.yaml
│           │   ├── kustomization.yaml
│           │   └── secrets.yaml
│           ├── environments
│           │   ├── kustomization.yaml
│           │   └── test
│           │       ├── apigee-environment.yaml
│           │       ├── components
│           │       │   ├── http-proxy
│           │       │   │   ├── kustomization.yaml
│           │       │   │   └── patch.yaml
│           │       │   ├── imagepullsecret
│           │       │   │   ├── kustomization.yaml
│           │       │   │   └── patch.yaml
│           │       │   ├── nodeselector
│           │       │   │   ├── kustomization.yaml
│           │       │   │   └── patch.yaml
│           │       │   └── workload-identity
│           │       │       ├── kustomization.yaml
│           │       │       ├── patch.yaml
│           │       │       └── service-accounts.yaml
│           │       ├── kustomization.yaml
│           │       └── secrets.yaml
│           ├── kustomization.yaml
│           ├── organization
│           │   ├── apigee-organization.yaml
│           │   ├── components
│           │   │   ├── http-proxy
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── patch.yaml
│           │   │   ├── imagepullsecret
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── patch.yaml
│           │   │   ├── nodeselector
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── patch.yaml
│           │   │   └── workload-identity
│           │   │       ├── kustomization.yaml
│           │   │       ├── patch.yaml
│           │   │       └── service-accounts.yaml
│           │   ├── kustomization.yaml
│           │   └── secrets.yaml
│           ├── redis
│           │   ├── apigee-redis.yaml
│           │   ├── components
│           │   │   ├── imagepullsecret
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── patch.yaml
│           │   │   ├── nodeselector
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── patch.yaml
│           │   │   └── workload-identity
│           │   │       ├── kustomization.yaml
│           │   │       ├── patch.yaml
│           │   │       └── service-accounts.yaml
│           │   ├── kustomization.yaml
│           │   └── secrets.yaml
│           ├── route-config
│           │   ├── kustomization.yaml
│           │   └── test-envgroup
│           │       ├── apigee-route-config.yaml
│           │       ├── components
│           │       │   ├── http-and-non-sni-client
│           │       │   │   ├── apigee-route.yaml
│           │       │   │   └── kustomization.yaml
│           │       │   ├── http-client
│           │       │   │   ├── apigee-route.yaml
│           │       │   │   └── kustomization.yaml
│           │       │   └── non-sni-client
│           │       │       ├── apigee-route.yaml
│           │       │       └── kustomization.yaml
│           │       └── kustomization.yaml
│           └── telemetry
│               ├── apigee-telemetry.yaml
│               ├── components
│               │   ├── http-proxy
│               │   │   ├── kustomization.yaml
│               │   │   └── patch.yaml
│               │   ├── imagepullsecret
│               │   │   ├── kustomization.yaml
│               │   │   └── patch.yaml
│               │   ├── logger
│               │   │   ├── kustomization.yaml
│               │   │   └── patch.yaml
│               │   ├── metrics
│               │   │   ├── kustomization.yaml
│               │   │   └── patch.yaml
│               │   ├── nodeselector
│               │   │   ├── kustomization.yaml
│               │   │   └── patch.yaml
│               │   ├── openshift-scc
│               │   │   ├── kustomization.yaml
│               │   │   └── scc.yaml
│               │   ├── workload-identity-logger
│               │   │   ├── kustomization.yaml
│               │   │   ├── patch.yaml
│               │   │   └── service-accounts.yaml
│               │   └── workload-identity-metrics
│               │       ├── kustomization.yaml
│               │       ├── patch.yaml
│               │       └── service-accounts.yaml
│               └── kustomization.yaml
├── README.md
├── templates
│   ├── certificate-org-envgroup.yaml
│   ├── secret-apigee-cassandra-backup-and-restore-gcp-sa-key.yaml
│   ├── secret-apigee-cassandra-backup-and-restore-key-file.yaml
│   ├── secret-gcp-sa-key.yaml
│   └── secret-ingress-tls-cert-key.yaml
└── tools
    ├── apigee-hybrid-setup.sh
    ├── apigee-pull-push.sh
    ├── common.sh
    ├── create-service-account.sh
    └── dump_kubernetes.sh

上述文件的版本可在 GitHub 儲存庫的 preview-1 標籤中找到,網址為:https://github.com/apigee/apigee-hybrid-install/releases/tag/preview-1。

上述資料夾包含 Apigee hybrid 執行時期的 Kubernetes 清單,並使用 Kustomize 進行設定管理。清單是根據 Kustomize bases & overlays 的概念進行組織的。bases 資料夾包含 Apigee 每個元件所需的最小配置。overlays 資料夾包含多個附加功能(配置),定義為 components。 可以透過取消註解 kustomization.yaml 檔案中的元件參考來新增元件。

範例: 若要為 Apigee 資料儲存啟用 gcs-backup,請在下方的 customization.yaml 中取消註解 gcs-backup 元件。

路徑: ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}/datastore/kustomization.yaml

namespace: "apigee" # kpt-set: ${APIGEE_NAMESPACE}

resources:
- apigee-datastore.yaml

components:
# - ./components/http-proxy
# - ./components/nodeselector/
# - ./components/imagepullsecret
# - ./components/workload-identity
# - ./components/openshift-scc
- ./components/gcs-backup (uncommented)
# - ./components/gcs-restore
# - ./components/non-gcs-backup
# - ./components/non-gcs-restore

任何需要自訂的值都必須在 gcs-backup 的相應 patch.yaml 檔案中設定。 在下面的文件中,CLOUD_STORAGE_BUCKET_PATH 的值需要由使用者設定。

路徑: $INSTALL_DIR/overlays/instances/$INSTANCE_DIR/datastore/components/gcs-backup/cron-patch.yaml

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: apigee-cassandra-backup
  namespace: apigee
spec:
  schedule: "${YOUR_BACKUP_SCHEDULE_CODE}" # To be modified
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: apigee-cassandra-backup
            env:
            - name: APIGEE_CLOUDPROVIDER
              value: "GCP"
            - name: DATABASE_STORAGE_BUCKET
              value: "${CLOUD_STORAGE_BUCKET_PATH}" # To be modified. REQUIRED
            volumeMounts:
            - name: apigee-cassandra-backup
              mountPath: /var/secrets/google
          volumes:
          - name: apigee-cassandra-backup
            secret:
              secretName: "apigee-cassandra-backup-and-restore-svc-account"

同樣,任何需要自訂的功能/配置都可以透過取消註解 apigee 元件的 kustomization.yaml 中的元件來啟用。此外,還需要根據需要,相應地設定組件 patch.yaml 檔案中各欄位的值。

資料夾和文件的簡要說明:

基地

此資料夾包含 Apigee 各個元件所需的最基本配置範本。此資料夾中的清單檔案無需修改。

疊加層

此資料夾包含其他配置的 kustomize 元件模板

初始化

namespaces.yaml

Apigee 資料平面元件的安裝命名空間。預設命名空間名稱為apigee

憑證

包含用於向 webhook 頒發憑證的 Issuer 和 Certificate 資源。也包含用於核發憑證給各個 Pod,以進行 TLS 通訊的 Issuer。

rbac

包含各種元件將要使用的 Role、ClusterRole、RoleBinding 和 ClusterRoleBinding。

信用
    Contains the definition of all the CRDs which are used by Apigee.
網路鉤子

包含 ValidatingWebhookConfiguration 和 MutatingWebhookConfiguration,它們將用於對自訂資源執行驗證。

輸入

包含適用於所有入口 Pod 的配置。例如:常見頭部修改、健康檢查等。

OpenShift

包含 openshift SecurityContextConstraints 的定義。

控制器

鴿子控制器
apigee-hybrid-config.yaml

包含一個 ConfigMap,它是在 apigee-controller-manager.yaml 中作為輸入提供的。此 ConfigMap 包含諸如 imageHub、imagePullSecrets、forwardProxy 等配置。

apigee-controller-deployment.yaml

包含控制器和 webhook 的兩個服務,以及控制器的部署。如果您想為控制器使用私有鏡像,則需要在此處進行變更。

伊斯蒂奧德

Apigee-istio-mesh-config.yaml 包含 Apigee 使用的 Istio 的網格配置。這不適用於叢集中其他 ASM/Istio 安裝。

apigee-ingressgateway-manager-deployment-patch.yaml

包含 Istiod 的服務和部署。這是一個僅供 Apigee 使用場景的私有系統。

instances/{實例名稱}

datastore
apigee-datastore.yaml

包含管理 Cassandra 的 ApigeeDatastore 自訂資源。

secrets.yaml

包含資料儲存的預設憑證。

redis
apigee-redis.yaml

包含管理 Redis 的 ApigeeRedis 自訂資源。

secrets.yaml

包含資料儲存的預設憑證。

組織
apigee-organization.yaml

包含 ApigeeOrganization 自訂資源,該資源管理其他子元件,如 connectAgent、watcherAndSynchronizer、MART、UDCA 和 Ingress。

secrets.yaml

包含Secret被引用的apigee-organization.yaml 。腳本產生時,部分秘密訊息會被註解掉。如果停用它們的生成,則需要手動建立這些物件。

environments

包含您組織中的所有環境。你應該為每個環境建立一個單獨的資料夾,方法是複製已經提供給你的資料夾,並根據需要進行配置。

dev
apigee-environment.yaml

包含 ApigeeEnvironment 自訂資源,用於管理執行時間等其他子元件。

secrets.yaml

包含Secret被引用的apigee-environment.yaml 。腳本產生時,部分秘密訊息會被註解掉。如果停用它們的生成,則需要手動建立這些物件。

遙測
apigee-telemetry.yaml

包含 ApigeeTelemetry 自訂資源。

secrets.yaml

包含Secret被引用的apigee-telemetry.yaml 。腳本產生時,部分秘密訊息會被註解掉。如果停用生成功能,您就必須手動建立這些

路由配置
dev-envgroup
apigee-route-config.yaml

包含 ApigeeRouteConfig 自訂資源。

secrets.yaml

包含 Secret,且 apigee-route-config.yaml 中有參照該 。由於這是由 apigee-hybrid-setup.sh 腳本自動產生的,因此被註解掉了,保留在那裡是為了提供一個範例,說明如果您手動建立金鑰,金鑰應該是什麼樣子。

診斷

diagnostic-collector.yaml

用於啟動診斷部署作業的資源

工具

apigee-hybrid-setup.sh
apigee-create-service-account.sh
dump-kubernetes.sh
apigee-pull-push.sh

將服務帳戶金鑰儲存在外部金鑰庫中

Vault(由 Hashicorp 開發)是一款受歡迎的金鑰管理系統,它與 Google、Azure、AWS 等提供的金鑰儲存進行了多項整合。Hashicorp Vault 可讓您從外部來源取得金鑰,然後在 Kubernetes 資源中使用它們。您可以使用 Vault 取得密鑰,方法有很多種。以下步驟將作為如何使用 Vault CSI Provider 掛載儲存在 Vault 提供的某些金鑰引擎中的 Google Cloud 服務帳戶金鑰的基本範例。



  1. 我們將使用 Helm 在您的叢集中安裝與 Vault 相關的資源。請依照 安裝 Helm 中的步驟在您的系統中設定 Helm。
  2. 請依照安裝 Vault Helm chart中的步驟操作,即:

    1. 將 Hashicorp 程式碼庫加入 Helm。

      helm repo add hashicorp https://helm.releases.hashicorp.com
      
    2. 更新 Helm 倉庫

      helm repo update
      
    3. 安裝 Vault

      helm install vault hashicorp/vault \
      --set "server.dev.enabled=true" \
      --set "injector.enabled=false" \
      --set "csi.enabled=true"
      
  3. 現在我們將把這個秘密保存在保險庫裡。

    1. 取得 Vault 開發艙內的 shell。

      kubectl exec -it vault-0 -- /bin/sh
       ```
      
    2. 在本例中,我們將使用鍵/值 Secret 引擎儲存資料。

      vault kv put secret/runtime-gcp-sa-key key="${BASE_64_ENCODED_KEY}"
      
    3. 若要驗證金鑰是否已成功存儲,請使用:

      vault kv get secret/runtime-gcp-sa-key
      
  4. 設定身份驗證,允許運行時 pod 取得金鑰。如 Kubernetes 服務帳戶 所述,Kubernetes 服務帳戶為 Pod 提供身份,並允許它們與其他系統進行身份驗證。

    1. 取得 Vault 開發艙內的 shell。

      kubectl exec -it vault-0 -- /bin/sh
      
    2. 啟用 Kubernetes 身份驗證方法

      vault auth enable kubernetes
      
    3. 撰寫驗證設定

      vault write auth/kubernetes/config \
      issuer="https://kubernetes.default.svc.cluster.local" \
      token_reviewer_jwt="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \
      kubernetes_host="https://$KUBERNETES_PORT_443_TCP_ADDR:443" \
      kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt \
      disable_iss_validation=true
      
    4. 建立身份驗證策略

      vault policy write apigee-runtime-app - <<EOF
      path "secret/data/runtime-gcp-sa-key" {
      capabilities = ["read"]
      }
      EOF
      
    5. 將策略與服務帳戶綁定

      vault write auth/kubernetes/role/apigee-runtime-role \
      bound_service_account_names=apigee-runtime-sa \
      bound_service_account_namespaces=${APIGEE_NAMESPACE} \
      policies=apigee-runtime-app \
      ttl=20m
      

    這裡,我們假設服務帳戶位於 apigee 命名空間內。如果您為安裝 Apigee 使用了其他命名空間,則需要使用該名稱。

    1. 退出 Vault-0 內的外殼

      exit
      
  5. 安裝密鑰儲存 CSI 驅動程式

    # Add repo to helm
    helm repo add secrets-store-csi-driver https://raw.githubusercontent.com/kubernetes-sigs/secrets-store-csi-driver/master/charts
    # Install driver in cluster
    helm install csi secrets-store-csi-driver/secrets-store-csi-driver
    
  6. 創造SecretProviderClass引用您在 Vault 中建立的金鑰的 Kubernetes 資源

    cat > spc-vault.yaml <<EOF
    apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
    kind: SecretProviderClass
    metadata:
    name: vault-apigee-runtime-gcp-sa-key
    spec:
    provider: vault
    parameters:
      vaultAddress: "http://vault.default:8200"
      roleName: "apigee-runtime-role"
      objects: |
        - objectName: "client_secret.json"
          secretPath: "secret/data/runtime-gcp-sa-key"
          secretKey: "key"
    EOF
    
  7. 應用 yaml

    kubectl apply -f spc-vault.yaml
    
  8. 建立 Kubernetes 服務帳戶,並在步驟 (4.e) 中指派權限

    kubectl create serviceaccount -n ${APIGEE_NAMESPACE} apigee-runtime-sa
    
  9. 修改環境變數 apigee-environment.yaml 文件,並新增以下幾行:

    apiVersion: apigee.cloud.google.com/v1alpha2
    kind: ApigeeEnvironment
    # existing content
    spec:
    name: {ENV_NAME}
    organizationRef: {ORG_NAME}
    components:
     runtime:
    # existing content
       pod
       containers:
       - name: apigee-runtime
         podServiceAccountName: apigee-runtime-sa
    # existing content
         volumeMounts:
         - name: secrets-store-inline
           mountPath: "/opt/apigee/sa"
           readOnly: true
       volumes:
       - name: secrets-store-inline
         csi:
           driver: secrets-store.csi.k8s.io
           readOnly: true
           volumeAttributes:
             secretProviderClass: "vault-apigee-runtime-gcp-sa-key"
    
  10. 套用變更:

    kubectl apply -k ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}/environments/$ENV_NAME
    

Apigee Hybrid 升級



您應該已完成 先決條件 中提到的所有要求。此外,建議您對所有組件進行滾動重啟,以檢查集群是否健康。重啟順序為 Cassandra、Redis、ApigeeOrganization 和 ApigeeEnvironment。

建立備份

  1. 建立目前混合部署方案的備份副本。如果需要將升級回滾到目前版本,則需要進行備份。

    tar -czvf apigee-hybrid-install.v-X.Y.Z.tar.gz $HYBRID_INSTALL_BASE_DIR
    
  2. 建立 Cassandra 資料庫備份。Cassandra 備份是應對災難情況的重要保護措施。

如有需要,請升級您的 Kubernetes 平台

雖然並非每次都需要執行此步驟,但如果您的 Kubernetes 平台(如 kubernetes、openshift)以及元件(如 cert-manager、cassandra 等)的版本不再受新版 Apigee Hybrid 支持,則您需要升級這些平台和元件的版本。文件將包含 個受支援的平台和元件版本。

下載安裝文件

下載存放區,並將現有 Apigee Hybrid 設定中的 bases 和 tools 資料夾替換為較新的資料夾:

  1. 複製 GitHub 倉庫 preview-1 標籤,位址為 https://github.com/apigee/apigee-hybrid-install/releases/tag/preview-1

    複製的存放區結構會與「Apigee Hybrid 設定資料夾結構」一文所述的結構類似:

  2. 取代現有 Apigee Hybrid 設定中的初始化、工具和控制器資料夾。

    export HYBRID_INSTALL_HOME=PATH_TO_PREVIOUS_HYBRID_INSTALL_DIRECTORY
    mv -f bases $HYBRID_INSTALL_HOME/bases
    mv -f tools $HYBRID_INSTALL_HOME/tools
    

如有需要,請更新服務帳號權限

雖然並非每次都需要執行此步驟,但如果需要,您需要建立新的服務帳戶或更新現有服務帳戶的權限。升級指南將詳細說明需要修改或建立哪些服務帳戶,以及需要新增哪些角色。

  • 如果需要修改現有服務帳戶的權限,請使用對應的 gcloud 指令。升級指南中將包含需要新增的詳細命令和角色。

    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:apigee-component@$PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/$NEW_ROLE"
    
  • 如果較新的 Apigee 混合版本可能需要為新的 / 現有的元件建立額外的服務帳戶,那麼您需要建立這些帳戶。您可以使用工具資料夾中提供的 apigee-create-service-account.sh 腳本來建立新的服務帳戶。由於腳本將在步驟 4 中更新,因此它將包含建立新服務帳戶所需的詳細資訊和新設定檔。

    新建立的服務帳戶名稱必須在對應的元件 CR 中引用。

    ./tools/create-service-account --env prod --profile apigee-component
    

升級控制器

將 ${INSTALL_DIR}/overlays/instances/$INSTANCE_DIR/kustomization.yaml 中列出的元件的版本欄位變更為相關的混合版本。

以下是 $INSTALL_DIR/overlays/instances/$INSTANCE_DIR/kustomization.yaml 檔案的範例。版本欄位的值必須更新為對應的版本。

resources:
- datastore/
- environments/
- organization/
- redis/
- route-config/
- telemetry/

patches:
- target:
    group: apigee.cloud.google.com
    version: v1alpha1
    kind: ApigeeDatastore
  patch: |-
    - op: add
      path: /spec/version
      value: 1-6-1 (Modify the version)
- target:
    group: apigee.cloud.google.com
    version: v1alpha2
    kind: ApigeeEnvironment
  patch: |-
    - op: add
      path: /spec/version
      value: 1-6-1 (Modify the version)

請按照 Apigee Hybrid 安裝工作流程中「建立初始化資源和控制器」一節的步驟操作。您可以透過指令碼或手動步驟升級初始化資源和控制器。

更新 Apigee Kubernetes 元件

您需要進行以下更改: - 如果架構發生任何變化,或者引入了新字段或棄用了舊字段,則必須按照升級指南中提供的說明,對 CR 進行相應的更改。 - 至少需要將 CR 中的版本欄位(表示已安裝的 Apigee Hybrid 版本)更新為較新的 Apigee Hybrid 版本。

對 Apigee CR 應用這些變更。對於非生產環境,您可以同時套用 Apigee 元件的所有變更。

kubectl apply -f ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}

Apigee Hybrid Rollback

  1. 恢復 Apigee 混合設置

    切換到包含先前版本的 Apigee Hybrid 安裝程式的目錄。如果不可用,請從 Apigee Hybrid 升級過程中步驟 1[連結] 建立的 zip 檔案中復原。

  2. 回滾 Kubernetes 元件

    套用 Apigee CR 的變更

    kubectl apply -k ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}
    
  3. 復原控制器

    請依照 Apigee hybrid 安裝工作流程中提供的步驟 建立初始化資源和控制器 進行操作。您可以使用指令碼或按照提供的手動步驟復原初始化資源和控制器。

  4. 清除所用資源

    您需要清理升級過程中建立的任何新的額外資源,例如在新版本的混合系統中引入的新元件或服務帳戶。升級指南會說明需要清除的所有資源,以及清除步驟。

刪除環境



如要從 Kubernetes 叢集刪除與環境相關的所有資源,請按照下列步驟操作:

  1. 取得環境 CR 的名稱。如要執行這項操作,請取得所有環境:

    kubectl get env -n ${APIGEE_NAMESPACE}
    

    將資源名稱儲存在 APIGEE_ENV 環境變數中。

  2. 刪除環境加密金鑰。例如,如果您沒有更改加密金鑰的名稱,則可以使用下列命令刪除它們:

    kubectl delete secret -n ${APIGEE_NAMESPACE} $APIGEE_ENV-encryption-keys
    
  3. 刪除 Google Cloud 服務帳戶金鑰:

    kubectl delete secret -n ${APIGEE_NAMESPACE} $(kubectl get env $APIGEE_ENV -n ${APIGEE_NAMESPACE} -o=jsonpath='{.spec.components.*.appServiceAccountSecretName}')
    
  4. 刪除 Kubernetes 服務帳戶:

    kubectl delete secret -n ${APIGEE_NAMESPACE} $(kubectl get env $APIGEE_ENV -n ${APIGEE_NAMESPACE} -o=jsonpath='{.spec.components.*.podServiceAccountName}')
    
  5. 刪除 Apigee 環境自訂資源:

    kubectl -n ${APIGEE_NAMESPACE} delete env $APIGEE_ENV
    

刪除混合型設定



以下步驟用於從 Kubernetes 叢集中刪除所有與 Apigee Hybrid 相關的資源:

  1. 您需要刪除 Apigee 使用者設定和架構設定作業。

    # To list all jobs in ${APIGEE_NAMESPACE}
    kubectl -n ${APIGEE_NAMESPACE} get jobs
    # To delete all jobs in ${APIGEE_NAMESPACE}
    kubectl -n ${APIGEE_NAMESPACE} delete jobs $(kubectl -n ${APIGEE_NAMESPACE} get jobs -o custom-columns=':.metadata.name')
    
  2. 您必須刪除已部署的 Apigee Hybrid 資料平面元件。使用以下命令刪除所有組件:

    kubectl delete -k ${INSTALL_DIR}/overlays/instances/$INSTANCE_NAME
    
  3. 如果您未使用 Kubernetes 服務帳戶 Secret、Google Cloud 服務帳戶 Secret 等的預設名稱,則需要執行此步驟。如果您使用了預設名稱,則這些 Secret 將在下一步中刪除;否則,您需要使用以下指令手動刪除它們:

    kubectl delete secret -n ${APIGEE_NAMESPACE} $(kubectl get ${APIGEE_COMPONENT} ${APIGEE_COMPONENT_NAME} -n ${APIGEE_NAMESPACE} -o=jsonpath='{.spec.components.*.appServiceAccountSecretName}')
    kubectl delete secret -n ${APIGEE_NAMESPACE} $(kubectl get ${APIGEE_COMPONENT} ${APIGEE_COMPONENT_NAME} -n ${APIGEE_NAMESPACE} -o=jsonpath='{.spec.components.*.podServiceAccountName}')
    
  4. 對於 OpenShift,您需要刪除在安裝 Apigee Hybrid 期間建立的 scc(安全性上下文約束)。

    kubectl delete scc ${SECURITY_CONTEXT_CONSTRAINTS_NAME}
    
  5. 執行以下命令刪除角色、角色綁定、CRD、控制器部署等。

    kubectl delete -k ${INSTALL_DIR}/overlays/initialization/ingress
    kubectl delete -k ${INSTALL_DIR}/overlays/initialization/rbac
    kubectl delete -k ${INSTALL_DIR}/overlays/initialization/webhooks
    kubectl delete -k ${INSTALL_DIR}/overlays/initialization/crds
    kubectl delete -k ${INSTALL_DIR}/overlays/initialization/certificates
    
  6. 執行以下命令刪除 Apigee 命名空間

    kubectl delete -f ${INSTALL_DIR}/overlays/initialization/namespace.yaml
    

    或者,使用以下命令:

    kubectl delete $APIGEE_NAMESPACE
    

多實例安裝

多執行個體設定是指可跨多個區域或在同一區域內使用的混合設定。Apigee 建議您將第 2 個執行個體的設定整理到個別的目錄結構中,因為執行個體之間的環境設定 (副本等) 一定不同。每個執行個體的設定都會分離,並獨立整理到各自的資料夾結構中。

舉例來說,在多區域情境中,如果採用「主動-被動」設定,您可能會想在暖待機狀態下,設定第 2 個區域,並採用不同大小和設定。

在下方的資料夾結構中,您可以複製名為 instance1 的目錄,並將副本命名為 instance2,然後視需要修改資料儲存區和 Ingress 設定。

apigee-hybrid-setup 多實例設定的資料夾結構。 ]

.
├── bases
│   ├── controllers
│   │   ├── apigee-controller
│   │   │   ├── apigee-controller-deployment.yaml
│   │   │   └── kustomization.yaml
│   │   └── istiod
│   │       ├── apigee-ingressgateway-manager-deployment.yaml
│   │       └── kustomization.yaml
│   └── initialization
│       ├── certificates
│       │   ├── certificates-and-issuers.yaml
│       │   └── kustomization.yaml
│       ├── crds
│       │   ├── customresourcedefinition-apigeedatastores.apigee.cloud.google.com.yaml
│       │   ├── customresourcedefinition-apigeedeployments.apigee.cloud.google.com.yaml
│       │   ├── customresourcedefinition-apigeeenvironments.apigee.cloud.google.com.yaml
│       │   ├── customresourcedefinition-apigeeorganizations.apigee.cloud.google.com.yaml
│       │   ├── customresourcedefinition-apigeeredis.apigee.cloud.google.com.yaml
│       │   ├── customresourcedefinition-apigeerouteconfigs.apigee.cloud.google.com.yaml
│       │   ├── customresourcedefinition-apigeeroutes.apigee.cloud.google.com.yaml
│       │   ├── customresourcedefinition-apigeetelemetries.apigee.cloud.google.com.yaml
│       │   ├── customresourcedefinition-cassandradatareplications.apigee.cloud.google.com.yaml
│       │   └── kustomization.yaml
│       ├── ingress
│       │   ├── envoyfilter-1.11.yaml
│       │   └── kustomization.yaml
│       ├── openshift
│       │   ├── kustomization.yaml
│       │   └── scc.yaml
│       ├── rbac
│       │   ├── apigee-controller
│       │   │   ├── kustomization.yaml
│       │   │   └── rbac.yaml
│       │   └── apigee-embedded-ingress-controller
│       │       ├── cluster-role-bindings.yaml
│       │       ├── cluster-roles.yaml
│       │       ├── kustomization.yaml
│       │       └── service-account.yaml
│       └── webhooks
│           ├── kustomization.yaml
│           ├── mutatingwebhookconfiguration.yaml
│           └── validatingwebhookconfiguration.yaml
├── instances
│   └── instance1 (Add the 2nd instance under instances directory similar to instance1)
│       ├── datastore
│       │   ├── apigee-datastore.yaml
│       │   ├── components
│       │   │   ├── http-proxy
│       │   │   │   ├── kustomization.yaml
│       │   │   │   └── patch.yaml
│       │   │   ├── imagepullsecret
│       │   │   │   ├── kustomization.yaml
│       │   │   │   └── patch.yaml
│       │   │   ├── nodeselector
│       │   │   │   ├── kustomization.yaml
│       │   │   │   └── patch.yaml
│       │   │   └── workload-identity
│       │   │       ├── apigee-workload-identities.yaml
│       │   │       ├── kustomization.yaml
│       │   │       └── patch.yaml
│       │   ├── kustomization.yaml
│       │   └── secrets.yaml
│       ├── environments
│       │   ├── kustomization.yaml
│       │   └── test
│       │       ├── apigee-environment.yaml
│       │       ├── components
│       │       │   ├── http-proxy
│       │       │   │   ├── kustomization.yaml
│       │       │   │   └── patch.yaml
│       │       │   ├── imagepullsecret
│       │       │   │   ├── kustomization.yaml
│       │       │   │   └── patch.yaml
│       │       │   ├── nodeselector
│       │       │   │   ├── kustomization.yaml
│       │       │   │   └── patch.yaml
│       │       │   └── workload-identity
│       │       │       ├── apigee-workload-identities.yaml
│       │       │       ├── kustomization.yaml
│       │       │       └── patch.yaml
│       │       ├── kustomization.yaml
│       │       └── secrets.yaml
│       ├── kustomization.yaml
│       ├── organization
│       │   ├── apigee-organization.yaml
│       │   ├── components
│       │   │   ├── http-proxy
│       │   │   │   ├── kustomization.yaml
│       │   │   │   └── patch.yaml
│       │   │   ├── imagepullsecret
│       │   │   │   ├── kustomization.yaml
│       │   │   │   └── patch.yaml
│       │   │   ├── nodeselector
│       │   │   │   ├── kustomization.yaml
│       │   │   │   └── patch.yaml
│       │   │   └── workload-identity
│       │   │       ├── apigee-workload-identities.yaml
│       │   │       ├── kustomization.yaml
│       │   │       └── patch.yaml
│       │   ├── kustomization.yaml
│       │   └── secrets.yaml
│       ├── redis
│       │   ├── apigee-redis.yaml
│       │   ├── components
│       │   │   ├── imagepullsecret
│       │   │   │   ├── kustomization.yaml
│       │   │   │   └── patch.yaml
│       │   │   ├── nodeselector
│       │   │   │   ├── kustomization.yaml
│       │   │   │   └── patch.yaml
│       │   │   └── workload-identity
│       │   │       ├── apigee-workload-identities.yaml
│       │   │       ├── kustomization.yaml
│       │   │       └── patch.yaml
│       │   ├── kustomization.yaml
│       │   └── secrets.yaml
│       ├── route-config
│       │   ├── kustomization.yaml
│       │   └── test-env-group
│       │       ├── apigee-route-config.yaml
│       │       ├── components
│       │       │   ├── http-and-non-sni-client
│       │       │   │   ├── apigee-route.yaml
│       │       │   │   └── kustomization.yaml
│       │       │   ├── http-client
│       │       │   │   ├── apigee-route.yaml
│       │       │   │   └── kustomization.yaml
│       │       │   └── non-sni-client
│       │       │       ├── apigee-route.yaml
│       │       │       └── kustomization.yaml
│       │       └── kustomization.yaml
│       └── telemetry
│           ├── apigee-telemetry.yaml
│           ├── components
│           │   ├── http-proxy
│           │   │   ├── kustomization.yaml
│           │   │   └── patch.yaml
│           │   ├── imagepullsecret
│           │   │   ├── kustomization.yaml
│           │   │   └── patch.yaml
│           │   ├── logger
│           │   │   ├── kustomization.yaml
│           │   │   └── patch.yaml
│           │   ├── metrics
│           │   │   ├── kustomization.yaml
│           │   │   └── patch.yaml
│           │   ├── nodeselector
│           │   │   ├── kustomization.yaml
│           │   │   └── patch.yaml
│           │   ├── workload-identity-logger
│           │   │   ├── apigee-workload-identities.yaml
│           │   │   ├── kustomization.yaml
│           │   │   └── patch.yaml
│           │   └── workload-identity-metrics
│           │       ├── apigee-workload-identities.yaml
│           │       ├── kustomization.yaml
│           │       └── patch.yaml
│           └── kustomization.yaml
├── overlays
│   ├── controllers
│   │   ├── apigee-controller
│   │   │   ├── apigee-hybrid-config.yaml
│   │   │   ├── components
│   │   │   │   ├── imagepullsecret
│   │   │   │   │   ├── kustomization.yaml
│   │   │   │   │   └── patch.yaml
│   │   │   │   └── nodeselector
│   │   │   │       ├── kustomization.yaml
│   │   │   │       └── patch.yaml
│   │   │   └── kustomization.yaml
│   │   ├── istiod
│   │   │   ├── apigee-ingressgateway-manager-deployment-patch.yaml
│   │   │   ├── apigee-istio-mesh-config.yaml
│   │   │   ├── components
│   │   │   │   ├── imagepullsecret
│   │   │   │   │   ├── kustomization.yaml
│   │   │   │   │   └── patch.yaml
│   │   │   │   └── nodeselector
│   │   │   │       ├── kustomization.yaml
│   │   │   │       └── patch.yaml
│   │   │   └── kustomization.yaml
│   │   └── kustomization.yaml
│   ├── initialization
│   │   ├── certificates
│   │   │   ├── apigee-ingressgateway-manager-certificate.yaml
│   │   │   └── kustomization.yaml
│   │   ├── crds
│   │   │   └── kustomization.yaml
│   │   ├── ingress
│   │   │   └── kustomization.yaml
│   │   ├── namespace.yaml
│   │   ├── openshift
│   │   │   ├── kustomization.yaml
│   │   │   └── scc.yaml
│   │   ├── rbac
│   │   │   ├── apigee-controller
│   │   │   │   └── kustomization.yaml
│   │   │   ├── apigee-embedded-ingress-controller
│   │   │   │   └── kustomization.yaml
│   │   │   └── kustomization.yaml
│   │   └── webhooks
│   │       ├── kustomization.yaml
│   │       ├── mutatingwebhookconfiguration.yaml
│   │       └── validatingwebhookconfiguration.yaml
│   └── instances
│       └── instance1
│           ├── datastore
│           │   ├── apigee-datastore.yaml
│           │   ├── components
│           │   │   ├── http-proxy
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── patch.yaml
│           │   │   ├── imagepullsecret
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── patch.yaml
│           │   │   ├── nodeselector
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── patch.yaml
│           │   │   ├── openshift-scc
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── scc.yaml
│           │   │   └── workload-identity
│           │   │       ├── apigee-workload-identities.yaml
│           │   │       ├── kustomization.yaml
│           │   │       └── patch.yaml
│           │   ├── kustomization.yaml
│           │   └── secrets.yaml
│           ├── environments
│           │   ├── kustomization.yaml
│           │   └── test
│           │       ├── apigee-environment.yaml
│           │       ├── components
│           │       │   ├── http-proxy
│           │       │   │   ├── kustomization.yaml
│           │       │   │   └── patch.yaml
│           │       │   ├── imagepullsecret
│           │       │   │   ├── kustomization.yaml
│           │       │   │   └── patch.yaml
│           │       │   ├── nodeselector
│           │       │   │   ├── kustomization.yaml
│           │       │   │   └── patch.yaml
│           │       │   └── workload-identity
│           │       │       ├── apigee-workload-identities.yaml
│           │       │       ├── kustomization.yaml
│           │       │       └── patch.yaml
│           │       ├── kustomization.yaml
│           │       └── secrets.yaml
│           ├── kustomization.yaml
│           ├── organization
│           │   ├── apigee-organization.yaml
│           │   ├── components
│           │   │   ├── http-proxy
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── patch.yaml
│           │   │   ├── imagepullsecret
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── patch.yaml
│           │   │   ├── nodeselector
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── patch.yaml
│           │   │   └── workload-identity
│           │   │       ├── apigee-workload-identities.yaml
│           │   │       ├── kustomization.yaml
│           │   │       └── patch.yaml
│           │   ├── kustomization.yaml
│           │   └── secrets.yaml
│           ├── redis
│           │   ├── apigee-redis.yaml
│           │   ├── components
│           │   │   ├── imagepullsecret
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── patch.yaml
│           │   │   ├── nodeselector
│           │   │   │   ├── kustomization.yaml
│           │   │   │   └── patch.yaml
│           │   │   └── workload-identity
│           │   │       ├── apigee-workload-identities.yaml
│           │   │       ├── kustomization.yaml
│           │   │       └── patch.yaml
│           │   ├── kustomization.yaml
│           │   └── secrets.yaml
│           ├── route-config
│           │   ├── kustomization.yaml
│           │   └── test-envgroup
│           │       ├── apigee-route-config.yaml
│           │       ├── components
│           │       │   ├── http-and-non-sni-client
│           │       │   │   ├── apigee-route.yaml
│           │       │   │   └── kustomization.yaml
│           │       │   ├── http-client
│           │       │   │   ├── apigee-route.yaml
│           │       │   │   └── kustomization.yaml
│           │       │   └── non-sni-client
│           │       │       ├── apigee-route.yaml
│           │       │       └── kustomization.yaml
│           │       └── kustomization.yaml
│           └── telemetry
│               ├── apigee-telemetry.yaml
│               ├── components
│               │   ├── http-proxy
│               │   │   ├── kustomization.yaml
│               │   │   └── patch.yaml
│               │   ├── imagepullsecret
│               │   │   ├── kustomization.yaml
│               │   │   └── patch.yaml
│               │   ├── logger
│               │   │   ├── kustomization.yaml
│               │   │   └── patch.yaml
│               │   ├── metrics
│               │   │   ├── kustomization.yaml
│               │   │   └── patch.yaml
│               │   ├── nodeselector
│               │   │   ├── kustomization.yaml
│               │   │   └── patch.yaml
│               │   ├── openshift-scc
│               │   │   ├── kustomization.yaml
│               │   │   └── scc.yaml
│               │   ├── workload-identity-logger
│               │   │   ├── apigee-workload-identities.yaml
│               │   │   └── kustomization.yaml
│               │   └── workload-identity-metrics
│               │       ├── apigee-workload-identities.yaml
│               │       ├── kustomization.yaml
│               │       └── patch.yaml
│               └── kustomization.yaml
├── README.md
├── templates
│   ├── ingress-certificate.yaml
│   ├── ingress-cert-secret.yaml
│   └── service-account-key-secret.yaml
└── tools
    ├── apigee-hybrid-setup.sh
    ├── common.sh
    ├── create-service-account.sh
    └── dump_kubernetes.sh

在 GKE 上設定多實例

必要條件

在配置多個混合實例之前,您需要完成以下先決條件:

  • 在多個區域(相同或不同)中使用不同的 CIDR 區塊設定 Kubernetes 集群
  • 設定跨區域通訊
  • 在所有區域的 Kubernetes 叢集之間開啟 Cassandra 通訊埠 7000 和 7001 (疑難排解期間,7000 可能會做為備份選項)。另請參閱「設定通訊埠」。

您可以使用諸如 ntpdate 之類的工具來驗證伺服器時間是否同步。


設定多區域種子主機

  1. 從現有執行個體複製 $INSTANCE_NAME 資料夾,並新增至 instances 資料夾下方。
  2. 如果命名空間欄位的值與 instance1 命名空間不同,請修改該值。
  3. 依照 指定入口 TLS 憑證 中指定的步驟修改另一個實例的入口設定。
  4. 如要瞭解如何為其他執行個體設定負載平衡器 IP,請參閱「管理 Apigee Ingress 閘道」。



  5. 在檢索種子名稱之前,請將 kubectl 上下文設定為原始叢集。

    kubectl config use-context original-cluster-name
    
  6. 執行以下kubectl指令,以決定目前區域中 Cassandra 的種子主機位址。

    kubectl get pods -o wide -n apigee -l app=apigee-cassandra
    
  7. 上一個指令傳回的任何 Pod IP 都可以被視為多區域種子主機。

  8. 在第二個實例中,設定 Apigee 資料儲存 CR 的 ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}/datastore/apigee-datastore.yaml 檔案中 multiRegionSeedHost 的值。

設定新實例

  1. 將上下文設定為現有集群

    kubectl config use-context existing-cluster-name
    
  2. 將 apigee-ca 金鑰匯出到文件

    kubectl -n cert-manager get secret apigee-root-certificate -o yaml > apigee-root-certificate.yaml
    
  3. 將環境設為新區域的叢集名稱:

    kubectl config use-context NEW_CLUSTER_NAME
    
  4. 將密鑰導入新集群

    kubectl -n cert-manager apply -f apigee-root-certificate.yaml
    
  5. 依照 建立初始化資源和控制器 中概述的步驟,在新實例(區域)中安裝混合模式。

  6. 在新資料中心的所有 pod 上部署 Cassandra。使用以下命令從集群中獲取 apigeeorg:

    kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name"
    
  7. 建立 Cassandra 資料複製自訂資源 (YAML) 檔案。檔案名稱可以任意命名。在下列範例中,檔案將命名為 datareplication.yaml。 文件必須包含以下內容

    apiVersion: apigee.cloud.google.com/v1alpha1
    kind: CassandraDataReplication
    metadata:
    name: REGION_EXPANSION
    namespace: NAMESPACE
    spec:
    organizationRef: APIGEEORG_VALUE
    force: false
    source:
      region: SOURCE_REGION
    

    其中:

    • REGION_EXPANSION 是您為該元資料指定的名稱。您可以選擇類似“cassandra-data-replication”這樣的名稱。
    • NAMESPACE 是為第二個實例選擇的相同命名空間。這通常是“apigee”。
    • APIGEEORG_VALUE 是上一步中 kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name" 指令輸出的值。
    • SOURCE_REGION 是來源叢集中 nodetool status 指令傳回的 cassandra 資料中心的值。
  8. 使用下列指令套用 CassandraDataReplication:

    kubectl apply -f datareplication.yaml
    
  9. 使用以下命令驗證重建狀態。



    kubectl -n apigee get apigeeds -o json | jq ".items[].status.cassandraDataReplication"
    

    結果應該類似這樣

    {
    "rebuildDetails": {
      "apigee-cassandra-default-0": {
        "state": "complete",
        "updated": 1623105760
      },
      "apigee-cassandra-default-1": {
        "state": "complete",
        "updated": 1623105765
      },
      "apigee-cassandra-default-2": {
        "state": "complete",
        "updated": 1623105770
      }
    },
    "state": "complete",
    "updated": 1623105770
    }
    
  10. 從記錄檔驗證重建程序。此外,請使用 nodetool status 指令驗證資料大小:

    kubectl logs apigee-cassandra-default-0 -f -n apigee
    

    請參閱 datastore/secrets.yaml 檔案以取得 JMX_user 和 JMX_password 資訊。

    kubectl exec apigee-cassandra-default-0 -n apigee  -- nodetool -u JMX_user -pw JMX_password status
    
  11. 從 Apigee 資料儲存 CR 移除 multiRegionSeedHost,然後執行以下命令以套用變更。

    kubectl apply k apply -k ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}/datastore
    
  12. 檢查 Cassandra 叢集狀態

    以下命令可用於查看兩個資料中心中的叢集設定是否成功。此指令檢查兩個區域的 nodetool 狀態。

    kubectl exec apigee-cassandra-default-0 -n apigee  -- nodetool -u JMX_user -pw JMX_password status
    
    
    Datacenter: us-central1
    =======================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
    UN  10.12.1.45  112.09 KiB  256          100.0%            3c98c816-3f4d-48f0-9717-03d0c998637f  ra-1
    UN  10.12.4.36  95.27 KiB  256          100.0%            0a36383d-1d9e-41e2-924c-7b62be12d6cc  ra-1
    UN  10.12.5.22  88.7 KiB   256          100.0%            3561f4fa-af3d-4ea4-93b2-79ac7e938201  ra-1
    Datacenter: us-west1
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
    UN  10.0.4.33   78.69 KiB  256          100.0%               a200217d-260b-45cd-b83c-182b27ff4c99  ra-1
    UN  10.0.0.21   78.68 KiB  256          100.0%               9f3364b9-a7a1-409c-9356-b7d1d312e52b  ra-1
    UN  10.0.1.26   15.46 KiB  256          100.0%               1666df0f-702e-4c5b-8b6e-086d0f2e47fa  ra-1
    

疑難排解

支持性、診斷和故障排除指南

https://cloud.google.com/apigee/docs/api-platform/troubleshoot/playbooks/troubleshooting-apigee-hybrid.

在多區域 Apigee Hybrid 設定中使用 forceDelete 後進行手動清理

  • 在以下範例中,有 2 個區域 - us-east1 和 us-west1。
  • 在 us-west1 區域中,使用強制刪除刪除了 apigee 資料儲存。
  • 在 us-east1 區域,cassandra 仍在運作。
  • 使用指令驗證 apigeeds 是否已刪除

    kubectl get apigeeds -n apigee
    No resources found in apigee namespace.
    
  • 將 kubectl 上下文變更為 cassandra 叢集仍在運作的另一個區域(此處為 us-east1)區域。

  • 驗證資料儲存是否處於運作狀態

    kubectl get apigeeds -n apigee
    NAME      STATE     AGE
    default      running    23h
    
  • 進入 up 區域(此處為 us-east1)中的某個 Cassandra Pod。

    kubectl exec -it -n apigee apigee-cassandra-default-0 -- bash
    apigee@apigee-cassandra-default-0:~$
    
  • 檢查節點工具狀態,它會顯示已刪除區域(此處為 us-west1)中所有已關閉的節點。

    apigee@apigee-cassandra-default-0:~$ nodetool -u ${APIGEE_JMX_USER} -pw ${APIGEE_JMX_PASSWORD} status
    
    Datacenter: us-east1
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --     Address         Load           Tokens   Owns    Host ID                                                           Rack
    UN  10.52.0.212   685.01 KiB  256          ?         e1aa61e3-4eae-4549-9b58-506d495d87ab   ra-1
    UN  10.52.0.72     606.75 KiB  256          ?         477dfc03-f93e-40ea-810a-d15769822ad5     ra-1
    UN  10.52.0.104   648.3 KiB    256          ?         a8854cff-c2e3-4f0c-a342-e692787efcab        ra-1
    Datacenter: us-west1
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --     Address         Load             Tokens   Owns     Host ID                                                           Rack
    DN  10.60.0.143   567.06 KiB    256          ?           355d6ace-ab77-42cb-8138-9993bfd62d0e    ra-1
    DN  10.60.0.40     535.99 KiB    256          ?           4ed2c903-ff56-40fa-a15e-80a3de3cb22d      ra-1
    DN  10.60.0.17     573.08 KiB    256          ?           f9a50d19-c04a-4d0d-a088-612384bed9f5     ra-1
    
  • 刪除已刪除區域(此處為 us-west1)中的所有節點

    apigee@apigee-cassandra-default-0:~$ nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD removenode 355d6ace-ab77-42cb-8138-9993bfd62d0e
    apigee@apigee-cassandra-default-0:~$ nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD removenode 4ed2c903-ff56-40fa-a15e-80a3de3cb22d
    apigee@apigee-cassandra-default-0:~$ nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD removenode f9a50d19-c04a-4d0d-a088-612384bed9f5
    
  • 確認已刪除區域 (在此為 us-west1) 中沒有任何節點

    apigee@apigee-cassandra-default-0:~$ nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD status
    
    
    Datacenter: us-east1
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --     Address         Load             Tokens  Owns   Host ID                                                           Rack
    UN  10.52.0.212   699.71 KiB    256          ?        e1aa61e3-4eae-4549-9b58-506d495d87ab  ra-1
    UN  10.52.0.72     586.77 KiB    256          ?        477dfc03-f93e-40ea-810a-d15769822ad5    ra-1
    UN  10.52.0.104   623.6 KiB      256          ?        a8854cff-c2e3-4f0c-a342-e692787efcab       ra-1
    
  • 完成後,請刪除上層區域 (這裡為 us-east1) 中的使用者設定工作。系統會在幾秒內自動重新建立工作。

    kubectl get jobs -n apigee
    
    
    ​​NAME                                                                                    COMPLETIONS   DURATION   AGE
    apigee-cassandra-schema-setup-apigee--0d2504c                    0/1           5m54s      5m54s
    apigee-cassandra-user-setup--apigee--0d2504c                          0/1            7s         7s
    
    
    kubectl delete job apigee-cassandra-user-setup--apigee--0d2504c
    
  • 等待使用者設定作業完成

    kubectl get jobs -n apigee
    
    ​​NAME                                                                                    COMPLETIONS   DURATION   AGE
    apigee-cassandra-schema-setup-apigee--0d2504c                    1/1           5m54s      5m54s
    apigee-cassandra-user-setup--apigee--0d2504c                      1/1           7m                7m
    
  • 確認鍵空間中不存在已刪除的區域。

  • 建立一個 Cassandra 調試 pod。

    • 如果是混合式 1.5 以上版本,請參閱 Cassandra 疑難排解指南的說明文件 (例如混合式 1.5 - 連結、混合式 1.6 - 連結),然後執行建立的 Pod
  • 使用下列指令登入偵錯 Pod 中的 cqlsh:

    apigee@cassandra-debug-client:~$ cqlsh apigee-cassandra-default-0.apigee-cassandra-default.apigee.svc.cluster.local -u ddl_user --ssl
    Password:
    
  • 確認所有鍵空間中的 us-west1 區域已移除。

    ddl_user@cqlsh> SELECT * FROM system_schema.keyspaces;
    
    keyspace_name              | durable_writes | replication
    ---------------------------+----------------+-----------------------------------------------------------------------------------
    cache_prince_hybrid_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'us-east1': '3'}
      rtc_prince_hybrid_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'us-east1': '3'}
                    system_auth |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'us-east1': '3'}
                  system_schema |           True |                            {'class': 'org.apache.cassandra.locator.LocalStrategy'}
    quota_prince_hybrid_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'us-east1': '3'}
      kms_prince_hybrid_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'us-east1': '3'}
             system_distributed |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'us-east1': '3'}
                         system |           True |                            {'class': 'org.apache.cassandra.locator.LocalStrategy'}
                         perses |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'us-east1': '3'}
      kvm_prince_hybrid_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'us-east1': '3'}
                  system_traces |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'us-east1': '3'}
    (11 rows)