[kubernetes] Endpoint 和 Service介绍与应用
0x01 介绍
每个Pod都有独有的IP地址,而每次Pod重建后IP地址都会发生变化,那我们如何长期对一个Pod进行访问呢?答案就是Service,Servcie可以理解为一组Pod的四层代理,Service作为kubernets一种标准的资源,它可以通过节点的kube-proxy从apiserver中获取每个Pod的地址,从而实现代理功能。由下图可见,每一个Service资源都有一个endpoints,endpoints主要记录了每个pod的IP地址信息,当Pod的IP发生变化时,endpoints会进行更新。
Service常见的代理模式有两种,一种是IPVS,一种是iptables;还有比较新的cni:ebpf、nftables。本篇使用的是IPVS,启用IPVS可以通过以下方式进行设置:
1、使用kubeadm安装的集群配置
# kubectl edit configmap kube-proxy -n kube-system ... mode: “ipvs“ ...、 # kubectl delete pod kube-proxy-btz4p -n kube-system 注:1、kube-proxy配置文件以configmap方式存储 2、如果让所有节点生效,需要重建所有节点kube-proxy pod
2、二进制安装的集群配置
# vi kube-proxy-config.ymlmode: ipvsipvs:scheduler: "rr“# systemctl restart kube-proxy注:参考不同资料,文件名可能不同。
值得注意的是:当 kube-proxy 以 IPVS 代理模式启动时,它将验证 IPVS 内核模块是否可用。如果未检测到 IPVS 内核模块,则 kube-proxy 将退回到以 iptables 代理模式运行。
0x02 Service快速入门
定义一个deployment资源
[root@aliyun168-37 nginx]# cat dp.yaml apiVersion: apps/v1kind: Deploymentmetadata: name: nginx labels: app: nginx namespace: testspec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx name: nginx ports: - containerPort: 80
定义一个service资源
[root@aliyun168-37 nginx]# cat svc.yaml apiVersion: v1kind: Servicemetadata: name: nginx-svc namespace: testspec: selector: app: nginx # 选择的pod ports: - port: 8080 # service端口 targetPort: 80 # container端口 protocol: TCP # 协议类型
应用:
kubectl apply -f dp.yamlkubectl apply -f svc.yaml
至此一个Service资源就创建好了,Service的endpoint为labels app:nginx的pod.
查看Pod
[root@aliyun168-37 nginx]# kubectl get pod -n test -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-7848d4b86f-mdql8 1/1 Running 0 6m45s 10.244.4.140 wokayou <none> <none>nginx-7848d4b86f-t5zmt 1/1 Running 0 6m45s 10.244.4.139 wokayou <none> <none>nginx-7848d4b86f-zt7jj 1/1 Running 0 6m45s 10.244.4.141 wokayou <none> <none>
查看Service
[root@aliyun168-37 nginx]# kubectl describe svc/nginx-svc -n testName: nginx-svcNamespace: testLabels: <none>Annotations: Selector: app=nginxType: ClusterIPIP: 10.109.58.23Port: <unset> 8080/TCP # 代理后的端口TargetPort: 80/TCP # Container的端口Endpoints: 10.244.4.139:80,10.244.4.140:80,10.244.4.141:80Session Affinity: NoneEvents: <none>
查看Endpoints(创建Service后会自动创建一个同名的endpoints)
[root@aliyun168-37 nginx]# kubectl get endpoints nginx-svc -n testNAME ENDPOINTS AGEnginx-svc 10.244.4.139:80,10.244.4.140:80,10.244.4.141:80 18m
访问:
查看IPVS规则:
0x03 Service类型和应用
Service支持4种类型:
ClusterIP(默认模式)
NodePort:主机端口模式
Headless ClusterIP:无头模式
LoadBalancer:使用外部负载均衡
ExternalName:将外部服务引入集群内部
0x03.1 ClusterIP
不指定Service类型时,默认类型为ClusterIP,而这个ClusterIP的地址段在安装集群的时已经配置好了,ClusterIP一般只能在集群内访问,集群外是无法访问的。
配置位置:
cat kube-controller-manager.yaml ... - --service-cluster-ip-range=10.96.0.0/12...
ClusterIP类型使用:
[root@aliyun168-37 nginx]# cat svc.yaml apiVersion: v1kind: Servicemetadata: name: nginx-svc namespace: testspec: selector: app: nginx ports: - port: 8080 # service端口 targetPort: 80 # container Port protocol: TCP type: ClusterIP
也可以指定ClusterIP
...spec:... type: ClusterIP clusterIP: 10.100.100.100...
0x03.2 NodePort
NodePort类型的Service应用后,每个Node都会监听该端口。我们可以通过任意一个NodeIP:Port来访问。
创建一个NodePort类型的Service
...spec:... ports: - port: 80 protocol: TCP type: NodePort...
查看Service,可以看到已经将80端口映射为31321端口了
[root@aliyun168-37 nginx]# kubectl get svc -n testNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEnginx-svc NodePort 10.104.215.99 <none> 80:31321/TCP 3m23s
随便登录一台主机,查看端口监听情况
集群外访问测试:
NodePort类型的Service在不指定Port的情况下,将随机分配一个Port,而分配的访问默认为30000-32767,可以通过以下配置文件进行修改:
vim kube-apiserver.yaml
增加:- --service-node-port-range=1-65535
也可以指定NodePort
...spec:... ports: - port: 80 protocol: TCP nodePort: 1023 type: NodePort...
0x03.3 Headless ClusterIP无头服务
无头服务是一种特殊ClusterIP类型的Service,但是没有ClusterIP,只能通过域名进行访问,无头服务一般在StatfulSet中使用。
定义一个Headless ClusterIP资源
apiVersion: v1kind: Servicemetadata: name: nginx-svc namespace: testspec: selector: app: nginx ports: - port: 80 protocol: TCP clusterIP: "None" # 此处定义为Node,即为Headless
查看Service
[root@aliyun168-37 nginx]# kubectl get svc -n testNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEnginx-svc ClusterIP None <none> 80/TCP 48s
获取集群内DNS地址
解析地址,域名组成为servicename.namespace.svc.cluster.local:
[root@aliyun168-37 nginx]# nslookup nginx-svc.test.svc.cluster.local 10.96.0.10Server: 10.96.0.10Address: 10.96.0.10#53
Name: nginx-svc.test.svc.cluster.localAddress: 10.244.4.140Name: nginx-svc.test.svc.cluster.localAddress: 10.244.4.141Name: nginx-svc.test.svc.cluster.localAddress: 10.244.4.139
集群内访问:
0x03.4 ExternalName 将外部流量引入集群内部
ExternalName类型的Service通过CNAME和它的值,可以将服务映射到externalName字段的内容引入外部服务到内部流量,即使用DNS CNAME机制把自己CNAME到你指定的另外一个域名上。
定义一个externalName类型Service:
[root@aliyun168-37 nginx]# cat svc3.yaml apiVersion: v1kind: Servicemetadata: name: mysql namespace: testspec: type: ExternalName externalName: mysql.51yunwei.top
pod使用mysql进行访问
0x03.5 LoadBalancer使用外部负载均衡
LoadBalancer需要使用外部Balancer(负载均衡器)来实现,我的环境无法演示。
0x04 使用endpoint代理集群外部服务
通过上面的例子,我们知道service是依靠endpoint实现的,而这个endpoint也是一种kuberntes资源,支持自定义,这就意味着我们也可以使用service实现集群外部的资源代理访问。
定义endpoints:
apiVersion: v1kind: Endpointsmetadata: name: mysql-svc namespace: testsubsets: - addresses: - ip: 1.1.1.1 ports: - port: 3306
定义service(名字和endpoints一样就可以自动关联起来了):
apiVersion: v1kind: Servicemetadata: name: mysql-svc namespace: testspec: ports: - port: 3306 targetPort: 3306 protocol: TCP
查看:
[root@aliyun168-37 nginx]# kubectl describe svc mysql-svc -n test Name: mysql-svcNamespace: testLabels: <none>Annotations: Selector: <none>Type: ClusterIPIP: 10.103.36.61Port: <unset> 3306/TCPTargetPort: 3306/TCPEndpoints: 1.1.1.1:3306Session Affinity: NoneEvents: <none>[root@aliyun168-37 nginx]#
访问:
--结束。
[kubernetes] Endpoint 和 Service介绍与应用相关推荐
- 学习笔记之-Kubernetes(K8S)介绍,集群环境搭建,Pod详解,Pod控制器详解,Service详解,数据存储,安全认证,DashBoard
笔记来源于观看黑马程序员Kubernetes(K8S)教程 第一章 kubernetes介绍 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署 ...
- 容器编排技术 -- Kubernetes DNS Pod 与 Service 介绍
容器编排技术 -- Kubernetes DNS Pod 与 Service 介绍 1 介绍 2 怎样获取 DNS 名字? 3 支持的 DNS 模式 3.1 Service 3.1.1 A 记录 3. ...
- Kubernetes 网络实现——Service网络
引言 本文介绍 Kubernetes 网络中 Service 网路部分的实现方案.更多相关文章和其他文章均收录于贝贝猫的文章目录. Service 网络 service network 比较特殊,每个 ...
- Web service 介绍与简单应用
一.Web service 介绍 什么是 Web service 到目前为止对 Web service 没有统一的定义,这里以一种更容易理解的方式解释.Web service 是一个平台独立的,低耦合 ...
- Kubernetes的client-go库介绍
官方示例:https://github.com/kubernetes/client-go/blob/master/examples/out-of-cluster-client-configuratio ...
- kubernetes endpoint 代码阅读
打个广告,如果想旅游(国内外周边,签证,酒店,门票等)可以联系 15713688208 ,微信同号. 常量参数 首先看一些常量参数: maxRetries: 服务在退出队列之前的重试次数.会因为限速控 ...
- Kubernetes控制器和service
1.控制器的介绍 Pod 的分类: 自主式 Pod:Pod 退出后不会被创建 控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目 控制器类型: Replication Cont ...
- 企业运维 kubernetes(k8s) 之 service
目录 1. service 介绍 2. 开启 kube-proxy 的 ipvs 模式 3. 创建 service:(NodePort方式) 4. DNS 插件 Service 5. pod 滚动更新 ...
- 容器编排技术 -- Kubernetes kubectl create service nodeport 命令详解
容器编排技术 -- Kubernetes kubectl create service nodeport 命令详解 1 kubectl create service nodeport 2 语法 3 示 ...
最新文章
- 编程之美初赛第一场--焦距
- Java基础点:集合
- 跨域调用报表展现页面的flash打印方法
- 一二三系列之CodeChef分块——Chef and Churu,Chef and Problems,Children Trips
- asp.net动态加载css
- 西门子Mendix发低代码最新报告趋势:客户体验先行、智能化和全渠道化
- C++函数的三种传递方式
- python棋子判定_python微信跳一跳系列之棋子定位颜色识别
- (9)数据结构-双端队列
- Kafka从上手到实践-Kafka集群:重要配置和性能探讨 | 凌云时刻
- MQAM(M元正交幅度调制)
- top res mysql_Java应用Top命令RES内存占用高分析
- JavaScript中使用attachEvent实现事件监听
- 1198_MISRA_C规范学习笔记_Rule 8.6 Rule 8.7
- Reverse complement DNA
- Apache commons lang简介
- mysql平然_分享 | 36张不可思议的数学知识动图,让你对数学怦然心动!!
- Android - 分屏模式(多窗口模式)
- TimerFd使用心得
- linux安装程序出现了问题,linux安装extundelete以及对遇到问题的解决
热门文章
- linux是实时系统还是分时操作系统
- AI生成肖像画,精细到毛发!北大校友最新研究收割2.8k星标,还登上了ICPR 2020...
- 一起自学SLAM算法:11.5 强化学习与自主导航
- socket接口技术和相关函数(socket,bind,listen,accept)
- java jtextarea清空_Java:JTextArea类
- linux下ad键盘驱动,led、键盘、ADC驱动程序
- python如何使用gpu加速_如何用云端 GPU 为你的 Python 深度学习加速?
- 二级指针(指向指针的指针)
- 2022.02.09_Java学习总结_网络编程、正则表达式
- ansys matlab 温度场,ANSYS温度场分析步骤.pdf