我已经重现了您的场景,这对我有用。
我将尝试按照我所遵循的步骤指导您。
云提供商: GKE
库伯内特版本:v1.15.3命名空间: default
我正在使用 2 个映像的 2 个部署,每个映像都有一个服务。
服务1: default-http-backend
- 使用 nginx 镜像,它将成为我们的默认后端。
服务2: custom-http-backend
- 对于无生命/回显服务器图像,如果请求来自白名单 IP,则将显示此服务。
Ingress:带注释的 Nginx 入口。
预期行为:入口将配置为使用默认后端, 自定义 http 错误 and 白名单源范围注释。如果请求是从白名单 IP 发出的,则入口将重定向到自定义 http 后端,如果没有,它将被重定向到默认 http 后端.
部署 1:default-http-backend
创建文件default-http-backend.yaml
包含以下内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: default-http-backend
spec:
selector:
matchLabels:
app: default-http-backend
template:
metadata:
labels:
app: default-http-backend
spec:
containers:
- name: default-http-backend
image: nginx
ports:
- name: http
containerPort: 80
imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
name: default-http-backend
spec:
selector:
app: default-http-backend
ports:
- protocol: TCP
port: 80
targetPort: 80
应用 yaml 文件:k apply -f default-http-backend.yaml
部署 2:自定义-http-后端
创建文件custom-http-backend.yaml
包含以下内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: custom-http-backend
spec:
selector:
matchLabels:
app: custom-http-backend
template:
metadata:
labels:
app: custom-http-backend
spec:
containers:
- name: custom-http-backend
image: inanimate/echo-server
ports:
- name: http
containerPort: 8080
imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
name: custom-http-backend
spec:
selector:
app: custom-http-backend
ports:
- protocol: TCP
port: 80
targetPort: 8080
应用 yaml 文件:k apply -f custom-http-backend.yaml
检查服务是否启动并运行
我正在使用别名k
for kubectl
➜ ~ k get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
custom-http-backend ClusterIP 10.125.5.227 <none> 80/TCP 73s
default-http-backend ClusterIP 10.125.9.218 <none> 80/TCP 5m41s
...
➜ ~ k get pods
NAME READY STATUS RESTARTS AGE
custom-http-backend-67844fb65d-k2mwl 1/1 Running 0 2m10s
default-http-backend-5485f569bd-fkd6f 1/1 Running 0 6m39s
...
您可以使用测试该服务端口转发:
默认 http 后端
k port-forward svc/default-http-backend 8080:80
尝试访问http://本地主机:8080在你的浏览器中看到nginx默认页面。
自定义 http 后端
k port-forward svc/custom-http-backend 8080:80
尝试访问http://本地主机:8080在您的浏览中可以看到 echo-server 镜像提供的自定义页面。
入口配置
此时我们已经启动并运行了两个服务,我们需要安装和配置 nginx 入口。您可以按照官方文档,这里就不介绍了。
安装后让我们部署入口,根据您发布的代码我做了一些修改:删除了 tls,添加了其他域并删除了路径/api
仅用于测试目的并将我的家庭 IP 添加到白名单。
创建文件my-app-ingress.yaml
内容:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-app-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: "/"
nginx.ingress.kubernetes.io/custom-http-errors: '403'
nginx.ingress.kubernetes.io/default-backend: default-http-backend
nginx.ingress.kubernetes.io/whitelist-source-range: 207.34.xxx.xx/32
spec:
rules:
- host: myapp.rabello.me
http:
paths:
- path: "/"
backend:
serviceName: custom-http-backend
servicePort: 80
应用规范:k apply -f my-app-ingress.yaml
使用以下命令检查入口:
➜ ~ k get ing
NAME HOSTS ADDRESS PORTS AGE
my-app-ingress myapp.rabello.me 146.148.xx.xxx 80 36m
就这样!
如果我使用列入白名单的 IP 在家进行测试,则会显示自定义页面,但如果我尝试使用 4G 网络中的手机进行访问,则会显示 nginx 默认页面。
注意我在同一命名空间中使用入口和服务,如果您需要使用不同的命名空间,则需要使用外部名称.
我希望这有帮助!
参考:
Kubernetes 部署
Kubernetes 服务
nginx 入口
Nginx 注释