温馨提示:这篇文章已超过421天没有更新,请注意相关的内容是否还可用!
摘要:,,Ingress是Kubernetes中的一个核心组件,用于管理外部访问集群内部的服务。它提供了负载均衡、URL路由和访问控制等功能。通过Ingress,外部用户可以通过特定的域名或IP地址访问集群中的服务。为了暴露服务,Ingress可以与LoadBalancer结合使用,配置负载均衡器以接收外部流量并将其转发到集群中的服务。通过这种方式,可以轻松地将Kubernetes服务公开给外部用户,并实现流量的管理和控制。
目录
一.ingress基本原理介绍
1.将原有用于暴露服务和负载均衡的服务的三四层负载均衡变为一个七层负载均衡
2.controller和ingress
3.通过下面这个图可能会有更直观的理解
二.为什么会出现ingress
1.NodePort存在缺点
2.LoadBalancer存在缺点
三.ingress三种暴露服务的方式
四.ingress配置前准备工作
1.像之前的openelb部署文章讲到一样,先开启严格ARP
2.部署好openelb相关配置
五.部署ingress,部署deploy.yaml
1.文件网盘地址
2.上面链接中的应修改处已修改好,主要如下
3.部署deploy.yaml
4.创建需要用的deployment和service
六.创建该服务的ingress-http代理
1.主要配置项有host、service-name、service-port等几处,代码中介绍
2.添加域名映射进行访问测试
(1)linux
(2)windows
一.ingress基本原理介绍
1.将原有用于暴露服务和负载均衡的服务的三四层负载均衡变为一个七层负载均衡
工作原理了类似于nginx,等于是在ingress里建立许多规则,在通过controller监听规则变化,生成对应的配置,实现对服务的反向代理配置,为外部提供服务,并动态更新。
2.controller和ingress
(1)上面提到controller,他是具体用于实现反向代理和负载均衡的程序,对ingress定义的规则进行解析并根据配置进行转发,nginx、haproxy等都可以作为实现方式。如果是对Kubernetes 集群外部的客户端提供服务,那么 Controller 实现的是类似于边缘路由(Edge Router) 的功能。需要注意的是, Ingress 只能以 HTTP TTPS 提供服务。
(2)那么还要提到一个ingress对象,他起到定义请求如何转发到service的规则的作用,使用 Ingress 进行服务路由时, Controller 基于 Ingress 规则将客户端请求直接转发到 Service 对应的后端 Endpoint Pod 上,这样会跳过 kube-proxy 设置的路由转发规则,以提高网络转发效率。
3.通过下面这个图可能会有更直观的理解
二.为什么会出现ingress
我们知道ingress也是用于暴露服务和负载均衡的,相对NodePort和LoadBalancer的缺点而言,ingress可以较完美解决这些问题,耗费较少的端口和LB资源,比较方便,一个IP可以暴露多个应用,支持同域名不同uri,支持证书等功能。但是如上所述,他是一个七层负载均衡,在某种情况下他还是会造成CPU消耗大,设备性能下降。
1.NodePort存在缺点
集群中服务增多时,他的占用设备的端口比较多,但站在内核处理方面,他的内核处理次数少一点。
2.LoadBalancer存在缺点
每一个service都要配置一个LB,还需要云厂商的配置支持,在特殊情况下比较麻烦。
三.ingress三种暴露服务的方式
三种方式分别是:deployment+loadbalancer的service,daemonset+hostnetwork+nodeselector的service,deployment+nodeport的service,这里主要介绍deployment+loadbalancer下的openelb方式部署,用Deployment部署ingress-controller,创建一个type为 LoadBalancer的 service关联这组pod。公有云为LoadBalancer的 service自动创建一个负载均衡器,这时把域名解析指向地址,就实现了集群服务的对外暴露。
四.ingress配置前准备工作
openelb,purelb,metallb三种均衡器在部署ingress之前都需要保证部署的该功能负载均衡正常工作,这里就以openelb为例
1.像之前的openelb部署文章讲到一样,先开启严格ARP
[root@k8s-master ingress]# kubectl edit configmap kube-proxy -n kube-system [root@k8s-master ingress]# kubectl rollout restart ds kube-proxy -n kube-system daemonset.apps/kube-proxy restarted [root@k8s-master ingress]# kubectl get configmap kube-proxy -n kube-system -o yaml | grep mode mode: "ipvs" [root@k8s-master ingress]# kubectl get configmap kube-proxy -n kube-system -o yaml | grep strictARP strictARP: true
2.部署好openelb相关配置
openelb文件网盘链接:百度网盘 请输入提取码 提取码:29e4
#部署完查看是否有openelb-system名称空间,是否有pod运行,以及其他资源是凑正常运行 [root@k8s-master ingress]# kubectl apply -f openelb.yaml [root@k8s-master ingress]# kubectl get all -n openelb-system NAME READY STATUS RESTARTS AGE pod/openelb-admission-create-5ffkm 0/1 Completed 0 17m pod/openelb-admission-patch-hdt6j 0/1 Completed 1 17m pod/openelb-keepalive-vip-bl7h7 1/1 Running 0 17m pod/openelb-keepalive-vip-ng2c7 1/1 Running 0 17m pod/openelb-manager-99b49789c-g72wf 1/1 Running 0 17m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/openelb-admission ClusterIP 10.99.101.18 443/TCP 17m NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/openelb-keepalive-vip 2 2 2 2 2 17m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/openelb-manager 1/1 1 1 17m NAME DESIRED CURRENT READY AGE replicaset.apps/openelb-manager-99b49789c 1 1 1 17m NAME COMPLETIONS DURATION AGE job.batch/openelb-admission-create 1/1 3s 17m job.batch/openelb-admission-patch 1/1 4s 17m #创建eip地址池 [root@k8s-master ingress]# cat ip-pool.yaml apiVersion: network.kubesphere.io/v1alpha2 kind: Eip metadata: name: my-eip-pool spec: address: 192.168.2.11-192.168.2.20 protocol: layer2 disable: false interface: ens33 [root@k8s-master ingress]# kubectl apply -f ip-pool.yaml
五.部署ingress,部署deploy.yaml
1.文件网盘地址
链接:https://pan.baidu.com/s/15xTy25X9_3HP-qjhmoM9Iw
提取码:54zw
2.上面链接中的应修改处已修改好,主要如下
controller和controller-admission都添加了一段注解annotations,用于声明使用刚才创建的eip地址池,添加了80端口
3.部署deploy.yaml
[root@k8s-master ingress]# kubectl apply -f deploy.yaml
4.创建需要用的deployment和service
创建关于nginx和tomcat的两个service和deployment,代码中有注意事项
[root@k8s-master ingress]# cat mydeployment.yaml apiVersion: apps/v1 kind: Deployment #deployment都是正常创建即可 metadata: labels: app: my-nginx name: my-nginx namespace: myns spec: replicas: 1 selector: matchLabels: app: my-nginx template: metadata: labels: app: my-nginx spec: containers: - image: nginx:1.17.2 name: nginx imagePullPolicy: IfNotPresent ports: - containerPort: 80 --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: my-tomcat name: my-tomcat namespace: myns spec: replicas: 1 selector: matchLabels: app: my-tomcat template: metadata: labels: app: my-tomcat spec: containers: - image: tomcat:8.5-jre10-slim name: tomcat imagePullPolicy: IfNotPresent ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: nginx-service namespace: myns annotations: #在metadata中指定注解信息,使用eip地址池中的地址 lb.kubesphere.io/v1alpha1: openelb protocol.openelb.kubesphere.io/v1alpha1: layer2 eip.openelb.kubesphere.io/v1alpha2: my-eip-pool spec: allocateLoadBalancerNodePorts: false #不自动分配端口,由用户指定 externalTrafficPolicy: Cluster #将外部流量分发到集群内的所有节点 internalTrafficPolicy: Cluster #将内部流量限制在集群内 selector: app: my-nginx type: LoadBalancer #指定类型为loadbalancer负载均衡 ports: - port: 80 targetPort: 80 --- apiVersion: v1 kind: Service metadata: name: tomcat-service namespace: myns annotations: #在metadata中指定注解信息,使用eip地址池中的地址 lb.kubesphere.io/v1alpha1: openelb protocol.openelb.kubesphere.io/v1alpha1: layer2 eip.openelb.kubesphere.io/v1alpha2: my-eip-pool spec: allocateLoadBalancerNodePorts: false externalTrafficPolicy: Cluster internalTrafficPolicy: Cluster selector: app: my-tomcat type: LoadBalancer ports: - port: 8080 targetPort: 8080 [root@k8s-master ingress]# kubectl apply -f mydeployment.yaml
六.创建该服务的ingress-http代理
1.主要配置项有host、service-name、service-port等几处,代码中介绍
[root@k8s-master ingress]# cat myingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: myingress namespace: myns spec: ingressClassName: nginx rules: - host: www.mynginx.com #想要映射的域名 http: paths: - path: / pathType: Prefix backend: service: name: nginx-service #为哪个服务进行映射,必须要和刚才创建的服务名称一致 port: number: 80 #暴露哪个端口号用于外部访问 - host: www.tomcat.com http: paths: - path: / pathType: Prefix backend: service: name: tomcat-service port: number: 8080
2.添加域名映射进行访问测试
[root@k8s-master ingress]# kubectl get service -n myns #使用的是我们创建的服务所开放出来的EXTERNAL-IP NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-service LoadBalancer 10.96.45.145 192.168.2.13 80:30385/TCP 36m tomcat-service LoadBalancer 10.97.204.115 192.168.2.14 8080:30165/TCP 36m [root@k8s-master ingress]# kubectl get ingress -n myns #分别对应两个ingress NAME CLASS HOSTS ADDRESS PORTS AGE myingress nginx www.mynginx.com,www.tomcat.com 192.168.2.11 80 33m
(1)linux
[root@k8s-master ingress]# tail -2 /etc/hosts 192.168.2.13 www.mynginx.com 192.168.2.14 www.mytomcat.com
(2)windows
以管理员身份运行powershell,切到.\drivers\etc\编辑hosts文件,
PS C:\WINDOWS\system32> cd .\drivers\etc\ PS C:\WINDOWS\system32\drivers\etc> notepad .\hosts PS C:\WINDOWS\system32\drivers\etc>
还没有评论,来说两句吧...