一、service的类型
- clusterip:集群内部访问
- externalname:调用外部API时使用,域名解析,让应用不用关心实际的IP地址
- nodeport:集群外部访问,暴漏节点上的端口,转发到pod内
- loadbalancer:nodeport + 负载均衡,解决nodeport是单点访问的问题
- headless:无头服务,通过svc的名字访问,域名访问
二、clusterip yaml解析
集群内部访问。如果创建pod后只是对pod ip进行访问,会存在单点故障,当pod重新拉起或者多个副本时,副本就没有任何意义了。clusterip是可以对deployment内所有的pod进行负载。生产环境内部访问建议使用此类型的SVC
使用kubectl get ep,可以查看到后端挂载的pod
apiVersion: v1
kind: Service
metadata:
name: nginx-clusterip
namespace: mtactor
spec:
type: ClusterIP
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 8080
targetPort: 80
1、第1~5行
-(apiVersion: v1)kubernetes中apisver的版本,详情请参考(kubernetes 关于apiVersion版本的报错-CSDN博客)
-(kind: Service)表示需要创建一个Service
-(metadata:)元数据的定义
-(name: nginx-clusterip)Service的名字
-(namespace: mtactor)Service属于哪个namespace
2、第6~9行
-(spec:)service的配置信息
-(type: ClusterIP)service的类型,其他的请参考上面
-(selector:)定义后端的pod有哪些
-(app: nginx)只要是有这个标签的pod,都要纳管到service的后端
3、第10~14行
-(ports:)定义使用的端口
-(- name: http)应用层的端口协议
-(protocol: TCP)传输层的端口协议
-(port: 8080)service监听的端口
-(targetPort: 80)后端pod监听的端口
三、externalname yaml解析
调用外部API时使用,域名转发,让应用不用关心实际的IP地址。比如我想要调用www.aliyun.com。但是aliyun的域名可能会变,直接改代码太麻烦。如果使用了externalname的话,只需要修改后端的指向域名。生产环境访问外部API建议使用此类型的SVC
访问方式:SERVICE_NAME.NAMESPACE_NAME.svc.cluster.local
我遇到一个问题,配置好externalname后,访问上述链接应该相当于访问hnsharing.com,下面的截图能访问到,说明配置成功了,但是这个404我不理解。还有访问https的时候,也没法验证证书。还有访问主页获取到的也是403。有遇到过的朋友,麻烦留言指点一下
apiVersion: v1
kind: Service
metadata:
name: nginx-externalname
namespace: mtactor
spec:
type: ExternalName
externalName: hnsharing.com
externalName配置的就是后端的实际域名或者IP
四、nodeport yaml解析
用于集群外部访问,暴漏节点上的端口,转发到pod内。具体是暴漏哪个节点呢?默认情况下所有的集群节点都可以,包括master和node节点。但是不管访问哪个节点,都存在单点故障问题。在生产环境下不介意使用
apiVersion: v1
kind: Service
metadata:
name: nginx-nodeport
namespace: mtactor
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30007
type: NodePort
-(ports:)定义使用的端口
-(protocol: TCP)传输层的端口协议
-(port: 80)service监听的端口
-(targetPort: 80)后端pod监听的端口
-(nodePort: 30007)节点上暴漏的端口
五、loadbalancer yaml解析
用于集群外部访问,nodeport + 负载均衡的方式。在nodeport中存在单点故障的问题。loadbalancer就是为了解决单点故障的问题。在前端加上负载均衡,再转发到nodeport上面,生产环境中介意使用此类型的SVC
一般在机房或者云上使用ECS自建Kubernetes集群是无法使用 LoadBalancer 类型的 Service 。因为 Kubernetes 本身没有为裸机群集提供网络负载均衡器的实现。
使用云平台的时候,创建服务后,Kubernetes将自动创建一个云提供商的负载均衡器,并且为这个服务分配一个外网IP地址。