반응형
helm이란?
kubernetes 어플리케이션 관리를 위한 오픈소스 패키지 매니저
kubernetes 에서 어플리케이션 배포를 위한 YAML 파일의 복잡성을 줄이는데 사용
Helm 을 사용하면 관리자는 쉽게 어플리케이션 설치, 업그레이드, 롤백 및 구성을 할 수 있음
Chart 라고 불리는 패키지를 사용하여 kubernetes 어플리케이션을 설치함
Chart 는 kubernetes 오브젝트, 구성 파일 및 기타 필요한 파일을 포함하는 패키지 임
차트, 저장소, 릴리즈
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/
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]
반응형