天天看点

Kubernetes Ingress为Ingress control配置路由规则

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

Kubernetes Ingress为Ingress control配置路由规则
[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 

Kubernetes Ingress为Ingress control配置路由规则
Kubernetes Ingress为Ingress control配置路由规则

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      
Kubernetes Ingress为Ingress control配置路由规则

Ingress:基于URI路由多个服务

 通过uri转发到不同的服务上面

web1.ctnrs.com/app1   ->  service
web1.ctnrs.com/app2   ->  service      
Kubernetes Ingress为Ingress control配置路由规则

基于请求地址转发不同应用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        

继续阅读