一.Ingress 是什么?
https://kubernetes.io/zh/docs/concepts/services-networking/ingress/(官网)
Ingress 公开了从集群外部到集群内 services 的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
**
**
可以将 Ingress 配置为提供服务外部可访问的 URL、负载均衡流量、终止 SSL / TLS,以及提供基于名称的虚拟主机。Ingress 控制器 通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。
Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort 或者 Service.Type=LoadBalancer 类型的服务。
环境准备
-
您必须具有 ingress 控制器 才能满足 Ingress 的要求。仅创建 Ingress 资源无效。
-
您可能需要部署 Ingress 控制器,例如 ingress-nginx。您可以从许多Ingress 控制器 中进行选择。
-
理想情况下,所有 Ingress 控制器都应符合参考规范。但实际上,不同的 Ingress 控制器操作略有不同
Ingress Controller
下图即为Ingress Controller这种独特的控制器资源的工作流程图.
需要注意: Ingress Controller 和 Ingress是两个不同的资源。
Ingress它是通过headless service的集群内FQDN获取到它后端所有的Pod资源的IP,因为headless Service没有ClusterIP,它的域名对应的IP为PodIP。Ingress获取PodIP后,在立刻将其写入到ingress-nginx的配置文件中,并触发nginx重读配置文件。实现动态更新upstream。
另外,外部LB可以直接跳过Service,直接访问到nginx,这需要将nginx这个Pod作为共享宿主机的网络名称空间才能实现,这时就需要借助于daemonSet控制器来控制着nginx这种七层反代Pod仅允许在指定节点上,并且每个节点上仅运行一个nginx Pod。
根据上图描述一下大概部署ingresscontroller步骤,
- 部署ingressController控制器
- 部署service 把ingressController暴露到外网
- 部署ingress资源,把后端的service信息加载到ingressController配置文件中
部署ingressController控制器(通用部署)
https://github.com/kubernetes/ingress-nginx/tree/nginx-0.20.0/deploy(github官网)
部署nginx-controller
1.把mandatory.yanl文件下载到本地(wget https://github.com/kubernetes/ingress-nginx/blob/nginx-0.20.0/deploy/mandatory.yaml)
2. kubectl apply -f mandatory.yaml
ingress-controller在ingress-nginx命名空间下
部署service 把ingressController暴露到外网
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
nodePort: 30080
- name: https
port: 443
targetPort: 443
nodePort: 30443
protocol: TCP
selector:
app.kubernetes.io/name: ingress-nginx #ingress-controller的标签
app.kubernetes.io/part-of: ingress-nginx
设置后端pod和service
apiVersion: v1
kind: Service
metadata:
name: nginxsvc
spec:
ports:
- name: http
port: 80
targetPort: 80
selector:
app: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- name: http
containerPort: 80
部署ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginxingress
annotations:
kubernetes.io/ingress.class: "nginx" #注释要写
spec:
rules:
- host: www.jiji.com
http:
paths:
- path:
backend:
serviceName: nginxsvc
servicePort: 80
访问测试
end
简单分列
一个分列配置根据请求的 HTTP URI 将流量从单个 IP 地址路由到多个服务。 Ingress 允许您将负载均衡器的数量降至最低。例如,这样的设置:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: simple-fanout-example
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
backend:
serviceName: service1
servicePort: 4200
- path: /bar
backend:
serviceName: service2
servicePort: 8080
Ingress 控制器将提供实现特定的负载均衡器来满足 Ingress,只要 Service (service1,service2) 存在。 当它这样做了,您会在地址栏看到负载均衡器的地址。
基于名称的虚拟托管
基于名称的虚拟主机支持将 HTTP 流量路由到同一 IP 地址上的多个主机名。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: name-virtual-host-ingress
spec:
rules:
- host: foo.bar.com
http:
paths:
- backend:
serviceName: service1
servicePort: 80
- host: bar.foo.com
http:
paths:
- backend:
serviceName: service2
servicePort: 80