Ingress 是一个原生的 Kubernetes 资源,可以通过规则将外部流量转发到集群内部的服务 Endpoint。
Ingress 需要借助 Ingress Controller 来转发 Ingress 对象所指定的规则。
kube-proxy 是一个 4 层的接入层。 kube-proxy 主要是靠 iptables 内核转发,有问题基本无法定位,全靠猜,相对黑盒。
Ingress 是一个 7 层的、能转发的、可编程的一个接入层。 流量数据近乎透明。
IngressClass
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: external-lb
annotations:
ingressclass.kubernetes.io/is-default-class: "True"
spec:
controller: example.com/ingress-controller
parameters:
apiGroup: k8s.example.com
kind: IngressParameters
name: external-lb
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: example-ingress
spec:
ingressClassName: external-lb
rules:
- host: k8s.example.com
http:
paths:
- path: /example
pathType: Prefix
backend:
serviceName: example-service
servicePort: 80
metadata:
name: foo
annotations:
kubernetes.io/ingress.class: "nginx"
设置缺省的 IngressClass
ingressclass.kubernetes.io/is-default-class
annotations,设置为 True。
代表所在的 IngressClass 为缺省控制器。
没有显式指定 ingressClassName
的新的 Ingress 资源都会使用该控制器。
pathType
该动能为 1.18 版本以后的改版。
ImplementationSpecific
使用此路径类型,匹配取决于 IngressClass。Exact
与网址路径完全匹配且区分大小写Prefix
根据网址路径前缀进行匹配。匹配区分大小写,并且在逐个路径的基础上进行匹配。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple-fanout-example
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
pathType: Prefix
backend:
service:
name: service1
port:
number: 4200
- path: /bar
pathType: Prefix
backend:
service:
name: service2
port:
number: 8080
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: name-virtual-host-ingress
spec:
rules:
- host: foo.bar.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service1
port:
number: 80
- host: bar.foo.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service2
port:
number: 80
Ingress 未定义 host
,则可以匹配到 Ingress Controller IP 地址的任何网络流量,而无需基于 host
。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: name-virtual-host-ingress-no-third-host
spec:
rules:
- http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service3
port:
number: 80
TLS
apiVersion: v1
kind: Secret
metadata:
name: testsecret-tls
namespace: default
data:
tls.crt: base64 encoded cert
tls.key: base64 encoded key
type: kubernetes.io/tls
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-example-ingress
spec:
tls:
- hosts:
- https-example.foo.com
secretName: testsecret-tls
rules:
- host: https-example.foo.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service1
port:
number: 80