kubernetes service详解

avatar
作者
猴君
阅读量:0

一、service的类型

  1. clusterip:集群内部访问
  2. externalname:调用外部API时使用,域名解析,让应用不用关心实际的IP地址
  3. nodeport:集群外部访问,暴漏节点上的端口,转发到pod内
  4. loadbalancer:nodeport + 负载均衡,解决nodeport是单点访问的问题
  5. 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地址。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!