ITPub博客

首页 > 数据库 > 数据库开发技术 > Ingess kubernetes 原生LB

Ingess kubernetes 原生LB

原创 数据库开发技术 作者:步步运维步步坑 时间:2023-10-13 10:00:00 0 删除 编辑

     在之前的文章已经提到,Service对集群之外暴露服务的主要方式有两种:NotePort和LoadBalancer,但是这两种方式,都有一定的缺点:

NodePort方式的缺点是会占用很多集群机器的端口,那么当集群服务变多的时候,无异于变相增加维护成本

LB方式的缺点是每个service(后文简称为svc)需要一个LB,浪费、麻烦,并且需要kubernetes之外设备的支持

        基于这种现状,kubernetes官方提供了Ingress资源对象,它只需要一个NodePort或LB就可以满足暴露多个Service的需求。工作机制大致如下图表示:

Ingress相当于一个7层的负载均衡器,是kubernetes对反向代理的一个抽象,它的工作原理类似于Nginx,可以理解成在Ingress里建立诸多映射规则,Ingress Controller通过监听这些配置规则并转化成Nginx的反向代理配置 , 然后对外部提供服务。在这里有两个核心概念:

  • ingress:kubernetes中的一个对象,作用是定义请求如何转发到svc的规则

  • ingress controller:具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发,实现方式有很多,比如Nginx, Contour, Haproxy等等


Ingress的工作原理如下:

用户编写规则,说明哪个域名对应看k8s集群中的哪个svc

Ingress controller 动态感知Ingress规则的变化,然后生成一段对应的反向代理配置

Ingress controller会将生成的反向代理配置写入到一个运行着的Nginx服务中,并动态更新(如下图)

Ingress使用演示

创建文件夹

# mkdir ingress-controller# cd ingress-controller/

获取ingress-nginx

# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

 创建

# kubectl apply -f ./

 

查看ingress-nginx

# kubectl get pod -n ingress-nginxNAME                                           READY   STATUS    RESTARTS   AGEpod/nginx-ingress-controller-fbf967dd5-4qpbp   1/1     Running   0          30s

查看svc# kubectl get svc -n ingress-nginxNAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGEingress-nginx   NodePort   10.98.75.177   <none>        80:32355/TCP,443:31355/TCP   11h

准备service和pod

为了后面的实验比较方便,创建如下图所示的模型

 创建tomcat-nginx.yaml

apiVersion: apps/v1kind: Deploymentmetadata:  name: nginx-deployment  namespace: devspec:  replicas: 2  selector:    matchLabels:      app: nginx-pod  template:    metadata:      labels:        app: nginx-pod    spec:      containers:      - name: nginx        image: nginx:1.17.1        ports:        - containerPort: 80 --- apiVersion: apps/v1kind: Deploymentmetadata:  name: tomcat-deployment  namespace: devspec:  replicas: 3  selector:    matchLabels:      app: tomcat-pod  template:    metadata:      labels:        app: tomcat-pod    spec:      containers:      - name: tomcat        image: tomcat:8.5-jre10-slim        ports:        - containerPort: 8080 --- apiVersion: v1kind: Servicemetadata:  name: nginx-service  namespace: devspec:  selector:    app: nginx-pod  clusterIP: None  type: ClusterIP  ports:  - port: 80    targetPort: 80 --- apiVersion: v1kind: Servicemetadata:  name: tomcat-service  namespace: devspec:  selector:    app: tomcat-pod  clusterIP: None  type: ClusterIP  ports:  - port: 8080    targetPort: 8080

创建

# kubectl create -f tomcat-nginx.yaml

 

查看

# kubectl get svc -n devNAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGEnginx-service    ClusterIP   None         <none>        80/TCP     48stomcat-service   ClusterIP   None         <none>        8080/TCP   48s

Http代理和Https代理

创建ing-http.yaml

apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: ing-http  namespace: devspec:  rules:  - host: nginx.test.com    http:      paths:      - path: /        backend:          serviceName: nginx-service          servicePort: 80  - host: tomcat.test.com    http:      paths:      - path: /        backend:          serviceName: tomcat-service          servicePort: 8080

创建

# kubectl create -f ing-http.yamlingress.extensions/ing-http created 

查看

# kubectl get ing ing-http -n devNAME           HOSTS                                  ADDRESS   PORTS   AGEing-http   nginx.test.com,tomcat.test.com             80      22s 

查看详情

# kubectl describe ing ing-http  -n dev...Rules:Host                Path  Backends----                ----  --------nginx.test.com   / nginx-service:80 (10.244.1.96:80,10.244.1.97:80,10.244.2.112:80)tomcat.test.com  / tomcat-service:8080(10.244.1.94:8080,10.244.1.95:8080,10.244.2.111:8080)...


本地配置host文件,解析上面的两个域名到集群中任一节点上就可以分别访问tomcat.test.com和nginx.test.com查看效果了(注意这里要看ingress-nginx暴露端口,访问时需要携带端口,如果需要是用80&443 后可以是用nginx座一层代理,或者traefik + nginx 实现)

Https代理

创建证书&生成证书

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/C=CN/ST=BJ/L=BJ/O=nginx/CN=test.com"

创建密钥

kubectl create secret tls tls-secret --key tls.key --cert tls.crt

创建ing-https.yaml

apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: ing-https  namespace: devspec:  tls:    - hosts:      - nginx.test.com      - tomcat.test.com      secretName: tls-secret # 指定秘钥  rules:  - host: nginx.test.com    http:      paths:      - path: /        backend:          serviceName: nginx-service          servicePort: 80  - host: tomcat.test.com    http:      paths:      - path: /        backend:          serviceName: tomcat-service          servicePort: 8080

创建

# kubectl create -f ing-https.yamlingress.extensions/ing-https created

查看

# kubectl get ing ing-https -n devNAME            HOSTS                                  ADDRESS         PORTS     AGEing-https   nginx.test.com,tomcat.test.com   10.104.153.38   80, 443   2m42s

 查看详情

# kubectl describe ing ing-https -n dev...TLS:  tls-secret terminates nginx.test.com,tomcat.test.comRules:Host              Path Backends----              ---- --------nginx.test.com  /  nginx-service:80 (10.244.1.97:80,10.244.1.98:80,10.244.2.119:80)tomcat.test.com /  tomcat-service:8080(10.244.1.99:8080,10.244.2.117:8080,10.244.2.120:8080)...

通过浏览器访问https://nginx.test.com和https://tomcat.test.com来查看了(要看创建ingress-nginx的时候暴露的端口是什么,访问时需要携带端口)


原文作者:步步运维步步坑;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2022-10-08

  • 博文量
    100
  • 访问量
    51728