将服务暴露给外部客户端
就是外部可以访问pod上的服务,有一下几种方式可以在外部访问服务
1,将服务的类型设置成NodePort的形式。这样就会在每个集群的节点上打开一个端口,提供对外边服务的访问。
2,将服务的类型设置成LoadBalance,NodePort类型的一种扩展,这使得服务可以通过一个专用的负载均衡器来访问。这是由kubernets的云基础设施提供的。
3,创建一个Ingress资源。这是一个完全不同的机制。通过一个IP地址公开多个服务。它运行在http层。
1.1使用NodePort类型的服务
将一组pod公开给外部客户端的方法,将服务类型设置成NodePort,通过创建NodePort服务,可以让Kubernets在其所在节点上保留一个端口,并将传入的连接转发给服务部分的Pod
NodePort类型的YAML
----------------------------
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 9376
selector:
app: MyApp
----------------------------
type: NodePort:为NodePort类型服务
targetPort: 8080:背后Pod的目标端口号
port: 80:node的端口号
nodePort: 9376:通过集群节点的9376端口可以访问该服务。
例如:以下的形式可以访问服务
xx.xx.xx.xx(service的IP):80
xx.xx.xx.xx(1st nodeIP):9376
xx.xx.xx.xx(2nd nodeIP):9376
因为9376端口是特殊端口,得打开防火墙,一定要注意!
2.1通过负载均衡器将服务暴露出来
在云提供商上运行的kubernets集群通常支持从云基础架构自动提供负载均衡器。所以需要做的就是设置服务类型为LoadBalance而不是NodePort。LoadBalancer有自己的public IP,并将所有的连接重定向到服务。你可以通过访问负载均衡器IP来访问服务。
如果Kubernets运行在一个不支持LoadBalancer服务的环境中运行,则不会调负载均衡器。
LoadBalancer类型的YAML
----------------------------
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
selector:
app: MyApp
----------------------------
可以通过访问负载均衡器的IP访问服务。
注意一下下面的设置,可以查看一下官网
spec;
externalTrafficPolicy : Local
3.1通过Ingress暴露服务
为什么要用Ingress,一个重要的原因是LoadBalancer需要自己独立的IP,而Ingress只需要一个公网IP就能为许多服务器提供访问。
Ingress类型的YAML
----------------------------------------
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: name-virtual-host-ingress
spec:
rules:
- host: foo.bar.com
http:
paths:
- backend:
serviceName: service1
servicePort: 80
- host: bar.foo.com
http:
paths:
- backend:
serviceName: service2
servicePort: 80
---------------------------------------
创建好Ingress之后,Ingress将域名foo.bar.com和bar.foo.com映射到服务上,注意需要把域名foo.bar.com和bar.foo.com放的DNS上,这样就可以通过域名解析访问到服务了。
foo.bar.com和bar.foo.com在DNS上是相同的IP。这样就可以了,访问不同的服务可以通过path就可以区分不同的服务了。
目前是Http服务,还可以是Https服务,这要就需要配置TLS的证书和私钥。
还有就是Pod还有一个就绪探针。有的Pod刚被创建,可能不会马上就提供服务,还需要准备一些资源。这样就可以需要就绪探针定时取检测目前Pod是否是可以提供服务的。如果不能提供服务,Ingress等服务在接受到外部的请求时,就不会放该Pod上转发请求。