热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

「走进k8s」Kubernetes1.15.1的service(25)

上节课说了job和定时的job,其实这个应用场景很少,之前也说了pod,deployment,pod的生命周期。也了解了pod的生命是有限的,死亡过后就不会复活了。rc和deplo


上节课说了job 和 定时的job,其实这个应用场景很少,之前也说了pod,deployment,pod的生命周期。也了解了pod的生命是有限的,死亡过后就不会复活了。rc和deployment可以动态的创建和销毁pod,我们的每个pod都有自己的ip地址,但是如果pod重新启动后ip地址就会发生变化,因为重建了,就会重新分配ip,这样就会带来一个问题:后端的微服务集合为前端的集合提供API服务,前端把ip地址写死了,结果后端挂了,但是通过自动扩缩容又起起来了,但是ip非常可能发生了变化,导致前端也无法正常的访问,这如何解决呢?引入一个名词service。



(一)service




  • ① 场景解决


对于后端的服务ip发生变化,为了解决,可能在前端请求后端之前,增加一个nginx或者apache反向代理,每次让前端访问nginx,当后端的ip发生变化的时候,修改nginx的配置就可以了。每次都要修改也挺麻烦的,nginx有个属性upstream选项,可以动态的配置访问地址,可以通过后端每次重启的服务进行服务的注册,nginx获取注册后的ip地址然后动态的让前端请求进行转向到新的ip上,这样就可以解决了。 服务注册:一般zookeeper,consul,在k8s里面是etcd。


既然需要中间件,那是不是k8s里面也有一个对象可以充当这个对象,是的,那就是service。



  • ② service定义


每个 Pod 本身会带著一或多个不等的标志在身上,当 Service 指定存取某些特定的标志时,Label Selector 会根据 Pod 身上自带的标籤进行分组,并回传 Service 所要求的 Pod 资讯。


下图右边共有三种分别为黄、绿、蓝色的 Pod,正代表着集群内有三种不同的 Pod 群组,当今天收到使用者请求时,便会将请求送至对应的蓝色群组内的其中一个 Pod 进行处理。




  • ③ service存在的意思


Service 作为中介层,避免使用者和 Pod 进行直接连线,除了让我们服务维持一定弹性能够选择不同的 Pod 来处理请求外,某种程度上避免裸露无谓的 Port 而导致资安问题。另外,也体现出云服务架构设计中一个非常重要的观念:


对于使用者而言,仅需知道有人会处理他们的请求,而毋须知道实际上处理的人是谁。



  • ④ service的官网


https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.15/#service-v1-core



(二)k8s中的三种IP



(三)service



  • ① 源码


先创建一组deployment-demo-nginx,生成pod,跟service进行关联。


nginx-deploy.yaml


---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deploy
labels:
app: nginx-demo
spec:
replicas: 3
revisionHistoryLimit: 15
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: nginxweb

demo-service.yaml

apiVersion: v1
kind: Service
metadata:
name: demoservice
spec:
selector:
app: nginx
type: NodePort
ports:
- name: http
protocol: TCP
port: 80
targetPort: nginxweb

demo-service.yaml 中的 spec.selector.app 对应的是 nginx-deploy.yaml 中template。metadata.labels.app 名称必须一致。他们通过这样来对应。下面还有个80端口也是对应的一种方式。



  • ② 执行yaml


nginx-deploy.yaml demo-service.yaml

vi nginx-deploy.yaml
vi demo-service.yaml




kubectl apply -f nginx-deploy.yaml
kubectl apply -f demo-service.yaml



查看service情况。Endpoints就是service会持续的监听这个selector。


kubectl get svc
kubectl describe svc demoservice


targetPort 不光可以设置成端口,也可以设置成一个字符串。我进行了字符串的对应 nginxweb。 如果其他的pod的名称也叫 app= nginx, service 也会进行匹配。



  • ③ 进入一个pod尝试访问service


上边service的ip :10.107.50.167


kubectl run -it testservice --image=busybox /bin/sh
wget -q -O- 10.107.50.167



service 提供的服务其实指向的deployment对应的pod,pod内部是nginx。 直接访问service的服务其实就是指向的某个nginx。


(四)service


在Kubernetes集群中,每个Node会运行一个kube-proxy进程, 负责为Service实现一种 VIP(虚拟 IP,就是我们上面说的clusterIP)的代理形式,现在的Kubernetes中默认是使用的iptables这种模式来代理。这种模式,kube-proxy会监视Kubernetes master对 Service 对象和 Endpoints 对象的添加和移除。 对每个 Service,它会添加上 iptables 规则,从而捕获到达该 Service 的 clusterIP(虚拟 IP)和端口的请求,进而将请求重定向到 Service 的一组 backend 中的某一个个上面。 对于每个 Endpoints 对象,它也会安装 iptables 规则,这个规则会选择一个 backend Pod。 默认的策略是,随机选择一个 backend。 我们也可以实现基于客户端 IP 的会话亲和性,可以将 service.spec.sessionAffinity 的值设置为 “ClientIP” (默认值为 “None”)。 另外需要了解的是如果最开始选择的 Pod 没有响应,iptables 代理能够自动地重试另一个 Pod,所以它需要依赖 readiness probes。




  1. Client 访问service,service访问pod节点,如果第一次访问的pod1,通过亲和性下次还是访问pod1

  2. Client访问pod2没有响应,iptables会自动重试到另一个pod上边去,可能是pod1或者pod3,根据设计的策略来。

  3. pod1,pod2,pod3,如果少了一个pod2,肯定也是apiserver操作导致的,kube-proxy他会实时的监听apiserver。api 通知 porxy 移除 pod2。


(五)Service 类型



  • ① ClusterIP


默认模式,只能在集群内部访问。



  • ② NodePort


在每个节点上都监听一个同样的端口号(30000-32767),ClusterIP和路由规则会自动创建。集群外部可以访问

:

联系到集群内部服务,可以配合外部负载均衡使用(我现在公司用的就是这个模式配合阿里云的SLB)。


该端口将通过 Service 的 spec.ports[*].nodePort 字段被指定,如果不指定的话会自动生成一个端口。


kubectl get svc


请求节点地址: http://192.168.86.100:31298/


http://192.168.86.101:31298/ 都可以进行访问




  • ③ LoadBalancer


要配合支持公有云负载均衡使用比如GCE、AWS。其实也是NodePort,只不过会把

:

自动添加到公有云的负载均衡当中。



  • ③ ExternalName


创建一个dns别名指到service name上,主要是防止service name发生变化,要配合dns插件使用。


PS:基本上service就讲解完毕了,了解下service的原理和对应的service的类型。其实Service的内容远远不止这些,这些是一些比较常用的功能,如果在平时用到可以参考一下。

>>原创文章,欢迎转载。转载请注明:转载自,谢谢!>>原文链接地址:上一篇:

已是最新文章




推荐阅读
  • Windows环境下部署Kubernetes Dashboard指南
    本指南详细介绍了如何在Windows系统中部署Kubernetes Dashboard,包括下载最新配置文件、修改服务类型以支持NodePort访问、下载所需镜像并启动Dashboard服务等步骤。 ... [详细]
  • 本文详细介绍了 Kubernetes 集群管理工具 kubectl 的基本使用方法,涵盖了一系列常用的命令及其应用场景,旨在帮助初学者快速掌握 kubectl 的基本操作。 ... [详细]
  • 深入探讨配置文件的管理与优化
    尽管配置文件的重要性不言而喻,但其管理和安全性问题却常被忽视。本文将详细讨论配置文件的不同管理策略及其优缺点。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • Ralph的Kubernetes进阶之旅:集群架构与对象解析
    本文深入探讨了Kubernetes集群的架构和核心对象,详细介绍了Pod、Service、Volume等基本组件,以及更高层次的抽象如Deployment、StatefulSet等,帮助读者全面理解Kubernetes的工作原理。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 深入解析 RuntimeClass 及多容器运行时应用
    本文旨在探讨RuntimeClass的起源、功能及其在多容器运行时环境中的实际应用。通过详细的案例分析,帮助读者理解如何在Kubernetes集群中高效管理不同类型的容器运行时。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 华为USG基于源地址的多出口策略路由配置
    网络拓扑如下:组网情况:企业用户主要有技术部(VLAN10)和行政部(VLAN20),通过汇聚交换机连接到USG。企业分别通过两个不同运营商(ISP1和ISP2)连接到 ... [详细]
  • 本文详细介绍了如何在Kubernetes集群中调整etcd、apiserver、controller-manager、scheduler等核心组件以及kube-proxy和coredns的时区设置方法。 ... [详细]
  • 本文详细介绍了如何利用go-zero框架从需求分析到最终部署至Kubernetes的全过程,特别聚焦于微服务架构中的网关设计与实现。项目采用了go-zero及其生态组件,涵盖了从API设计到RPC调用,再到生产环境下的监控与维护等多方面内容。 ... [详细]
author-avatar
宇剑小窝_911
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有