基于k8s部署的应用(服务)如何访问

当我们使用k8s部署了一套应用时(比如一个blog系统),要怎么访问它便成了我们最直接的问题,这里的访问应该同时包括了对外(tomcat)和对内(mysql)服务。

要弄清楚这个问题,首先我们需要了解kubernetes网络模型设计的基础原则:

每个pod都拥有一个独立的ip地址,而且假定所有的pod都在一个直接连通的、扁平的网络空间中。

回到题目的问题,我们这里分两步分讨论:

1. 集群内部访问

1.1 通过pod的ip访问

通过这种方式访问是不可靠的,因为当pod重启后,它的ip会重新分配

1.1.1 因为pod中所有容器共享一个网络堆栈(pod的ip地址是docker0分配的),所以同一个pod中的容器可以通过localhost来互相访问
1.1.2 不同pod的容器访问可以使用endpoint方式:pod的ip+容器的端口

1.2 通过服务访问

通过创建service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,这个地址不会因为pod的重启而发生改变,所以是可靠的。

访问方式:服务的clusterIP(这个是系统分配的全局唯一ip)+containerPort(应用容器的端口)

2. 集群外部访问

2.1 直接访问容器

在启动pod的rc/deployment中指定容器的hostport,并设置pod级别的hostwork=true,这样直接通过主机ip+hostport就可以实现访问

2.2 通过service访问

2.2.1 NodePort方式
在service.yaml中配置nodeport参数,这一集群会在每一个node上为需要外部访问的service开启一个TCP监听端口,外部系统只需要用任意一个Node的IP地址+具体的NodePort端口号就可访问此服务。不过这种方式没有解决node层负载均衡的问题(pod层kube-proxy会自动实现负载分发到多个pod上,但node层不能负载分发到多个node)

2.2.2 如果使用公有云平台(如aws、azure、openstack、gce等)部署时,可以用loadbalance方式,配置外部负载均衡器,对service的请求会通过loadbalance转发到后端pod

2.3 Ingress

Ingress也是k8s中单独定义的对象,它的作用就是实现对外暴露访问的负载均衡,它和Service本身LoadBalancer的区别在于:
- Ingress支持L4、L7负载均衡,LoadBalancer设计上只支持L4;
- Ingress基于Pod部署,并将Pod网络设置成external network;
- Ingress controller支持Nginx、Haproxy、GCE-L7,能够满足企业内部使用。

基于k8s部署的应用(服务)如何访问_第1张图片

你可能感兴趣的:(kubernetes)