1.为什么需要Ingress
- 我们使用传统的NodePort类型的Service的确能将集群内的服务暴露给集群外部客户端去访问,但是使用这种类型的Service存在以下问题。
- 一个端口只能使用一个服务,所有通过NodePort暴露的端口都需要提前规划;
- 如果集群上的Service的数量太多的话,暴露的NodePort端口不具有连续性。后期维护成本太大,且不宜于管理;
- 无论是Iptables或者是Ipvs模型的Service都配置在Linux内核中的Netfilter之上进行四层调度。是一种比较通用的调度器。支持调度HTTP、Mysql等应用层服务,不过,也正是工作于传输层从而使得它无法做到类似卸载HTTPS中的SSL会话,也不支持基于URL的请求调度机制,因为它工作在传输层。kubernetes也不支持为此类负载均衡配置任何类型的健康状态检测机制。
2.什么是Ingress以及Ingress的资源规范
2.1什么是Ingress?
在kubernetes之中,Service资源和Pod资源的IP地址仅能用于集群网络的内部通信,所有的网络流量都无法穿透边界路由器(Edge Router)以实现集群内外通信,尽管可以使用NodePort或者LoadBalancer类型通过节点引入外部流量,但它依然是4层流量转发。
Ingress是kubernetes标准的资源类型,它主要用来定义流量转发规则,但是Ingress资源并不能实现流量的转发以及调度,它仅仅是一组流量路由的规则集合,这些规则要真正发挥作用还需要使用Ingress-Controller,由Ingress-Controller控制器读取对应的Ingress规则,然后完成流量的路由以及转发;
2.2什么是Ingress-Controller?
Ingress Controller可以由任何具有反向代理(HTTP/HTTPS)功能的服务程序实现,如Nginx、Traefik、Envoy、Haproxy。Ingress-Controller通过Pod的形式运行在kubernetes集群上,它能够与集群上的Pod直接通信,这样就可以让用户的流量经过Ingress-Controller直接调度到后端的Pod。
Ingress-Controller类似于Nginx服务,它负责读取Ingress的规则,然后转换将规则转换为nginx.conf配置文件。这样就可以根据对应的规则来实现流量的调度。同时它还会实时感知后端Serrvice对应Pod变化,当Pod发生变动后,Ingress-Controller会再次结合Ingress的规则,进而完成对应配置的动态更新。

需要注意的是: 使用Ingress资源进行流量分发的时候,Ingress-Controller可基于某个Ingress资源定义的规则将客户端的请求流量直接转发至与Service对应的后端的Pod资源之上。这种机制会绕过Service资源,从而省去了由kube-proxy实现的端口代理开销。实际的访问是Clinet--->Ingress Controller----->通过Ingress规则---->借助Service识别目标有哪些Pod。
2.3Ingress配置资源规范
- apiVersion: networking.k8s.io/v1 # 资源所属的API群组和版本
- kind: Ingress # 资源类型
- metadata: # 元数据
- name: <string> # 资源名称
- namespace: <string> # 名称空间
- spec:
- ingressClassName: "nginx" # 适用的Ingress控制器类别,须明确指明
- rules: <[]object> # Ingress规则列表
- - host: <string> # 虚拟主机的FQDN,俗称域名
- http: <object>
- paths: <[]object> # 虚拟主机的PATH定义列表
- - path: <string> # 匹配以什么开头类似于nginx中的location
- pathType: <string> # Prefix前缀匹配,不区分大小写 Exact。精确匹配URL,区分大小写
- backend: <object> # 后端
- service: <object> #关联后端的Service
- name: <string> # 后端Service的名称
- port: <object> #后端Service的端口
- name: # 端口名称
- number: # 端口号
-
复制代码 3.Ingress的安装与配置
3.1Ingress-Controller的安装;
Ingress-Controller的GitHub地址: https://github.com/kubernetes/ingress-nginx
Ingress-Nginx的annotaions: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#permanent-redirect
3.1.1下载配置文件
- root@ks-master01-10:~# wget https://github.com/kubernetes/ingress-nginx/blob/main/deploy/static/provider/kind/deploy.yaml
复制代码 3.1.2配置文件如下
有几处需要修改3.1.3查看Ingress-Controller运行是否正常
Pod运行正常,- root@ks-master01-10:~# kubectl get pods -n ingress-nginx
- NAME READY STATUS RESTARTS AGE
- ingress-nginx-admission-create--1-hcfr2 0/1 Completed 0 2d23h
- ingress-nginx-admission-patch--1-6tdvp 0/1 Completed 0 2d23h
- ingress-nginx-controller-jtwc6 1/1 Running 4 (18h ago) 2d23h
- ingress-nginx-controller-x9psq 1/1 Running 4 (18h ago) 2d23h
复制代码 3.1.4查看Service
- root@ks-master01-10:~# kubectl get svc
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- kubernetes ClusterIP 10.96.0.x <none> 443/TCP 14d
- nginx-svc ClusterIP 10.96.xx.102 <none> 80/TCP 23m
复制代码 3.2使用Ingress发布应用
条件1: 创建应用
条件2: 创建Service
条件3: 创建Ingress资源
3.2.1创建应用
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: nginx-deploy
- namespace: default
- spec:
- replicas: 2
- selector:
- matchLabels:
- app: nginx-test
- template:
- metadata:
- labels:
- app: nginx-test
- spec:
- containers:
- - name: nginx
- image: nginx:1.16
- imagePullPolicy: IfNotPresent
- ports:
- - name: http
- containerPort: 80
复制代码 查看Pod- root@ks-master01-10:~# kubectl get pods -l app=nginx-test
- NAME READY STATUS RESTARTS AGE
- nginx-deploy-86cf6979bd-b6fld 1/1 Running 0 2m3s
- nginx-deploy-86cf6979bd-pz4s8 1/1 Running 0 2m3s
复制代码 3.2.2创建Service
Ingress资源仅通过Service资源识别相应的Pod资源获取其IP和端口,而后Ingress控制器即可直接使用各Pod对象的IP地址与它直接进行通信,而不经由Service资源代理和调度,因此Service资源的ClusterIP对Ingress控制器一无所用,不过若集群内的其他Pod客户端需要与其通信,那么ClusterIP还是很有必要;- root@ks-master01-10:~# cat nginx-deploy-svc.yaml
- apiVersion: v1
- kind: Service
- metadata:
- name: nginx-svc
- namespace: default
- spec:
- selector:
- app: nginx-test
- ports:
- - port: 80
- targetPort: 80
- root@ks-master01-10:~# kubectl apply -f nginx-deploy-svc.yaml
- service/nginx-svc created
复制代码 查看Service- root@ks-master01-10:~# kubectl get svc
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- nginx-svc ClusterIP 10.96.79.102 <none> 80/TCP 4s
复制代码 可以看到后端的端点是2个nginx的Pod- root@ks-master01-10:~# kubectl describe svc nginx-svc
- Name: nginx-svc
- Namespace: default
- Labels: <none>
- Annotations: <none>
- Selector: app=nginx-test
- Type: ClusterIP
- IP Family Policy: SingleStack
- IP Families: IPv4
- IP: 10.96.79.102
- IPs: 10.96.79.102
- Port: <unset> 80/TCP
- TargetPort: 80/TCP
- Endpoints: 192.168.1.72:80,192.168.2.21:80
- Session Affinity: None
复制代码 3.2.3集群内测试
因为是ClusterIP,在集群内访问测试是没有问题的;- root@ks-master01-10:~# curl -I 10.96.79.102
- HTTP/1.1 200 OK
- Server: nginx/1.16.1
- Date: Wed, 24 Aug 2022 05:06:42 GMT
- Content-Type: text/html
- Content-Length: 612
- Last-Modified: Tue, 13 Aug 2019 10:05:00 GMT
- Connection: keep-alive
- ETag: "5d528b4c-264"
- Accept-Ranges: bytesÍ
复制代码 3.2.4创建Ingress资源发布应用;
通过Ingrees资源的FQDN主机或者URL的路径等类似发布的服务,只有用户的访问请求能够匹配到其.spec.rules.host字段定义的主机才能被相应的规则所处理;- root@ks-master01-10:~# vim nginx-deploy-ingress.yaml
- apiVersion: networking.k8s.io/v1
- kind: Ingress
- metadata:
- name: nginx-test
- namespace: default
- spec:
- ingressClassName: "nginx"
- rules:
- - host: haitang.nginx.com
- http:
- paths:
- - path: /
- pathType: Prefix
- backend:
- service:
- name: nginx-svc
- port:
- number: 80
- root@ks-master01-10:~# kubectl apply -f nginx-deploy-ingress.yaml
- ingress.networking.k8s.io/nginx-test created
- # 可以已经将Pod识别为后端的端点;
- root@ks-master01-10:~# kubectl describe ingress nginx-test
- Name: nginx-test
- Namespace: default
- Address:
- Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
- Rules:
- Host Path Backends
- ---- ---- --------
- haitang.nginx.com
- / nginx-svc:80 (192.168.1.72:80,192.168.2.21:80)
- Annotations: <none>
- Events:
- Type Reason Age From Message
- ---- ------ ---- ---- -------
- Normal Sync 8s nginx-ingress-controller Scheduled for sync
- Normal Sync 8s nginx-ingress-controller Scheduled for sync
-
- # 查看Ingress资源
- root@ks-master01-10:~# kubectl get ingress
- NAME CLASS HOSTS ADDRESS PORTS AGE
- nginx-test nginx haitang.nginx.com xx.xx.xx.xx 80 13m
复制代码 3.2.5集群外测试访问;
需配置/etc/hosts访问即可;- sh-3.2# curl -I haitang.nginx.com
- HTTP/1.1 200 OK
- Date: Wed, 24 Aug 2022 05:04:15 GMT
- Content-Type: text/html
- Content-Length: 612
- Connection: keep-alive
- Last-Modified: Tue, 13 Aug 2019 10:05:00 GMT
- ETag: "5d528b4c-264"
- Accept-Ranges: bytes
复制代码 当然网页访问也是没有问题

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |