添加网关


服务网关在微服务实践中可以做到统一接入、流量管控、安全防护、业务隔离等功能。

在这里可以看到我已经部署了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主要通过域名去帮你做分流的

  • URL匹配规则
    • 前缀匹配:例如映射URL为/healthz,只要符合此前缀的URL均可访问。例如/healthz/v1、/healthz/v2。
    • 完全匹配:只有完全匹配上才能生效。例如映射URL为/healthz,则必须为此URL才能访问。
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规则是先要自己定义的

• 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  
Logo

开源、云原生的融合云平台

更多推荐