ingress-nginx 部署 defaultbackend
介绍
defaultBackend 是一种默认后端服务,用于处理 ingress-nginx 控制器无法理解的所有 URL 路径和主机(即所有未映射 Ingress 的请求)。
部署
部署 defaultbackend 有几种方法。如果是使用 helm 安装的 ingress-nginx,则步骤相对比较简单。如果使用 yaml 部署的,步骤相对多一些。
使用 helm 部署
如果通过 helm 安装的 ingress,可以通过修改 values.yaml 的 defaultBackend 部分。比如:
defaultBackend:
enabled: true
name: defaultbackend
image:
registry: registry.k8s.io
image: defaultbackend-amd64
tag: "1.5"
修改 values.yaml 文件中的 config 部分,或执行kubectl edit configmaps -n ingress-nginx ingress-nginx-controller
更新 ConfigMap :
config:
custom-http-errors: 404,415,503
设置哪些 HTTP 代码的请求,以便使用 error_page 指令进行处理。
设置完后,更新 Release 即可:
helm upgrade ingress-nginx -n ingress-nginx .
使用 yaml 部署
使用 yaml 部署,则需要有几个步骤:
- 部署 defaultbackend 的 Deployment
- 设置 defaultbackend 的 Service
- 设置 ingress-nginx-controller 的 ConfigMap
- 更改 ingress-nginx-controller 的启动参数
部署 defaultbackend 的 Deployment
yaml 文件如下:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: defaultbackend
name: defaultbackend
namespace: ingress-nginx
spec:
replicas: 1
selector:
matchLabels:
app: defaultbackend
template:
metadata:
labels:
app: defaultbackend
spec:
containers:
- image: registry.k8s.io/defaultbackend-amd64:1.5
imagePullPolicy: IfNotPresent
name: defaultbackend
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /healthz
port: 8080
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 5
这个镜像默认开放一个 8080 端口,且后端开放两个 URL:
/healthz
返回 200 状态码/
返回 404 状态码
然后通过一个 Service ,固定一个访问入口,并将接口开放为 80 端口。
设置 defaultbackend 的 Service
yaml 文件内容如下:
apiVersion: v1
kind: Service
metadata:
name: defaultbackend
namespace: ingress-nginx
spec:
selector:
app: defaultbackend
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
部署后,查看 defaultbackend 的信息:
# kubectl get deployment,service,endpoints -n ingress-nginx defaultbackend
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/defaultbackend 1/1 1 1 1h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/defaultbackend ClusterIP 172.16.131.37 <none> 80/TCP 1h
NAME ENDPOINTS AGE
endpoints/defaultbackend 10.104.157.89:8080 1h
可以通过 Service 进行访问测试:
# curl 172.16.131.37 -i
HTTP/1.1 404 Not Found
Date: Tue, 09 Jul 2024 14:53:09 GMT
Content-Length: 21
Content-Type: text/plain; charset=utf-8
default backend - 404
通过访问 /healthz
的接口
# curl 172.16.131.37/healthz -i
HTTP/1.1 200 OK
Date: Tue, 09 Jul 2024 14:53:21 GMT
Content-Length: 2
Content-Type: text/plain; charset=utf-8
ok
设置 ingress-nginx-controller 的 ConfigMap
同样需要更新 ingress-nginx-controller 的 Configmap,通过kubectl edit configmaps -n ingress-nginx ingress-nginx-controller
在 ConfigMap.data
上添加custom-http-errors
,比如:
data:
custom-http-errors: 404,415,503
更改 ingress-nginx-controller 的启动参数
通过添加 --default-backend-service
启动参数来告诉 controller 这些 defaultbackend 的请求转发到哪里,比如:
containers:
- args:
- /nginx-ingress-controller
- --default-backend-service=$(POD_NAMESPACE)/defaultbackend
这里引用了一个环境变量,它代表当前Pod所在的命名空间(Namespace)。当在Pod的配置文件(YAML文件)中使用这个环境变量时,Kubernetes会在运行时自动替换它为Pod实际所在的命名空间。如果 defaultbackend 和 ingress-nginx-controller 不在同一个命名空间,则需要指定命名空间,不能使用环境变量。
修改完成后重新启动 nginx-ingress-controller 即可。