Gravitonでポッドを実行する
Gravitonノードグループをtaintで設定したので、このアプリケーションを活用するように設定する必要があります。そのために、uiマイクロサービスをGravitonベースのマネージドノードグループの一部であるノードにのみデプロイするようにアプリケーションを構成します。
変更を行う前に、現在のUIポッドの構成を確認しましょう。これらのポッドは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されていないノードで正常に実行されています。関連するポッドはRunningステータスであり、カスタムtolerationが設定されていないことを確認できます。Kubernetesは、あなたやコントローラーが明示的にこれらのtolerationを設定しない限り、node.kubernetes.io/not-readyとnode.kubernetes.io/unreachableのtolerationをtolerationSeconds=300で自動的に追加することに注意してください。これらの自動的に追加されるtolerationは、これらの問題のいずれかが検出されてから5分間、ポッドがノードにバインドされたままであることを意味します。
taintされたマネージドノードグループにポッドをバインドするようにuiデプロイメントを更新しましょう。nodeSelectorで使用できるように、taintされたマネージドノードグループに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というラベルを持つノードにのみポッドをスケジュールするように指定しています。このnodeSelectorは、UIポッドが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デプロイメントは古いものを終了する前に新しく作成されたポッドがReady状態になるのを待ちます。デプロイメントのロールアウトが詰まっているようなので、さらに調査しましょう:
NAME READY STATUS RESTARTS AGE
ui-659df48c56-z496x 0/1 Pending 0 16s
ui-795bd46545-mrglh 1/1 Running 0 8m
ui名前空間の個々のポッドを調査すると、1つのポッドがPending状態にあることがわかります。Pendingポッドの詳細をさらに調べると、発生した問題に関する情報が得られます。
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ポッドの新しい構成に反映されています。tainted=yesラベルを持つ任意のノードにポッドをピン留めしましたが、これにより新しい問題が発生しました。ポッドをスケジュールできません(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.
これを修正するには、tolerationを追加する必要があります。デプロイメントと関連するポッドがfrontend: trueのtaintを許容できるようにしましょう。必要な変更を行うために、以下のkustomizeパッチを使用できます:
- Kustomize Patch
- Deployment/ui
- Diff
apiVersion: apps/v1
kind: Deployment
metadata:
name: ui
spec:
template:
spec:
tolerations:
- key: "frontend"
operator: "Exists"
effect: "NoExecute"
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
tolerations:
- effect: NoExecute
key: frontend
operator: Exists
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
+ tolerations:
+ - effect: NoExecute
+ key: frontend
+ operator: Exists
volumes:
- emptyDir:
medium: Memory
name: tmp-volume
このYAMLは前の構成に基づいてtolerationを追加しています。tolerations