728x90
argo-rollouts 설치
kubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml # argo-rollouts 생성
#다운로드
curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64
#권한 변경
chmod +x ./kubectl-argo-rollouts-linux-amd64
#파일 이동
sudo mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts
#설치 완료 후
kubectl argo rollouts version
Blue/Green 배포 설정을 위해서는 svc를 두가지를 만들어야한다. 흔히 active, preview로 설명하지만 쉽게 설명하면 Blue, Green을 위해 트래픽 흐름을 변경하기 위한 svc라고 생각하면 이해하기 편하다.
blue/green 예제
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: api-rollouts
namespace: blueGreen
spec:
selector:
matchLabels:
app: api-a
replicas: 1
revisionHistoryLimit: 2
strategy:
blueGreen:
activeService: api-svc-active
previewService: api-svc-preview
autoPromotionEnabled: true
template:
metadata:
labels:
app: innog-prod-key-api
spec:
nodeSelector:
nodetype: app
containers:
- name: api-a
image: image-url
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
failureThreshold: 3
env:
- name: JAVA_OPTS
value: ""
resources:
limits:
cpu: 1000m
memory: 1024Mi
requests:
cpu: 300m
memory: 512Mi
---
apiVersion: v1
kind: Service
metadata:
name: api-svc-active
namespace: blueGreen
spec:
selector:
app: api-a
ports:
- protocol: TCP
port: 80
targetPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: api-api-svc-preview
namespace: blueGreen
spec:
selector:
app: api-a
ports:
- protocol: TCP
port: 80
targetPort: 8080
autoPromotionEnabled
해당 설정을 통해 자동으로 배포할 지 수동으로 할지 설정할 수 있다. (수동은 대시보드나 cli를 통해 가능하다.)
kubectl argo rollouts promote <rollout name>
pod를 생성하면 해당 명령어를 통해 조회할 수 있다.
kubectl argo rollouts get rollout rollout-bluegreen --watch
canary 예제
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: api-rollouts
namespace: canary
spec:
selector:
matchLabels:
app: api-a
replicas: 1
revisionHistoryLimit: 2
strategy:
canary:
maxSurge: "50%" # canary 배포로 생성할 pod의 비율
maxUnavailable: 0 # 업데이트 될 때 사용할 수 없는 pod의 최대 수
steps:
- setWeight: 33
- pause: { duration: 10 }
- setWeight: 66
- pause: { duration: 10 }
- setWeight: 100
template:
metadata:
labels:
app: innog-prod-key-api
spec:
nodeSelector:
nodetype: app
containers:
- name: api-a
image: image-url
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
failureThreshold: 3
env:
- name: JAVA_OPTS
value: ""
resources:
limits:
cpu: 1000m
memory: 1024Mi
requests:
cpu: 300m
memory: 512Mi
---
apiVersion: v1
kind: Service
metadata:
name: api-svc
namespace: canary
spec:
externalTrafficPolicy: Cluster
sessionAffinity: None
selector:
app: api-a
ports:
- protocol: TCP
port: 80
targetPort: 8080
externalTrafficPolicy는 외부에서 들어오는 트래픽을 클러스터 내에서 어떻게 처리할 지 결정하는 정책이다. Cluster 값은 외부 트래픽이 클러스터에 도착했을 때, 그 트래픽이 클러스터 내부에서 로드 밸런싱된다는 의미이다. Local 값도 있는데 이는 외부 트래픽이 도착한 노드에서만 처리된다는 의미이다.
sessionAffinity는 클라이언트가 동일한 세션에서 여러 요청을 보낼 때, 그 요청들이 같은 파드로 전달될지를 결정하는 옵션이다. None 설정으로 인해 클라이언트가 특정 파드에 고정되지 않고, 새로운 버전과 기존 버전의 파드 간에 트래픽이 로드 밸런싱될 수 있도록 한다.
argo rollout dashboard 는 인증 체계가 없다. 그러므로 포트 포워딩으로 dashboard 에 접속 하는 것을 추천한다.
kubectl port-forward service/argo-rollouts-dashboard 31000:3100
/rollouts path로 접속하면 blue/green 또는 canary 배포를 콘솔에서 확인가능하다.
'IT' 카테고리의 다른 글
쿠버네티스[EKS] Istio 설치 및 적용 [istioctl, helm, operator] (3) | 2024.10.09 |
---|---|
EKS worker node SSM 접속 (0) | 2024.10.09 |
쿠버네티스[EKS] argocd 설치 및 AWS ALB 외부 노출, Slack 설정 (0) | 2024.10.09 |
쿠버네티스[EKS] EFK (Elastic, Fluent-bit, Kibana) helm 설치 (1) | 2024.10.09 |
쿠버네티스[EKS] 프로메테우스, 그라파나 helm 설치 (0) | 2024.10.08 |