DevOps課程-AWS-EKS 7

透過Jenkins Pipeline來佈署EKS Cluster

ZONGRU Li
10 min readOct 11, 2022

在有Jenkins的情況下,有些前置設置要先完成

  1. Jenkins Container內安裝kubectl工具
  2. Jenkins Containeraws-iam-authenticator工具(IAM Authenticator)
  3. 建立kubeconfig來連線EKS Cluster:
  • 也就是Jenkins Container內要包含所有連線到:
  • 1.AWS帳號認證權限
  • 2.EKS Cluster認證權限
  • 而前面透過eksctl工具建置EKS Cluster,就有包含了連線EKS Cluster的資訊:
  • 另外安裝了eksctl工具,裡面就包含了”aws-iam-authenticator”工具了
  • (但是這應該不包含我windows安裝的exe下載的方式安裝的版本)
  • Windows可以另外安裝:
LINK
  • 也就是本機可以的這些操作,Jenkins Container內也要可以

4. 另外就是AWS的憑證部分,也就是AWS User

5. 調整Jenkinsfile來建置EKS Clusterdeployment

1.在Jenkins Container內安裝kubectl工具

首先連線到DigitalOcean建立的Jenkins機台的Jenkins Container

建置相關可參考其他筆記

進到Jenkins Container內部後可以透過指令安裝kubectl工具,安裝可參考:

不同於官網的安裝方式,這邊有更容易簡單的安裝手法在

整理起來如下:

#進到Jenkins Container內(用root身分,因為要安裝工具):
docker exec -u 0-it {Jenkins容器id} bash
#安裝kubectl工具(下載,更改權限,搬到工具目錄,一次全下!):
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl;chmod +x ./kubectl;mv ./kubectl /usr/local/bin/kubectl
#確認kubectl工具安裝成功:
kubectl version

2.在Jenkins Containeraws-iam-authenticator工具(IAM Authenticator)

參考以下安裝文件:

LINK
#在root模式下在Jenkins容器內安裝aws-iam-authenticator:
curl -o aws-iam-authenticator https://s3.us-west-2.amazonaws.com/amazon-eks/1.21.2/2021-07-05/bin/linux/amd64/aws-iam-authenticator
#更改權限:
chmod +x ./aws-iam-authenticator
#搬到工具目錄:
mv ./aws-iam-authenticator /usr/local/bin/
#確認是否安裝成功:
aws-iam-authenticator help

3.建立kubeconfig來連線EKS Cluster

因為Jenkins Container內部沒有編輯器

所以會是在容器外做編輯kubeconfig

#編輯一個kubeconfig檔:
vi config

然後直接複製本機建立AWSEKS Cluster的時候

~/.kube目錄下的config內容,貼進去

其中要更改三個位置:

  1. EKS Cluster Name,改成建立的名子 →"demo-cluster"
  2. Server Endpoint(可以直接去EKS服務業複製API Server Endpoint位置)
  3. certificate-authority-data

但是目前看到AWS最新文件看起來要改的位置已經不止上面這些了

以下是講師的畫面(紅框是要修改處)

下面是AWS目前的文件:

LINK

把上面要寫的config檔的部分擷取如下:

可以看到跟講師的有些內容不太一樣

要改的變數有:

  1. $cluster_name
  2. $cluster_endpoint
  3. $certificate_data
  4. $region_code
  5. $account_id

大部分內容都可以參考建置時候本機~/.kube裡面那一份

等檔案編輯好後

#先進到Jenkins Container內把根目錄的.kube目錄建起來,這時候用一般使用者進容器:
docker exec -it {Jenkins容器id} bash
cd ~/
#可以順便確認home目錄是哪裡:
pwd
mkdir .kube
exit
#把做好的config檔搬進去容器裡面~/.kube/目錄下:
docker cp config {Jenkins容器id}:/var/jenkins_home/.kube/
#進到Jenkins容器內確認:
docker exec -it {Jenkins容器id} bash
cd ~
ls -a
ls .kube
cat ~/.kube/config

貼上上述內容,修改處:

其中$certificate_data可以看到本機的那一份:

後面會直接透過pipelineenv設置AWS憑證資訊的環境變數來調用

4. 另外就是AWS的憑證部分,也就是AWS User

針對BP來說,最好是在AWSIAM特別建立Jenkins使用的User

設置有限的權限,而不是直接使用AdminUser

不過這邊只是簡單示範

直接在Jenkins的憑證管理內新增兩個Secret text的憑證

內容即是以下兩個:

名稱id給:

  1. jenkins_aws_access_key_id
  2. jenkins_aws_secret_access_key

5. 調整Jenkinsfile來建置EKS Clusterdeployment

在Jenkinsfile內寫上如

#在執行以下kubectl工具建置指令時,背後會有aws的相關驗證會一併執行
sh 'kubectl create deployment nginx-deployment --image=nginx'

也就是背後會觸發aws-iam-authenticator工具的驗證

所以在執行上述指令前要先宣告AWS的使用者憑證資訊到環境變數去:

environment{
AWS_ACCESS_KEY_ID = credentials('jenkins_aws_access_key_id')
AWS_SECRET_ACCESS_KEY = credentials('jenkins_aws_secret_access_key')
}

這部分講師是特地拉git serverJenkinsfile,我就簡單直接寫在Jenkins上面

直接在AWS的EC2上面搞一台:

#RHEL機台準備Jenkins環境:
sudo yum module install container-tools -y
#起Jenkins:
sudo podman run -p 8080:8080 -p 50000:50000 -d \
-v jenkins_home:/var/jenkins_home \
docker.io/jenkins/jenkins:lts

最後完成以下:

我先移除最新的kubectl工具

(因為我載的是1.25多版,EKS Cluster1.23K8S)

參考前面安裝也有挑版本的選擇:

root身分在Jenkins容器內執行:
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.23.0/bin/linux/amd64/kubectl;chmod +x ./kubectl;mv ./kubectl /usr/local/bin/kubectl
重裝1.23.0的kubectl工具

執行上還是跳請退回舊版yaml檔:

所以改一下kubeconfigyaml

簡單的kubectl get node指令可以正常運作了:

改回佈署的pipeline內容:

完整pipeline如下:

透過Jenkins看pod好像有佈署運作中

去到AWSEKS上查看:

我本機也能看到:

後來發現是要登IAMUser也就是adminpig才能看到:

adminpig才有node對應顯示

真神奇,root帳號反而看不到@@

這邊就直接移除這整個Cluster:

#執行以下移除EKS Cluster指令:
eksctl delete cluster --name demo-cluster

參考課程reference

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

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

No responses yet