Services
定义
Kubemetes 服务是一种为一组功能相同的pod 提供单一不变的接入点资源。默认情况下,您会获得稳定的集群IP地址,集群内部的客户端可以使用该IP地址与Service中的Pod通信。客户端向稳定IP地址发送请求,然后请求会被路由到Service的其中一个Pod。
Service通过选择器selector来识别器成员Pod。为使得Pod成为Service的成员,该Pod必须具有选择器中指定的所有标签label。如下资源清单yaml文件例子。需具备标签1和标签2的Pod才是该Service的成员。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
#选择器对象
selector:
app:metrics#标签1
department:engineering#标签2
#ports对象
ports:
name:
port:#指定端口,该端口值可以任意
targetPort:#转发到的Pod端口,该端口值不是任意的
nodePort:
protocol
使用Service的目的
- 背景:每个Pod具有IP地址,当使用Deployment控制器时,Pod的IP地址往往动态变化。
- 解决方法:通过Service可以获得稳定的IP地址,且在Service的生命周期有效,与Pod的IP地址变化与否无关。
5种Service类型
类型 | 解释 | yaml文件注意字段 |
---|---|---|
clusterIP(default) | 内部客户端向稳定的内部IP地址发送请求 | type:ClusterIP; |
NodePort | 客户端向使用Service指定的一个或多个nodePort值的节点的IP地址发送请求 | type:NodePort |
LoadBalancer | 客服端向网络负载均衡的IP地址发送请求 | type:LoadBalancer |
ExternalName | 内部客户端使用Service的DNS名称作为外部DNS名称的别名 | type:ExternalName |
Headless | 如果你需要对Pod分组,但是不需要稳定的IP地址,就可以使用Headless服务 | type:Headless |
Endpoints对象
创建Service时,kubernetes会创建一个与Service同名的EndPoints对象。kubernetes使用Endpoints对象来跟踪哪些Pod属于Service的成员。
创建服务
通过命令kubectl expose 服务名字;另外也可以通过编写yaml文件来弄。
检测新的服务
从内部集群测试服务
- 显而易见的方法是创建一个pod ,它将请求发送到服务的集群IP 并记录响应。可以通过查看pod 日志检查服务的响应。
- 使用ssh 远程登录到其中一个Kubemetes 节点上,然后使用curl 命令。
- 可以通过kubectl exec 命令在一个己经存在的pod 中执行curl 命令。
在运行的容器中远程执行命令
配置服务上的会话亲和性需要在yaml文件中增加sessionAffinity 属性
同一个服务暴露多个端口
连接集群外部的服务
后端是集群中运行的一个或多个pod 的服务。服务并不是和pod 直接相连的。相反,有一种资源介于两者之间一一它就是Endpoint 资源。
[apps@NM-ITC-RH5885V3-BSS-032 tyj]$ kubectl describe svc kubia
Name: kubia
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=kubia
Type: ClusterIP
IP: 10.0.0.180
Port: <unset> 80/TCP
TargetPort: 8080/TCP
Endpoints: 172.10.0.103:8080,172.10.0.127:8080,172.10.0.128:8080 + 3 more...
Session Affinity: None
Events: <none>
Endpoint 资源就是暴露一个服务的IP 地址和端口的列表, Endpoint 资源和其他Kubernetes 资源一样,所以可以使用kubectl info 来获取它的基本信息。
[apps@NM-ITC-RH5885V3-BSS-032 tyj]$ kubectl get endpoints kubia
NAME ENDPOINTS AGE
kubia 172.10.0.103:8080,172.10.0.127:8080,172.10.0.128:8080 + 3 more... 130m
手动配置服务的endpoint
创建没有选择器的服务。通过yaml文件启动。
为没有选择器的服务创建Endpoint 资源
列出服务
[apps@NM-ITC-RH5885V3-BSS-032 ~]$ kubectl get services#或者输入kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
fan-app NodePort 10.0.0.166 <none> 8222:25913/TCP 16h
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 15d
kubia ClusterIP 10.0.0.129 <none> 10009/TCP 3d14h
kubia-headless ClusterIP None <none> 80/TCP 16h
kubia-http LoadBalancer 10.0.0.10 <pending> 10010:30466/TCP 3d14h
kubia-nodeport NodePort 10.0.0.173 <none> 80:30123/TCP 46h