云原生之Kubernetes:10、Service代理

Service资源是Kubernetes中最核心的资源对象之一,其定义了一个统一访问的服务入口地址,客户端可以通过这个入口地址访问其背后的一组由Pod副本组成的集群实例。 Service与其后端Pod副本集群之间则是通过Label Selector标签选择器来实现动态注册和调度的。

1、为什么需要Service资源?

在这里插入图片描述

通过分析、识别并建模系统中所有服务为微服务—Kubernetes Service,最终我们的系统由多个提供不同业务能力而又彼此独立的微服务单元组成,服务之间通过TCP/IP进行通信,从而拥有了强大的分布式能力、弹性扩展能力、容错能力

既然每个Pod都会被分配一个单独的IP地址,而且每个Pod都提供了一个独立的Endpoint(Pod IP+ContainerPort)以被客户端访问,现在多个Pod副本组成了一个集群来提供访问。

Kubernetes 需要在每个Node上安装kube-proxy,kube-proxy进程其实就是一个智能的软件负载均衡器,它负责把对Service的请求转发到后端的某个Pod实例上,并在内部实现服务的负载均衡与会话保持机制。

Kubernetes发明了一个很巧明的设计,Service不是共用一个负载均衡器的IP地址,而是每个Service分配了一个全局唯一的虚拟IP地址,这个虚拟IP被称为Cluster IP。这样每个服务就变成了具备唯一IP地址的"通信节点",服务调用就变成了最基础的TCP网络通信问题

Pod的Endpoint地址会随着Pod的销毁和重新创建而发生改变,因为新的Pod地址与之前的旧的Pod不同。而Service一旦被创建,Kubernetes就会自动为它分配一个可用的Cluster IP,而且在Service的整个声明周期内,它的Cluster IP不会发生改变。所以只要将Service的name与Service的Cluster IP地址做一个DNS域名映射即可解决问题

2、Service资源如何管理Pod

1.service通过标签选择器关联至拥有相关标签的Pod对象
2.客户端向Service进行请求,而非直接请求Pod对象
3.Service默认类型为ClusterIP,还有ExternalName,NodePort,LoadBalancer和Headless,共5种类型

service配置字段的查看命令:

kubectl explain svc

1、ClusterIP

在这里插入图片描述

客户端Pod对象访问服务端Pod对象时不会进行源地址转换:

二者在同一主机时,源地址为客户端pod地址;
二者不在同一主机时,源地址为客户端pod所在节点的flannel或cni地址。
只能在集群内部被访问

2、NodePort

在这里插入图片描述

可以被集群外部访问到,节点的请求会DNAT到Serviceip,然后再调度至PodIP

3、LoadBalancer

需要结合公有云的LBAAS(需要付费),支持动态接入功能。

4、ExternalName

在这里插入图片描述

将集群外部Service引入集群内部供各客户端使用,需要设置标签选择器,并手动定义一个endpoint资源,指向外部的资源地址。

5、Headless

这是一个比较特殊的service类型,有时候,你没必要或者不需要负载均衡和一个对外提供服务的ip地址。
在这种情况下,你可以在.spec.clusterIp中定义None字段,来申明一个Headless Service。
他可以通过coredns组件内部的解析功能,以完成相关地址解析的支持作用。

此外,我们之后会讲到StatefulSet控制器,它就是基于Headless网络所构筑的。

3、Endpoints

endpoints为service中的网络端点,用于接收service发来的请求,并将其转发至相关的上游服务(deployment)。

1、命令补充

#API配置查看
kubectl explain endpoints
#endpoints信息查看
kubectl get endpoints -A

2、注意:自定义endpoints时,需要与service同名

[root@centos-1 dingqishi]#  kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   4d23h
ngx-new      ClusterIP   10.96.232.218   <none>        80/TCP    2d5h

[root@centos-1 dingqishi]# kubectl get endpoints
NAME         ENDPOINTS                     AGE
kubernetes   192.168.0.104:6443            4d23h
ngx-new      10.244.2.8:80,10.244.2.9:80   2d5h

4、创建Service

1、编写Service的Yaml

[root@centos-1 dingqishi]# cat > Lq-server.yaml <<EOF 
kind: Service
apiVersion: v1
metadata:
  name: Lq-server
  namespace: Lq-server
spec:
  selector:
    app: Lq-server
  type: NodePort
  ports:
    - protocol: TCP      #仅支持TCP和UDP,不写默认TCP
      port: 3017
      targetPort: 5003
      nodePort: 31122
EOF
参数 解释
Port port表示:service暴露在cluster ip(Seriver ip )上的端口,:port 是提供给集群内部客户访问service的入口。
NodePort nodePort是kubernetes提供给集群外部客户访问service入口的一种方式(另一种方式是LoadBalancer,:nodePort 是提供给集群外部客户访问service的入口。
targetPort targetPort很好理解,targetPort是pod上的端口,从port和nodePort上到来的数据最终经过kube-proxy流入到后端pod的targetPort上进入容器。

2、创建

[root@centos-1 dingqishi]# kubectl create -f Lq-server.yaml
service/Lq-server created

3、查看server详细信息

[root@centos-1 dingqishi]# kubectl get service --namespace=Lq-server
NAME             TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
Lq-server        NodePort   10.254.22.153   <none>        3017:31122/TCP   13m

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340