With the Amazon EKS cluster running on Graviton-based nodes, deploy NGINX to confirm that arm64 workloads schedule and run correctly.
Create a file named nginx-graviton.yaml with the following content:
apiVersion: v1
kind: Namespace
metadata:
name: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-arm-deployment
namespace: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx-arm
template:
metadata:
labels:
app: nginx-arm
spec:
nodeSelector:
kubernetes.io/arch: arm64 # Pin pods to Graviton (arm64) nodes
containers:
- name: nginx
image: nginx:1.27
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-arm-svc
namespace: nginx
spec:
selector:
app: nginx-arm
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
The nodeSelector: kubernetes.io/arch: arm64 field ensures the pod is scheduled only on nodes that report the arm64 architecture label. The Graviton node you provisioned has this label.
Apply the manifest:
kubectl apply -f nginx-graviton.yaml
The output is similar to:
namespace/nginx created
deployment.apps/nginx-arm-deployment created
service/nginx-arm-svc created
Check that the pod reaches the Running state:
kubectl get pods -n nginx
The output is similar to:
NAME READY STATUS RESTARTS AGE
nginx-arm-deployment-6d4f9b8c7d-xk2pq 1/1 Running 0 30s
Confirm the service was created:
kubectl get svc -n nginx
The output is similar to:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-arm-svc ClusterIP 10.100.42.137 <none> 80/TCP 30s
The NGINX service is type ClusterIP, which means it has no external IP and is reachable only from within the cluster network. The cluster also has publicAccess: false, so there’s no public Kubernetes API endpoint. Both constraints mean you can’t test connectivity from your local machine directly.
Instead, run a one-off pod inside the cluster that sends a request to the service and then deletes itself:
kubectl run curl-test --rm -it --image=curlimages/curl --restart=Never -- curl http://nginx-arm-svc.nginx.svc
The output is similar to:
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
</body>
</html>
pod "curl-test" deleted
The NGINX welcome page confirms that the workload is running and reachable on your Graviton-based EKS cluster.
Remove the NGINX workload and then delete the cluster to avoid ongoing AWS charges.
Delete the NGINX resources:
kubectl delete -f nginx-graviton.yaml
The output is similar to:
namespace "nginx" deleted
deployment.apps "nginx-arm-deployment" deleted
service "nginx-arm-svc" deleted
Delete the EKS cluster through Rafay:
rctl delete cluster demo-eks-graviton
You’ve now deployed NGINX using a manifest that pins pods to arm64 nodes, verified the pod reaches a Running state, and tested connectivity from inside the cluster. You then cleaned up all provisioned resources.
Rafay’s control plane handles cluster access without requiring a public Kubernetes API endpoint, so you can use Rafay to run private, Graviton-based EKS clusters at scale.