一、将服务暴露给外部客户端的几种方式:
1、服务类型为NodePort: 每个集群节点都会在节点上打开一个端口,并将该端口接受到的流量重定向到基础服务。该服务仅在内部集群IP和端口上才可以访问,也可以通过所有节点上的专用端口访问。
2、服务类型为LoadBalance: nodeport类型的一种扩展,服务可以通过一个专用的负载均衡器来访问,一般由云服务基础设施提供的。客户端通过负载均衡器的IP访问到服务
3、创建一个Ingress资源: 这是个完全不同的机制,通过一个IP地址公开多个服务。运行在HTTP层。
二:三种服务类型详解
1、使用NodePort类型服务
示例:
apiVersion: v1
metadata:
name: kubia-nodeport
spec:
type: NodePort #类型为NodePort的服务
ports:
- port: 80 #服务集群IP的端口号
targetPort: 8080 #背后pod的目标端口
nodePort: 30123 #通过集群阶段的30123端口可以访问该服务
selector:
app: kubia
设置类型为NodePort并指定该服务应该绑定到的所有集群节点的节点端口。指定端口不是强制性的,可以随机。
kubectl get svc kubia-nodeport #查看名为kubia-nodeport的基础信息
显示结果EXTWENAL-IP列显示nodes,表明服务可以通过任何集群节点的IP访问。
PORT(s) 列显示通过集群IP访问的端口和nodeport类型映射的端口。
* 如果要对外提供服务,可以通过JSONPath获取所有节点的IP
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}' #获取所有node ip
注:
A、浏览item属性中的所有元素
B、对于每个元素输入status属性
C、过滤address属性的元素,仅包含具有将type属性设置为ExternalIP的元素。
D、打印过滤元素address属性
curl http://nodeip:30123 访问到pod。
2、通过负载均衡将服务暴露出来
场景:
K8S部署在云基础设施上的时候,可以创建一个load badancer 类型服务,负载均衡拥有独一无二的公网IP,可以通过负载均衡器的IP访问服务。
示例:
apiVersion: v1
kind: Service
metadata:
name: kubia-loadbalancer
spec:
type: LoadBalancer #该服务从k8s集群的基础架构获取负载均衡器
ports:
- port: 80
targetPort: 8080
selector:
app: kubia
kubectl get svc kubia-loadbalancer
EXTERNAL-IP 列显示的IP为负载均衡IP ,可以直接对外提供服务。
3、通过Ingress 暴露服务
使用ingress的重要原因是LB需要为每个服务提供一个公网IP而ingress直接使用主机名和路径就可以用一个公网IP为多个服务提供外部访问。ingress工作在应用层(7层)
1、创建Ingress资源
示例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: kubia
spec:
rules:
- host: kubia.example.com #Ingress 将域名映射到服务
http:
paths:
- path: /
backend:
serviceName: kubia-nodeport #将所有请求发送到kubia-nodeport服务的80端口
servicePort: 80
2、获取ingress的IP
kubectl get ingresses
#ADDRESS 列则显示IP
知道IP后通过DNS解析,将域名解析到IP上。
现在可以通过 http://kubia.example.com访问到pod
3、通过Ingress暴露多个服务
(1) 根据相同主机,不同路径
.....
- host: kubia.example.com
http:
paths:
- path: /kubia #对kubia.example.com/kubia的请求转发至kubia服务
backend:
serviceName: kubia
servicePort: 80
- path: /foo #对kubia.example.com/foo的请求转发至 bar服务。
backend:
serviceName: bar
serviceName: 80
(2) 根据不同的主机名转发
spec:
rules:
- host: foo.example.com
http:
paths:
- path: /
backend:
serviceName: foo #将foo.example.com转发到foo服务
servicePort: 80
- host: bar.example.com
http:
paths:
- path: /
backend:
serviceName: bar #将bar.example.com转发到bar服务
servicePort: 80