服务:让客户端发现pod并与之通信

2021-11-29
2 min read

介绍

  • 为什么需要服务:
    • 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和端口对中的一个并将传入连接重定向到在该位置监听的服务器。