[k8s] EKS 멀티 아키텍처 노드에서 배포 제어

Woong·2025년 6월 24일
0

Docker, k8s

목록 보기
17/20

상황

  • EKS node 구성
    • 노드 A: amd64
    • 노드 B: arm64
% kubectl get nodes -o wide
NAME                                               STATUS   ROLES    AGE   VERSION               INTERNAL-IP     EXTERNAL-IP     OS-IMAGE         KERNEL-VERSION                   CONTAINER-RUNTIME
<node1>   Ready    <none>   46d   v1.32.3-eks-473151a   <internal ip>   <external ip>   Amazon Linux 2   5.10.236-227.928.amzn2.aarch64   containerd://1.7.27
<node2>   Ready    <none>   46d   v1.32.3-eks-473151a   <internal ip>   <external ip>   Amazon Linux 2   5.10.236-227.928.amzn2.x86_64    containerd://1.7.27
  • Docker 이미지는 amd64 만 지원하도록 빌드되는 상황

    • -> arm64 node 에서 실행 시 Exec format error 발생
    • ex) exec /usr/local/bin/uvicorn: exec format error
  • deployment 에서 별다른 설정이 없을 경우 kubectl apply 로 배포시 어떤 노드로 배포될지 제어 불가

    • -> 아키텍처 기준을 충족하는 노드로만 배포하도록 설정 필요

nodeAffinity 사용

  • 특정 아키텍처 노드에만 배치되도록 제한
  • Deployment.spec.template.spec.affinity 에 어떤 arch 를 기준으로 배포할지 명시
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/arch
              operator: In
              values:
                - amd64

nodeSelector

  • label 에 대한 단순 key-value 매칭만 가능
nodeSelector:
  kubernetes.io/arch: amd64

example

기존 Deployment 예시에서 affinity 추가:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: kubernetes.io/arch
                    operator: In
                    values:
                      - amd64
      containers:
        - name: my-app
          image: <user_id>.<ecr_domain>/<ecr_repository>:REPLACED_BY_CI
          ports:
            - containerPort: 7000

CI 연계

  • GitLab CI에서 kustomize edit set image로 이미지 태그 대체
    • 배포는 overlay 기준으로 환경별 분리

0개의 댓글