내가 보기 위한 쿠버네티스 정리글 - 5 (jenkins)

아카이브 · 2021. 5. 15. 17:14

오늘은 젠킨스 pod를 띄어볼 예정이다.

먼저 간단하게 pod, deployment, service의 개념에 대해 설명하겠다.

 

pod

pod는 동일환 실행환경에서 동작하는 애플리케이션 컨테이너와 볼륨의 집합을 의미한다.

쿠버네티스 클러스터에서 배포할 수 있는 가장 작은 아티팩트는 컨테이너가 아닌 파드다, 이는 파드에 포함된 모든 컨테이너는 같은 머신에 존재한다는것을 의미한다.

 

Service

쿠버네티스 서비스에 대해서 자세하게 살펴보도록 한다.

Pod의 경우에 지정되는 Ip가 랜덤하게 지정이 되고 리스타트 때마다 변하기 때문에 고정된 엔드포인트로 호출이 어렵다, 또한 여러 Pod에 같은 애플리케이션을 운용할 경우 이 Pod 간의 로드밸런싱을 지원해줘야 하는데, 서비스가 이러한 역할을 한다.

서비스는 지정된 IP로 생성이 가능하고, 여러 Pod를 묶어서 로드 밸런싱이 가능하며, 고유한 DNS 이름을 가질 수 있다.

 

클러스터 IP로만 접근이 가능한 것이 아니라, 모든 노드의 IP와 포트를 통해서도 접근이 가능하게 된다. 이번챕터에서는 nodeport를 30000으로 설정하여, 8080포트로도 접근이 가능하지만. 모든 노드의 30000포트로도 서비스를 접근하게 하여 jenkins를 실행할 것이다.

Deployment

어플리케이션을 컨테이너로 패키지하고, 복제집합을 만들고, 인그레스 컨트롤러를 사용해 서비스에 대한 트래픽을 로드밸런싱하고, 이러한 모든 객체 (파드, 레플리카셋, 서비스)는 애플리케이션의 단일 인스턴스를 구축하는데 사용된다. 그러나 새버전을 릴리스 하는데는 도움이 되지 않는다.

반면에 디플로이먼트 객체는 새 버전의 릴리스를 관리하기 위해 사용한다. 디플로이먼트는 어떤 특정 버전과 상관없는 방식으로 배포된 애플리케이션을 나타내는 개념이다. 또한 디플로이먼트를 통하여 코드의 한 버전에서 다른버전으로 쉽게 이동할 수 있다. 이러한 롤아웃과정은 간단하면서도 신중하게 진행된다. 개별 파드 업그레이드 과정에서 사용자가 구성할 수 있는 시간을 주고 기다린다. 또한 상태 검사를 통해 새로운 버전의 애플리케이션이 정상적으로 동작하는지 확인하고, 너무 많은 실패가 발생할 경우 배포를 중지한다.

 

 

먼저 이전 챕터에서 구현한 pvc를 토대로 아래와 같이 jenkins-deployment에 바인딩 할것이다. 그 후 deployment를 생성한 후 service를 통하여 jenkins를 띄울것이다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins-deployment
  namespace: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins-deployment
  template:
    metadata:
      labels:
        app: jenkins-deployment
    spec:
      serviceAccountName: jenkins
      securityContext:
        fsGroup: 1000
      containers:
      - name: jenkins-deployment
        image: jenkins/jenkins:lts
        volumeMounts:
          - name: jenkins-home
            mountPath: /var/jenkins_home
        ports:
        - containerPort: 8080
      volumes:
        - name: jenkins-home
          persistentVolumeClaim:
            claimName: jenkins-pvc

---

apiVersion: v1
kind: Service
metadata:
  name: jenkins-deployment-svc
  namespace: jenkins
  labels:
    app: jenkins-deployment
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
    name: http
    nodePort: 30000
  - port: 50000
    protocol: TCP
    name: slave
    nodePort: 30001
  selector:
    app: jenkins-deployment

 

위의 yaml을 실행한다. 아래와 같은 명령어를 통하여 pods를 생성 할 수 있다.

kubectl apply -f jenkins-svc.yaml

 

아래의 명령어를 통하여 쿠버네티스 상태를 확인해본다.

kubectl get pods -o wide --all-namespaces

아래의 이미지의 STATUS가 Running이라면 해당 pods가 정상적으로 동작하는것을 뜻한다.

 

pods가 정상적으로 동작한다면 아래와 같이 virtualBox에 포트포워딩을 해야 현재의 컴퓨터로 접속할 수 있다.

포트포워딩후 30000번 포트로 접속을 시도하면 아래와 같이 jenkins 시작화면을 볼 수 있을것이다.