Leo Yeh's Blog

SAS Viya (118)

教學目標

初步了解在三大主流雲端平台所提供的 Kubernetes 容器管理平台之服務部署 SAS Viya 平台的基本概念。

重點概念

首先我們能夠按照 SAS 所提供的官方文件官方部落格文章開始透過容器的方式進行部署,其中要就是透過 Kubernetes 容器管理平台進行自動化部署,而 Kubernetes 簡稱為 K8s,主要用於自動部署、擴展和管理容器,而目前三大主流的雲端服務平台,像是 Amazon 的 AWS、Microsoft 的 Azure 和 Google 的 GCP 等雲端平台,皆有提供 Kubernetes 容器管理平台的服務,像是 Amazon 所提供的 Amazon Elastic Kubernetes Service (Amazon EKS) 服務、Microsoft 所提供的 Azure Kubernetes Service (AKS) 服務和 Google 所提供的 Google Kubernetes Engine (GKE) 服務。因此我們能透過在主流雲端平台中,透過容器的方式部署 SAS Viya 平台至主流雲端平台所提供 Kubernetes 容器管理平台中,而我們若要透過容器的方式部署 SAS Viya 平台至主流雲端平台所提供 Kubernetes 容器管理平台中,主要有三個階段,分別為:

  1. 建立階段 (Build):建立 Docker 容器映像檔和 Kubernetes 部署設定檔。
  2. 啟動階段 (Launch):在 Kubernetes 容器管理平台啟動 SAS Viya 平台。
  3. 設定階段 (Configure):設定 Kubernetes 容器管理平台中的 SAS Viya 平台。

接著建立階段主要是建立容器映像檔,我們主要會需要一台建立機器 (Build Machine),其也能夠是一台輕量級伺服器,但需要執行 Linux 作業系統,至於規格的部份,則建議使用 2 CPU 和 8 GB 記憶體以上的規格,並且安裝穩定版本的 Docker ,同時配置 100GB 的儲存空間用於儲存相關資訊,預設指定目錄為「/var/lib/docker」,但是我們能夠輕鬆更改「/etc/docker/daemon.json」設定檔中的目錄路徑,以及將「SAS Viya Container Recipes」的 Github 專案複製至建立機器中,以利透過指令的方式開始建立容器映像檔,請參考官方說明文件

1
2
3
4
5
6
$  ./build.sh \
--type full \
--zip /path/to/SAS_Viya_deployment_data.zip \
--docker-registry-namespace myuniquename \
--docker-registry-url myregistry.myhost.com \
--addons "auth-sssd"

當完成建立階段的步驟之後,我們將會在建立主機的 docker images 目錄中儲存容器映像檔,至於映像檔的數量取決於訂購的軟體方案,同時所有映像檔也被標記,並且推送到特定容器映像檔註冊資料庫,其使用的參考命名為「$DOCKER_REGISTRY_URL/$DOCKER_REGISTRY_NAMESPACE/-:$ SAS_DOCKER_TAG」,請注意當我們安裝 Docker 工具之後,預設會指定儲存至 Docker Hub 中的容器映像檔註冊資料庫。此外我們是否能夠指定主流雲端平台所提供容器映像檔註冊資料庫,像是 Amazon 所提供的 Amazon Elastic Container Registry (Amazon ECR) 服務、Microsoft 所提供的 Azure Container Registry (ACS) 服務和 Google 所提供的 Google Container Registry (GCR) 服務呢?這當然沒有問題啊,此外若我們已經建立好容器映像檔至特定容器映像檔註冊資料庫,但是因為需求變更,而需要將建立好的容器映像檔移至另一個特定容器映像檔註冊資料庫,因此我們能夠將 Azure Container Registry (ACS) 服務中所註冊的容器映像檔移至 Google Container Registry (GCR) 服務中,主要透過 Docker 所提供的原生指令就能夠輕易的完成此操作,但是請記得在轉移之前必須先登入相關雲端平台中的容器映像檔註冊資料庫服務,才有存取進行存取操作。

1
2
3
$ docker pull <來源容器映像檔完整名稱>
$ docker tag <來源容器映像檔完整名稱> <目地容器映像檔完整名稱>
$ docker push <目地容器映像檔完整名稱>

再來啟動階段主要當完成建立階段的步驟之後我們會在「sas-container-recipes/builds/full/manifests/kubernetes」目錄中找到所有與部署至 Kubernetes 容器管理平台中相關的設定檔案,其中預設主要使用當建立和推送的容器映像檔,而其中主要有五個最關鍵的 Kubernetes 容器管理平台之部署設定檔,分別為:

  1. deployment.yaml:主要用於描述部署的設定資訊,透過此檔案能夠將工作負載部署至 Kubernetes 容器管理平台中。
  2. configmap.yaml:主要用於執行階段將設定檔、指令列引數、環境變數、通訊連接埠及其他設定結果繫結到 Pod 的容器和系統元件。
  3. secrets.yaml:主要用於安全性物件,會在叢集裡儲存機密資料,像是密碼、OAuth 憑證和 SSH 金鑰等,將機密資料儲存在密鑰裡相對較安全。
  4. service.yaml:主要用於將一組 Pod 組成單一資源,並且設定以各種方式存取這組 Pod 資源,根據預設將會獲得穩定的叢集 IP 位址,客戶端會將要求傳送至穩定的 IP 位址,而求會轉送至服務中的一個 Pod。
  5. ingress.yaml:主要用於建立 HTTP(S) 負載平衡器,並且能做出更好的情境感知負載平衡的流量路由決策。

而當我們有上述五個 Kubernetes 容器管理平台之部署設定檔案之後,就能夠透過 Kubectl 指令開始部署 SAS Viya 平台至 Kubernetes 容器管理平台中,請注意預設認情況下當部署到 Kubernetes 容器管理平台中新的命名空間,會將資源與執行的任何其他資源隔離開來,同時如果我們建立完整的 SAS Viya 平台部署,則需要確保有足夠的資源來同時執行所有容器,建議至少需要 8 Core 的 CPU 和 80 GB 的記憶體,請記住 SAS Viya 平台中雲端分析服務 (CAS) 是一個多執行緒程式在記憶體中執行時,若提供的 CPU 核心數和記憶體越多,則我們用 SAS Viya 平台進行實際分析工作的能力就越強大。

1
2
3
4
5
6
7
$ kubectl create namespace <命名空間>
$ kubectl apply -f <設定檔路徑>/deployment.yaml -n <命名空間>
$ kubectl apply -f <設定檔路徑>/configmap.yaml -n <命名空間>
$ kubectl apply -f <設定檔路徑>/secrets.yaml -n <命名空間>
$ kubectl apply -f <設定檔路徑>/service.yaml -n <命名空間>
$ kubectl apply -f <設定檔路徑>/ingress.yaml -n <命名空間>
$ watch kubectl get pods -n <命名空間>

至於所謂 Kubectl 指令主要是與 Kubernetes 容器管理平台一起使用的客戶端工具,我們可以將它視為打包 Kubernetes API 的命令提示指令,請記得 Kubectl 指令能夠操作主流雲端平台中所提供 Kubernetes 容器管理平台的服務,所以採用 Kubectl 指令將會非常方便且有彈性的容器部署方式。而當執行完成上述指令之後,最後一行指令為監控目前特定命名空間中 Pod 的執行情況,正常情況大約等個一個小時所有 SAS Viya 平台容器映像檔的執行情況皆會為「Running」,此時我們就能夠開始使用部署在 Kubernetes 容器管理平台中的 SAS Viya 平台了,但若是發現有錯誤發生時,我們檢查部署設定檔是否有問題,以及部署設定檔中容器映像檔的位置是否設定正確,以及有些容器映像檔因為檔案很大,所以會導致其它有相依關係的容器映像檔無法正常啟動,此時建議透過以下指令重新載入所部署的容器映像檔。

1
2
3
$ kubectl kubectl get deployment -n <命名空間>  
$ kubectl scale deployment <該容器映像檔部署的名稱> --replicas=0 -n <命名空間>
$ kubectl scale deployment <該容器映像檔部署的名稱> --replicas=1 -n <命名空間>

最後設定階段主要進行部署在 Kubernetes 容器管理平台中的 SAS Viya 平台的相關設定,我們除了透過登入 SAS Environment Manager 網站操作界面進行設定之外,更能夠透過以下指令登入至容器映像檔部署對應 Pod 中執行操作指令,像是若我們要透過 LDAP 進行登入,則需要根據正確配置的 sitedefault.yml 和 sssd.conf 檔案進行後續設定,更進一步我們需要根據需求,將所有進行的調整想辦法整合至 Kubernetes 容器管理平台之部署設定檔案中,避免當特定 Pod 中執行的容器環境發生問題重新載入時,將會導致被重新設定為預設值的問題發生,這部份就需有非常專業的能力才有辦法處理了。

1
$ kubectl -n <命名空間> exec -it $(kubectl -n <命名空間> get po | grep <該容器映像檔部署對應 Pod 的名稱>| awk '{print $1}') -- bash

總結 SAS 平台容器部署策略正在迅速發展,其作為一種可擴展,高可用性導向服務的體系結構,非常適合在 Kubernetes 容器管理平台中執行,同時 Kubernetes 容器管理平台為 SAS Viya 平台來了巨大的營運優勢,像是更簡單的部署,更長的正常執行時間,即時的規模,以及更高效能的硬體件使用等優勢。此外 SAS Viya 未來的版本將將提供以 Helm 部署方式讓客戶更容易將 SAS Viya 平台部署至的 Kubernetes 容器管理平台中,同時 SAS Viya 平台中的基礎設施在許多方面將被重新設計為更原生支援 Kubernetes,以利系統管理員和營運商更能夠有方便透過 Kubernetes 容器管理平台來管理 SAS Viya 平台。

(心得分享:若要練習三大主流雲端平台進行 SAS Viya 的容器部署,就部署簡易程度來看 GCP > Azure > AWS,其中最大的差別主要在於負載平衡器的設定,這部份 GCP 無需特別設定就自動完成,此外 GCP 所提供的 K8s 管理操作介面,相較於 Azure 和 AWS 更直覺且更方便進行使用,更重要的是能夠直接透過網站動態調整部署設定檔,並且儲存之後自動更新部署…,所以若是沒有 K8s 容器部署經驗,則建議從 GCP 開始進行練習。)

相關資源

⬅️ Go back