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

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

Keel ?

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

GitHub - keel-hq/keel: Kubernetes Operator to automate Helm, DaemonSet, StatefulSet & Deployment updates
Kubernetes Operator to automate Helm, DaemonSet, StatefulSet & Deployment updates - keel-hq/keel
Keel
Kubernetes Operator to automate Helm, DaemonSet, StatefulSet & Deployment updates

오퍼레이터(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 를 사용 할 수 있습니다.

Guide | Keel
Keel installation instructions

이미지 업데이트를 감지하여서 업데이트하도록 하는 방법

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/policyforce 옵션은 태그가 시멘틱버저닝을(ie v1.0.0) 따르지 않더라도 강제업데이트 하는 정책입니다. keel.sh/match-tag=true 로 지정하는 경우 현재 지정된 태그와 동일한 태그에 대해서 digest 가 달라지는 경우에 업데이트 하도록 하는 옵션입니다. (그래서 dev 같은 태그만 두고, 이걸 이미지 업데이트하면 감지해서 업데이트하게 됩니다)

keel.sh/triggerpoll 은 웹훅등을 쓰지 않고 container image registry 를 폴링해서 업데이트를 감지하겠다는 옵션입니다. (Guide | Keel

이미지 업데이트를 감지해서 Deployment 와 같은 오브젝트에 대해 restart 를 해주는 오퍼레이터라서. imagePullPolicy 는 우리 케이스처럼 같은 태그의 업데이트를 감지하고, 정말 업데이트 하고싶으면 Always 로 지정해야 합니다!

 

실제 동작

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

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

keel 오퍼레이터가 감지하고 restart 해버린다 ! (그래서 파드가 새로 생김)

대시보드

몇번의 업데이트가 있었는지. 정책이 있는지 없는지(이미지 업데이트 관련) 확인 가능하고. 위에 일주일에 몇번 업데이트가 있었는지도 보임
현재 감시중인 이미지가 뭐있는지 확인 가능
업데이트에 대한 audit log 남음 !