- クラウド技術
EKSとJenkinsの連携について
- #jenkins
- #AWS
目次
目的
【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc. 詳細はこちらから>
jenkinsからEKSへのCI/CDを実現させる。
CI = 継続的インテグレーション
CD = 継続的デリバリー
CI/CDを実現させる事により、都度手動でのリリースは不要になり
git等でソースがコミットされたタイミングで自動リリースすることが可能となる。
前提
- jenkinsの操作、AWSの操作が一通り出来る読者を対象とする。
- OSはcentosを使用する。
- Dockerがインストール済みであること。
- EKSは作成済みであること。
- awsコマンドが使用可能であること。
AWS側の準備
- AWS Identity and Access Management(以下IAM)でjenkinsユーザーを作成する。
※ユーザー名「jenkins」とする。
必要に応じて権限を設定する。※以下はECRにPushPull出来る権限設定をAWSコンソールで設定する1234567891011121314151617181920{"Version": "2012-10-17","Statement": [{"Sid": "AllowPushPull","Effect": "Allow","Action": ["ecr:GetDownloadUrlForLayer","ecr:BatchGetImage","ecr:BatchCheckLayerAvailability","ecr:PutImage","ecr:InitiateLayerUpload","ecr:UploadLayerPart","ecr:CompleteLayerUpload","ecr:GetAuthorizationToken"],"Resource": "*"}]}
jenkins(Docker)のインストール
以下はceontosのコンソールで実行する
- jenkinsイメージのカスタムDockerfileを作成する
jenkinsでkubectl、awscliを使用出来るように、centos上で以下のDockerfileを作成する。
※コマンド実行はホームディレクトリ(~/)で行う
123456789101112131415FROM jenkins/jenkins:2.277.1-ltsUSER root## kubectlRUN wget -O /tmp/kubectl https://storage.googleapis.com/kubernetes-release/release/v1.19.3/bin/linux/amd64/kubectlRUN chmod +x /tmp/kubectlRUN mv /tmp/kubectl /usr/local/bin/kubectl## aws cliRUN wget -O /tmp/awscliv2.zip https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zipRUN unzip /tmp/awscliv2.zip -d /tmpRUN /tmp/aws/installUSER jenkins - Dockerタグ「jenkins/jenkins:eks」を指定してビルドを行う
1docker build -t jenkins/jenkins:eks . - docker-compose.ymlを作成する
以下のdocker-compose.ymlを作成し実行する。※マウント先の「/srv/jenkins」は作成しておく
12345678910111213<span class="">sversion: '3.8'services:jenkins:image: jenkins/jenkins:ekscontainer_name: 'jenkins'ports:- 8080- 5000:5000volumes:- /srv/jenkins:/var/jenkins_homerestart: alwaysenvironment:TZ: Asia/Tokyo</span> - Dockerをバックグラウンドで起動する。
1<span>docker-compose -f docker-compose.yml up -d</span> - jenkins(https://smallit.co.jp:8080)にアクセスしAdmin設定、プラグインの設定を行ってインストール完了
jenkinsとEKSを連携させる
以下はceontosのコンソールで実行する
- jenkinsのawsコマンドを設定する。
マウントした場所「/srv/jenkins/」に「.aws」ディレクリを作成する。
1<span>mkdir /srv/jenkins/.aws</span>上記で作成した「.aws」以下にconfigファイルを作成
1<span>vi /srv/jenkins/.aws/config</span>123<span class="">[default] </span><span class="comment linenumber react-syntax-highlighter-line-number"></span><span>region = ap-northeast-1 </span><span class="comment linenumber react-syntax-highlighter-line-number"></span><span>output = json</span>上記で作成した「.aws」以下にcredentialsファイルを作成
1<span>vi /srv/jenkins/.aws/credentials</span>123<span class="">[default]</span><span>aws_access_key_id = XXXXXXXXXXXXXXXXx</span><span>aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXX</span>※「■AWS側の準備」で作成した「jenkins」ユーザーのアクセスキー、パスを設定する
所有者をjenkinsに変更
1<span>chown 1000. /srv/jenkins/.aws -R</span> - jenkins上のkubectlコマンドを設定する。
EKSの設定を取得する。※コマンド実行はホームディレクトリ(~/)で行う
1<span>aws eks --region ap-northeast-1 update-kubeconfig --name cluster-name</span>※「ap-northeast-1」「cluster-name」は自分の環境に合わせて変更すること
上記コマンドで「~/.kube」作成されるのでそのファイルをjenkinsマウントポジションにコピー1<span>cp ~/.kube /srv/jenkins</span>所有者をjenkinsに変更
1<span>chown 1000. /srv/jenkins/.aws</span>
jenkinsユーザーからkubectlを実行できるようにする
以下はceontosのコンソールで実行する
- aws-authにjenkinsユーザーを追加する。
kubectlコマンドでEKSのaws-authを編集する。
1<span>kubectl edit -n kube-system configmap/aws-auth</span>1234567891011121314151617181920apiVersion: v1data:mapRoles: |- rolearn: <arn:aws:iam::111122223333:role/eksctl-my-cluster-nodegroup-standard-wo-NodeInstanceRole-1WP3NUE3O6UCF>username: <system:node:{{EC2PrivateDNSName}}>groups:- <system:bootstrappers>- <system:nodes>mapUsers: |- userarn: <arn:aws:iam::111122223333:user/admin>username: <admin>groups:- <system:masters>↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ この部分を追加する ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓mapUsers: |- userarn: arn:aws:iam::XXXXXXXX:user/jenkinsusername: jenkinsgroups:- system:masters↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ この部分を追加する ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑</system:masters></admin></system:nodes></system:bootstrappers>
jenkinsのpipeline等でkubectlコマンドを使用してEKSに連携する
以下はjenkinsのjob設定でテスト作成する。
- Jenkinsfileを作成する。
123456789101112131415161718pipeline {agent any// 環境変数environment {// k8sの設定ファイルKUBECONFIG = "${env.JENKINS_HOME}/.kube/config"}// デプロイstages {stage('deploy'){steps {// k8s deploysh "kubectl apply -f ${env.WORKSPACE}/test.yaml"}}}} - 実行結果にkubectlの実行でエラーが出ていなければ連携完了。
【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>