❗EC2에 쿠버네티스 설치
https://radiant515.tistory.com/665
❗도커 허브에 리포지토리 생성
docker-kubernetes-test라는 이름으로 생성하였다.
❗스프링부트 프로젝트 구성
@GetMapping("/test")
String test() {
return "Hello, Docker and Kubernetes!";
}
배포할 프로젝트는 스프링으로 생성하였고, 간단하게 test api만 생성하였다.
❗Dockerfile
# Use the official OpenJDK 17 base image
FROM openjdk:17-jdk
# Set the working directory
WORKDIR /app
# Copy the JAR file into the container
COPY build/libs/*.jar app.jar
# Run the application
ENTRYPOINT ["java", "-jar", "app.jar"]
프로젝트 root에 해당 파일을 생성한다.
❗CICD 파일
name: CI/CD Pipeline
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-22.04
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up JDK 17
uses: actions/setup-java@v2
with:
java-version: 17
distribution: 'temurin'
java-package: jdk
- name: Set execute permission on gradlew
run: chmod +x ./gradlew
- name: Build with Gradle
run: ./gradlew clean build -x test
- name: Build Docker image
run: docker build -t tokyj515/docker-kubernetes-test .
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Push Docker image
run: docker push tokyj515/docker-kubernetes-test
deploy:
needs: build # deploy 작업이 build 작업을 필요로 함
runs-on: ubuntu-22.04
steps:
- name: Install SSH client
run: sudo apt-get install -y openssh-client
- name: Add SSH key
run: echo "${{ secrets.AWS_EC2_SSH_KEY }}" > key.pem && chmod 600 key.pem
- name: SSH and Apply Kubernetes Deployment on EC2
run: |
ssh -o StrictHostKeyChecking=no -i key.pem ubuntu@${{ secrets.AWS_EC2_HOST }} << 'EOF'
# Ensure Docker is installed and running
sudo systemctl start docker
sudo usermod -aG docker ubuntu
# Pull Docker image
sudo docker pull tokyj515/docker-kubernetes-test
# Check kubectl context (optional)
sudo kubectl config current-context
# Apply Kubernetes deployment with root privileges
sudo kubectl apply -f service-1.yaml
sudo kubectl apply -f service-2.yaml
EOF
프로젝트 root에서 .github/workflows/gradle.yml 파일에 해당 내용을 작성한다. 한 개의 이미지를 2개의 service.yaml 파일로 실행시키고자 한다.
❗ github secret 추가
cicd 파일에 삽입될 변수를 github secret으로 넣어준다
❗service.yaml 생성하기
apiVersion: v1
kind: Service
metadata:
name: testapi-service-1
spec:
selector:
app: testapi
ports:
- protocol: TCP
port: 8080 # 서비스 내에서 사용할 포트
targetPort: 8080 # 컨테이너에서 사용하는 포트
nodePort: 30001 # 외부에서 접근할 포트
type: NodePort # 외부에서 접근 가능하도록 NodePort 타입 사용
apiVersion: v1
kind: Service
metadata:
name: testapi-service-2
spec:
selector:
app: testapi
ports:
- protocol: TCP
port: 8080 # 서비스 내에서 사용할 포트
targetPort: 8080 # 컨테이너에서 사용하는 포트
nodePort: 30002 # 외부에서 접근할 포트
type: NodePort # 외부에서 접근 가능하도록 NodePort 타입 사용
서버의 루트에 service-1.yaml과 service-2.yaml을 파일을 생성한다. 두 파일은 같은 이미지로 다른 2개의 pod를 생성한다.
❗배포하기
main 브랜치에 푸시하게 되면 CICD 스크립트가 실행되고, 이에 최종적으로 2개의 service가 실행된다.
kubectl get services
이 명령을 통해 어떤 서비스가 몇 번 포트로 실행 중인지 확인할 수 있다. 현재 실행시킨 서비스는 30001, 30002번으로 실행되는 것을 볼 수 있다.
minikube ip
curl [minikube-ip]:[port]/[api 경로]
미니큐브의 ip 주소를 확인하고, 이 주소와 실행 중인 포트, api 경로를 합쳐서 서비스가 잘 실행 중인지 확인해 볼 수 있다.
❗트러블슈팅
EC2 인스턴스에서 minikube를 사용하여 가볍게 kubernetes 클러스터를 실행하고자 했다. 하지만 기본적으로 minikube는 로컬 네트워크에서만 접근할 수 있게 설정이 되어있었다. 이 때문에 EC2 인스턴스의 공용 IP를 사용하여 배포된 프로젝트로는 접근할 수 없어서 minikube ip를 통해 확인해야 했다.
'🔻DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Kubernetes로 같은 pod 동시 생성하기(Deployment) (0) | 2024.09.03 |
---|---|
[kubernetes] minikube란? (0) | 2024.09.03 |
[Kubernetes] EC2에 kubernetes 설치하기 (0) | 2024.09.03 |
[Kubernetes] Kubernetes(쿠버네티스)란? (0) | 2024.07.18 |