Graviton에서 Pod 실행
이제 Graviton 노드 그룹에 taint를 적용했으므로, 이 변 경 사항을 활용하도록 애플리케이션을 구성해야 합니다. 이를 위해 Graviton 기반 관리형 노드 그룹에 속한 노드에만 ui 마이크로서비스를 배포하도록 애플리케이션을 구성하겠습니다.
변경을 수행하기 전에 UI Pod의 현재 구성을 확인해 보겠습니다. 이러한 Pod는 ui라는 이름의 관련 배포에 의해 제어되고 있다는 점을 기억하세요.
Name: ui-7bdbf967f9-qzh7f
Namespace: ui
Priority: 0
Service Account: ui
Node: ip-10-42-11-43.us-west-2.compute.internal/10.42.11.43
Start Time: Wed, 09 Nov 2022 16:40:32 +0000
Labels: app.kubernetes.io/component=service
app.kubernetes.io/created-by=eks-workshop
app.kubernetes.io/instance=ui
app.kubernetes.io/name=ui
pod-template-hash=7bdbf967f9
Status: Running
[....]
Controlled By: ReplicaSet/ui-7bdbf967f9
Containers:
[...]
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
예상대로 애플리케이션은 taint가 적용되지 않은 노드에서 성공적으로 실행되고 있습니다. 관련 Pod는 Running 상태이며 사용자 정의 toleration이 구성되지 않았음을 확인할 수 있습니다. Kubernetes는 사용자나 컨트롤러가 명시적으로 설정하지 않는 한 node.kubernetes.io/not-ready 및 node.kubernetes.io/unreachable에 대해 tolerationSeconds=300으로 toleration을 자동으로 추가합니다. 이러한 자동으로 추가된 toleration은 이러한 문제 중 하나가 감 지된 후 5분 동안 Pod가 노드에 바인딩된 상태로 유지됨을 의미합니다.
ui 배포를 업데이트하여 해당 Pod를 taint가 적용된 관리형 노드 그룹에 바인딩하겠습니다. taint가 적용된 관리형 노드 그룹은 nodeSelector와 함께 사용할 수 있는 tainted=yes 레이블로 사전 구성되어 있습니다. 다음 Kustomize 패치는 이 설정을 활성화하기 위해 배포 구성에 필요한 변경 사항을 설명합니다:
- Kustomize Patch
- Deployment/ui
- Diff
apiVersion: apps/v1
kind: Deployment
metadata:
name: ui
spec:
template:
spec:
nodeSelector:
kubernetes.io/arch: arm64
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/created-by: eks-workshop
app.kubernetes.io/type: app
name: ui
namespace: ui
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/component: service
app.kubernetes.io/instance: ui
app.kubernetes.io/name: ui
template:
metadata:
annotations:
prometheus.io/path: /actuator/prometheus
prometheus.io/port: "8080"
prometheus.io/scrape: "true"
labels:
app.kubernetes.io/component: service
app.kubernetes.io/created-by: eks-workshop
app.kubernetes.io/instance: ui
app.kubernetes.io/name: ui
spec:
containers:
- env:
- name: JAVA_OPTS
value: -XX:MaxRAMPercentage=75.0 -Djava.security.egd=file:/dev/urandom
- name: METADATA_KUBERNETES_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: METADATA_KUBERNETES_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: METADATA_KUBERNETES_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
envFrom:
- configMapRef:
name: ui
image: public.ecr.aws/aws-containers/retail-store-sample-ui:1.2.1
imagePullPolicy: IfNotPresent
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 45
periodSeconds: 20
name: ui
ports:
- containerPort: 8080
name: http
protocol: TCP
resources:
limits:
memory: 1.5Gi
requests:
cpu: 250m
memory: 1.5Gi
securityContext:
capabilities:
add:
- NET_BIND_SERVICE
drop:
- ALL
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
volumeMounts:
- mountPath: /tmp
name: tmp-volume
nodeSelector:
kubernetes.io/arch: arm64
securityContext:
fsGroup: 1000
serviceAccountName: ui
volumes:
- emptyDir:
medium: Memory
name: tmp-volume
runAsUser: 1000
volumeMounts:
- mountPath: /tmp
name: tmp-volume
+ nodeSelector:
+ kubernetes.io/arch: arm64
securityContext:
fsGroup: 1000
serviceAccountName: ui
volumes:
위 매니페스트에서 nodeSelector는 kubernetes.io/arch: arm64 레이블이 있는 노드에만 Pod가 스케줄링되어야 함을 지정합니다. 이 nodeSelector는 UI Pod를 ARM64 아키텍처 노드(Graviton 노드)에서만 실행되도록 효과적으로 제한합니다.
Kustomize 변경 사항을 적용하려면 다음 명령을 실행하세요:
namespace/ui unchanged
serviceaccount/ui unchanged
configmap/ui unchanged
service/ui unchanged
deployment.apps/ui configured
최근 변경 사항을 적용한 후 UI 배포의 롤아웃 상태를 확인해 보겠습니다:
Waiting for deployment "ui" rollout to finish: 1 old replicas are pending termination...
ui 배포의 기본 RollingUpdate 전략이 주어지면, K8s 배포는 새로 생성된 Pod가 Ready 상태가 될 때까지 기다린 후 이전 Pod를 종료합니다. 배포 롤아웃이 멈춘 것 같으니 더 자세히 조사해 보겠습니다:
NAME READY STATUS RESTARTS AGE
ui-659df48c56-z496x 0/1 Pending 0 16s
ui-795bd46545-mrglh 1/1 Running 0 8m
ui 네임스페이스 아래의 개별 Pod를 조사하면 하나의 Pod가 Pending 상태임을 관찰할 수 있습니다. Pending Pod의 세부 정보를 더 자세히 살펴보면 발생한 문제에 대한 정보를 얻을 수 있습니다.
Name: ui-659df48c56-z496x
Namespace: ui
[...]
Node-Selectors: kubernetes.io/arch=arm64
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 19s default-scheduler 0/4 nodes are available: 1 node(s) had untolerated taint {frontend: true}, 3 node(s) didn't match Pod's node affinity/selector. preemption: 0/4 nodes are available: 4 Preemption is not helpful for scheduling.변경 사항이 Pending Pod의 새 구성에 반영되어 있습니다. tainted=yes 레이블이 있는 모든 노드에 Pod를 고정했지만 Pod를 스케줄링할 수 없어(PodScheduled False) 새로운 문제가 발생했습니다. 더 유용한 설명은 events에서 찾을 수 있습니다:
0/4 nodes are available: 1 node(s) had untolerated taint {frontend: true}, 3 node(s) didn't match Pod's node affinity/selector. preemption: 0/4 nodes are available: 4 Preemption is not helpful for scheduling.