跳到主要内容
版本:3.9.x

在 OpenShift 上安装 API7 Ingress Controller

本指南将引导你完成如何在 OpenShift 集群上部署 API7 Ingress Controller。

准备工作

请遵循在 OpenShift 上安装 API7 企业版中的前提条件和安装步骤,但跳过生成并运行部署脚本(用于 API7 Gateway)步骤。

安装 API7 Ingress Controller

如果你想使用不同的命名空间或自定义其他配置名称,请相应地调整安装命令和配置值。

生成并运行部署脚本

导航到仪表板:

  1. 从侧边导航栏选择网关组,然后点击添加网关组

  2. 选择类型为Ingress Controller

  3. 名称字段中输入 api7-ingress

  4. 点击添加

添加新的网关组

网关组应该被创建,并且你将在部署步骤面板中看到提示,要求安装 ingress controller 并部署 GatewayProxy 配置。

输入 Ingress Controller 的命名空间和名称。

安装 API7 Ingress Controller

然后点击生成脚本

安装 API7 Ingress Controller

在命令末尾手动附加高亮显示的标志。确保前一行以尾随反斜杠(\)结束。命令应类似于以下内容:

helm repo add api7 https://charts.api7.ai
helm repo update
helm upgrade --install -n api7-enterprise-project --create-namespace api7-ingress api7/api7-ingress-controller \
--version 0.1.23 \
--set "deployment.image.repository=api7/api7-ingress-controller" \
--set "deployment.image.tag=2.0.16" \
--set "config.controllerName=api7.ai/api7-ingress-controller" \
--set "config.leaderElection.id=api7-ingress-controller-leader" \
// 注释 1
--set "adc.securityContext.runAsUser=65532" \
// 注释 2
--skip-crds

--set "adc.securityContext.runAsUser=65532":以非 root 用户(UID 65532)身份运行 API7 Ingress Controller,以符合 OpenShift 的安全策略。

--skip-crds:跳过通过 Helm 安装 CRD,因为 OpenShift 限制了 CRD 管理。Gateway API CRD 已经存在,而 APISIX CRD 必须在之后手动安装。

信息

如果你打算使用 Gateway API 创建资源,请使用 0.1.23 或更高版本的 Helm chart。较早的 chart 版本无法在 OpenShift 环境中正确安装 Gateway API 资源。

在终端中运行它。如果部署成功,你应该会看到类似于以下的响应:

NAME: api7-ingress
LAST DEPLOYED: Mon Feb 2 15:12:59 2026
NAMESPACE: api7-enterprise-project
STATUS: deployed
REVISION: 1
TEST SUITE: None

为 API7 Ingress Controller 配置 SCC

创建一个名为 api7-ingress 的服务账户,该账户将在 Helm chart 发布名称中被引用。角色必须分配给 Ingress Controller 部署所使用的服务账户。

oc create serviceaccount api7-ingress -n api7-enterprise-project

创建一个带有 nonroot-v2 SCC 的角色:

oc create role api7-ingress \
--verb=use \
--resource=scc \
--resource-name=nonroot-v2 \
-n api7-enterprise-project

将角色绑定到服务账户:

oc create rolebinding api7-ingress \
--role=api7-ingress \
--serviceaccount=api7-enterprise-project:api7-ingress \
-n api7-enterprise-project

安装 APISIX CRD

在 OpenShift 中,Gateway API CRD 是预安装的,并且受到平台保护。Helm 安装必须使用 --skip-crds,以避免在尝试安装这些受保护的 CRD 时出现权限错误。因此,APISIX CRD 也被跳过,需要手动安装。

kubectl apply -f https://raw.githubusercontent.com/api7/api7-helm-chart/refs/heads/main/charts/ingress-controller/crds/apisix-crds.yaml

你应该会得到以下响应。

customresourcedefinition.apiextensions.k8s.io/apisixconsumers.apisix.apache.org created
customresourcedefinition.apiextensions.k8s.io/apisixglobalrules.apisix.apache.org created
customresourcedefinition.apiextensions.k8s.io/apisixpluginconfigs.apisix.apache.org created
customresourcedefinition.apiextensions.k8s.io/apisixroutes.apisix.apache.org created
customresourcedefinition.apiextensions.k8s.io/apisixtlses.apisix.apache.org created
customresourcedefinition.apiextensions.k8s.io/apisixupstreams.apisix.apache.org created
customresourcedefinition.apiextensions.k8s.io/backendtrafficpolicies.apisix.apache.org created
customresourcedefinition.apiextensions.k8s.io/consumers.apisix.apache.org created
customresourcedefinition.apiextensions.k8s.io/gatewayproxies.apisix.apache.org created
customresourcedefinition.apiextensions.k8s.io/httproutepolicies.apisix.apache.org created
customresourcedefinition.apiextensions.k8s.io/pluginconfigs.apisix.apache.org created

部署 GatewayProxy 配置

  1. 命名空间字段中输入 api7-enterprise-project
  2. 名称字段中输入 api7-ingress
  3. 点击生成脚本

如果你尚未配置 Admin API 地址,系统将提示你先添加它。

添加 Admin API 地址

  1. 选择 IngressGateway API 标签页。
安装 API7 Ingress Controller
  1. 复制生成的脚本并在终端中运行。

你应该会得到以下响应。

namespace/api7-enterprise-project configured
secret/api7-ingress-admin-secret configured
gatewayclass.gateway.networking.k8s.io/api7-ingress created
gatewayproxy.apisix.apache.org/api7-ingress created
ingressclass.networking.k8s.io/api7-ingress created

创建网关实例

前往网关实例页面并添加一个网关实例。

激活网关实例

切换到 Kubernetes 标签页并填写参数。完成后,点击生成以查看部署脚本。

激活网关实例

生成的脚本结尾没有反斜杠(\)。确保 apisix.image.tag 行以 \ 结尾,并且额外的 securityContext 设置被附加到 Helm 命令的末尾,如下所示:

helm repo add api7 https://charts.api7.ai
helm repo update
cat > /tmp/tls.crt <<EOF
-----BEGIN CERTIFICATE-----
MIIBhjCCATigAwIBAgICBAAwBQYDK2VwMEQxCzAJBgNVBAYTAlVTMRMwEQYDVQQI
EwpDYWxpZm9ybmlhMQ0wCwYDVQQKEwRBUEk3MREwDwYDVQQDEwhBUEk3IEluYzAe
Fw0yNTEyMzEwNzQ3MzZaFw0zNjAxMjgwNzQ3MzZaMC4xDTALBgNVBAoTBEFQSTcx
HTAbBgNVBAMTFEdBVEVXQVktQ0EtVkVSU0lPTi0xMCowBQYDK2VwAyEA0WOxi3H/
gxsh/kNEg8L9cLrfZmRqE5lB4fW0DVObre2jZDBiMA4GA1UdDwEB/wQEAwIHgDAT
BgNVHSUEDDAKBggrBgEFBQcDAjAtBgNVHQ4EJgQkYWZjNmQ0ODctMmVmZC00MjZh
LWJiNDktMTA2ZWQ2NDIyOWFkMAwGA1UdIwQFMAOAATEwBQYDK2VwA0EAJJh+f8Sv
4OWo41Um3NOpvB30tjWQEsUXpDKyh9Kh8b7ymcDVQ0Hn1J9jFyI5Y/yFT8ZSz7ek
1GGpngVMsWTiDg==
-----END CERTIFICATE-----
EOF
cat > /tmp/tls.key <<EOF
-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIEIFXsXU+dBdP8lkheZH/6SMy7ZnMionHN/xRDHBjOMAvP
-----END PRIVATE KEY-----
EOF
cat > /tmp/ca.crt <<EOF
-----BEGIN CERTIFICATE-----
MIIBeDCCASqgAwIBAgIRAP4AwnUs3br0nZ7V03gyt84wBQYDK2VwMEQxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMQ0wCwYDVQQKEwRBUEk3MREwDwYD
VQQDEwhBUEk3IEluYzAgFw0yNTEyMzEwNjU1NDlaGA8yMDg2MDExNTA2NTU0OVow
RDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExDTALBgNVBAoTBEFQ
STcxETAPBgNVBAMTCEFQSTcgSW5jMCowBQYDK2VwAyEAHTkeAU7NKliDJFd5UN9b
xYIMgAz4RG3QUwEBXl2NwdCjLzAtMA4GA1UdDwEB/wQEAwIChDAPBgNVHRMBAf8E
BTADAQH/MAoGA1UdDgQDBAExMAUGAytlcANBABrSW1mdva+TFJNiOpyblbz5vSJY
Jk9HSb3vHYfa3dncCz2A5m5sOs1VNFq3QQqPVaI41dx0FvIrp89gVsFVMAk=
-----END CERTIFICATE-----
EOF
kubectl create namespace api7-enterprise-project --dry-run=client -o yaml | kubectl apply -f -
kubectl create secret generic -n api7-enterprise-project api7-ee-3-gateway-tls --from-file=tls.crt=/tmp/tls.crt --from-file=tls.key=/tmp/tls.key --from-file=ca.crt=/tmp/ca.crt
helm upgrade --install -n api7-enterprise-project --create-namespace api7-ee-3-gateway api7/gateway \
--set "etcd.auth.tls.enabled=true" \
--set "etcd.auth.tls.existingSecret=api7-ee-3-gateway-tls" \
--set "etcd.auth.tls.certFilename=tls.crt" \
--set "etcd.auth.tls.certKeyFilename=tls.key" \
--set "etcd.auth.tls.verify=true" \
--set "gateway.tls.existingCASecret=api7-ee-3-gateway-tls" \
--set "gateway.tls.certCAFilename=ca.crt" \
--set "apisix.extraEnvVars[0].name=API7_GATEWAY_GROUP_SHORT_ID" \
--set "apisix.extraEnvVars[0].value=eybqbncmefrqq" \
--set "etcd.host[0]=https://api7ee3-dp-manager.api7-enterprise-project.svc.cluster.local:7943" \
--set "apisix.replicaCount=1" \
--set "apisix.image.repository=api7/api7-ee-3-gateway" \
--set "apisix.image.tag=3.9.3" \
// 注释 1
--set "apisix.securityContext.runAsNonRoot=true" \
// 注释 2
--set "apisix.securityContext.runAsUser=636"

--set "apisix.securityContext.runAsNonRoot=true":确保 APISIX Pod 以非 root 用户身份运行,以符合 OpenShift 安全要求。

--set "apisix.securityContext.runAsUser=636":为 APISIX Pod 进程指定 UID (636),以满足 OpenShift SCC 要求。

返回网关实例页面,你应该会看到一个健康的网关实例。

运行中的 API7 网关实例

验证

检查所有 Pod 状态:

kubectl get pods -n api7-enterprise-project

确保 Ingress Controller 和 Gateway Pod 处于 Running 状态:

NAME                                                    READY   STATUS    RESTARTS         AGE
api7-ee-3-gateway-78f8fd49f9-6fkhv 1/1 Running 0 4m44s
api7-ingress-api7-ingress-controller-568867b656-v8ftd 2/2 Running 0 65m
api7-postgresql-0 1/1 Running 0 91m
api7-prometheus-server-5c9b5c98ff-mf2gl 1/1 Running 0 91m
api7ee3-dashboard-df48f5f59-x5zkt 1/1 Running 0 91m
api7ee3-developer-portal-7fbd8fdc54-jvnvc 1/1 Running 0 91m
api7ee3-dp-manager-7b449767dc-dxfrr 1/1 Running 0 91m

列出所有 Service:

kubectl get svc -n api7-enterprise-project

你应该会看到一个可用的网关服务:

NAME                                               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
api7-ee-3-gateway-gateway NodePort 172.30.128.146 <none> 80:31474/TCP,443:30130/TCP 32m
api7-ingress-api7-ingress-controller-webhook-svc ClusterIP 172.30.63.42 <none> 443/TCP 67m
api7-ingress-metrics-service ClusterIP 172.30.133.232 <none> 8443/TCP 67m
api7-postgresql ClusterIP 172.30.123.46 <none> 5432/TCP 92m
api7-postgresql-hl ClusterIP None <none> 5432/TCP 92m
api7-prometheus-server ClusterIP 172.30.10.79 <none> 9090/TCP 92m
api7ee3-dashboard ClusterIP 172.30.84.136 <none> 7080/TCP,7443/TCP 92m
api7ee3-developer-portal ClusterIP 172.30.42.148 <none> 4321/TCP 92m
api7ee3-dp-manager ClusterIP 172.30.153.144 <none> 7900/TCP,7943/TCP 92m

下一步

通过阅读将请求代理到服务,学习如何将流量路由到你的服务。