ingress介绍和ingress通过LoadBalancer暴露服务配置

目录

一.ingress基本原理介绍

1.将原有用于暴露服务和负载均衡的服务的三四层负载均衡变为一个七层负载均衡

2.controller和ingress

3.通过下面这个图可能会有更直观的理解

二.为什么会出现ingress

1.NodePort存在缺点

2.LoadBalancer存在缺点

三.ingress三种暴露服务的方式

四.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方式部署

四.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>
相关推荐
wclass-zhengge9 分钟前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇15 分钟前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
昌sit!8 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
A ?Charis11 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
北漂IT民工_程序员_ZG12 小时前
k8s集群安装(minikube)
云原生·容器·kubernetes
2301_8061313619 小时前
Kubernetes的基本构建块和最小可调度单元pod-0
云原生·容器·kubernetes
SilentCodeY19 小时前
containerd配置私有仓库registry
容器·kubernetes·containerd·镜像·crictl
binqian1 天前
【k8s】ClusterIP能http访问,但是不能ping 的原因
http·容器·kubernetes
探索云原生1 天前
GPU 环境搭建指南:如何在裸机、Docker、K8s 等环境中使用 GPU
ai·云原生·kubernetes·go·gpu
是垚不是土1 天前
Istio流量镜像测试
运维·kubernetes·云计算·istio