介绍
- 为什么需要服务:
- pod是短暂的
- k8s会在pod启动前给已经调度到节点上的pod分配IP地址,因此客户端不能提前知道pod的ip
- 水平伸缩意味着多个pod可能提供相同的服务
k8s服务是一种为一组功能相同的pod提供单一不变的接入点的资源,服务存在则IP地址与端口不变。
创建服务可以使用kubectl expose
也可以直接用YAML文件
可以指定port为服务的可用端口,指定targetPort为将连接转发到的容器端口。
- 如何从内部集群来测试服务
- 创建一个pod,它将请求发送到服务的集群IP上并记录响应,然后可以查看pod日志
- 使用ssh登录到其中一个节点上,然后用curl命令
- 通过
kubectl exec
在一个已经存在的pod中执行curl命令- kubectl exec xxx – curl -s http://xxx.xxx.xxx (前者为pod名,后者为同集群中需要访问的pod的地址)
如果希望服务代理将同一个clientIP的请求转发到一个pod上,可以设置服务的sessionAffinity属性为ClientIP(因为服务是处理TCP和UDP包,所以可以解释为什么会话亲和性不会针对cookie,因为cookie属于HTTP协议中)
可以在pod的定义中给port命名(containerPort),这样在服务中的targetPort可以按照名称引用
如果要让客户端知道服务的IP和端口号,可以使用环境变量。
连接集群外部的服务
服务不是直接与pod向量的,Endpoint资源介于两者之间。
Endpoint资源就是暴露一个服务的IP地址和端口的列表,可以使用kubectl info endpoints xxx
来获取一个其基本信息
尽管spec服务中定义了pod选择器,但是重定向传入连接时并不会用到,而是选择器用于构建IP与端口列表,然后存储在Endpoint资源中,客户端连接到服务时,服务代理选择这些IP和端口对中的一个并将传入连接重定向到在该位置监听的服务器。