컨테이너 인프라 환경(4) 젠킨스 2. 젠킨스 설치&설정

InSeok·2023년 3월 4일
0

Jenkins 설치

젠킨스 설치를 위한 간편화 도구

매니페스트 파일

  • 쿠버네티스의 오브젝트를 생성하기 위한 메타 정보, 구체적인 설정 정보를를 YAML이나 JSON으로 기술한 파일
  • 사용자마다 필요한 환경적 요소가 모두 다르므로 이를 다양한 요구사항에 맞게 바꿔야 한다.

배포 간편화 도구 비교

  • kubectl은 바이너리 실행 파일로 짜인 배포 도구이다.
  • 커스터마이즈와 헬름은 kubectl을 좀 더 확장해서 복잡한 오브젝트와 구성환경을 자동으로 맞추는 도구이다.

큐브시티엘(kubectl)

  • 쿠버네티스에 기본으로 포함된 커맨드라인 도구
  • 오브젝트 생성과 쿠버네티스 클러스에 존재하는 오브젝트,이벤트 등의 정보를 확인하는 용도
  • 오브젝트 명세가 정의된 yaml 파일을 인자로 입력받아 파일 내용에 따라 오브젝트를 배포할 수도 있다.
  • 큐브시티엘은 정의된 매니페스트 파일을 그대로 배포하기 때문에 개별적인 오브젝트를 관리하거나 배포할 때 사용하는 것이 좋다.

커스터마이즈(Kustomize)

  • 오브젝트를 사용자 의도에 따라 유동적으로 배포가능
  • 별도의 커스터마이즈 실행파일을 활용해 커스터마이스 명세를 따르는 야믈 파일을 생성할 수 있다.
  • 명세와 관련된 yaml파일에 변수나 템플릿을 사용하지는 않지만, 명령어로 배포 대상 오브젝트의 이미지 태그와 테이블 같은 명세를 변경하거나 일반 파일을 이용해 컨피그맵과 시크릿을 생성하는 기능을 지원
  • 운영중인 환경에서 배포시 가변적인 요소를 적용하는데 적합

헬름(Helm)

  • 오브젝트 배포에 필요한 사양이 이미 정의된 Chart 라는 패키지를 활용한다.
  • 온라인의 헬름 차트 저장소에서 패키지를 검색하고 내려받아 사용할 수있어 간편하다.
  • 자체 템플릿 문법을 사용하므로 가변적인 인자를 배포할 때 다양한 배포환경에 맞추거나 원하는 조건을 적용 가능
  • 오브젝트를 묶어 패키지 단위로 관리하므로 단순한 1개의 명령어로 애플리케이션에 필요한 오브젝트드르을 구성할 수있다.

kubectl은 고정적인 값으로 설정된 매니페스트를 그대로 사용할 수밖에 없다.
커스터마이즈는 일부 내요을 가변적으로 변경행 사용가능하다.
헬름은 매니페스트의 일부가 아닌 모든 내용을 설정할 수 있는 값을 제공해 필요에 따라 사용자 환경에 맞는 설정값으로 변경할 수있다.

커스터마이저로 배포 간편화

  • 작동원리
    • yaml 파일에 정의된 값을 사용자가 원하는 값을 변경할 수있다.
    • 쿠버네티스에서 오브젝트에 대한 수정 사항을 반영하려면 사용자가 직접 yaml파일을 편집기 프로그램으로 수정해야한다.
    • 수정 해야하는 yaml 파일이 많거나 , 하나의 yaml 파일로 환경이 다른 여러 개의 쿠버네티스 클러스터에 배포해야 해서 일부 항목을 수정해야 할때 커스터 마이즈를 활용한다.
    • kustomize 명령과 create 옵션으로 kustomization.yaml 이라는 기본 매니페스트를 만들고, 이 파일에 변경해야 하는 값들을 적용한다.
    • build옵션으로 변경할 내용이 적용된 최종 yaml 파일을 저장하거나 변경된 내용이 바로 실행되도록 지정
  • 커스터마이즈로 MetalLB 한번에 만들기
    • kustomiztion.yaml을 통해 원하는 내용이 담긴 MetalLB 매니페스트를 생성하고, 이를 통해 배포

      커스터마이즈는 최종 매니페스트 생성을 도와주는 도구이다.

    • kustomize create --namespace --resources

    • kustomize edit set image 옵션으로 이미지 태그를 지정가능

    • kustomize build 로 최종 매니패스트 생성

    • kustomize build | kubectl apply -f - 빌드한 결과가 바로 kubectl apply 인자로 전달돼 배포 되게 한다.

  • kubectl describe pods -n metallb-system | grep Image:

헬름으로 배포 간편화

  • 커스터마이즈에서 제한적이었던 주소 할당 영역과 같은 값을 대체하면서 간단하게 설치할 수있다.
  • 작동원리
    • 쿠버네티스에 패키지를 손쉽게 배포할 수 있도록 패키지를 관리하는 쿠버네티스 전용 패키지 매니저이다.
    • 패키지는 실행 파일 뿐만아니라 실행 환경에 필요한 의존성 파일과 환경 정보들의 묶음이다.
    • 패키지 매니저는 외부에 있는 저장소에서 패키지 정보를 받아와 패키지를 안정적으로 관리하는 도구이며, 설치에 필요한 의존성 파일들을 관리하고 간편하게 설치할 수있게 도와준다.
  • 패키지 매니저 기능
    • 패키지 검색
    • 패키지 관리
      • 패키지 설치, 삭제 ,업그레이드 ,되돌리기등
    • 패키지 의존성관리
      • 패키지 설치시 의존하는 소프트웨어를 같이 설치하고 같이 삭제가능
    • 패키지 보안 관리
      • 디지털 인증서와 패키지에 고유하게 발행되는 체크섬(Checksum)값으로 해당 패키지의 소프트웨어나 의존성이 변조됬는지 검사
  • 헬름의 장점
    • 요구 조건별로 리소스를 편집하거나 변수를 넘겨서 처리하는 패키지 생성 가능
    • 차트(Chart) - 다양한 요구 조건을 처리할 수 있는 패키지
    • 배포한 애플리케이션을 업그레이드하거나 되돌리 수 있는 기능과 삭제할 수 있는 기능을 제공
    • 하나의 패키지로 다양한 사용자가 원하는 각자의 환경을 구성라 수있고 이를 자유롭게 배포,관리, 삭제 할 수 있다.
  • 헬림 기본 저장소는 아티팩트허브(artifacthub.io)다.
    • 아티팩트허브에서는 설치할 패키지에 대한 경로만을 제공한다.
  • 생산자 영역
    • 헬름 명령으로 작업공간을 생성하면 templates 디렉터리로 애플리케이션 배포에 필요한 여러 yaml 파일과 구성파일을 작성할 수 있다.
    • templates 디렉터리에서 조건별 분기, 값 전달 등을 처리할 수있도록 values.yaml에 설정된 키를 사용한다.
    • Charts.yaml 파일에 차트 이름,목적, 배포되는 애플리케이션 버전 같은 패키지 정보를 담는다.
    • 생산자 저장소에 업로드하고 아티팩터 허브에 등록
  • 사용자 영역
    • 애플리케이션의 차트 저장소 주소를 아티팩트허브에서 얻으면 헬름을 통해서 주소를 등록
    • 최신으로 업데이트 한 이후에 차트를 내려받고 설치한다.
    • 헬름을 통해 쿠버네티스에 설치된 애플리케이션 패키지를 릴리스 라고 한다.
    • helm repo add 명령으로 저장소를 등록한다.
    • helm repo update 명령으로 최신차트 정보를 동기화
    • helm repo list 로 저장소 목록을 확인
    • helm install 헬름 차트 설치
      • --namespace 애플리케이션이 위치할 네임스페이스 지정

      • --create-namespace 네임스페이스가 존재하지 않는경우 생성

      • --set 헬름에서 사용할 변수를 명령인자로 전달
        - key=value 형태로 전달

        헬름에 필요한 set 값을 확인하는 방법
        적용하려는 차트에 있는 values.yaml 내용을 확인하거나 helm show value [차트] 로 간략히 확인가능

젠킨스 설치 및 설정

헬름으로 젠킨스 설치

  • 헬름으로 설치되는 젠킨스는 파드에서 동작하는 애플리케이션이기 때문에 PV를 마운트하지 않으면 파드가 다시 시작될 때 내부 볼륨에 저장하는 모든 데이터가 삭제된다.
  • 이를 방지하기 위해 애플리케이션의 PV가 NFS를 통해 프로비저닝 될 수 있게 NFS용 디렉터리를 만들고 이를 NFS 서비스로 생성해야한다.
  • ls -n 옵션으로 디렉터리에 부여된 사용자 ID(uid)와 그룹 ID(gid)의 번호를 확인
    • 0번은 root 사용자에 속해 있다는 의미
  • 젠킨스를 헬름차트로 설치해 애플리케이션을 사용하게 되면 젠킨스의 여러 설정 파일과 구성파일들이 PVC를 통해 PV에 파일로 저장된다.
  • PV에 적절한 접근 ID를 부여하지 않으면 PVC를 사용해 파일을 읽고 쓰는 기능에 문제가 발생할 수있다.
  • 이런 문제를 방지하기위해 chown 1000:1000 /nfs_shared/jenkins/ 명령어로 젠킨스 PV가 사용할 NFS 디렉터리에 대한 접근 ID를 1000번으로 설정한다.
    • 1000번은 젠킨스 컨트롤러 이미지에서 기본적으로 사용하는 유저ID,그룹ID가 1000번이다.
  • 젠킨스는 사용자가 배포를 위해 생성한 내용과 사용자의 계정 정보, 사용하는 플러그인과 같은 데이터를 저장하기 위해서 PV와 PVC의 구성을 필요로 한다.
  • PV와 PVC를 구성하고 Bound 상태인지 확인한다.
  • 젠킨스를 설치하는데 필요한 인자가 많기 때문에 모든 인자를 포함해 사전에 쉘스크립트 파일을 만들어 실행해 젠킨스를 설치하자.
  • helm upgrade 명령어로 젠킨스 버전을 업그레이드 할 수 있고, helm rollback Revision번호명령어로 특정 버전으로 돌아갈 수 있다.

헬름으로 설치하는 애플리케이션 초기화 하는법
kuectl get deploymentkubectl get pods로 잘설치 되었는지 확인하고, 문제가 있을경우
helm unistall jenkinsrm-rf /nfs_shared/jenkins/* 명령으로 설치 과정에서 내려받은 파일들을 삭제하고 초기화 시킨 이후에 다시 설치하자.

테인트(taint)는 매우 특별하게 취급돼야하는 곳에 설정해, 쉽게 접근하지 못하는 소중한것으로 설정 한다. 톨러레이션(tolerations)이라는 특별한 키를 가져야만 이곳에 출입가능하다.

테인트

  • 는 키와 값 그리고 키와값에 따른 효과의 조합을 통해 테인트를 설정한 노드에 파드 배치의 기준을 설정한다.
    • 키와 값의 조합은 테인트를 설정한 노드가 어떤 노드인지를 구분하기 위해 사용하며, 키는 필수값이고, 값은 생략가능하다.
    • 효과는 키 또는 값이 일치하지 않는 파드가 노드에 스케줄되려고 하는 경우 어떤 동작을 할 것인지를 나타낸다.
      • NoSchedule, PreferNoShedule, NoExecure 값이 있다.

톨러레이션

  • 톨러레이션의 키, 값, 효과를 사용해 연산자를 통해 비교한 후 조건에 맞는 테인트를 실별한다.
  • 키와 효과가 반드시 일치해야 한다.
  • 키와 효과 중 생략된 요소가 있다면 해당 요소는 묵시적으로 모든 키 혹은 모든 효과를 의미한다.
  • 톨러레이션의 키,값, 효과 는 테인트의 키,값,효과와 조건에 맞는지를 Eqaul or Exists 연산자를 통해 판단한다.
  • 연산자는 기본적으로 Equal로 동작해 테인트와 톨러레이션을 비교하는 역할을 한다.
  • Exists의 경우 비교할 키와 값이 존재한다는 가정으로 테인트에 진입할 수있는 만능키로 바꿔주는 역할을 한다.
  • 테인트와 톨러레이션의 조건이 맞다면 테인트가 설정된 노드에 톨러레이션을 가진 파드를 배치할 수 있다.
  • 조건이 맞다고 판단하는 기준은 Eqaul 연산자를 사용했을 때 테인트와 톨러 레이션의 키와 값 그리고 효과까지 일치하는 경우이다.
  • Exists 연산자를 사용했을 때는 값을 반드시 생략해야 하며, 키와 효과의 일치 여부를 판단한다.
    • 키와 효과를 모두 생략한 상태에서 Exists 연산자만 사용한다면 테인트의 키와 효과는 모든 키와 모든 효과를 의미하므로 Exists 연산자 하나만으로도 테인트가 설정된 모든노드에 대해서 해당 톨러레이션을 설정한 파드를 배포할 수 있다.
  • install.sh
    • --set master.nodeSelector
      - nodeSelector 뒤에 따라오는 문자열과 일치하는 레이블을 가진 노드에 파드를 스케줄링 하겠다는ㅅ러정
      - ‘.’ 과 같은 기호를 문자열로 인식하게 해주기위해 \ 를 붙여준다. 이를 이스케이프라고한다.
      - 테인트가 설정된 노드에 파드를 배치하기위해 예외인 tolerations 옵션 적용
      - key가 node-role.kubernetes.io/master이며 effect가 NoScheduledls 테인트가 존재(Exists)할때 테인트를 예외 처리해 해당 노드에 파드를 배치할 수있도록 설정

      --set master.tolerations[0].key=node-role.kubernetes.io/master \
      --set master.tolerations[0].effect=NoSchedule \
      --set masetr.tolerations[0].operator=Exists \
profile
백엔드 개발자

0개의 댓글