​​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-proxyIPVS 代理模式启动时,它将验证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种类型:

  1. ClusterIP​(默认模式)

  2. NodePort​:主机端口模式

  3. Headless ClusterIP​:无头模式

  4. LoadBalancer​:使用外部负载均衡

  5. 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

集群内访问:

​0x​​03.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​进行访问

​0x​​03.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介绍与应用相关推荐

  1. 学习笔记之-Kubernetes(K8S)介绍,集群环境搭建,Pod详解,Pod控制器详解,Service详解,数据存储,安全认证,DashBoard

    笔记来源于观看黑马程序员Kubernetes(K8S)教程 第一章 kubernetes介绍 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署 ...

  2. 容器编排技术 -- Kubernetes DNS Pod 与 Service 介绍

    容器编排技术 -- Kubernetes DNS Pod 与 Service 介绍 1 介绍 2 怎样获取 DNS 名字? 3 支持的 DNS 模式 3.1 Service 3.1.1 A 记录 3. ...

  3. Kubernetes 网络实现——Service网络

    引言 本文介绍 Kubernetes 网络中 Service 网路部分的实现方案.更多相关文章和其他文章均收录于贝贝猫的文章目录. Service 网络 service network 比较特殊,每个 ...

  4. Web service 介绍与简单应用

    一.Web service 介绍 什么是 Web service 到目前为止对 Web service 没有统一的定义,这里以一种更容易理解的方式解释.Web service 是一个平台独立的,低耦合 ...

  5. Kubernetes的client-go库介绍

    官方示例:https://github.com/kubernetes/client-go/blob/master/examples/out-of-cluster-client-configuratio ...

  6. kubernetes endpoint 代码阅读

    打个广告,如果想旅游(国内外周边,签证,酒店,门票等)可以联系 15713688208 ,微信同号. 常量参数 首先看一些常量参数: maxRetries: 服务在退出队列之前的重试次数.会因为限速控 ...

  7. Kubernetes控制器和service

    1.控制器的介绍 Pod 的分类: 自主式 Pod:Pod 退出后不会被创建 控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目 控制器类型: Replication Cont ...

  8. 企业运维 kubernetes(k8s) 之 service

    目录 1. service 介绍 2. 开启 kube-proxy 的 ipvs 模式 3. 创建 service:(NodePort方式) 4. DNS 插件 Service 5. pod 滚动更新 ...

  9. 容器编排技术 -- Kubernetes kubectl create service nodeport 命令详解

    容器编排技术 -- Kubernetes kubectl create service nodeport 命令详解 1 kubectl create service nodeport 2 语法 3 示 ...

最新文章

  1. 编程之美初赛第一场--焦距
  2. Java基础点:集合
  3. 跨域调用报表展现页面的flash打印方法
  4. 一二三系列之CodeChef分块——Chef and Churu,Chef and Problems,Children Trips
  5. asp.net动态加载css
  6. 西门子Mendix发低代码最新报告趋势:客户体验先行、智能化和全渠道化
  7. C++函数的三种传递方式
  8. python棋子判定_python微信跳一跳系列之棋子定位颜色识别
  9. (9)数据结构-双端队列
  10. Kafka从上手到实践-Kafka集群:重要配置和性能探讨 | 凌云时刻
  11. MQAM(M元正交幅度调制)
  12. top res mysql_Java应用Top命令RES内存占用高分析
  13. JavaScript中使用attachEvent实现事件监听
  14. 1198_MISRA_C规范学习笔记_Rule 8.6 Rule 8.7
  15. Reverse complement DNA
  16. Apache commons lang简介
  17. mysql平然_分享 | 36张不可思议的数学知识动图,让你对数学怦然心动!!
  18. Android - 分屏模式(多窗口模式)
  19. TimerFd使用心得
  20. linux安装程序出现了问题,linux安装extundelete以及对遇到问题的解决

热门文章

  1. linux是实时系统还是分时操作系统
  2. AI生成肖像画,精细到毛发!北大校友最新研究收割2.8k星标,还登上了ICPR 2020...
  3. 一起自学SLAM算法:11.5 强化学习与自主导航
  4. socket接口技术和相关函数(socket,bind,listen,accept)
  5. java jtextarea清空_Java:JTextArea类
  6. linux下ad键盘驱动,led、键盘、ADC驱动程序
  7. python如何使用gpu加速_如何用云端 GPU 为你的 Python 深度学习加速?
  8. 二级指针(指向指针的指针)
  9. 2022.02.09_Java学习总结_网络编程、正则表达式
  10. ansys matlab 温度场,ANSYS温度场分析步骤.pdf