Cloud Architect 꿈꾸기

Cloud Computing 35

Jenkins와 git을 연동해서 Docker Hub로 자동 배포하기

이번에는 git에 프로젝트를 올리면 Jenkins에서 소스코드를 이미지화하여 도커 허브에 자동으로 배포하도록 할 예정이다. 먼저 Jenkins에 Freestyle project로 새로운 아이템을 생성한다. GitHub project를 체크하고 연동할 프로젝트의 깃주소를 붙여넣는다. 깃허브 아이디와 패스워드를 입력한 상태로 credential을 만들어준다. 마지막으로 빌드 시 어떤 커맨드를 실행할지 적어준다. Docker Hub에 등록하기 위한 커맨드를 적어주었다. docker build -t boolks/wearwhat_web:latest . sudo docker login -u "dockerhub_id" -p "dockerhub_pw" sudo chmod 666 /var/lib/jenkins/.dock..

Jenkins 설치

Jenkins를 통한 CI/CD에 들어가기에 앞서 ubuntu 위에 설치하는 방법을 정리하려 한다. 1. Java 설치 먼저 Jenkins를 설치하려면 Java가 설치되어 있어야 한다. Ubuntu 상에서 쉽게 설치하는 방법은 bell-sw.com/pages/downloads/ Download Liberica JDK, OpenJDK, Java 8, Java 11, Linux, Windows, macOS Download Java Liberica JDK for Linux, Windows, macOS. It is built from OpenJDK, tested and passed the JCK provided under the license from OpenJDK. bell-sw.com 이 사이트에서 제공하는..

Kubernetes - AutoScaler

Kubernetes가 지원하는 AutoScaling 방식은 HPA (Horizontal Pod AutoSacler) VPA (Vertical Pod AutoScaler) CA (Cluster AutoScaler) 가 있다. HPA (Horizontal Pod AutoSacler) HPA는 Replicas 수에 따라 Pod가 운영중이고 트래픽이 많아져 그 Pod의 리소스를 전부 사용한 경우에, Controller와 연결된 HPA가 Pod의 리소스를 미리 감지하고 있다가 위험한 상황이 오면, Controller의 Replicas 수를 자동으로 늘려주는 작동 방식이다. 이에 따라 Pod의 수가 늘어나게 되는데 이것이 Scale Out이며, 리소스 상황에 여유가 생기면 다시 Replicas 수를 줄여 Pod를 ..

Kubernetes - Ingress

이번에는 두 가지 부분에서 Kubernetes의 Ingress가 어떻게 사용되는지 확인해보려 한다. Service LoadBalancing Canary Update Service LoadBalancing 하나의 사이트를 운영중일 때 각 기능별로 Pod를 나누게 된다면 한 쪽의 기능에 문제가 생겼을 때 다른 기능에는 영향이 끼치지 않는다는 점이 Pod관리의 장점일 것이다. 각 기능은 다시 도메인에 /path를 붙여줌으로써 사용자가 각 서비스에 접근할 수 있도록 해주어야 하는데, Kubernetes에서는 이러한 도메인 구분을 Ingress를 통해 나눌 수 있다. Ingress를 사용하기 위해서는 Ingress Controller가 필요한데 Nginx, Kong 등을 통해서 환경을 실행해줄 수 있겠다. Can..

Kubernetes - StatefulSet

이번에는 Kubernetes의 StatefulSet에 대해 알아보려한다. Stateless Application stateless Application은 주로 애플리케이션이 여러 개 배포되더라도 다 같은 서비스로 유지된다. 주로 Web Server (Apache, Nginx, IIS) 와 같은 애플리케이션에 유용하다. 만일 하나의 애플리케이션이 죽을 경우, Stateless는 단순히 같은 서비스의 역할을 하는 앱을 복제하는 것으로 재생성 할 수 있다. stateless Application은 대체로 사용자들이 네트워크에 접속하고, 트래픽은 한 애플리케이션에만 집중되면 서버에 문제가 생기기 때문에 여러 애플리케이션에 분산시키는 형태로 흘러간다. 이러한 Stateless Application은 앞서 포스팅했..

Kubernetes - Authentication, Authorization

이번에는 Kubernetes에서 지원하는 API 접근제어 정책으로 Authentication, Authorization에 대해 알아보도록 하겠다. Authentication 사용자가 Kubernetes Cluster로 Https 접근을 하기 위해서는 쿠버네티스 설치시에 클러스터로 접근할 수 있는 정보가 담긴 파일을 Kubeconfig에 담아두어야 한다. 즉, 클라이언트 인증서가 kubeconfig에 저장되어 있으면 된다. kubeconfig에는 CA crt, Client crt, Client key가 포함되어있다. 기본적으로 저장되는 장소는 /etc/kubernetes/admin.conf인데 내부를 확인해보면 각각의 인증서가 base64로 인코딩된 상태로 저장되어 있다. 각각의 인증서 내용을 확인해보기 ..

Kubernetes - Volume (Dynamic Provisioning)

Kubernetes의 Volume을 사용하는 구조에서 앞서 PVC / PV를 이용하는 방식을 알아볼 수 있었다. 이번에는 PVC / PV 개념에서 한층 더 나아가 사용자가 PVC를 만들면 알아서 PV를 만들고 실제 Volume과 연결해주는 기능인 Dynamic Provisiong에 대해 알아보려 한다. Dynamic Provisioning Dynamic Provisiong을 사용하기 위해 Kubernetes에서는 StorageClass 오브젝트를 사용할 수 있다. PVC를 만들 때 StorageClassName 부분에 StorageClass의 이름을 넣어주게 되면, 자동으로 StorageVolume을 가진 PV를 생성할 수 있다. 또한 Volume의 status Lifecycle에 대해 알아보자면, 최초..

Kubernetes - Service (Headless, Endpoint, ExternalName)

이번에는 Kubernetes의 Service를 조금 더 깊게 파고자 한다. 1. Headless Headless 서비스는 한 Pod가 Service를 거치지 않고 Service 내부에 있는 Pod에 직접 접근하고 싶을 때 사용할 수 있다. 서비스는 Headless를 이용하여 Cluster IP를 설정하지 않고 (None) Pod에 hostname과 subdomin을 부여함으로써 Pod의 DNS를 통해 직접 접근할 수 있다. 2. Endpoint 기존에 서비스 - Pod간 연결은 Selector를 통해 할당이 되는데, Endpoint를 통해 서비스의 이름과 IP 정보를 넣게되면 selector 없이도 연결이 가능하다. 3. ExternalName 외부의 특정 사이트에서 데이터를 가져오는 상황에서 접근 주소..

Kubernetes - Scheduling

이번에는 Kubernetes Pod가 노드에 할당되기 위한 Scheduling에 대해 알아보려한다. 1. QoS QoS는 노드에 균등하게 자원을 배분한 Pod가 사용되고 있을 때, 만약 Pod에 추가적인 자원이 필요할 때 더 이상 노드에 여유 자원이 없는 경우를 대비해 설정할 수 있는 제약 조건이다. Pod를 생성할 떄 Pod는 다음 QoS 클래스 중 하나를 선택할 수 있다. Guaranteed Burstable BestEffort 1. Guranteed Guaranteed는 모든 Container에 Request와 Limit가 설정되어 있으며, Request와 Limit에는 memory, cpu상한과 요청량이모두 설정되어 있고, 각 컨테이너에 할당된 memory와 cpu의 Request와 limit 값..

Kubernetes - Pod Lifecycle

이번엔 Kubernetes Pod의 생명주기(Lifecycle)를 알아보도록 한다. 기본적으로 Pod의 Lifecycle phase는 Pending, Running, Succeeded, Failed 그리고 Unknown의 단계로 나뉜다. 1. Lifecycle Phase Pod가 처음 만들어지기 시작하는 시점이다. Pending 상태일 때 Pod 안에서는 initContainer를 통해, 본 컨테이너가 기동되기 전에 초기화 스크립트를 작성하면 Pod를 initalize하는 동안 설정이 적용된다. Pod가 Pending되는 동안 Container는 Creating중 이기 때문에 Waiting 상태가 된다. 정상적으로 Container가 기동되게되면 Pod와 Container의 상태는 모두 Running이 ..