前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Service 的应用

Service 的应用

作者头像
星哥玩云
发布2022-09-15 21:49:13
2230
发布2022-09-15 21:49:13
举报
文章被收录于专栏:开源部署开源部署

ClusterIP

​clusterIP 主要在每个 node 节点使用 ipvs,将发向 clusterIP 对应端口的数据,转发到 kube-proxy 中。然后 kube-proxy 自己内部实现有负载均衡的方法,并可以查询到这个 service 下对应 pod 的地址和端口,进而把数据转发给对应的 pod 的地址和端口。

74.png
74.png

为了实现图上的功能,主要需要以下几个组件的协同工作:

  • apiserver 用户通过kubectl命令向apiserver发送创建service的命令,apiserver接收到请求后将数据存储到etcd中。
  • kube-proxy kubernetes的每个节点中都有一个叫做kube-porxy的进程,这个进程负责感知service,pod的变化,并将变化的信息写入本地的iptables规则中。
  • ipvs 使用NAT等技术将virtualIP的流量转至endpoint中

示例:

代码语言:javascript
复制
vim nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      app: web-nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: web-nginx
    spec:
      containers:
        - name: web-nginx
          image: docker.io/nginx
          imagePullPolicy: IfNotPresent
          ports:
          - containerPort: 80
          
#-----------------------------# 分割线 #--------------------------------------#
          
vim nginx-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  type: ClusterIP
  selector:
    app: web-nginx
  ports:
  - name: http
    port: 80
    targetPort: 80

​我们先运行我们的资源清单,然后查看下是否可以正常访问:

75.png
75.png

​为了方便分别当前是哪个 Pod 给我们提供的服务,我们依次将三个 Pod 内 index.html 的文件内容修改为 “1”、“2”、“3”,然后从新看一下:

76.png
76.png

​我们在来看一下我们的 Pod 的 IP 地址 与 ipvs 的转发关系:

77.png
77.png
78.png
78.png

Headless Service

​有时不需要或不想要负载均衡,以及单独的 Service IP 。遇到这种情况,可以通过指定 Cluster IP(spec.clusterIP) 的值为 “None” 来创建 Headless Service 。这类 Service 并不会分配 Cluster IP, kube-proxy 不会处理它们,而且平台也不会为它们进行负载均衡和路由

代码语言:javascript
复制
vim headless.yaml

apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  selector:
    app: web-nginx
  clusterIP: "None"
  ports:
  - name: http
    port: 80
    targetPort: 80

dig -t A myapp.default.svc.cluster.local. @10.244.0.3
79.png
79.png

​通过 dig 命令,我们可以看到,即使没有 SVC 的 IP 我们也可以通过域名的方式访问到我们的 Pod

80.png
80.png

NodePort

​nodePort 的原理在于在 node 上开了一个端口,将向该端口的流量导入到 kube-proxy,然后由 kube-proxy 进一步到给对应的 pod

代码语言:javascript
复制
vim nodeport.yaml

apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  type: NodePort
  selector:
    app: web-nginx
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 31000		# 可以通过宿主机的的31000端口访问nginx服务
    									# 有效端口范围为30000-32767

我们来查看一下相关的信息:

81.png
81.png

验证一下:

82.png
82.png
83.png
83.png
84.png
84.png

LoadBalancer

​loadBalancer 和 nodePort 其实是同一种方式。区别在于 loadBalancer 比 nodePort 多了一步,就是可以调用cloud provider 去创建 LB 来向节点导流

ExternalName

​这种类型的 Service 通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容( 例如:www.zutuanxue.com )。ExternalName Service 是 Service 的特例,它没有 selector,也没有定义任何的端口和Endpoint。相反的,对于运行在集群外部的服务,它通过返回该外部服务的别名这种方式来提供服务。

代码语言:javascript
复制
vim external.yaml

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  type: ExternalName
  externalName: www.zutuanxue.com

我们来查看一下:

85.png
85.png
86.png
86.png

​当查询主机 my-service.defalut.svc.cluster.local ( SVC_NAME.NAMESPACE.svc.cluster.local )时,集群的DNS 服务将返回一个值 my.database.example.com 的 CNAME 记录。访问这个服务的工作方式和其他的相同,唯一不同的是重定向发生在 DNS 层,而且不会进行代理或转发。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档