ingress 高级用法
多个Ingress Controller SVC
如果您只运行了一个ingress controller,想通过多个ULB对外提供服务(例如需要在ULB中绑定SSL证书),可以参考这个yaml文件。
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx2
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
- name: https
port: 443
targetPort: 443
protocol: TCP
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
这里我新建了一个把ingress controller暴露出集群的svc,名为ingress-nginx2,这时针对这个nginx ingress controller就拥有了2个svc,对应了2个ULB。
[root@10-10-10-194 ~]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx LoadBalancer 172.17.23.246 xx.xx.xx.xx 80:32677/TCP,443:39787/TCP 10d
ingress-nginx2 LoadBalancer 172.17.7.114 yy.yy.yy.yy 80:47962/TCP,443:45958/TCP 29m
用户可以解析增加n1 xx.xx.xx.xx和n2 yy.yy.yy.yy进行区分流量入口,这个操作流程将使用同一套ingress controller,多个SVC的使用场景,逻辑如下图。
ULB1 ULB2
| |
ing_svc1 ing_svc2
| |
-----------------
|
ingress controller
|
-----------------
| |
app_svc1 app_svc2
| |
app_pod1 app_pod2
多个 Ingress Controller
如果您运行了多个ingress controller在您的kubernetes集群中(例如同时运行了nginx和traefik),则需要在使用ingress资源对象时进行声明操作,例如:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: traefik-web-ui
namespace: kube-system
annotations:
kubernetes.io/ingress.class: traefik
# 声明使用 traefik 作为指定的ingress controller
# 也可以替换成 nginx 等已安装的ingress controller
spec:
rules:
- host: traefik-ui.minikube
http:
paths:
- path: /
backend:
serviceName: traefik-web-ui
servicePort: web
如果您部署了不同类型的ingress controller(例如nginx和traefik),而不指定注释类型,将导致这两个或者所有的ingress controller都在努力满足ingress的需求,并且所有的ingress controller都在争抢更新ingress的状态。
使用 DaemonSet 部署
ingress-controller可以通过Deployment或DaemonSet部署,各有利弊:
使用Deployment时,可伸缩性可以更好,因为在使用DaemonSet时您将拥有每个节点的单一Pod模型,而在使用Deployment时,基于环境您可能需要更少的Pod。
当节点加入群集时,DaemonSet会自动扩展到新节点,而Deployment仅在需要时在新节点上进行调度。
DaemonSet 确保只有一个节点有且只有一个副本。如果副本数要小于或大于集群节点数,建议通过 Deployment进行设置。
最近更新时间:2025-03-19 09:32:07