❯ k create namespace flagger-system
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 # 👍
# 차트로 값 수정 후 배포
❯ 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을 지워주면 됨.
❯ 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-election은 configMap을 통해 관리됨 (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
Incoming Webhook 하나만 생성하면 됨.AlertProvider 리소스를 통해서 게시할 채널 등 지정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
AlertProvider처럼 canary manifest에 참조로 넣어 사용 가능.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
podinfo 어플리케이션을 배포# deployment, service에서 두 label값을 참조
selector:
matchLabels:
app: podinfo
code: POD001
❯ 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.
❯ 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
❯ 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"
}%
❯ 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",
}%
❯ 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



