一、Ingress概念
1.1 Ingress概念
使用NodePort类型的Service可以将集群内部服务暴露给集群外部客广端,但使用这种类型Service存在如下几个问题。
- 1、一个端口只能一个服务使用,所有通过NodePort暴露的端口都需要提前规划;
- 2、如果通过NodePort暴露端口过多,后期维护成本太大,且不易于管理;
- 3、目前Service底层使用的是Iptables、IPVS,仅支持4层协议,无法完成https协议传输;
Kubernetes为了解决这种需求,提供了一种高级的流量管理,也就是Ingress和Ingress控制器,Kubernetes使用Ingress控制器来接收所有入口的流量,然后通过Ingress资源来定义流量如何区分,以及流量如何转发的规则。
Kubernetes为了解决这种需求,提供了一种高级的流量管理,也就是Ingress和Ingress控制器,Kubernetes使用Ingress控制器来接收所有入口的流量,然后通过Ingress资源来定义流量如何区分,以及流量如何转发的规则。
有了Ingress和Ingress控制器,我们就可以直接定义流量转发规则来发布服务,而无需创建一堆的NodePort和LoadBalance类型的Service。
1.2、 什么是Ingress
Ingress其实就是Kubernetes中的一种资源,它主要是用来定义流量转发规则。但Ingress资源自身并不能实现流量的转发和调度,它仅仅是一组流量路由的规则集合,这些规则要真正发挥作用还需要使用到Ingress控制器,由Ingress控制器读取对应的Ingress规则,然后完成流量的路由或转发。
Ingress的底层知识是通过Nginx进行封装。配置规则也是跟Nginx类似
1.3、Ingress Controller
Ingress Controller就是一类以代理HTTP/HTTPS协议为主的代理程序。如:Nginx、Traefik、Envoy、Haproxy。Ingress Controller通过Pod的形式运行在Kubernetes集群上,它能够与集群上的Pod直接通信。这样就可以让用户的流量经过Ingress控制器时直接调度到对应的Pod上。
Ingress Controller类似Nginx服务,它负责读取Ingress的规则,然后转换将规则转换为nginx.conf配置文件,这样就可以根据对应的规则来实现流量的调度。同时它还会实时感知后端Service对应的Pod变化,当Pod发生变动后,Ingress控制器会再次结合Ingress的规则,进而完成对应的配置动态更新。
注意:使用Ingress资源进行流量分发时,Ingress控制器可基于ingress定义的规则将客户端的请求流量直接转发至Service对应的后端Pod资源上。比如:用户请求api.oldxu.net,Ingress控制器根据对应的规则直接将请求流量调度至Pod3或Pod4,而无需经过Service对象转发。
二、Ingress的安装与配置
- 安装Ingress-nginx控制器;
- 使用daemonSet方式部署,但需要通过nodeSelect来选择几个节点安装,并非所有节点都需要;
- 将Pod的端口与节点共享网络名称空间;设定为HostNetwork;
1、ingress配置文件下载
- ingress 配置文件下载
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/baremetal/deploy.yaml
- ingress 配置修改
## 第一次修改:查看注释
apiVersion: v1
kind: Service
metadata:labels:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxapp.kubernetes.io/version: 1.2.0name: ingress-nginx-controller""""""""""selector:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginx#type: NodePorttype: ClusterIP ### 这个修改成 ClusterIP ---
第二次修改:查看注释
---
apiVersion: apps/v1
#kind: Deployment
kind: DaemonSet ### 修改成DaemonSet控制器
metadata:labels:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxapp.kubernetes.io/version: 1.2.0name: ingress-nginx-controllernamespace: ingress-nginx
spec:minReadySeconds: 0revisionHistoryLimit: 10selector:"""""""""""" volumeMounts:- mountPath: /usr/local/certificates/name: webhook-certreadOnly: truednsPolicy: ClusterFirstWithHostNet ##DNS策略hostNetwork: true ## 与主机共享网络空间nodeSelector: ## 所有节点都必须有这个标签kubernetes.io/os: linux ## 这个标签已经是具备的 kubectl get node --show-labels 查看node-role: ingress ## 如果具备这个标签就可以安装serviceAccountName: ingress-nginxterminationGracePeriodSeconds: 300volumes:- name: webhook-certsecret:secretName: ingress-nginx-admission 第三处修改:修改三个image 的镜像,因为GitHub,无法下载,可以提前下载,上传至阿里镜像仓库
[root@master ingress]# kubectl apply -f deploy.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
daemonset.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created
[root@master ingress]# kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-pk4qm 0/1 Completed 0 48s
ingress-nginx-admission-patch-jcgqd 0/1 Completed 0 48s
[root@master ingress]# kubectl get daemonsets.apps -n ingress-nginx
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
ingress-nginx-controller 0 0 0 0 0 kubernetes.io/os=linux,node-role=ingress 62s#### 本次采用的daemonsets的方式进行部署,如果在生产环境中,一般是采用这种方式进行部署,采取资源比较高的几个node进行部署ingress
### 因为node上现在还缺少node-role=ingress这个标签,导致不能给节点安装,在资源比较高的节点打上标签就可以部署,如下操作[root@master ~]# kubectl label nodes node1 node-role=ingress
node/node1 labeled
[root@master ~]# kubectl get daemonsets.apps -n ingress-nginx
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
ingress-nginx-controller 1 1 0 1 0 kubernetes.io/os=linux,node-role=ingress 6m43s[root@master ~]# kubectl get nodes node1 --show-labels | grep ingress
node1 Ready <none> 99d v1.23.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux,node-role=ingress## 将node1和node2进行打标签
[root@master ~]# kubectl get nodes node1 node2 --show-labels | grep ingress
node1 Ready <none> 99d v1.23.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux,node-role=ingress
node2 Ready <none> 99d v1.23.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux,node-role=ingress
- ingress状态查看
Completed: 当一个Pod中的容器成功完成任务后,容器的状态会变为 Completed。这表示该容器已经顺利执行完其任务并退出了。在你的输出中,ingress-nginx-admission-create-pk4qm 和 ingress-nginx-admission-patch-jcgqd 这两个Pod的容器已经成功完成它们的任务。
三、Ingress快速入门实践
1、Ingress资源清单
apiVersion: networking.k8s.io/v1 #资源所属的API群组和版本
kind: Ingress ## 资源表示
metadata:name: ingress-01 ## 资源名称namespace: default ## 资源命名空间
spec:ingressClassName: "nginx" ## 适配的Ingress控制器类别,必须明确指定 <string>rules: ## Ingress规则列表 <[]Object>- host: ## 虚拟主机的FODN,俗称域名 <string>http: ## <Object>paths: ## 虚拟主机PATH定义的列表,有path和backend组成 <[]Object> -required->- path: ## 匹配以什么开头,类似nginx中location的作用 <string>pathType: ## Prefix前缀匹配,不区分大小写 Exact精确匹配URL,区分大小写 <string> -required->backend: ## <Object> -required->service: ##关联后端service <Object>name: ## 关联后端service名称 <string> -requiredport: ## 关联后端service端口 <Object>name: ## 关联后端service端口名称 <string>port: ## 关联后端service端口号 <integer>
2、Ingress发布业务,可以参考service篇章的guestbooks
3、Ingress基于URL实现路由
- 场景:将来自同一域名,不同URL请求调度到不同Service
3.1、 demoapp 的yaml资源清单
apiVersion: apps/v1
kind: Deployment
metadata:name: demoapp
spec:replicas: 2selector:matchLabels: app: demoapptemplate:metadata:labels:app: demoappspec:containers:- name: demoimage: oldxu3957/demoapp