DevOps課程-Configuration Management with Ansible 22

Project: Deploying Application in K8s

ZONGRU Li
8 min readOct 22, 2023

Project Automate K8s Deployment

要先讓遠端主控機台可以透過Terraform建置EKS

在遠端主控機除了前面有安裝anisble工具(參考第18篇筆記)

後續為了配合Terraform連動驅動Ansible腳本

又在主控機上安裝AWS Cli & Terraform工具(參考第20篇筆記)

接著就可以考慮更進階的K8S相關Ansible自動化腳本作業

Introduction

前面課程學會了透過Anislbe腳本自動化安裝Nexus,Java應用程式

也學會安裝docker,甚至自動化運行Container

接著就要來學著自動化佈署應用程式到K8s上

並且會有以下幾個階段建置:

  1. 透過Terraform建置EKS叢集,可能會建在別的region
  2. 設置Ansible去連線到該EKS叢集
  3. 佈署Deployment與Service到EKS上(此時會自動化接到ALB暴露服務)

這邊使用的就是Terraform課程建立的EKS的建置腳本

Create EKS cluster with Terraform

抓取之前Terraform最後完成的筆記,也就是github上的EKS建置的程式碼

重新抓到主控機上面

#執行以下指令:
terraform init
#建置:
terraform apply

建置完成後,到指定的region查詢EKS服務確認有成功建立

由於建立是指定到不同region來確認結果:

所以要切換一下region去查看EKS是否正常建立(大概要十幾分鐘)

#參考以前Terraform建置EKS的PART 3筆記
#執行以下aws工具指令取得該Region指定的EKS Cluster名稱的kubeconfig檔:
aws eks update-kubeconfig --name myapp-eks-cluster --region eu-west-2

(如果目錄下已經有kubeconfig檔,就會報錯)

#順便主控機安裝kubectl工具(指定版本,參考k8s官網)
curl -LO https://dl.k8s.io/release/v1.27.1/bin/linux/amd64/kubectl
#搬到一般使用者工具目錄:
sudo mv kubectl /usr/local/bin/
sudo chmod u+x /usr/local/bin/kubectl

隨便試一下指令看到:

Create a NameSpace in EKS Cluster

透過kubeconfig檔案這個檔案即可對EKS Cluster進行相關操作

裡面描述了EKS Cluster溝通的api Server的真實位置

接著Ansible也會需要該檔案來進行EKS Cluster相關操作

回到Ansible腳本目錄內,建立新的Ansible腳本

名稱叫做:deploy-to-k8s.yaml

然後使用找到以下K8S的Ansible module:

community.kubernetes.k8s

LINK

這邊開始撰寫操作EKS Cluster的Ansible腳本,但是首先會注意到

上面這個module會需要:

  • OpenShift Python client是用來K8S物件的CRUD操作
  • openShift = Python client for OpenShift Platform
  • PyYAML = YAML parser and emitter for Python

這邊有幾個簡單指令可以檢查是否有安裝上述Python模組

#執行pip編譯指令來檢測是否有相關模組:
python3 -c "import openshift"

#另外確認PyYAML則是:
python3 -c "import yaml"

所以目前缺openshift

#執行pip工具安裝opensihft模組
#但是現在指定安裝到登入的使用者層級去安裝就好,不要裝到系統層
#不然還會有權限問題,所以加入--user:
pip3 install openshift --user
#如果上面yaml沒裝的話就順便:
pip3 install PyYAML --user

最後確認都裝好了:

開始編輯deploy-to-k8s.yaml

也可以參考文件透過環境變數去指定kubeconfig檔

這樣可以指定到特定的kubeconfig檔名的絕對路徑

另外由於指定的機台是localhost

所以設定檔依據之前課程指定到inventory_aws_ec2.yaml就要改回hosts

這時候把腳本放到主控機的anislbe目錄下,就可以使用

#執行以下指令:
ansible-playbook deploy-to-k8s.yaml

上面就把NameSpace建立完了

接著其他元件部分可以寫成YAML來建立,先寫為nginx-config.yaml檔案:

把上面這檔案放到主控機的ansible執行目錄去,然後腳本加入:

#再次執行以下指令:
ansible-playbook deploy-to-k8s.yaml

上面外網暴露的位置可以直接打,但是通常要等個幾分鐘才能等到ALB建立

我大概等1~2分鐘看到:

而實際上這個k8s的Ansible module也可以透過他的格式直接創建k8s元件

寫成他定義的definition格式:

Set environment variable for kubeconfig

每個Play中去填寫以下這行會變得非常瑣碎:

#可以直接放到環境變數去使用:
export K8S_AUTH_KUBECONFIG=~/.kube/config

腳本就可以改為:

#再次執行以下指令:
ansible-playbook deploy-to-k8s.yaml

參考課程reference

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet