작성할 파일은 다음과 같다.
1. Dockerfile
2. index.html
3. Deployment.yaml
4. Service.yaml
5. buildspec.yaml
1. Dockerfile 작성
테스트를 진행하기 위해서 간단하게 Dockerfile로 아파치를 설치하여 실행할 예정이다.
Dockerfile의 경로는 git Repository의 루트 디렉터리에 생성한다.
# ./Dockerfile
FROM ubuntu:18.04
RUN apt-get update
RUN apt-get install apache2 -y
COPY index.html /var/www/html
EXPOSE 80
CMD apachectl -DFOREGROUND
2. index.html 파일 생성
index.hmtl 파일은 Dockerfile로 생성한 아파치 OS에서 실행할 테스트 웹페이지 이다.
git repository 루트 디렉터리에 생성한다.
# ./index.html
<h1>안녕하세요...</h1>
<h1>방갑습니다...</h1>
<h1>HI...</h1>
3. Deployment.yaml 파일 생성
Deployment 파일은 git repository에서 EKS 폴더안에 생성한다.
Dockerfile로 이미지를 만들어 ECR에 업로드하면, 그 이미지를 EKS 클러스터에 배포하는 내용이다.
# ./EKS/Deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: eks-deploy
spec:
replicas: 1
selector:
matchLabels:
app: eks
template:
metadata:
labels:
app: eks
spec:
containers:
- name: eks
image: AWS_ECR_URI
ports:
- containerPort: 80
imagePullPolicy: Always
env:
- name: DATE
value: 'DATE_STRING'
4. Service.yaml 파일 생성
Service.yaml 파일도 git repository에서 EKS 폴더안에 생성한다.
Service는 쿠버네티스 클러스터가 외부와 통신할 수 있도록 LoadBalancer로 작성한다.
apiVersion: v1
kind: Service
metadata:
name: eks-svc
spec:
ports:
- name: "80"
port: 80
targetPort: 80
selector:
app: eks
type: LoadBalancer
5. buildspec.yaml 파일을 생성한다.
buildspec.yaml은 git repository 루트 디렉터리에 생성한다.
이 파일은 codebuild 생성할때 정의했던 파일로 Codebuild가 빌드할 때 해당 파일을 참조하여 빌드를 수행 한다.
install : 런타임으로 도커를 설치하고, EKS 클러스터에 도커이미지를 배포하기 위해서 kubectl을 설치하고 kubeconfig를 생성하여 kubectl 명령어를 사용할 수 있게 한다.
pre_build : ECR에 로그인 한다
build : Dockerfile을 빌드하고 ECR에 Push 한다
post_build : ECR의 URI를 AWS_ECR_URI로 치환하여 사용한다.
그리고 deployment.yaml 파일과 service.yaml 파일을 배포한다.
version: 0.2
phases:
install:
runtime-versions:
docker: 18
commands:
- curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.19.6/2021-01-05/bin/linux/amd64/kubectl
- chmod +x ./kubectl
- mv ./kubectl /usr/local/bin/kubectl
- mkdir ~/.kube
- aws eks --region ap-northeast-2 update-kubeconfig --name eks
- kubectl get po -n kube-system
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/
build:
commands:
- echo Building the Docker image
- docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
- docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
- docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
post_build:
commands:
- AWS_ECR_URI=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
- DATE='date'
- echo Build completed on $DATE
- sed -i.bak 's#AWS_ECR_URI#'"$AWS_ECR_URI"'#' ./EKS/deploy.yaml
- sed -i.bak 's#DATE_STRING#'"$DATE"'#' ./EKS/deploy.yaml
- kubectl apply -f ./EKS/deploy.yaml
- kubectl apply -f ./EKS/svc.yaml
마지막으로 해당 파일들은 GitHub 레파지토리에 Push를 수행할 때마다 작동을 하게 된다.
에러 처리
1. error: unable to recognize "./k8s/deployment.yaml": Unauthorized 에러가 계속 발생 한다...
(트러블 슈팅이 너무 힘들었다.)
kubectl get configmaps aws-auth -n kube-system -o yaml > aws-auth.yaml
해결 방법
apiVersion: v1
data:
mapRoles: |
- groups:
- system:bootstrappers
- system:nodes
rolearn: arn:aws:iam::{account_id}:role/{workernode-role}
username: system:node:{{EC2PrivateDNSName}}
#사용자를 추가 함
rolearn: arn:aws:iam::123456712345:role/[CodeBuild Role 이름]
username: [CodeBuild Role 이름]
groups:
- system:masters
2. An error occurred (AccessDeniedException) when calling the DescribeCluster operation 에러 발생
해결 방법
Codebuild에 사용했던 Role에 eks:DescribeCluster 권한 및 혹시 몰라 EKS 전체 권한을 추가했다.
3.An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: 관련 에러
해결 방법
Codebuild에 사용했던 Role에 AmazonEC2contianerRegistryPowerUser 정책을 추가 해주었더니 에러가 나오지않고 다음으로 넘어간다.
'⌛ AWS 인프라 구성하기 (MiniProject) > ✅ 개발환경 구성 (EKS)' 카테고리의 다른 글
Container 통신 환경을 제공하기 위한 calico 설치하기 (0) | 2022.05.31 |
---|---|
EKS 기반 모니터링 서비스 환경 구성 (프로메테우스 & 그라파나) (0) | 2022.05.26 |
EKS + CI/CD 구성하기 (2) - CodePipeine 생성 (0) | 2022.05.24 |
EKS + CI/CD 구성하기 (1) - CodeBuild 생성 (0) | 2022.05.24 |
(미완성) CI/CD 환경 구성 (1) (0) | 2022.05.23 |