Leo Yeh's Blog

SAS Viya (90)

教學目標

在 Azure Kubernetes Service (AKS) 雲端服務中部署 SAS Event Stream Processing 6.1 的心得分享。

重點概念

今年一月我們已經在 AWS 雲端平台中以 Kubernetes 容器叢集中部署 SAS Viya 3.4 平台,並且整理為心得分享文章,而在相隔半年之後,SAS Event Stream Processing 6.1 也已經支援在 Kubernetes 容器叢集中進行部署,所以此篇文章主要就會針對如何在 Azure Kubernetes Service (AKS) 雲端服務中部署 SAS Event Stream Processing 6.1 的心得分享,請注意此篇文章假設我們已經具備 Docker 和 Kubernetes 的基本概念和操作能力,若是不具備相關概念和能力,請先參考 Docker 官方網站Kubernetes 官方網站 進行學習。

首先當我們要在 Azure Kubernetes Service (AKS) 雲端服務中部署 SAS Event Stream Processing 6.1,則主要必須透過 Azure Kubernetes Service (AKS) 雲端服務先建立 Kubernetes 容器叢集平台,相關操作步驟請參考官方文件,以及建立儲存所有容器之映像檔的儲存庫,則我們能夠透過 Azure Container Registry (ACR) 雲端服務先建立 Docker 容器儲存庫,相關操作步驟請參考官方文件

接著我們主要會透過 SAS Viya Container Recipes 基於 Order 信件中部署壓縮檔 SAS_Viya_deployment_data.zip 產生部署 SAS Event Stream Processing (ESP) 的所有容器映像檔,請參考以下指令,請注意「type」參數必須設定「full」,「mirror-url」參數必須設定 SAS Event Stream Processing 安裝檔儲存的網址,「docker-registry-url」參數必須設定 Docker 容器儲存庫的網址,「docker-namespace」參數必須設定 Docker 容器儲存庫中的命名空間,至於詳細設定步驟,請參考官方文件

自動建立 Docker 容器映像檔和 Kubernetes 部署設定檔

1
2
3
4
5
6
7
$ cd ~/recipes/sas-container-recipes/
$ time ./build.sh \
--type full \
--zip SAS_Viya_deployment_data.zip \
--mirror-url http://127.0.0.1:8080/ \
--docker-registry-url http://127.0.0.1:5001 \
--docker-namespace sas-esp\

然而所產生的容器映像檔主要能夠儲存在三種不同類型的儲存庫,分別為:

  1. Local Container Repository
  2. Private Container Repository
  3. Public Container Repository

其中我們可能會先將容器映像檔建立至本機中,必須先安裝和啟用 Docker CE 服務,當容器映像檔建立完成之後,我們能會選擇要儲存至哪種類型的儲存庫中,此時我們就會先考慮建置 Local Container Repository 本機伺服器的容器儲存庫,所有容器皆部署至本機伺服器的儲存庫,但是不建議採用,因為 Kubernete 要如何連線至本機伺服器的容器儲存庫相關設定相對較複雜,所以我們在企業內部會建置 Private Container Repository 私有伺服器的容器儲存庫,此時我們若要採用,則必須先建立 Kubernete 針對伺服器的容器儲存庫儲存庫的使用者驗證憑據 Secret,並且在每個部署 Pod 的 YAML 設定檔中需要加上「imagePullSecrets」參數指定所對應的驗證憑據 Secret,請注意此參數建議加在 container: 和 volumes: 之後屬於同一層級,若放錯層級將會導致建立時驗證發生「error validating data: ValidationError(StatefulSet.spec.template.spec.containers[0]): unknown field “imagePullSecrets” in io.k8s.api.core.v1.Container; 」之錯誤訊息,並且請注意 Secret 和 Pod 必須在相同的命名空間才會生效。

此外有關私有伺服器的容器儲存庫,我們能夠考慮採用 Azure Container Registry (ACR) 或 Docker Hub Repository 雲端服務。如果採用 ACR 雲端服務,則我們必須先建立驗證機制,主要有兩種設定驗證方法,我們僅需要設定下列其中一種驗證方法,最常見的方法是將授與使用 Azure Kubernetes Service (AKS) 服務主體的存取權,但是在某些情況下,您可能無法將所需角色指派給自動產生的 AKS 服務主體,授與其存取 ACR 的權限,則能夠選擇性地授與使用 AKS 祕密的存取權,然而不論是哪一種皆要有「Microsoft.Authorization/roleAssignments/write」授與存取 ACR 角色指派的權限,否則將 AKS 將無法正常存取 ACR 上儲存的容器映像檔,至於詳細設定步驟,請參考官方文件。如果採用 Docker Hub Repository 雲端服務,則需要支付 22 美金獲取 21 個私有儲存庫,才能夠儲存 SAS Event Stream Processing (ESP) 的所有容器映像檔至私有儲存庫,主要有兩種設定驗證方法,我們僅需要設定下列其中一種驗證方法,最常見的方法是透過指令自動建立提供驗證憑據的 Secret,請參考以下指令,此外若我們已經在本機登入 Docker,則也能夠基於存在的 Docker 驗證憑據透過指令手動建立提供驗證憑據的 Secret,至於詳細設定步驟,請參考官方文件

建立提供 Kubernetes 驗證憑據的 Secret

1
2
3
4
5
6
7
8
9
10
$ DOCKER_REGISTRY_SERVER=<Docker Repository URI>
$ DOCKER_USER=<Docker User>
$ DOCKER_EMAIL=<Docker Email>
$ DOCKER_PASSWORD=<Docker Password>

$ kubectl create secret docker-registry docker-secret -n sas-esp \
--docker-server=$DOCKER_REGISTRY_SERVER \
--docker-username=$DOCKER_USER \
--docker-password=$DOCKER_PASSWORD \
--docker-email=$DOCKER_EMAIL

然而如果我們是初學者,則建議直接採用 Public Container Repository,也就是 Docker Hub Repository 雲端服務,主要原因除了免費之外,我們更不需要設定相關的複雜設定,但是 SAS Event Stream Processing (ESP) 的所有容器映像檔就會公開讓任何人進行存取使用,此時就會有授權碼的問題,需要特別僅慎小心使用。

再來多個容器彼此之間會互相溝通,所以我們需要透過 Kubernetes 部署容器,以利設定容器彼此之間的關聯,然而部署 SAS Event Stream Processing 總共有 12 個容器映像檔,分別為:

  1. SAS Data Service:sas-viya-sasdatasvrc
  2. RabbitMQ Message Bus:sas-viya-rabbitmq
  3. Postgres Database:sas-viya-pgpoolc
  4. Reverse Proxy Server:sas-viya-httpproxy
  5. SAS Data Configuration:sas-viya-consul
  6. SAS ESP Design Studio:sas-viya-espstudio
  7. SAS ESP Dashboard Tool:sas-viya-espstreamviewer
  8. SAS ESP Manager:sas-viya-vipresm
  9. SAS ESP Server:sas-viya-espserver
  10. SAS Core Microservices:sas-viya-coreservices
  11. SAS Configuration Database:sas-viya-configuratn
  12. SAS Operations:sas-viya-operations

其中 SAS Core Microservice 中有 SAS Logon 服務,當我們需要登入操作 SAS ESP Design Studio 或 SAS ESP Manager 服務時皆需要先透過 SAS Logon 服務進行使用者登入授權存取服務。然而我們要如何部署容器映像檔,主要會透過「~/recipes/sas-container-recipes/builds/full/manifests/kubernetes」目錄中的 Kubernetes 設定檔進行自動部署設定,然而在自動部署設定容器映像檔之前,我們必須先建立 Kubernetes 命名空間的 YAML 設定檔,並且進行手動部署設定在 Azure Kubernetes Service 中。

手動部署 Kubernetes 命名空間設定

1
2
3
4
5
6
7
8
9
10
$ tee ~/recipes/sas-container-recipes/builds/full/manifests/kubernetes/namespace/sas-esp.yml > /dev/null <<'EOF'
apiVersion: v1
kind: Namespace
metadata:
name: sas-esp
labels:
name: "SAS_ESP_Full_Deployment_Multi_Image"
EOF
$ kubectl apply -f ~/recipes/sas-container-recipes/builds/full/manifests/kubernetes/namespace/sas-esp.yml
$ kubectl get ns

當我們手動部署完成 Kubernetes 命名空間之後,下一步就是自動部署 Kubernetes 相關容器設定,我們透過 kubectl 指令在 Azure Kubernetes Service 中設定 Configmaps、Secrets、Services 和 Deployments 相關設定部署多個 Docker 容器,並且進行關聯,以利容器之間彼此進行溝通。

自動部署 Kubernetes 所有容器的相關設定

1
2
3
4
5
$ kubectl -n sas-esp apply -f ~/recipes/sas-container-recipes/builds/full/manifests/kubernetes/configmaps
$ kubectl -n sas-esp apply -f ~/recipes/sas-container-recipes/builds/full/manifests/kubernetes/secrets
$ kubectl -n sas-esp apply -f ~/recipes/sas-container-recipes/builds/full/manifests/kubernetes/services
$ kubectl -n sas-esp apply -f ~/recipes/sas-container-recipes/builds/full/manifests/kubernetes/deployments
$ watch kubectl -n sas-esp get pods -o wide

此時若發現有 Pod 的狀態為「Pending」,則原因可能是 Azure Kubernetes Service 中的叢集中的節點數量不足夠,此時我們需要縮放節點數量為容器應用程式增加所能使用的總核心數與記憶體總量,若發現有 Pod 的狀態為「ErrImagePull」,則原因可能是指定了錯誤的容器映像檔,以及發現有 Pod 的狀態為「ImagePullBackOff」,則原因可能是使用私有伺服器的容器儲存庫卻沒有提供正確的驗證資訊,不論是「ErrImagePull」或「ImagePullBackOff」哪一種狀態,皆請先確認私有伺服器的容器儲存庫是否已經與 Azure Kubernetes Service 正確進行相關設定,請注意所有設定必須在相同命名空間。

當我們自動部署 Kubernetes 所有容器的相關設定至 Pod 中,並且確認所有 Pod 的狀態皆是「Running」,並且等待所有 SAS Event Stream Processing (ESP) 所有容器中的所有服務正常啟動,大約十分鐘之後,我們理應就能夠登入操作 SAS ESP Design Studio 或 SAS ESP Manager 服務。

查看 Kubernetes 所有執行容器中所有服務的狀態

1
2
3
4
5
6
7
8
9
10
11
12
$ tee /tmp/status.sh > /dev/null << 'EOF'
#!/bin/bash
for p in $(kubectl get pods -n sas-esp| grep Running | awk '{ print $1 }' )
do
printf '%s\n' '---------------------------------------------------------------------------------------------'
printf "running status on pod: $p: \n"
kubectl --namespace=vta exec -it $p -- /etc/init.d/sas-viya-all-services status
printf '%s\n' '---------------------------------------------------------------------------------------------'
done
EOF
$ chmod 777 /tmp/status.sh
$ /tmp/status.sh

然而問題又來了,我們要如何登入操作 SAS ESP Design Studio 或 SAS ESP Manager 服務呢?相關連線網址是什麼呢?為了解決此問題我們主要能夠啟動 Azure Kubernetes Service (AKS) 中的 HTTP 應用程式路由解決方案,以利我們存取已部署至 Azure Kubernetes Service (AKS) 叢集的應用程式,至於詳細設定步驟,請參考官方文件,此外當啟動 Azure Kubernetes Service (AKS) 中的 HTTP 應用程式路由解決方案之後,我們必須先建立 Kubernetes Ingress 的 YAML 設定檔,並且進行手動部署設定在 Azure Kubernetes Service 中,理應就能透過 HTTP 應用程式路由自動產生 Azure 的 DNS 網址登入操作 SAS ESP Design Studio 或 SAS ESP Manager 服務,但是如果我們等待十分鐘以上卻還沒有辦法登入操作 SAS ESP Design Studio 或 SAS ESP Manager 服務,此時我們就需要在 Azure DNS 區域的雲端服務中手動建立類型為「A」的名稱「sasesp」對應值為 AKS 部署 Ingress 所產生的 IP 位置,我們能夠透過「kubectl -n sas-esp get ingress 」取得對應的 IP 位置。

手動部署 Kubernetes Ingress 設定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ tee ~/recipes/sas-container-recipes/builds/full/manifests/kubernetes/ingress/sas-esp.yml > /dev/null <<'EOF'
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: sas-esp-ingress
namespace: sas-esp
annotations:
kubernetes.io/ingress.class: addon-http-application-routing
spec:
rules:
- host: sasesp.xxx.aksapp.io
http:
paths:
- backend:
serviceName: sas-viya-httpproxy
servicePort: 80
path: /
EOF
$ kubectl -n sas-esp apply -f ~/recipes/sas-container-recipes/builds/full/manifests/kubernetes/ingress/sas-esp.yml
$ kubectl -n sas-esp get ingress

最後當我們透過 Azure 的 DNS 網址登入操作 SAS ESP Design Studio 或 SAS ESP Manager 服務時,若是發生「404 Not Found」的錯誤訊息,則代表 SAS Core Microservice 中有 SAS Logon 服務還未正常啟動,此時我們能夠透過 Kubernetes 指令登入已部署的 SAS Core Microservice 容器查看服務狀態是否皆已經正常啟動。

登入 Kubernetes 已部署的 SAS Core Microservice 容器查看服務狀態

1
2
$ kubectl -n sas-esp exec -it $(kubectl -n sas-esp get po | grep core| awk '{print $1}') -- bash
$ /etc/init.d/sas-viya-all-services status

然而當我們透過 Azure 的 DNS 網址連線 SAS ESP Design Studio 或 SAS ESP Manager 服務看到 SAS Logon 的登入畫面時,此時問題又來了需要輸入使用者的帳號和密碼,為了解決此問題登入 Kubernetes 已部署的 SAS Core Microservice 容器查看變更 sasboot 密碼的方式,我們主要透過變更 sasboot 密碼的方式完成密碼變更設定之後,就能夠開始登入操作 SAS ESP Design Studio 或 SAS ESP Manager 服務了。

登入 Kubernetes 已部署的 SAS Core Microservice 容器查看變更 sasboot 密碼的方式

1
2
$ kubectl -n sas-esp exec -it $(kubectl -n sas-esp get po | grep core| awk '{print $1}') -- bash
$ grep sasboot `ls -tr /opt/sas/viya/config/var/log/saslogon/default/sas-saslogon_* | tail -n 1`

總結我們透過 Azure Kubernetes Service (AKS) 雲端服務中部署 SAS Event Stream Processing 6.1 主要有三個階段,分別為:

  1. 建立階段:自動建立 Docker 容器映像檔和 Kubernetes 部署設定檔。
  2. 啟動階段:在 Azure Kubernetes Service 雲端服務中啟動 SAS Event Stream Processing 6.1。
  3. 設定階段:在 Azure Kubernetes Service 雲端服務中設定 SAS Event Stream Processing 6.1。

當完成內部測試署之後,我們僅需要複製 Kubernetes 部署目錄「~/recipes/sas-container-recipes/builds/full/manifests/kubernetes/」至任何有安裝 kubectl 工具,並且已經設定連線至企業客戶的 Azure Kubernetes Service 雲端服務的客戶端,就能夠在二十分鐘之內,完成 SAS Event Stream Processing 6.1 的部署,請注意二十分鐘不包括從 Docker 容器儲存庫下載容器映像檔的時間,至於更深入的設定階段還包括設定身份驗證、共享儲存空間、資料串接設定、… 等,之後有空再進行心得分享。

列出 Kubernetes 部署目錄詳細資訊

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
$ cd ~/recipes/sas-container-recipes/builds/full/manifests 
$ tree
└── kubernetes
├── configmaps
│   ├── consul.yml
│   ├── espserver.yml
│   ├── operations.yml
│   ├── pgpoolc.yml
│   ├── rabbitmq.yml
│   ├── sasdatasvrc.yml
│   └── vipresm.yml
├── deployments
│   ├── configuratn.yml
│   ├── consul.yml
│   ├── coreservices.yml
│   ├── espserver.yml
│   ├── espstreamviewer.yml
│   ├── espstudio.yml
│   ├── httpproxy.yml
│   ├── operations.yml
│   ├── pgpoolc.yml
│   ├── rabbitmq.yml
│   ├── sasdatasvrc.yml
│   └── vipresm.yml
├── ingress
│   ├── sas-esp.yml
│   └── sas-viya.yml
├── namespace
│   ├── sas-esp.yml
│   └── sas-viya.yml
├── secrets
│   ├── consul.yml
│   ├── espserver.yml
│   ├── operations.yml
│   ├── pgpoolc.yml
│   ├── sasdatasvrc.yml
│   └── vipresm.yml
└── services
├── consul.yml
├── domain-service.yml
├── espserver.yml
├── httpproxy.yml
├── pgpoolc.yml
├── rabbitmq.yml
└── sasdatasvrc.yml

相關資源

⬅️ Go back