跳到主要内容
版本:Dev

在 OpenShift 或 OKD 上部署 AISIX OSS

AISIX OSS 无需控制面即可在 OpenShift 和 OKD 上运行。网关从声明式 resources.yaml 文件加载模型、模型服务提供方凭据、调用方 API Key 和策略,平台则通过默认的 restricted-v2 安全上下文约束(SCC)分配运行时 UID。

本流程安装一个网关副本,通过边缘 Route 暴露服务,并验证 AISIX 配置与 OpenShift 安全上下文。如果限制或缓存条目需要在副本间保持一致,请在增加副本数之前配置共享 Redis。

前提条件​

  • 已有 OpenShift 或 OKD 4.11 或更高版本的集群。
  • oc 会话能够在目标项目中管理工作负载、Service、Secret 和 Route,读取 Pod 日志并运行 oc exec。
  • 已获得应用域名和入口 CA 证书,或拥有读取集群 Ingress 配置和 openshift-config-managed 中 default-ingress-cert ConfigMap 的权限。集群管理员也可以直接提供域名和 CA,而无需授予这些权限。
  • Helm 3、Docker 和 cURL。
  • 上游模型服务提供方密钥和调用方 API Key。示例使用 OpenAI 和模型别名 gpt-4o-mini。

准备项目与凭据​

选择现有项目;如果集群允许创建项目,也可以申请新项目:

oc project aisix-dp

# 或申请新项目。
oc new-project aisix-dp

导出示例所用凭据,然后将其存储为 Secret:

export OPENAI_API_KEY="YOUR_PROVIDER_API_KEY"
export CALLER_API_KEY="YOUR_CALLER_API_KEY"

oc -n aisix-dp create secret generic openai-credentials \
--from-literal=api-key="$OPENAI_API_KEY"
oc -n aisix-dp create secret generic aisix-caller-keys \
--from-literal=my-caller="$CALLER_API_KEY"

准备并验证 AISIX 资源​

选择资源来源前,先添加 Chart 仓库:

helm repo add api7 https://charts.api7.ai
helm repo update

将以下 Chart values 保存为 values.yaml。Chart 会把内联资源文档存入 Secret,凭据仍保存在前面创建的 Secret 中:

values.yaml
replicaCount: 1

image:
repository: ghcr.io/api7/aisix
tag: dev

controlPlane:
enabled: false

standalone:
resources:
_format_version: "1"
provider_keys:
- display_name: openai-main
provider: openai
adapter: openai
api_key: ${OPENAI_API_KEY}
api_base: https://api.openai.com/v1
models:
- display_name: gpt-4o-mini
provider: openai
model_name: gpt-4o-mini
provider_key: openai-main
api_keys:
- display_name: my-caller
key_env: CALLER_API_KEY
allowed_models:
- gpt-4o-mini

extraEnvVars:
- name: OPENAI_API_KEY
valueFrom:
secretKeyRef:
name: openai-credentials
key: api-key
- name: CALLER_API_KEY
valueFrom:
secretKeyRef:
name: aisix-caller-keys
key: my-caller

如果 resources.yaml 由其他系统管理,请先准备资源文件,再选择使用现有 Secret或使用现有 ConfigMap。执行这些命令时使用 aisix-dp 项目和 oc。跳过下方的内联资源渲染与验证,然后携生成的 values.yaml 返回本文部署网关部分。

渲染由 Chart 管理的 Secret,并提取从 values.yaml 组装的完整资源文档:

helm template aisix-dp api7/aisix --namespace aisix-dp \
-f values.yaml --show-only templates/secret.yaml |
awk '
/^ resources\.yaml: \|$/ { in_resources = 1; next }
in_resources && /^---$/ { exit }
in_resources { sub(/^ /, ""); print }
' > rendered-resources.yaml

使用网关将接收的相同凭据验证渲染出的文档:

docker run --rm -i \
-e OPENAI_API_KEY -e CALLER_API_KEY \
--entrypoint /bin/sh ghcr.io/api7/aisix:dev \
-c 'umask 077; cat > /tmp/resources.yaml && exec /usr/local/bin/aisix validate --resources /tmp/resources.yaml' \
< rendered-resources.yaml

以流式方式传入文档,可避免放宽宿主机文件权限或更改其 SELinux 标签。

部署网关​

在选定项目中安装 Chart:

helm install aisix-dp api7/aisix \
--namespace aisix-dp \
--values values.yaml

网关 Chart 不固定 runAsUser、runAsGroup 或 fsGroup。它启用 runAsNonRoot 和 RuntimeDefault seccomp 配置,允许 restricted-v2 从项目范围内分配 ID。容器使用只读根文件系统、禁用权限提升,并丢弃除 NET_BIND_SERVICE 以外的所有能力;运行时可写路径使用 emptyDir 卷。

不要向网关 ServiceAccount 授予 anyuid。如果集群管理员为组织策略或自定义卷分配了固定 ID,请将 podSecurityContext.runAsUser、podSecurityContext.runAsGroup 和 podSecurityContext.fsGroup 设为所分配的值。除非镜像 UID 10001 属于项目允许的范围,否则不要复用它。

如果组织策略使用比 restricted-v2 更严格的 SCC,请由集群管理员审查渲染后的清单,并明确分配所需的 ID 或能力。

暴露网关​

为默认的纯 HTTP proxy Service 端口创建边缘 Route。OpenShift 路由器终止 TLS,并通过 HTTP 将流量转发到网关。如果应用域名由集群管理员提供,请将 ROUTE_DOMAIN 设置为该域名,并省略下方第一条导出命令:

export ROUTE_DOMAIN="$(oc get ingresses.config.openshift.io cluster \
-o jsonpath='{.spec.domain}')"
export GATEWAY_ROUTE_HOST="aisix-gateway.$ROUTE_DOMAIN"

oc create route edge aisix-dp \
--service=aisix-dp \
--port=proxy \
--hostname="$GATEWAY_ROUTE_HOST" \
--namespace aisix-dp

此命令使用默认发布名称和 proxy Service 端口。如果发布使用了名称覆盖或自定义监听器,请运行 oc get service -n aisix-dp,并替换为实际的 Service 名称和命名端口。

如果使用组织管理的 DNS,请在创建 Route 前将 GATEWAY_ROUTE_HOST 设置为对应主机名,并确保它解析到路由器。提供匹配的 Route 证书和私钥,或配置 Ingress Controller 的默认证书以覆盖该主机名。

如果网关监听器在 Pod 内终止 TLS,请使用 passthrough Route。如果路由器需要与 Service 建立新的、经过验证的 TLS 连接,请使用 re-encrypt 终止方式。

验证部署​

默认应用域名通常使用由集群内部入口 CA 签发的通配符证书。如果工作站尚未信任此 CA,请导出它,供 curl 检查使用:

oc get configmap default-ingress-cert -n openshift-config-managed \
-o jsonpath='{.data.ca-bundle\.crt}' > ingress-ca.crt
export CURL_CA_BUNDLE="$PWD/ingress-ca.crt"

如果 CA 文件由管理员提供,请将其保存为 ingress-ca.crt,并只运行 CURL_CA_BUNDLE 导出命令。如果 Route 或默认 Ingress Controller 使用工作站已信任的证书,则跳过此导出步骤。

等待网关 Deployment 就绪,并确认其分配到的 SCC 和 UID:

oc rollout status deployment/aisix-dp -n aisix-dp --timeout=5m

export GATEWAY_POD="$(oc get pod -n aisix-dp \
-l 'app.kubernetes.io/instance=aisix-dp,app.kubernetes.io/component=gateway' \
-o jsonpath='{.items[0].metadata.name}')"

oc get pod -n aisix-dp "$GATEWAY_POD" \
-o jsonpath='{.metadata.annotations.openshift\.io/scc}{"\n"}'
oc exec -n aisix-dp "$GATEWAY_POD" -- id -u

第一行应显示 restricted-v2,第二行应显示运行中进程使用的 UID。请确认该 UID 位于项目分配的范围内。

通过 Route 发送请求,验证就绪状态、调用方身份验证和上游模型服务提供方连接:

export AISIX_PROXY="https://$GATEWAY_ROUTE_HOST"

curl -sS "$AISIX_PROXY/readyz"
curl -sS "$AISIX_PROXY/v1/models" \
-H "Authorization: Bearer $CALLER_API_KEY"
curl -sS "$AISIX_PROXY/v1/chat/completions" \
-H "Authorization: Bearer $CALLER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o-mini",
"messages": [
{
"role": "user",
"content": "Reply with: AISIX is ready"
}
]
}'

就绪检查请求应返回 ok,模型列表应包含 gpt-4o-mini,补全结果应包含所请求的助手消息。

后续步骤​