メインコンテンツまでスキップ

ハイブリッドノードへのトラフィックのルーティング

これで、ハイブリッドノードインスタンスがクラスターに接続されたので、 以下のDeploymentIngressマニフェストを使用してサンプルワークロードをデプロイできます:

~/environment/eks-workshop/modules/networking/eks-hybrid-nodes/kustomize/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: nginx-remote
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: eks.amazonaws.com/compute-type
operator: In
values:
- hybrid
containers:
- name: nginx
image: public.ecr.aws/nginx/nginx:1.26
volumeMounts:
- name: workdir
mountPath: /usr/share/nginx/html
resources:
requests:
cpu: 200m
limits:
cpu: 200m
ports:
- containerPort: 80
initContainers:
- name: install
image: busybox:1.28
command: [ "sh", "-c"]
args:
- 'echo "Connected to $(POD_IP) on $(NODE_NAME)" > /work-dir/index.html'
env:
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
volumeMounts:
- name: workdir
mountPath: "/work-dir"
volumes:
- name: workdir
emptyDir: {}
A

nodeAffinityルールを使用して、Kubernetesスケジューラーにeks.amazonaws.com/compute-type=hybridラベルと値を持つクラスターノードを_優先_するように指示します。

~/environment/eks-workshop/modules/networking/eks-hybrid-nodes/kustomize/ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx
namespace: nginx-remote
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
A

ingressリソースは、AWSロードバランサー(ALB)を構成してワークロードポッドにトラフィックをルーティングします。

ワークロードをデプロイしましょう:

~$kubectl apply -k ~/environment/eks-workshop/modules/networking/eks-hybrid-nodes/kustomize
namespace/nginx-remote created
service/nginx created
deployment.apps/nginx created
ingress.networking.k8s.io/nginx created

ポッドが正常にハイブリッドノードにスケジュールされたことを確認しましょう:

~$kubectl get pods -n nginx-remote -o=custom-columns='NAME:.metadata.name,NODE:.spec.nodeName'
NAME                     NODE
nginx-787d665f9b-2bcms   mi-027504c0970455ba5
nginx-787d665f9b-hgrnp   mi-027504c0970455ba5
nginx-787d665f9b-kv4x9   mi-027504c0970455ba5

素晴らしい!予想通り、3つのnginxポッドはハイブリッドノード上で実行されています。

ヒント

ALBのプロビジョニングには数分かかる場合があります。続行する前に、次のコマンドでロードバランサーのプロビジョニングが完了したことを確認してください:

~$aws elbv2 describe-load-balancers --query 'LoadBalancers[?contains(LoadBalancerName, `k8s-nginxrem-nginx`) == `true`]' --query 'LoadBalancers[0].State.Code'
"active"

ALBがアクティブになったら、IngressのAssociatedのAddressを確認してALBのURLを取得できます:

~$export ADDRESS=$(kubectl get ingress -n nginx-remote nginx -o jsonpath="{.status.loadBalancer.ingress[*].hostname}{'\n'}") && echo $ADDRESS
k8s-nginxrem-nginx-03efa1e84c-012345678.us-west-2.elb.amazonaws.com

ALB URLを使って、コマンドラインからアクセスするか、ウェブブラウザにアドレスを入力してデプロイメントにアクセスできます。ALBはIngressルールに基づいて適切なポッドにトラフィックをルーティングします。

~$curl $ADDRESS
Connected to 10.53.0.5 on mi-027504c0970455ba5

curlまたはブラウザからの出力には、mi-プレフィックスを持つハイブリッドノード上で実行されているロードバランサーからのリクエストを受信するポッドの10.53.0.XのIPアドレスが表示されます。

curlコマンドを数回再実行するか、ブラウザを更新して、各リクエストでポッドのIPが変化し、ノード名は同じままであることに注目してください。これは、すべてのポッドが同じリモートノード上でスケジュールされているためです。

~$curl -s $ADDRESS
Connected to 10.53.0.5 on mi-027504c0970455ba5
~$curl -s $ADDRESS
Connected to 10.53.0.11 on mi-027504c0970455ba5
~$curl -s $ADDRESS
Connected to 10.53.0.84 on mi-027504c0970455ba5

ハイブリッドノードへのワークロードのデプロイ、ALBを通じてアクセスできるよう構成、およびトラフィックがリモートノードで実行されているポッドに適切にルーティングされていることを確認することに成功しました。

EKSハイブリッドノードでさらに多くのユースケースを探索する前に、少しクリーンアップをしましょう。

~$kubectl delete -k ~/environment/eks-workshop/modules/networking/eks-hybrid-nodes/kustomize --ignore-not-found=true