K8s  service (二)

Endpoint

Endpointkubernetes中的一个资源对象,存储在etcd中,用来记录一个service对应的所有pod访问地址,它是根据service匹配文件中selector描述产生的。

一个Service由一组Pod组成,这些Pod通过Endpoints暴露出来,Endpoints是实现是服务的端点集合。换句话说,servicepod之间的联系是通过endpoints实现的。

[root@master ~]# kubectl get endpoints -n dev -o wide

NAME                          ENDPOINTS                                                                  AGE

service-clusterip   10.244.1.39:80,10.244.1.40:80,10.244.2.33:80               50m

HeadLiness类型的Service (几乎不会用于生产)

在某些场景中,开发人员可能不想使用Service提供的负载均衡功能,而希望自己来控制负载均衡策略,针对这个中情况,kubernetes提供了HeadLiness Service,这类Service不会分配ClusterIP,如果想要访问service,只能通过service的域名进行查询。

创建service-headliness.yaml

apiVersion: v1

kind: Service

metadata:

  name: service-headliness 

  namespace: dev

spec:

  selector:

    app: nginx-pod

  clusterIP: None                       #将clusterIP设置为None,即可创建headliness Service

  type: ClusterIP 

  ports: 

  - port: 80

targetPort: 80

# 创建service[root@master ~]# kubectl create -f service-headliness.yaml

service/service-headliness created

# 获取service,发现CLUSTER-IP未分配

[root@master ~]# kubectl get svc service-headliness -n dev -o wide

NAME                          TYPE             CLUSTER-IP   EXTERNAL-IP        PORT(S)       AGE        SELECTOR

service-headliness ClusterIP None             <none>                80/TCP   11s         app=nginx-pod

# 查看service详情

[root@master ~]# kubectl describe svc service-headliness -n dev -o -wide

Name:                                       service-headliness

Namespace:                              dev

Labels:                                       <none>

Annotations:                       <none>

Selector:                             app=nginx-pod

Type:                                         ClusterIP

IP:                                             None

Port:                                          <unset> 80/TCP

TargetPort:                                80/TCP

Endpoints:                                 10.244.1.39:80,10.244.1.40:80,10.244.2.33:80

Session Affinity:                  None

Events:                                      <none>

# 查看域名的解析情况

[root@master ~]# kubectl exec -it pc-deployment-66cb59b984-8p84h -n dev /bin/sh/

# cat /etc/resolv.confnameserver

10.96.0.10

search dev.svc.cluster.local svc.cluster.local cluster.local

# 如果本机没有dig,需要安装dig工具

[root@master ~]#  yum -y install bind-utils

[root@master ~]# dig @10.96.0.10 service-headlilness.dev.svc.cluster.local

service-headliness.dev.svc.cluster.local. 30 IN A 10.244.1.40

service-headliness.dev.svc.cluster.local. 30 IN A 10.244.1.39

service-headliness.dev.svc.cluster.local. 30 IN A 10.244.2.33

Nodeport 类型的service

在之前的样例中,创建的Service的ip地址只有集群内部才可以访问,如果希望将Service暴露给集群外部使用,那么就要使用到另外一种类型Service,称为NodePort类型。NodePort的工作原理其实就是将service的端口映射到Node的一个端口上,然后就可以通过NodeIp:NodePort来访问service了。

创建service-nodeport.yaml

apiVersion: v1

kind: Service

metadata:

  name: service-nodeport 

  namespace: dev

spec:

  selector:

    app: nginx-pod 

  type: NodePort         # Service类型 

  ports: 

  - port: 80   

    nodePort: 30002          # 指定绑定的node的端口(默认取值范围是:30000-32767),#如果不指定,会默认分配   

    targetPort: 80

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐