k8s cluster 에서 package 를 관리하는 것을 돕는 도구
Chart
helm package
Chart
는 특정 폴더 내의 파일들로 구성된다. 해당 폴더의 이름은 chart 의 이름이다.workpress/
directory 내에 저장된다.versioned
된 결과물로 package 된다.Repository
chart
가 모아지고, 공유되는 공간
Release
k8s cluster 에서 running 중인
chart
의 instance
chart
는 같은 cluster 에 여러번 설치될 수 있다.release
가 생성된다.helm search
: chart 찾기두가지 source 에서 chart 를 찾을 수 있다.
helm search hub
: the Artifact Hub
에서 여러 다른 repo 에서 chart 를 찾는다.helm search repo
: helm repo add
명령어를 통해 이미 local 에 추가한 repository 에서 chart 를 찾는다. 따라서 인터넷 연결이 필요없다.helm search
는 string 검색 기능이 제공하기 때문에 이를 사용해서 단어 또는 문구이 일부만 이력해 찾을 수 있다.helm search repo word
→ wordpress chart 나옴helm install
: package 설치하기새로운 package 를 설치하기 위해 사용한다.
release name
(helm 이 생성해줬으면 한다면 --generate-name
를 사용한다.)chart name
chart
를 설치한다 == 새로운 release
object 를 생성한다.helm status
명령어를 통해 현재 release 의 상태를 볼 수 있다.helm install happy-panda bitnami/wordpress
# 결과
NAME: happy-panda
LAST DEPLOYED: Tue Jan 26 10:27:17 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
helm show values
명령어를 통해 해당 chart 가 정의한 옵션들을 확인할 수 있다.--values
또는 -f
: override 할 YAML 파일을 명시한다. 여러 파일을 전달할 수 있고, 가장 오른쪽에 위치한 파일이 우선적이다.--set
: command line 에서 override 를 명시한다.--set
으로 명시한 값들을 --values
에 높은 우선순위를 가지고 합쳐진다.--set
으로 명시한 값들은 ConfigMap
안에서 지속되고, helm get values <release-name>
명령어로 확인할 수 있다.helm upgrade
명령어를 사용할 때 --reset-values
옵션을 사용해 --set
으로 지정한 값을 초기화할 수 있다.chart 는 directory 를 pacakage 로 만든 것
<chart 명>/
Chart.yaml # A YAML file containing information about the chart
values.yaml # The default configuration values for this chart
charts/ # A directory containing any charts upon which this chart depends.
crds/ # Custom Resource Definitions
templates/ # A directory of templates that, when combined with values,
# will generate valid Kubernetes manifest files.
Chart.yaml
: chart 에 대한 정보 가진 yaml 파일values.yaml
: 차트에 대한 기본 환경 설정 값들charts/
: 이 차트에 종속된 차트들을 포함하는 dirtemplates/
: values.yaml
과 결합해 유효한 k8s manifest file 들이 생성될 template 들의 dirapiVersion: 차트 API 버전 (필수)
name: 차트명 (필수)
version: SemVer 2 버전 (필수)
차트와 버저닝
모든 차트는
SemVer 2
표준을 따른 버전 번호를 가져야한다.
Helm v2
는 version number 를 release marker 로 사용한다.nginx-1.2.3.tgz
로 이름지어진다.helm package
명령어는 패키지명 안의 버전 번호가 Chart.yaml
파일 안의 version
필드의 값과 일치한다고 가정하고 실행된다. 그렇지 않을 시 에러가 발생한다.
values.yaml
과 결합해 유효한 k8s manifest file 들이 생성될 파일들의 dir
templates/
폴더 내에 저장된다.templates/
폴더 내의 모든 파일을 전달한다.values.yaml
파일 내의 값이 같이 렌더링된다.helm install
을 통해 전달할 수 있다, 이 경우 chart 폴더 내의 values.yaml
파일 안의 값을 override 한다.
values.yaml
파일 내의 값은.Values
object 를 통해 template 에서 접근할 수 있다.
{{.Values.}}
로 template 에 values.yaml 파일의 값을 가져올 수 있다.
Predefined Values : values.yaml
파일 내에 작성한 값 외에 기존에 사용 가능한 값들
[Release.Name](http://Release.Name)
: release 의 이름 (chart 의 이름이 아님)Release.Namespace
: chart 가 release 된 namespace 의 이름Release.Service
: release 를 수행하는 serviceRelease.IsUpgrade
: 현재 업그레이드 or 롤백 중이면 trueRelease.IsInstall
: 현재 install 중이면 trueChart
: chart.yaml
내의 값을 가져올 수 있다.helm create <chart명>
./<chart명
폴더가 생성된다.chart.yaml
, values.yaml
, templates/
를 제외하고 일단 지운다.templates/
폴더 내의 모든 파일도 지운다.helm install <chart 명> <chart 폴더 주소> --debug --dry-run
ImagePullPolicy
또한 설정해준다.
kubelet
이 image 를 pull 받는 것을 시도할 때 영향을 미친다.
3가지 상태가 존재한다.
IfNotPresent
: 현재 local 에 image 가 존재하지 않을때만 pullAlways
: kubelet 이 container 를 시작하기 전에 매 번 container image registry 에 가지고 있는 image name 을 [digest](https://docs.docker.com/engine/reference/commandline/pull/#pull-an-image-by-digest-immutable-identifier)
에 대해 확인한다. 만약 로컬에 가진 이미지와 registry 에 존재하는 이미지가 다를 경우, 확인된 digest
에 대해 새 image 를 pull 받고, container 에 올린다.Never
: image 를 fetch 하는 것을 시도하지 않는다. image 가 local 에 존재할 경우 container 를 시작하고, 아닐 경우 시작이 실패한다.Pod 를 포함하는 object 를 생성할 때 명시하지 않을 경우 , 해당 pod 내의 모든 container 는 IfNotPreset
상태를 가지게 된다.
그리고 이 새 Pod 를 API server 에 올리면, cluster
는 상태에 따라 다른 imagePullPolicy
를 가진다.
imagePullPolicy
를 명시하지 않았고, container image 의 tag 가 :latest
일 경우, 자동으로 Always
imagePullPolicy
를 명시하지 않았고, container image 의 tag 또한 명시하지 않았을 경우, 자동으로 Always
imagePullPolicy
를 명시하지 않았고, container image tag 를 :latest
가 아닌 것으로 명시했을 경우, 자동으로 IfNotPreset
이 3가지 상황을 고려해서 강제로 image 를 pull 하고 싶을 경우 Always
상태로 set 하도록 설정할 수 있다.
💡 Argo CD 가 상태를 확인하고 image registry 에서 image 를 pull 받게 하기 위해, Always
로 set 한다.
values.yaml
파일에 작성하고, deployment 에 적용한다. (적용 후 명령어로 확인해보기)replicaCount: 1
image:
repository: ghcr.io/cloud-club/gitops-ajaebot
tag: sha-7fcbb88
pullPolicy: Always
apiVersion: apps/v1
kind: Deployment
metadata:
name: ju-ajae-deployment# deployment이름
labels:
app: ajae-bot
spec:
replicas: {{.Values.replicaCount}}# pod 1개
selector:
matchLabels:
app: ajae-bot
template:
metadata:
labels:
app: ajae-bot
spec:# Pod spec
containers:
- name: ajae-container
image: {{ .Values.image.repository}}:{{.Values.image.tag }}# version명시 하지 않을 경우 deault로 `latest`로 인식한다.
imagePullPolicy: {{.Values.image.pullPolicy}}
env:# slackbot token환경 변수로 넣어주기
- name: SLACK_BOT_TOKEN
valueFrom:
secretKeyRef:
name: juyoung-slack# k8s secret명
key: token
optional: false#반드시 있어야 실행
imagePullSecrets:# image pull받기 위한 github token file (secret)
- name: juyoung-github# github credentials로 생성한 secret
helm lint <chart dir 경로>
helm template <chart 경로>
명령어를 통해 생성된 모든 yaml 파일을 확인할 수 있다.helm install <chart명> <chart dir 경로>
helm uninstall <chart명>
🚫 생성한 sealed-secret 파일을 template/
폴더에 그대로 넣었더니 sealed-secret-controller
가 imagePullBackOff
된다. 이유가 뭘까?!!!!
sealed-secret-controller log 확인
image registry login 오류 → ImagePullBackOff
slack toekn 오류(환경 변수 오류) → CreateContainerConfigError