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 部署,则需要有几个步骤:

  1. 部署 defaultbackend 的 Deployment
  2. 设置 defaultbackend 的 Service
  3. 设置 ingress-nginx-controller 的 ConfigMap
  4. 更改 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-controllerConfigMap.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 即可。