准备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]#