Keel 을 이용한 컨테이너 이미지 태그 업데이트 자동 감지 및 쿠버네티스 파드 재배포 자동화

Keel ?
Keel 은 Helm, DaemonSet, StatefulSet, Deployment 를 통해 생성된 파드의 컨테이너 이미지 업데이트를 자동화하는 쿠버네티스 오퍼레이터입니다.

오퍼레이터(Operator)?
Opeartor 는 사용자 정의 리소스를 사용하여 애플리케이션 및 해당 컴포넌트를 관리하는 쿠버네티스의 소프트웨어 익스텐션입니다. 오퍼레이터는 쿠버네티스 원칙 중 “컨트롤 루프”를 따릅니다.
설치 by Helm (argocd application)
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: keel
namespace: test-argocd
spec:
project: default
source:
repoURL: https://charts.keel.sh
chart: keel
targetRevision: 1.0.2 # 2023.4.21
helm:
releaseName: keel
# valueFiles: # values file 참조 가능
# - values-production.yaml
values: | # inline value 추가 가능
helmProvider:
enabled: false
service:
enabled: false
type: ClusterIP
ingress:
enabled: false
basicauth:
enabled: true
user: "admin"
password: "password"
destination:
server: https://kubernetes.default.svc
namespace: test-keel
syncPolicy:
automated:
prune: false
selfHeal: false
syncOptions:
- CreateNamespace=true
ArgoCD Application 을 통해 HelmChart 를 직접보고 설치하였습니다. inline value 로 vaules 를 넣어주었고. helmProvider 는 사용하지 않을 계획이라(Helm 차트를 자동으로 업데이트하지 않을거고, 컨테이너 이미지에 대한 업데이트만 감지해서 처리할거라서) Disable 하였습니다.
basicauth 와 같은 인증 옵션을 키면 keel admin dasboard 를 사용 할 수 있습니다.

이미지 업데이트를 감지하여서 업데이트하도록 하는 방법
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-keel-app
namespace: test-keel-app
labels:
app: test-keel-app
app.kubernetes.io/name: test-keel-app
annotations:
keel.sh/pollSchedule: "@every 1m"
keel.sh/policy: force
keel.sh/match-tag: "true"
keel.sh/trigger: poll
spec:
# replicas: 1
selector:
matchLabels:
app: test-keel-app
template:
metadata:
labels:
app: test-keel-app
spec:
containers:
- name: test-keel-app
image: kimsehwan96/my-playground:dev
imagePullPolicy: "Always"
keel 오퍼레이터 설치 이후 이미지 업데이트를 감지해서 업데이트 하고자 하는 Deployment, StatefulSet, DaemonSet 등의 오브젝트 manifest 에 label or annotation 을 추가해주면 됩니다.
keel.sh/policy
의 force
옵션은 태그가 시멘틱버저닝을(ie v1.0.0) 따르지 않더라도 강제업데이트 하는 정책입니다. keel.sh/match-tag=true
로 지정하는 경우 현재 지정된 태그와 동일한 태그에 대해서 digest 가 달라지는 경우에 업데이트 하도록 하는 옵션입니다. (그래서 dev 같은 태그만 두고, 이걸 이미지 업데이트하면 감지해서 업데이트하게 됩니다)
keel.sh/trigger
의 poll
은 웹훅등을 쓰지 않고 container image registry 를 폴링해서 업데이트를 감지하겠다는 옵션입니다. (Guide | Keel )
이미지 업데이트를 감지해서 Deployment 와 같은 오브젝트에 대해 restart 를 해주는 오퍼레이터라서. imagePullPolicy
는 우리 케이스처럼 같은 태그의 업데이트를 감지하고, 정말 업데이트 하고싶으면 Always
로 지정해야 합니다!
실제 동작

동일한 kimsehwan96/my-playground:dev
에 새로운 이미지를 푸시해본다. 기존 test.txt
의 값이 2 였던것을 기억하자.

test.txt
의 숫자를 3으로 변경하고 이미지 빌드 및 푸시 (동일한 태그인 dev)


대시보드


