k8s: ingress基于url的负载均衡的实现

准备yaml文件

[root@master .kube]# cd /ingress/
[root@master ingress]# ls
ingress-controller-deploy.yaml         kube-webhook-certgen-v1.1.0.tar.gz  nfs-pv.yaml                        sc-ingress.yaml      url
ingress-nginx-controllerv1.1.0.tar.gz  nfs-pvc.yaml                        nginx-deployment-nginx-svc-2.yaml  sc-nginx-svc-1.yaml
[root@master ingress]# mkdir lb-url
[root@master lb-url]# ls
sc-ingress-url.yaml  sc-nginx-svc-3.yaml  sc-nginx-svc-4.yaml

sc-ingress-url.yaml 创建一个基于URL做负载均衡的ingress
sc-nginx-svc-3.yaml 创建service3 和相关pod
sc-nginx-svc-4.yaml 创建service4 和相关pod

查看目前已经存在的ingress ,是基于域名的负载均衡(上篇博客)

[root@master lb-url]# kubectl get ingress
NAME         CLASS   HOSTS                        ADDRESS                           PORTS   AGE
sc-ingress   nginx   www.feng.com,www.zhang.com   192.168.203.129,192.168.203.130   80      16h

执行文件

执行sc-ingress-url.yaml文件

[root@master url]# cat sc-ingress-url.yaml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: simple-url-lb-example
  annotations:
    kubernets.io/ingress.class: nginx
spec:
  ingressClassName: nginx
  rules:
  - host: www.wen.com
    http:
      paths:
      - path: /foo
        pathType: Prefix
        backend:
          service:
            name: sc-nginx-svc-3
            port:
              number: 80
      - path: /bar
        pathType: Prefix
        backend:
          service:
            name: sc-nginx-svc-4
            port:
              number: 80

[root@master url]# Kubectl apply -f sc-ingress-url.yaml
[root@master lb-url]# kubectl get ingress
NAME                    CLASS   HOSTS                        ADDRESS                           PORTS   AGE
sc-ingress              nginx   www.feng.com,www.zhang.com   192.168.203.129,192.168.203.130   80      16h
simple-url-lb-example   nginx   www.wen.com                                                    80      18s
[root@master lb-url]# 

执行sc-nginx-svc-3.yaml文件

[root@master url]# kubectl apply -f sc-nginx-svc-3.yaml 
[root@master url]# cat sc-nginx-svc-3.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sc-nginx-deploy-3
  labels:
    app: sc-nginx-feng-3
spec:
  replicas: 3
  selector:
    matchLabels:
      app: sc-nginx-feng-3
  template:
    metadata:
      labels:
        app: sc-nginx-feng-3
    spec:
      containers:
      - name: sc-nginx-feng-3
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name:  sc-nginx-svc-3
  labels:
    app: sc-nginx-svc-3
spec:
  selector:
    app: sc-nginx-feng-3
  ports:
  - name: name-of-service-port
    protocol: TCP
    port: 80
    targetPort: 80
[root@master url]# 

执行sc-nginx-svc-4.yaml文件

[root@master url]# kubectl apply -f sc-nginx-svc-4.yaml
[root@master url]# cat sc-nginx-svc-4.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sc-nginx-deploy-4
  labels:
    app: sc-nginx-feng-4
spec:
  replicas: 3
  selector:
    matchLabels:
      app: sc-nginx-feng-4
  template:
    metadata:
      labels:
        app: sc-nginx-feng-4
    spec:
      containers:
      - name: sc-nginx-feng-4
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name:  sc-nginx-svc-4
  labels:
    app: sc-nginx-svc-4
spec:
  selector:
    app: sc-nginx-feng-4
  ports:
  - name: name-of-service-port
    protocol: TCP
    port: 80
    targetPort: 80
[root@master url]# 

执行sc-nginx-svc-3.yaml 文件

[root@master lb-url]# kubectl apply -f sc-nginx-svc-3.yaml 
deployment.apps/sc-nginx-deploy-3 created
service/sc-nginx-svc-3 created
[root@master lb-url]# kubectl apply -f sc-nginx-svc-4.yaml 
deployment.apps/sc-nginx-deploy-4 created
service/sc-nginx-svc-4 created
[root@master lb-url]# 

[root@master lb-url]# kubectl get ingress
NAME                    CLASS   HOSTS                        ADDRESS                           PORTS   AGE
sc-ingress              nginx   www.feng.com,www.zhang.com   192.168.203.129,192.168.203.130   80      16h
simple-url-lb-example   nginx   www.wen.com                  192.168.203.129,192.168.203.130   80      59s
[root@master lb-url]# 

在nfs服务器上进行测试

需要在/etc/hosts文件里添加域名解析记录

[root@nfs-server ~]#  cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.203.129 www.feng.com
192.168.203.129 www.wen.com
192.168.203.130 www.wen.com
192.168.203.129 www.zhang.com
[root@nfs-server ~]# 

测试发现不能找到页面

[root@nfs-server ~]# curl  www.wen.com/foo
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.21.5</center>
</body>
</html>
[root@nfs-server ~]# curl  www.wen.com/bar
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.21.5</center>
</body>
</html>

到底是ingress controller的问题还是后端的pod的问题

查看ingress-nginx-controller pod的信息

[root@master lb-url]# kubectl get pod -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-lc8gj        0/1     Completed   0          17h
ingress-nginx-admission-patch-fs7ft         0/1     Completed   1          17h
ingress-nginx-controller-6c8ffbbfcf-4j872   1/1     Running     1          17h
ingress-nginx-controller-6c8ffbbfcf-qr62z   1/1     Running     1          17h
[root@master lb-url]#

排错思路

1.进入ingress控制器的内部查看是否加载基于URL的负载均衡的配置

[root@master lb-url]# kubectl exec -it ingress-nginx-controller-6c8ffbbfcf-4j872  -n ingress-nginx -- bash
bash-5.1$ cat nginx.conf|grep www.wen.com
  ## start server www.wen.com
    server_name www.wen.com ;
  ## end server www.wen.com
bash-5.1$ 

2.看pod的日志和详细信息

 [root@master lb-url]# kubectl logs ingress-nginx-controller-6c8ffbbfcf-4j872  -n ingress-nginx
[root@master lb-url]# kubectl logs ingress-nginx-controller-6c8ffbbfcf-qr62z  -n ingress-nginx -f
192.168.203.131 - - [08/Sep/2023:02:38:57 +0000] "GET /bar HTTP/1.1" 404 153 "-" "curl/7.29.0" 78 0.002 [default-sc-nginx-svc-4-80] [] 10.244.84.154:80 153 0.002 404 743b6f6eca4bb7ace60641dfd1d02b33
192.168.203.131 - - [08/Sep/2023:02:38:58 +0000] "GET /bar HTTP/1.1" 404 153 "-" "curl/7.29.0" 78 0.000 [default-sc-nginx-svc-4-80] [] 10.244.247.13:80 153 0.001 404 c7590416112b649fc2a5456152581fe0
192.168.203.131 - - [08/Sep/2023:02:38:59 +0000] "GET /bar HTTP/1.1" 404 153 "-" "curl/7.29.0" 78 0.002 [default-sc-nginx-svc-4-80] [] 10.244.84.154:80 153 0.002 404 edad15d8f1bebcf006535d61b29f8a6f
192.168.203.131 - - [08/Sep/2023:02:39:39 +0000] "GET /bar HTTP/1.1" 404 153 "-" "curl/7.29.0" 78 0.003 [default-sc-nginx-svc-4-80] [] 10.244.247.13:80 153 0.004 404 001592532f6226dd0acac818f90d1050

3.查看最后提供web服务器的pod的日志

[root@master lb-url]# kubectl logs  sc-nginx-deploy-4-766c99dd77-7twnm -f
2023/09/08 02:38:57 [error] 32#32: *1 open() "/usr/share/nginx/html/bar" failed (2: No such file or directory), client: 10.244.247.0, server: localhost, request: "GET /bar HTTP/1.1", host: "www.wen.com"
10.244.247.0 - - [08/Sep/2023:02:38:57 +0000] "GET /bar HTTP/1.1" 404 153 "-" "curl/7.29.0" "192.168.203.131"

/usr/share/nginx/html/bar 文件夹不存在,导致404错误

4.新建bar和foo文件夹以及index.html网页文件

进入service4 对应的一个pod里

[root@master lb-url]# kubectl exec -it sc-nginx-deploy-4-766c99dd77-7twnm -- bash
root@sc-nginx-deploy-4-766c99dd77-7twnm:/# cd /usr/share/nginx/html/
root@sc-nginx-deploy-4-766c99dd77-7twnm:/usr/share/nginx/html# ls
50x.html  index.html
root@sc-nginx-deploy-4-766c99dd77-7twnm:/usr/share/nginx/html# mkdir bar
root@sc-nginx-deploy-4-766c99dd77-7twnm:/usr/share/nginx/html# echo "hello,bar" >bar/index.html
root@sc-nginx-deploy-4-766c99dd77-7twnm:/usr/share/nginx/html# ls
50x.html  bar  foo  index.html
root@sc-nginx-deploy-4-766c99dd77-7twnm:/usr/share/nginx/html# cd bar
root@sc-nginx-deploy-4-766c99dd77-7twnm:/usr/share/nginx/html/bar# cat index.html 
hello,bar
root@sc-nginx-deploy-4-766c99dd77-7twnm:/usr/share/nginx/html/bar# ls
index.html
root@sc-nginx-deploy-4-766c99dd77-7twnm:/usr/share/nginx/html/bar#

再次在nfs服务器上测试

在nfs服务器上测试的时候访问路径

curl www.wen.com/bar/index.html
curl www.wen.com/foo/index.html

多测试几次就会成功,因为service 背后的ipvs的调度算法是轮询的

[root@nfs-server ~]# curl  www.wen.com/foo/index.html
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.21.5</center>
</body>
</html>
[root@nfs-server ~]# curl  www.wen.com/bar/index.html
hello,bar
[root@nfs-server ~]# 

所以需要在后端的pod里/usr/share/nginx/html里新建bar和foo文件夹,里面新建index.html页面

一些排错的方法

查看配置的负载均衡策略

[root@master url]# kubectl describe ingress simple-url-lb-example

在ingress-controller上查看负载均衡的情况

[root@master url]# kubectl logs -f ingress-nginx-controller-6c8ffbbfcf-4j872  -n ingress-nginx

在后端的nginx pod上查看访问日志

[root@master url]# kubectl logs sc-nginx-deploy-3-7496c84fcf-6kkr5 -f

查看ingress的负载均衡配置

[root@master lb-url]# kubectl describe  ingress  simple-url-lb-example
Name:             simple-url-lb-example
Namespace:        default
Address:          192.168.203.129,192.168.203.130
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
  Host         Path  Backends
  ----         ----  --------
  www.wen.com  
               /foo   sc-nginx-svc-3:80 (10.244.247.10:80,10.244.247.3:80,10.244.84.151:80)
               /bar   sc-nginx-svc-4:80 (10.244.247.13:80,10.244.84.154:80,10.244.84.160:80)
Annotations:   kubernets.io/ingress.class: nginx
Events:
  Type    Reason  Age                From                      Message
  ----    ------  ----               ----                      -------
  Normal  Sync    30m (x2 over 31m)  nginx-ingress-controller  Scheduled for sync
  Normal  Sync    30m (x2 over 31m)  nginx-ingress-controller  Scheduled for sync
[root@master lb-url]# 

查看service对应的endpoint 是否存在,就可以指定service是否有问题

[root@master lb-url]# kubectl get ep
NAME                ENDPOINTS                                            AGE
kubernetes          192.168.203.128:6443                                 22d
mysql-service       10.244.84.158:3306                                   3d17h
nginx               <none>                                               2d17h
nginx-stateful      <none>                                               2d17h
php-apache          <none>                                               19d
redis-leader        <none>                                               3d18h
sc-nginx-svc        10.244.84.136:80,10.244.84.142:80,10.244.84.157:80   17h
sc-nginx-svc-2      10.244.247.38:80,10.244.84.138:80,10.244.84.146:80   17h
sc-nginx-svc-3      10.244.247.10:80,10.244.247.3:80,10.244.84.151:80    31m
sc-nginx-svc-4      10.244.247.13:80,10.244.84.154:80,10.244.84.160:80   31m
scnginx-service     <none>                                               3d23h
scnginx-service-2   <none>                                               3d18h
wordpress-mysql     10.244.247.56:3306                                   41h
[root@master lb-url]# 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值