码迷,mamicode.com
首页 > 其他好文 > 详细

K8s -- Service

时间:2020-05-15 11:51:41      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:network   ges   服务发现   status   接口   range   keep   自动   ready   

我们已经能够通过ReplicaSet来创建一组Pod来提供具有高可用性的服务。虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题:
Pod IP仅仅是集群内可见的虚拟IP,外部无法访问。

[root@localhost ~]# kubectl get svc -n default -o wide
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE   SELECTOR
hellogo-svc     NodePort    10.68.239.65   <none>        80:30000/TCP   55d   name=hellogo-app
kubernetes      ClusterIP   10.68.0.1      <none>        443/TCP        57d   <none>
nginx-service   ClusterIP   10.68.1.174    <none>        80/TCP         20m   app=nginx
[root@localhost ~]# kubectl get pod -o wide
NAME                             READY   STATUS    RESTARTS   AGE   IP            NODE              NOMINATED NODE   READINESS GATES
hellogo-deploy-d67749668-2vpbf   1/1     Running   0          55d   172.20.3.15   192.168.145.185   <none>           <none>
hellogo-deploy-d67749668-v4ztw   1/1     Running   0          55d   172.20.4.10   192.168.145.182   <none>           <none>
nginx-deploy-f876fbb4d-4d5cg     1/1     Running   0          24m   172.20.5.3    192.168.145.150   <none>           <none>
[root@localhost ~]# curl -I  http://172.20.5.3
HTTP/1.1 200 OK
Server: nginx/1.17.10
Date: Fri, 15 May 2020 03:01:14 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 14 Apr 2020 14:19:26 GMT
Connection: keep-alive
ETag: "5e95c66e-264"
Accept-Ranges: bytes

[root@localhost ~]# curl -I http://10.68.1.174
HTTP/1.1 200 OK
Server: nginx/1.17.10
Date: Fri, 15 May 2020 03:04:03 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 14 Apr 2020 14:19:26 GMT
Connection: keep-alive
ETag: "5e95c66e-264"
Accept-Ranges: bytes
Pod IP会随着Pod的销毁而消失,当ReplicaSet对Pod进行动态伸缩时,Pod IP可能随时随地都会变化,这样对于我们访问这个服务带来了难度。

因此,Kubernetes中的Service对象就是解决以上问题的实现服务发现核心关键。

  1. Service的创建

Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。

Service同其他Kubernetes对象一样,也是通过yaml或json文件进行定义。此外,它和其他Controller对象一样,通过Label Selector来确定一个Service将要使用哪些Pod。一个简单的Service定义如下:

apiVersion: v1
kind: Service
metadata:
  labels:
    run: nginx
  name: nginx-service
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 81
  selector:
    app: nginx
  type: ClusterIP

下面简单分析一下上面的Service描述文件:

通过spec.selector字段确定这个Service将要使用哪些Label。在本例中,这个名为nginx的Service,将会管理所有具有app: nginxLabel的Pod。
spec.ports.port: 80表明此Service将会监听80端口,并将所有监听到的请求转发给其管理的Pod。spec.ports.targetPort: 81表明此Service监听到的80端口的请求都会被转发给其管理的Pod的81端口,此字段可以省略,省略后其值会被设置为spec.ports.port的值。
type: ClusterIP表面此Service的type,会在下文中讲到。
  1. Service的类型

在Serive定义时,我们需要指定spec.type字段,这个字段拥有四个选项:

ClusterIP。默认值。给这个Service分配一个Cluster IP,它是Kubernetes系统自动分配的虚拟IP,因此只能在集群内部访问。
NodePort。将Service通过指定的Node上的端口暴露给外部。通过此方法,访问任意一个NodeIP:nodePort都将路由到ClusterIP,从而成功获得该服务。
LoadBalancer。在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到 <NodeIP>:NodePort。此模式只能在云服务器(AWS等)上使用。
ExternalName。将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定)。需要 kube-dns 版本在 1.7 以上。

2.1 NodePort类型

在定义Service时指定spec.type=NodePort,并指定spec.ports.nodePort的值,Kubernetes就会在集群中的每一个Node上打开你定义的这个端口,这样,就能够从外部通过任意一个NodeIP:nodePort访问到这个Service了。
下面是一个简单的例子:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    run: nginx
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    nodePort: 30001
  type: NodePort

假如有3个app: nginx Pod运行在3个不同的Node中,那么此时客户端访问任意一个Node的30001端口都能访问到这个nginx服务。
2.2 LoadBalancer类型

如果云服务商支持外接负载均衡器,则可以通过spec.type=LoadBalancer来定义Service,一个简单的例子如下:

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376
  clusterIP: 10.0.171.239
  loadBalancerIP: 78.11.24.19
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 146.148.47.155

参考文章

https://kubernetes.io/docs/concepts/services-networking/service/
https://kubernetes.feisky.xyz/zh/concepts/service.html

K8s -- Service

标签:network   ges   服务发现   status   接口   range   keep   自动   ready   

原文地址:https://www.cnblogs.com/riseast/p/12893724.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!