K8s service (二)
Endpoint
Endpoint是kubernetes中的一个资源对象,存储在etcd中,用来记录一个service对应的所有pod访问地址,它是根据service匹配文件中selector描述产生的。
一个Service由一组Pod组成,这些Pod通过Endpoints暴露出来,Endpoints是实现是服务的端点集合。换句话说,service和pod之间的联系是通过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
# 查看service详情
[root@master ~]# kubectl describe svc service-headliness -n dev -o -wide
Name: service-headliness
Namespace: dev
Labels:
Annotations:
Selector: app=nginx-pod
Type: ClusterIP
IP: None
Port:
TargetPort: 80/TCP
Endpoints: 10.244.1.39:80,10.244.1.40:80,10.244.2.33:80
Session Affinity: None
Events:
# 查看域名的解析情况
[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