1) Kubernetes 클러스터
2) Flagger 설치
flagger-system 네임스페이스에 설치)helm repo add flagger https://flagger.app
helm repo update
kubectl create namespace flagger-system
helm upgrade -i flagger flagger/flagger \
--namespace=flagger-system \
--set crd.create=true \
--set meshProvider=kubernetes
3) Prometheus 설치 (모니터링 목적)
helm upgrade -i prometheus prometheus-community/kube-prometheus-stack \
--namespace=flagger-system \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false
네임스페이스 생성:
kubectl create namespace test
test 네임스페이스에 기본 애플리케이션(v1) 배포:
kubectl apply -n test -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: podinfo
labels:
app: podinfo
spec:
replicas: 2
selector:
matchLabels:
app: podinfo
template:
metadata:
labels:
app: podinfo
spec:
containers:
- name: podinfo
image: stefanprodan/podinfo:6.1.6
ports:
- containerPort: 9898
resources:
requests:
cpu: 10m
memory: 32Mi
EOF
Service 배포 (트래픽 진입점 설정):
kubectl apply -n test -f - <<EOF
apiVersion: v1
kind: Service
metadata:
name: podinfo
spec:
ports:
- port: 80
targetPort: 9898
selector:
app: podinfo
EOF
아래의 Canary 리소스는 Blue/Green 전략으로 구성되어 있다.
kubectl apply -n test -f - <<EOF
apiVersion: flagger.app/v1beta1
kind: Canary
metadata:
name: podinfo
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: podinfo
service:
port: 80
targetPort: 9898
analysis:
interval: 30s
threshold: 3
iterations: 2
match:
- headers:
test-header:
exact: "bluegreen"
webhooks:
- name: acceptance-test
type: pre-rollout
url: http://flagger-loadtester.flagger-system/
timeout: 5s
metadata:
type: bash
cmd: "curl -sd 'test' http://podinfo.test/"
EOF
interval: 검증 주기(30초마다 검사)iterations: 성공해야 하는 최소 반복 횟수(2회)Flagger는 자동으로 Canary용 Service와 새로운 Deployment를 추가로 생성한다.
kubectl get svc,deployment -n test
생성되는 리소스 예시:
NAME TYPE CLUSTER-IP PORT(S)
service/podinfo ClusterIP 10.x.x.x 80/TCP
service/podinfo-primary ClusterIP 10.x.x.x 80/TCP
NAME READY UP-TO-DATE AVAILABLE
deployment.apps/podinfo 2/2 2 2
deployment.apps/podinfo-primary 2/2 2 2
podinfo Service로 접근하면 된다.podinfo-primary이다.Deployment 이미지를 v2로 변경하여 신규 버전을 배포한다:
kubectl -n test set image deployment/podinfo podinfo=stefanprodan/podinfo:6.1.7
이 순간 Flagger가 배포를 감지하고, 아래와 같은 과정 수행:
podinfo) Deployment에 새 파드가 생성된다.podinfo-primary)가 v2로 완전히 전환된다.Canary 배포 상태 확인 (실시간):
kubectl describe canary/podinfo -n test
성공적인 결과 예시:
Status:
Phase: Succeeded
Message: Canary analysis completed successfully.
서비스 URL로 테스트 요청을 보낸다:
kubectl port-forward svc/podinfo -n test 8080:80
다른 터미널에서 curl 요청:
curl localhost:8080
version을 통해 정상 작동 여부 확인:
{
"hostname": "podinfo-primary-xxxxxx",
"version": "6.1.7",
...
}
새 버전(v2)으로 배포 완료됨을 확인할 수 있다.
정리 작업:
kubectl delete namespace test flagger-system