[flagger] 실제 사용

zzery·2022년 5월 19일

일지(2022~2024)

목록 보기
11/25

flagger

install

  • helm 사용

관리용 namespace 생성

❯ k create namespace flagger-system

CRD 배포

  • Canary : canary 배포 리소스
  • AlertProvider : 알림 지정
  • MetricTemplate : canary analysis template
❯ helm repo add flagger https://flagger.app
"flagger" has been added to your repositories

# canary CRD 적용
❯ kubectl apply -f https://raw.githubusercontent.com/fluxcd/flagger/main/artifacts/flagger/crd.yaml
customresourcedefinition.apiextensions.k8s.io/canaries.flagger.app created
customresourcedefinition.apiextensions.k8s.io/metrictemplates.flagger.app created
customresourcedefinition.apiextensions.k8s.io/alertproviders.flagger.app created

❯ k get crd
NAME                                       CREATED AT
alertproviders.flagger.app                 2022-05-19T15:54:19Z # 👍
canaries.flagger.app                       2022-05-19T15:54:19Z # 👍
metrictemplates.flagger.app                2022-05-19T15:54:19Z # 👍

Flagger 배포

# 차트로 값 수정 후 배포
❯ helm install flagger flagger/flagger -f values.yaml -n flagger-system
NAME: flagger
LAST DEPLOYED: Sun May 22 15:40:36 2022
NAMESPACE: flagger-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Flagger installed

flagger 컨트롤러에 leader-election 적용했는데 시작할 때 leader 선정 로그가 나옴.

하나는 attempting, 하나는 Acting as elected leader.

configMap으로 리더 관리하는데, 만약 아무도 리더 안되어 있으면 configMap을 지워주면 됨.

grafana 설치

❯ helm install flagger-grafana flagger/grafana -f ./grafana.yaml -n flagger-system
NAME: flagger-grafana
LAST DEPLOYED: Sun May 22 15:42:41 2022
NAMESPACE: flagger-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Run the port forward command:

kubectl -n flagger-system port-forward svc/flagger-grafana 3000:80

2. Navigate to:

http://localhost:3000

확인

  • leader-electionconfigMap을 통해 관리됨 (configMap에 현재 리더 파드 name이 기록)
  • helm uninstall로 삭제할 때 configMap은 남아있으니 재설치할 땐 configMap 삭제 필요
❯ k get po,configmap -n flagger-system
NAME                                   READY   STATUS    RESTARTS   AGE
pod/flagger-f68fbc566-v5rrx            1/1     Running   0          6m39s # 👍
pod/flagger-f68fbc566-vf7t2            1/1     Running   0          6m39s # 👍
pod/flagger-grafana-6f5c95488c-qkfwg   1/1     Running   0          4m34s # 👍

NAME                                    DATA   AGE
configmap/flagger-grafana-dashboards    3      4m34s
configmap/flagger-grafana-datasources   1      4m34s
configmap/flagger-grafana-providers     1      4m34s
configmap/flagger-leader-election       0      6m37s # 👍
configmap/istio-ca-root-cert            1      12h
configmap/kube-root-ca.crt              1      12h

AlertProvider

Slack

  • Incoming Webhook 하나만 생성하면 됨.
  • AlertProvider 리소스를 통해서 게시할 채널 등 지정
  • 이 리소스를 apply 후 canary manifest에 참조로 넣어 사용 가능.
apiVersion: flagger.app/v1beta1
kind: AlertProvider
metadata:
  name: error-alert
  namespace: flagger-system
spec:
  type: slack
  # error 타입 로그만 게시하는 용도
  channel: flagger-error
  username: flagger
  address: https://hooks.slack.com/services/TOKEN/TOKEN/TOKEN

---

apiVersion: flagger.app/v1beta1
kind: AlertProvider
metadata:
  name: info-alert
  namespace: flagger-system
spec:
  type: slack
  # canary analysis에 대한 알림 채널
  channel: flagger-canary
  username: flagger
  address: https://hooks.slack.com/services/TOKEN/TOKEN/TOKEN

MetricTemplate (💔)

  • canary analysis에서 사용하는 용도
  • AlertProvider처럼 canary manifest에 참조로 넣어 사용 가능.
  • 근데 잘 안된다.

ex) request-success-rate

  • flagger에서 기본으로 제공한다는데 반영이 안돼서 커스텀 메트릭으로 생성
  • 근데도 안된다.
  • 쿼리 내용은 여기 참조 - [여기]
apiVersion: flagger.app/v1beta1
kind: MetricTemplate
metadata:
  name: request-success-rate
  namespace: flagger-system
spec:
  provider:
    type: prometheus
    address: http://prometheus.istio-system:9090
  query: |
    sum(
        rate(
            istio_requests_total{
                  reporter="destination",
                  destination_workload_namespace="{{ namespace }}",
                  destination_workload=~"{{ target }}",
                  response_code!~"5.*"
            }[{{ interval }}]
        )
    )
    /
    sum(
      rate(
          istio_requests_total{
              reporter="destination",
              destination_workload_namespace="{{ namespace }}",
              destination_workload=~"{{ target }}"
          }[{{ interval }}]
      )
    ) 
    * 100  

practice - PodInfo

  • 연습용으로 제공하는 podinfo 어플리케이션을 배포

label selector

# deployment, service에서 두 label값을 참조
  selector:
    matchLabels:
      app: podinfo
      code: POD001

deploy

❯ tree
./podinfo
├── canary.yaml
├── configmap.yaml
├── deployment.yaml
└── service.yaml

# ---

❯ k apply -f ./configmap.yaml
configmap/podinfo created

❯ k apply -f ./service.yaml
service/podinfo-service created

❯ k apply -f ./deployment.yaml
deployment.apps/podinfo created

# ---

❯ k get po,deploy,svc,configmap
NAME                               READY   STATUS    RESTARTS      AGE
pod/podinfo-6b7b6877f7-4dzk2       2/2     Running   0             3m53s

NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/podinfo       1/1     1            1           3m53s

NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/kubernetes         ClusterIP   10.96.0.1       <none>        443/TCP    77d
service/podinfo-service    ClusterIP   10.99.135.248   <none>        9898/TCP   6m39s

NAME                           DATA   AGE
configmap/istio-ca-root-cert   1      2d16h
configmap/kube-root-ca.crt     1      77d
configmap/podinfo              1      7m

❯ k get vs
No resources found in default namespace.

canary 리소스 생성

❯ k apply -f ./canary.yaml
canary.flagger.app/podinfo created

❯ k get po,deploy,svc,configmap,vs
NAME                                   READY   STATUS    RESTARTS      AGE
pod/podinfo-primary-56c5d8f48c-28rtl   2/2     Running   0             44s

NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/podinfo           0/0     0            0           112s
deployment.apps/podinfo-primary   1/1     1            1           44s

NAME                              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/kubernetes                ClusterIP   10.96.0.1        <none>        443/TCP    77d
service/podinfo-service           ClusterIP   10.104.195.179   <none>        9898/TCP   116s
service/podinfo-service-canary    ClusterIP   10.111.252.139   <none>        9898/TCP   44s
service/podinfo-service-primary   ClusterIP   10.108.109.119   <none>        9898/TCP   44s

NAME                           DATA   AGE
configmap/istio-ca-root-cert   1      2d16h
configmap/kube-root-ca.crt     1      77d
configmap/podinfo              1      119s
configmap/podinfo-primary      1      44s

NAME                                                 GATEWAYS        HOSTS                             AGE
virtualservice.networking.istio.io/podinfo-service   ["local-dev"]   ["local.dev","podinfo-service"]   24s

test

curl local.dev/podinfo
{
  "hostname": "podinfo-primary-56c5d8f48c-28rtl",
  "version": "6.1.4",
  "revision": "",
  "color": "#34577c",
  "logo": "https://raw.githubusercontent.com/stefanprodan/podinfo/gh-pages/cuddle_clap.gif",
  "message": "greetings from podinfo v6.1.4",
  "goos": "linux",
  "goarch": "amd64",
  "runtime": "go1.17.9",
  "num_goroutine": "8",
  "num_cpu": "16"
}%

canary test

이미지 수정

❯ k set image deploy/podinfo \
> podinfo=ghcr.io/stefanprodan/podinfo:6.1.3
deployment.apps/podinfo image updated

❯ k get pod
NAME                               READY   STATUS    RESTARTS      AGE
podinfo-7c7f84b474-pk4xg           2/2     Running   0             13s
podinfo-primary-56c5d8f48c-28rtl   2/2     Running   0             5m53s

호출 테스트

# 기존 버전curl local.dev/podinfo
{
  "hostname": "podinfo-primary-56c5d8f48c-28rtl",
  "version": "6.1.4",
}%

# 수정 버전curl local.dev/podinfo
{
  "hostname": "podinfo-7c7f84b474-pk4xg",
  "version": "6.1.3",
}%

canary status

❯ k get canary -w
NAME      STATUS        WEIGHT   LASTTRANSITIONTIME
podinfo   Initialized   0        2022-05-22T07:29:51Z
podinfo   Progressing   0        2022-05-22T07:35:11Z # detect new revision
podinfo   Progressing   10       2022-05-22T07:35:31Z
podinfo   Progressing   20       2022-05-22T07:35:41Z
podinfo   Progressing   30       2022-05-22T07:35:51Z
podinfo   Progressing   40       2022-05-22T07:36:01Z
podinfo   Progressing   50       2022-05-22T07:36:11Z # max weight
podinfo   Promoting     0        2022-05-22T07:36:21Z # 통과 후 primary를 새 버전으로 바꿈
podinfo   Finalising    0        2022-05-22T07:36:41Z
podinfo   Succeeded     0        2022-05-22T07:36:51Z

❯ k get po
NAME                              READY   STATUS    RESTARTS      AGE
podinfo-primary-bd5c5cc84-z8tq6   2/2     Running   0             2m54s

Slack 알림 예시

새로운 canary 리소스 생성

변경사항 확인

성공/실패 여부

성공할 경우

실패할 경우

  • 실패 원인은 안나옴.

profile
이 블로그의 모든 글은 수제로 짜여져 있습니다...

0개의 댓글