通过之前学习的部分,我们已经通过 Deployment 来创建一组 Pod 来提供具有高可用性的服务。虽然每一个 pod 都会分配一个单独的 Pod IP,但是存在以下问题:
这种情况下,就有 Service 提供了负载均衡的能力,不过在使用上存在以下限制:
仅提供了4层负载均衡的能力,没有7层功能。有时我们可能需要更多的匹配规则来转发请求,此时4层将无法满足。
因此,k8s中的 Service 对象,就是解决以上问题的,实现服务发现的核心关键。
Service 在k8s中有三种类型:
Service 只是一个概念,真正起作用的其实是 kube-proxy 进程。
该规则效率较低,当前已经不再使用。
在该模式下,kube-proxy 为 service 后端的每个 pod 创建对应的 iptables 规则,直接将发向 cluster ip 的请求重定向到一个 pod ip。kube-proxy 不承担四层负载均衡的角色,只负责创建 iptables 规则。该模式的优点相较 userspace 模式效率更高,但不能提供灵活的负载均衡策略,当后端 Pod 不可用时,也无法进行重试。
在该模式下,kube-proxy 监视 k8s service 和 endpoint,然后调用 netlink 接口创建IPVS规则,并定期与 k8s service 和 endpoint 同步IPVS规则。该控制回路确保IPVS状态与期望的状态保持一致。
如果要在外部访问到该服务,需要在 .spec.type
字段配置为 NodePort,同时在 kind 字段设置为 Service 类型。
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 80
kubectl apply -f nginx-service.yaml
service 被创建完成。
kubectl get svc
service 的TYPE为 NodePort,且在PORT列可以查看到有通过外部访问的端口号。
使用上边k8s给service分配的随机端口 30192,加上master节点的IP地址,组成url在浏览器中输入后,查看结果。
kubectl delete -f <service配置文件名>
通过配置文件删除资源时,如果当前目录下没有配置文件,需要指定该资源的配置文件绝对或相对目录。
kubectl delete svc/<service服务名>
根据名称删除service,如果不知道具体的名称,可以先使用 kubectl get svc
获取要删除的service名称。service 删除后对 pod 没有任何影响。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。