目录
1.将原有用于暴露服务和负载均衡的服务的三四层负载均衡变为一个七层负载均衡
1.像之前的openelb部署文章讲到一样,先开启严格ARP
1.主要配置项有host、service-name、service-port等几处,代码中介绍
一.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方式部署
四.ingress简介
如果要把ingress部署在公有云,那用这种方式比较合适。用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 <none> 443/TCP 17m
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/openelb-keepalive-vip 2 2 2 2 2 <none> 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.文件网盘地址
链接:百度网盘 请输入提取码 提取码:0hls
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>