Orchestration/helm

[Mac OS] helm, kubernetes 패키지 매니저 (helm으로 Jenkins 설치하기)

chanstory 2023. 2. 16. 14:52
반응형


helm이란?

kubernetes 어플리케이션 관리를 위한 오픈소스 패키지 매니저
kubernetes 에서 어플리케이션 배포를 위한 YAML 파일의 복잡성을 줄이는데 사용
Helm 을 사용하면 관리자는 쉽게 어플리케이션 설치, 업그레이드, 롤백 및 구성을 할 수 있음
Chart 라고 불리는 패키지를 사용하여 kubernetes 어플리케이션을 설치함
Chart 는 kubernetes 오브젝트, 구성 파일 및 기타 필요한 파일을 포함하는 패키지 임

 

https://helm.sh/

 

Helm

Helm - The Kubernetes Package Manager.

helm.sh

 

차트, 저장소, 릴리즈

helm에서의 패키지 = 차트 (Chart)
helm에서의 패키지 저장공간 = 저장소
차트를 설치하고 쿠버네티스 클러스터에 구동될 때, 차트의 인스턴스를 릴리즈 라고함

 

 


helmd으로 Jenkins 설치하기 실습

 

Jenkins 란?

- 지속적 통합 도구로, 소프트웨어 개발 팀이 개발한 코드 변경사항을 자동으로 빌드, 테스트 하고 배포 할 수 있도록 함

- 다양한 툴과 통합하여 사용할 수 있으며, 매우 확장성이 뛰어나고 커뮤니티가 활발하여 다양한 지원이 가능

 

 

1. helm 설치

% curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 
% chmod 700 get_helm.sh 
% ./get_helm.sh

% brew install helm    // Mac OS 는 brew 사용

$ choco install kubernetes-helm     // windows는 Chocolatey or scoop 사용
$ scoop install helm

 

helm 설치 참고 링크
https://helm.sh/docs/intro/install/

 

Installing Helm

Learn how to install and get running with Helm.

helm.sh

 

 

2. Jenkins 저장소 추가

% helm repo add jenkins https://charts.jenkins.io     
// helm repo add <이름> <URL>
// 이름 : 저장소에 대한 고유한 이름
// URL : 저장소 주소이며 이 주소를 통해 helm CLI가 차트를 검색하고 설치함 


% helm repo update

 

3. Chart 설치

% helm install jk jenkins/jenkins
// helm install <Release_name> <Chart> <Flags>
// Release_name : ckxm dlstmxjstm dlfma

// Chart : 설치할 차트 이름 <repository>/<chart> 형식으로 지정할 수 있으며
                <repository> 가 생략되면 기본 helm 저장소에서 차트를 가져옴
// Flags : helm 설치시 사용되는 옵션 --set 과 같이 차트 값 설정 가능

 

4. 터미널 출력 NOTES의 안내대로 암호 획득 후 포트포워딩 통해 서비스를 노출 시키고 

    http://localhost:8080 으로 접속합니다

$ helm install jk jenkins/jenkins                                                                                       
NAME: jk
LAST DEPLOYED: Wed Apr 20 03:02:16 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get your 'admin' user password by running:
  kubectl exec --namespace default -it svc/jk-jenkins -c jenkins -- /bin/cat /run/secrets/chart-admin-password && echo
2. Get the Jenkins URL to visit by running these commands in the same shell:
  echo http://127.0.0.1:8080
  kubectl --namespace default port-forward svc/jk-jenkins 8080:8080

3. Login with the password from step 1 and the username: admin
...

 

접속확인

 

% kubectl get all
// Jenkins 는 스테이트풀셋 위에 돌아가므로 PV, PVC 도 존재함

% helm uninstall <release_name> <flags>
// Jenkins 종료 혹은 삭제
// Release_name : 삭제할 차트 인스턴스의 이름
// flags : helm 차트 삭제 시 사용되는 옵션
               옵션에서 주로 -n 또는 --namespace 옵션을 사용함 
               특정 네임스페이스에 설치된 helm 차트만 삭제할 수 있음

 

쿠버네티스 - 그외 기본 오브젝트
1. Namespace (논리적 리소스 구분)
- 쿠버네티스 클러스터 내에서 가상의 클러스터를 만드는데 사용된다.
  쿠버네티스의 독립된 환경에서 리소스의 추돌을 방지하고 권한과 접근 제어를 구성할 수 있다.

2. ConfigMap/Secret (설정)
- 쿠버네티스에서 어플리케이션을 구성하는 데 사용되는 구성 데이터를 저장하기 위한 리소스 이다.
   ConfigMap은 키-값 쌍으로 구성된 설정 데이터를 저장하며,
   Secret은 ConfigMap과 비슷하지만 민감한 데이터를 저장하는 데 사용됨   
   (민감 데이터 - DB의 비밀번호, API 토큰, SSL 인증서)


3. ServiceAccount (권한 설정)
- 쿠버네티스에서 어플리케이션이 API 서버와 상호 작용할 때 사용하는 인증정보 제공.
   각 Pod에는 기본적으로 하나의 ServiceAccount가 자동으로 생성되며, 이를 사용
   하여 Pod 내에서 API 서버와 상호 작용 할 수 있음

4. Role/ClusterRole (권한 설정 - get, list, watch, create)
- Role과 ClusterRole은 쿠버네티스에서 사용자 또는 ServiceAccount가 실행할 수 있는
   작업과 리소스에 대한 권한을 정의하는 데 사용함.
   Role은 Namespace 내에서 리소스에 대한 권한을 지정하며, ClusterRole은 전체 클러스터에서
   리소스에 대한 권한을 지정함


 

 

 


helm 차트 구성

 

hello world 차트 생성 예제

https://www.baeldung.com/ops/kubernetes-helm

 

// 차트 생성
% helm create hello-world

// 디렉토리 구조
hello-world /           
  Chart.yaml                      // 차트에 대한 설명이 포함된 기본 파일
  values.yaml                    // 차트의 기본값이 포함된 파일
  templates /                     // Kubernetes 리소스가 템플릿으로 정의되는 디렉토리
  charts /                            // 하위 차트를 포함할 수 있는 선택적 디렉토리
  .helmignore                   // 패키징 시 무시할 패턴을 정의할 수 있는 곳 (개념상 .gitignore 와 유사)



//templates 디렉토리 구조

hello-world /  
  templates  /
     deplyment.yaml
     service.yaml
     ingress.yaml
     . . . .
  

 

*** 이중괄호{{ }} 내에서 텍스트를 자유롭게 사용함 = 템플릿 지시어

*** helm 은 Go 템플릿 언어를 사용한다

 

deployment.yaml 소스

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "hello-world.fullname" . }}
  labels:
    app.kubernetes.io/name: {{ include "hello-world.name" . }}
    helm.sh/chart: {{ include "hello-world.chart" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ include "hello-world.name" . }}
      app.kubernetes.io/instance: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ include "hello-world.name" . }}
        app.kubernetes.io/instance: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP

 

service.yaml 소스

apiVersion: v1
kind: Service
metadata:
  name: {{ include "hello-world.fullname" . }}
  labels:
    app.kubernetes.io/name: {{ include "hello-world.name" . }}
    helm.sh/chart: {{ include "hello-world.chart" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: {{ include "hello-world.name" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}

 

value.yaml 소스

replicaCount: 1
image:
  repository: "sebcontents/cozserver"
  tag: "1.0"
  pullPolicy: IfNotPresent
service:
  type: NodePort
  port: 80


/*
//*아래는 공식문서 제공 코드
replicaCount: 1
image:
  repository: "hello-world"
  tag: "1.0"
  pullPolicy: IfNotPresent
service:
  type: NodePort
  port: 80
*/

 

 

설치
% helm install [RELEASE_NAME] ./hello-world

삭제
% helm uninstall [RELEASE_NAME]
반응형