在这里可以看到我已经部署了ingress controll,在使用ingress controll之前要把控制器部署在集群当中,部署好之后创建ingress规则。

[root@k8s-master ~]# kubectl get pod,svc -n ingress-nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-ingress-controller-5mzg4 1/1 Running 0 3m46s 192.168.179.103 k8s-node1 <none> <none>
pod/nginx-ingress-controller-fd6f8 1/1 Running 0 3m45s 192.168.179.104 k8s-node2 <none> <none>
由于没有部署ingress规则,所以返回的都是404
Ingress是什么
• Ingress:K8s中的一个抽象资源,给管理员 提供一个暴露应用的入口定义方法
• Ingress Controller:根据Ingress生成具体 的路由规则,并对Pod负载均衡器
Ingress主要通过域名去帮你做分流的
server {
listen 80;
server_name web1.ctnrs.com;
#tls
location / {
root ;
proxy_pass http://ip:port;
}
location /app {
root ;
proxy_pass http://ip:port;
}
}
server {
listen 80;
server_name web2.ctnrs.com;
location / {
root ;
proxy_pass http://ip:port;
}
}
创建pod service并且创建service(在创建ingress规则之前部署你的应用)
[root@k8s-master ~]# cat app.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web1
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: web1
template:
metadata:
labels:
app: web1
spec:
containers:
- name: web
image: nginx:1.18
ports:
- containerPort: 80
name: nginx
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: web1
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: nginx
selector:
app: web1
type: ClusterIP
可以看到应用部署成功,也可以访问,后面就是为这个项目创建具体的ingress规则了
[root@k8s-master ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/web1-5557959468-hl77r 1/1 Running 0 29s
pod/web1-5557959468-pb9r4 1/1 Running 0 29s
pod/web1-5557959468-t4bmc 1/1 Running 0 30s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 46d
service/web1 ClusterIP 10.99.82.114 <none> 80/TCP 31s
[root@k8s-master ~]# curl 10.99.82.114
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
创建ingress规则
创建ingress规则是先要自己定义的
• Ingress:K8s中的一个抽象资源,给管理员提供一个暴露应用的入口定义方法
• Ingress Controller:根据Ingress生成具体的路由规则,并对Pod负载均衡器
[root@k8s-master ~]# cat ingress-web1.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web1
spec:
rules:
- host: web1.ctnrs.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web1
port:
number: 80
[root@k8s-master ~]# kubectl apply -f ingress-web1.yml
ingress.networking.k8s.io/web1 created
[root@k8s-master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web1-5557959468-hl77r 1/1 Running 0 17m 10.244.36.83 k8s-node1 <none> <none>
web1-5557959468-pb9r4 1/1 Running 0 17m 10.244.169.145 k8s-node2 <none> <none>
web1-5557959468-t4bmc 1/1 Running 0 17m 10.244.169.146 k8s-node2 <none> <none>
[root@k8s-master ~]# kubectl describe ingress web1
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
Name: web1
Namespace: default
Address:
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
Host Path Backends
---- ---- --------
web1.ctnrs.com
/ web1:80 10.244.169.145:80,10.244.169.146:80,10.244.36.83:80)
Annotations: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CREATE 8h nginx-ingress-controller Ingress default/web1
Normal CREATE 2m40s nginx-ingress-controller Ingress default/web1
在ingress定义规则的yml文件里面,你可以这样理解:(和nginx配置虚拟主机就是一样的,这里的clusterIP+端口就相当于一个负载均衡器)
- - host: web1.ctnrs.com 相当于server_name
- - path: / 相当于 location / {}
测试:本地电脑绑定hosts记录对应ingress里面配置的域名
Pod在哪个节点就配置其域名 C:\Windows\System32\drivers\etc
192.168.179.103 web1.ctnrs.com
192.168.179.104 web1.ctnrs.com
Ingress:基于URI路由多个服务
通过uri转发到不同的服务上面
web1.ctnrs.com/app1 -> service
web1.ctnrs.com/app2 -> service
基于请求地址转发不同应用Pod
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web
spec:
rules:
- host: web2.ctnrs.com
http:
paths:
- path: /foo
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
- path: /bar
pathType: Prefix
backend:
service:
name: service2
port:
number: 8080
Ingress:基于名称的虚拟主机
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web3
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: servcie1
port:
number: 80
- host: bar.foo.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service2
port:
number: 80