前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >K8S 之 Headless 浅谈

K8S 之 Headless 浅谈

作者头像
YP小站
发布2020-06-04 15:30:04
15.5K0
发布2020-06-04 15:30:04
举报
文章被收录于专栏:YP小站YP小站

Headless Services 简介

有时不需要或不想要负载均衡,以及单独的 Service IP。遇到这种情况,可以通过指定 Cluster IP(spec.clusterIP)的值为 "None" 来创建 Headless Service。

您可以使用 headless Service 与其他服务发现机制进行接口,而不必与 Kubernetes 的实现捆绑在一起。

对 headless Service 并不会分配 Cluster IP,kube-proxy 不会处理它们,而且平台也不会为它们进行负载均衡和路由。DNS 如何实现自动配置,依赖于 Service 是否定义了 selector。

Lable Secector:

  • 配置 Selector:对定义了 selector 的 Headless Service,Endpoint 控制器在 API 中创建了 Endpoints 记录,并且修改 DNS 配置返回 A 记录(地址),通过这个地址直接到达 Service 的后端 Pod上。见下图:
  • 不配置 Selector:对没有定义 selector 的 Headless Service,Endpoint 控制器不会创建 Endpoints 记录。

Service(iptables 代理模式)简介

这种模式,kube-proxy 会监视 Kubernetes 控制节点对 Service 对象和 Endpoints 对象的添加和移除。对每个 Service,它会安装 iptables 规则,从而捕获到达该 ServiceclusterIP 和端口的请求,进而将请求重定向到 Service 任意一组 backend pod 中。对于每个 Endpoints 对象,它也会安装 iptables规则,这个规则会选择一个 backend pod 组合。

默认的策略是,kube-proxy 在 iptables 模式下随机选择一个 backend pod

下面是一个简图:

Headless Services 创建

代码语言:javascript
复制
$ vim headless_service.yaml
$ kubectl apply -f headless_service.yaml

headless_service.yaml 配置如下

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: nginx-test
  labels:
    app: nginx_test
spec:
  ports:
  - port: 80
    name: nginx-web
  # clusterIP 设置为 None
  clusterIP: None
  selector:
    app: nginx_test

---

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: nginx-web
spec:
  serviceName: "nginx-test"
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx_test
    spec:
      containers:
      - name: nginx-test
        image: nginx:1.11
        ports:
        - containerPort: 80
          name: nginx-web

Headless Services 验证

代码语言:javascript
复制
# 查看 statefulsets nginx-web
$ kubectl get statefulsets nginx-web

NAME        READY   AGE
nginx-web   2/2     93m

# 查看 pods 
$ kubectl get pods -o wide | grep nginx-web

nginx-web-0                         1/1     Running   0          96m    192.168.40.103   it-zabbix   <none>           <none>
nginx-web-1                         1/1     Running   0          96m    192.168.40.96    it-zabbix   <none>           <none>


# 显示 nginx-test Headless Services 详细信息
$ kubectl describe svc nginx-test

Name:              nginx-test
Namespace:         default
Labels:            app=nginx_test
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"nginx_test"},"name":"nginx-test","namespace":"default"},...
Selector:          app=nginx_test
Type:              ClusterIP
IP:                None
Port:              nginx-web  80/TCP
TargetPort:        80/TCP
Endpoints:         192.168.40.103:80,192.168.40.96:80
Session Affinity:  None
Events:            <none>

# 测试 service 域名是否解析出两个 pod ip
$ nslookup nginx-test.default.svc.cluster.local 192.168.16.2

Server:		192.168.16.2
Address:	192.168.16.2#53

Name:	nginx-test.default.svc.cluster.local
Address: 192.168.40.103
Name:	nginx-test.default.svc.cluster.local
Address: 192.168.40.96

# 测试 pod 域名是否解析出对应的 pod ip
$ nslookup nginx-web-0.nginx-test.default.svc.cluster.local 192.168.16.2

Server:		192.168.16.2
Address:	192.168.16.2#53

Name:	nginx-web-0.nginx-test.default.svc.cluster.local
Address: 192.168.40.103

$ nslookup nginx-web-1.nginx-test.default.svc.cluster.local 192.168.16.2

Server:		192.168.16.2
Address:	192.168.16.2#53

Name:	nginx-web-1.nginx-test.default.svc.cluster.local
Address: 192.168.40.96

Headless Services 应用场景

  • 第一种:自主选择权,有时候 client 想自己来决定使用哪个Real Server,可以通过查询DNS来获取 Real Server 的信息。
  • 第二种:Headless Service 的对应的每一个 Endpoints,即每一个Pod,都会有对应的DNS域名,这样Pod之间就可以互相访问

参考链接

  • https://kubernetes.io/zh/docs/concepts/services-networking/service/#headless-services
  • https://zhuanlan.zhihu.com/p/54153164

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 YP小站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Headless Services 简介
  • Service(iptables 代理模式)简介
  • Headless Services 创建
  • Headless Services 验证
  • Headless Services 应用场景
  • 参考链接
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档