Ingress#
四个示例展示了如何使用 ingress 访问您的 Ray 集群
警告
仅向授权用户公开 Ingress。 Ray Dashboard 提供对 Ray 集群的读写访问权限。任何可以访问此 Ingress 的人都可以对 Ray 集群执行任意代码。
AWS EKS 上的 AWS Application Load Balancer (ALB) Ingress 支持#
先决条件#
创建 EKS 集群。请参阅 Amazon EKS 入门 – AWS 管理控制台和 AWS CLI。
设置 AWS Load Balancer controller,请参阅 安装说明。请注意,该存储库为每个发行版维护一个网页。请确认您使用的是最新的安装说明。
(可选) 尝试 aws-load-balancer-controller 存储库中的 echo server 示例。
(可选) 阅读 how-it-works.md 以了解 aws-load-balancer-controller 的工作机制。
说明#
# Step 1: Install KubeRay operator and CRD
helm repo add kuberay https://ray-project.github.io/kuberay-helm/
helm repo update
helm install kuberay-operator kuberay/kuberay-operator --version 1.5.1
# Step 2: Install a RayCluster
helm install raycluster kuberay/ray-cluster --version 1.5.1
# Step 3: Edit the `ray-operator/config/samples/ray-cluster-alb-ingress.yaml`
#
# (1) Annotation `alb.ingress.kubernetes.io/subnets`
# 1. Please include at least two subnets.
# 2. One Availability Zone (ex: us-west-2a) can only have at most 1 subnet.
# 3. In this example, you need to select public subnets (subnets that "Auto-assign public IPv4 address" is Yes on AWS dashboard)
#
# (2) Set the name of head pod service to `spec...backend.service.name`
eksctl get cluster ${YOUR_EKS_CLUSTER} # Check subnets on the EKS cluster
# Step 4: Check ingress created by Step 4.
kubectl describe ingress ray-cluster-ingress
# [Example]
# Name: ray-cluster-ingress
# Labels: <none>
# Namespace: default
# Address: k8s-default-rayclust-....${REGION_CODE}.elb.amazonaws.com
# Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
# Rules:
# Host Path Backends
# ---- ---- --------
# *
# / ray-cluster-kuberay-head-svc:8265 (192.168.185.157:8265)
# Annotations: alb.ingress.kubernetes.io/scheme: internal
# alb.ingress.kubernetes.io/subnets: ${SUBNET_1},${SUBNET_2}
# alb.ingress.kubernetes.io/tags: Environment=dev,Team=test
# alb.ingress.kubernetes.io/target-type: ip
# Events:
# Type Reason Age From Message
# ---- ------ ---- ---- -------
# Normal SuccessfullyReconciled 39m ingress Successfully reconciled
# Step 6: Check ALB on AWS (EC2 -> Load Balancing -> Load Balancers)
# The name of the ALB should be like "k8s-default-rayclust-......".
# Step 7: Check Ray Dashboard by ALB DNS Name. The name of the DNS Name should be like
# "k8s-default-rayclust-.....us-west-2.elb.amazonaws.com"
# Step 8: Delete the ingress, and AWS Load Balancer controller will remove ALB.
# Check ALB on AWS to make sure it is removed.
kubectl delete ingress ray-cluster-ingress
GKE Ingress 支持#
先决条件#
创建 GKE 集群,并确保已安装 kubectl 工具并已进行身份验证以与您的 GKE 集群进行通信。请参阅 本教程,其中包含一个创建带 GPU 的 GKE 集群的示例。(本节不需要 GPU。)
如果您使用的是
gce-internalingress,请在与您的 GKE 集群相同的区域创建一个 Proxy-Only 子网。了解 https://cloud.google.com/kubernetes-engine/docs/concepts/ingress 中的概念可能很有帮助。
说明#
将以下文件保存为 ray-cluster-gclb-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ray-cluster-ingress
annotations:
kubernetes.io/ingress.class: "gce-internal"
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: raycluster-kuberay-head-svc # Update this line with your head service in Step 3 below.
port:
number: 8265
现在运行以下命令
# Step 1: Install KubeRay operator and CRD
helm repo add kuberay https://ray-project.github.io/kuberay-helm/
helm repo update
helm install kuberay-operator kuberay/kuberay-operator --version 1.5.1
# Step 2: Install a RayCluster
helm install raycluster kuberay/ray-cluster --version 1.5.1
# Step 3: Edit ray-cluster-gclb-ingress.yaml to replace the service name with the name of the head service from the RayCluster. (Output of `kubectl get svc`)
# Step 4: Apply the Ingress configuration
kubectl apply -f ray-cluster-gclb-ingress.yaml
# Step 5: Check ingress created by Step 4.
kubectl describe ingress ray-cluster-ingress
# Step 6: After a few minutes, GKE allocates an external IP for the ingress. Check it using:
kubectl get ingress ray-cluster-ingress
# Example output:
# NAME CLASS HOSTS ADDRESS PORTS AGE
# ray-cluster-ingress <none> * 34.160.82.156 80 54m
# Step 7: Check Ray Dashboard by visiting the allocated external IP in your browser. (In this example, it is 34.160.82.156)
# Step 8: Delete the ingress.
kubectl delete ingress ray-cluster-ingress
在 Kind 上手动设置 NGINX Ingress#
# Step 1: Create a Kind cluster with `extraPortMappings` and `node-labels`
# Reference for the setting up of Kind cluster: https://kind.kubernetes.ac.cn/docs/user/ingress/
cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "ingress-ready=true"
extraPortMappings:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
EOF
# Step 2: Install NGINX ingress controller
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
sleep 10 # Wait for the Kubernetes API Server to create the related resources
kubectl wait --namespace ingress-nginx \
--for=condition=ready pod \
--selector=app.kubernetes.io/component=controller \
--timeout=90s
# Step 3: Install KubeRay operator and CRD
helm repo add kuberay https://ray-project.github.io/kuberay-helm/
helm repo update
helm install kuberay-operator kuberay/kuberay-operator --version 1.5.1
# Step 4: Install RayCluster and create an ingress separately.
# More information about change of setting was documented in https://github.com/ray-project/kuberay/pull/699
# and `ray-operator/config/samples/ray-cluster.separate-ingress.yaml`
curl -LO https://raw.githubusercontent.com/ray-project/kuberay/v1.5.1/ray-operator/config/samples/ray-cluster.separate-ingress.yaml
kubectl apply -f ray-cluster.separate-ingress.yaml
# Step 5: Check the ingress created in Step 4.
kubectl describe ingress raycluster-ingress-head-ingress
# [Example]
# ...
# Rules:
# Host Path Backends
# ---- ---- --------
# *
# /raycluster-ingress/(.*) raycluster-ingress-head-svc:8265 (10.244.0.11:8265)
# Annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1
# Step 6: Check `<ip>/raycluster-ingress/` on your browser. You will see the Ray Dashboard.
# [Note] The forward slash at the end of the address is necessary. `<ip>/raycluster-ingress`
# will report "404 Not Found".
AKS 上的 Azure Application Gateway for Containers Gateway API 支持#
前提条件#
创建 AKS 集群。请参阅 快速入门:使用 Azure CLI 部署 Azure Kubernetes 服务 (AKS) 群集。
部署 Application Gateway for Containers ALB Controller 快速入门:部署 Application Gateway for Containers ALB Controller。
部署 Application Gateway for Containers 快速入门:创建由 ALB Controller 管理的 Application Gateway for Containers
(可选) 阅读 使用 Application Gateway for Containers 上的 Azure Web 应用程序防火墙保护 Web 应用程序
说明#
# Step 1: Install KubeRay operator and CRD
helm repo add kuberay https://ray-project.github.io/kuberay-helm/
helm repo update
helm install kuberay-operator kuberay/kuberay-operator --version 1.5.1
# Step 2: Install a RayCluster
helm install raycluster kuberay/ray-cluster --version 1.5.1
# Step 3: Edit the `ray-operator/config/samples/ray-cluster-agc-gatewayapi.yaml`
#
# (1) Annotation `alb.networking.azure.io/alb-namespace`
# 1. Please update this to the namespace of your alb custom resource.
#
# (2) Annotation `alb.networking.azure.io/alb-name`
# 1. Please update this to the name of your alb custom resource.
# Step 4: Check gateway and http route created by Step 3.
kubectl describe gateway ray-cluster-gateway
# [Example]
# Name: ray-cluster-gateway
# Namespace: default
# Labels: <none>
# Annotations:
# alb.networking.azure.io/alb-namespace: alb-test-infra
# alb.networking.azure.io/alb-name: alb-test
# API Version: gateway.networking.k8s.io/v1
# Kind: Gateway
# Metadata:
# Creation Timestamp: 2025-09-12T04:44:18Z
# Generation: 1
# Resource Version: 247986
# UID: 88c40c06-83fe-4ef3-84e1-7bc36c9b5b43
# Spec:
# Gateway Class Name: azure-alb-external
# Listeners:
# Allowed Routes:
# Namespaces:
# From: Same
# Name: http
# Port: 80
# Protocol: HTTP
# Status:
# Addresses:
# Type: Hostname
# Value: xxxx.yyyy.alb.azure.com
# Conditions:
# Last Transition Time: 2025-09-12T04:49:30Z
# Message: Valid Gateway
# Observed Generation: 1
# Reason: Accepted
# Status: True
# Type: Accepted
# Last Transition Time: 2025-09-12T04:49:30Z
# Message: Application Gateway for Containers resource has been successfully updated.
# Observed Generation: 1
# Reason: Programmed
# Status: True
# Type: Programmed
# Listeners:
# Attached Routes: 1
# Conditions:
# Last Transition Time: 2025-09-12T04:49:30Z
# Message:
# Observed Generation: 1
# Reason: ResolvedRefs
# Status: True
# Type: ResolvedRefs
# Last Transition Time: 2025-09-12T04:49:30Z
# Message: Listener is Accepted
# Observed Generation: 1
# Reason: Accepted
# Status: True
# Type: Accepted
# Last Transition Time: 2025-09-12T04:49:30Z
# Message: Application Gateway for Containers resource has been successfully updated.
# Observed Generation: 1
# Reason: Programmed
# Status: True
# Type: Programmed
# Name: http
# Supported Kinds:
# Group: gateway.networking.k8s.io
# Kind: HTTPRoute
# Group: gateway.networking.k8s.io
# Kind: GRPCRoute
# Events: <none>
kubectl describe httproutes ray-cluster-http-route
# [Example]
# Name: ray-cluster-http-route
# Namespace: default
# Labels: <none>
# Annotations: <none>
# API Version: gateway.networking.k8s.io/v1
# Kind: HTTPRoute
# Metadata:
# Creation Timestamp: 2025-09-12T04:44:43Z
# Generation: 2
# Resource Version: 247982
# UID: 54bbd1e6-bd28-4cae-a469-e15105f077b8
# Spec:
# Parent Refs:
# Group: gateway.networking.k8s.io
# Kind: Gateway
# Name: ray-cluster-gateway
# Rules:
# Backend Refs:
# Group:
# Kind: Service
# Name: raycluster-kuberay-head-svc
# Port: 8265
# Weight: 1
# Matches:
# Path:
# Type: PathPrefix
# Value: /
# Status:
# Parents:
# Conditions:
# Last Transition Time: 2025-09-12T04:49:30Z
# Message:
# Observed Generation: 2
# Reason: ResolvedRefs
# Status: True
# Type: ResolvedRefs
# Last Transition Time: 2025-09-12T04:49:30Z
# Message: Route is Accepted
# Observed Generation: 2
# Reason: Accepted
# Status: True
# Type: Accepted
# Last Transition Time: 2025-09-12T04:49:30Z
# Message: Application Gateway for Containers resource has been successfully updated.
# Observed Generation: 2
# Reason: Programmed
# Status: True
# Type: Programmed
# Controller Name: alb.networking.azure.io/alb-controller
# Parent Ref:
# Group: gateway.networking.k8s.io
# Kind: Gateway
# Name: ray-cluster-gateway
# Events: <none>
# Step 5: Check Ray Dashboard by visiting the FQDN assigned to your gateway object in your browser
# FQDN can be obtained by the command:
# kubectl get gateway ray-cluster-gateway -o jsonpath='{.status.addresses[0].value}'
# Step 6: Delete the gateway and http route
kubectl delete gateway ray-cluster-gateway
kubectl delete httproutes ray-cluster-http-route
# Step 7: Delete Application Gateway for containers
kubectl delete applicationloadbalancer alb-test -n alb-test-infra
kubectl delete ns alb-test-infra