【K8S in Action】服务:让客户端发现pod 并与之通信(2)

一 通过Ingress暴露服务

Ingress (名词) 一一进入或进入的行为;进入的权利;进入的手段或地点;入口。一个重要的原因是每个 LoadBalancer 服务都需要自己的负载均衡器, 以及
独有的公有 IP 地址, 而 Ingress 只需要一个公网 IP 就能为许多服务提供访问。
Ingress 在网络栈 (HTTP) 的应用层操作。

1.1 Ingress 控制器是必不可少的

只有Ingress控制器在集群中运行,Ingress 资源才能正常工作。在 minikube 上启动 Ingress 的扩展功能。

# 确保已启用 Ingress 附加组件
$ minikube addons list
- default-storageclass: enabled
- kube-dns: enabled
- heapster: disabled
- ingress: disabled    # 没有启动
- registry-creds: disabled
- addon-manager: enabled 
- dashboard: enabled

# 启用 Ingress 附加组件
$ minikube addons enable ingress
ingress was successfully enabled

# 查看控制Pod
$ kubectl get po  --all-namespaces

1.2 创建 Ingress 资源

apiVersion: extensions/vlbetal
kind: Ingress 
metadata:
	name : kubia.example.com
spec : 
	rules: 
	- host: kubia.example.com    #将域名映射到对应的服务
		http : 
		paths 
		- path: /
		  backend: 
			serviceName: kubia-nodeport   # 将请求发送到kubia-nodeport 的80端口
			servicePort 80


要通过 http://kubi example.com 访问服务,需要确保域名解析为 ngress 控制器 IP
kubectl get ingresses
NAME   HOSTS                ADDRESS         PORTS AGE 
kubia  kubia.example.com  192.168.99.100    80   29m 

通过配置 DNS 服务器将kubia.example.com解析为 IP地址,或者在 /ect/host文件( Windows 系统为 \windows\system32\drivers\etc\hosts 中添加下面 行内容
192.168.99.100 kubia.example.com

通过 Ingress 访问 pod: curl http: / /kubia.example.com

在这里插入图片描述

1.3 通过相同的Ingress 暴露多个服务

- host:kubia.example.com 
	http: 
		paths: 
		- path: /kubia 
			backend: 
				serviceName : kubia   # kubia.example.com/kubia 转发到kubia服务80端口
				servicePort: 80 
		- path: /foo 
			backend: 
				serviceName : bar  # kubia.example.com/foo 转发到bar服务80端口
				ser cePort: 80

二 pod 就绪后发出信号

还有一件关于 Service 和 Ingress 的事情。pod 可能需要时间来加载配置或数据。不要将请求转发到正在启动的 pod 中, 到完全准备就绪。

像存活探针一样,就绪探针有三种类型:
• Exec 探针,执行进程的地方。容器的状态由进程的退出状态代码确定
•HTTP GET 探针,向容器发送 HTTP GET 请求,通过响应的 HTTP 状态代码
判断容器是否准备好
• TCP socket 探针,它打开 TCP 连接到容器的指定端口。如果连接己建立,
则认为容器己准备就绪

启动容器时,可以为 k8s 配置等待时间,经过等待时间后才可以执行第1次准备就绪检查。之后,它会周期性地调用探针,并根据就绪探针的结果采取行动。如果某个 po 报告它尚未准备就绪,则会从该服务中删除该 pod 。如果再次准备就绪,则重新添加 pod。

apiVersion: vl 
kind: ReplicationController
spec: 
	template:
		spec: 
			containers:
			- name: kubia
				image: luksa/kubia
				readinessProbe:        就绪探针
					exec:  
						- ls 
						- /var/ready   定期在容器内执行ls/var/ready命令,返回退出码0, 表示成功
  • 务必定义就绪探针
  • 不要将停止 pod 的逻辑纳入就绪探针中
    只要删除该容器, Kubemetes就会从所有服务中移除该容器。

三 使用 headless服务来发现独立的pod

如果客户端需要链接到所有的 pod 呢?如果后端的 pod 都需要连接到所有其他
pod如何处理。

  • 一种选择是让客户端调用 Kubemetes API 服务器并通过 API调用获取 pod 及其 IP 地址列表。
    但由于应始终努力保持应用程序与 Kubemetes 无关, 因此使用 API 服务器并不理想。
  • Kubemetes 允许客户通过 DNS 查找发现 pod IP
    当执行服务的 DNS 查找时, DNS 服务器会返回单个 IP一服务的集群 IP。 但是, 如果告诉Kubemetes, 不需要为服务提供集群 IP (通过在服务 spec 中将 clusterIP 字段设置为 None 来完成此操作), 则 DNS 服务器将返回 podIP 而不是单个服务 IP。

3.1 创建headless服务

apiVersion: vl 
kind: Service 
metadata:
	name: kubia-headless 
spec: 
	clusterIP: None     服务成为handless的
	ports: 
	- port: 80
		targetPort: 8080
	selector: 
		app: kubia

kubectl create 创建服务之后,可以 通过kubectl get和kubectl describe来查看服务,你会发现它没有集群IP,并且它的后端 包含与pod选择器匹配的就绪 pod。

3.2 通过DNS发现pod

尝试执行DNS查找以查看是否获得了实际的podIP。需要从其中 一个pod中执行查找。
注意: headless 服务仍然提供跨 pod 的负载平衡, 但是通过 DNS 轮询机制不是通过服务代理

kubect1 run dnsutils --image=tutum/dnsutils --generator=run-pod/vl  --command -- sleep infinity

kubectl exec dnsutils nslookup kubia-headless    执行 DNS 查找
Name: kubia-headless.default.svc.cluster.local
Address: 10.108.1.4 
Name: kubia-headless.default.svc.cluster.local
Address: 10.108.2.5

kubectl exec dnsutils nslookup kubia      返回的IP是服务的集群 IP
Name: kubia.default.svc.cluster.local 
Address: 10.111.249.153

–generator=run-pod/vl 选项中, 该选项让 kubec七1直接创建pod, 而不需要通过 ReplicationController 之类的资源来创建。

3.3 发现所有的pod一包括未就绪的pod

不必通过查询KubemetesAPI服务器, 可以使用DNS查找机制来查找那些未准备好的pod。 要告诉Kubemetes无论pod的准备状态如何, 希望将所有pod 添加到服务中 。 必须将以下注解添加到服务中

kind: Service 
metadata: 
	annotations:
		service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"

警告: 注解名称表明了这是一个alpha功能。Service AP I已经支待一个 名为 publishNotReadyAddresses 的新服务规范字段。

4 排除服务故障

服务是Kubemetes的一个重要概念, 也是让许多开发人员感到困扰的根源。 许多开发人员为了弄清楚无法通过服务IP 或FQDN 连接到他们的pod的原因花费了
大量时间。
如果无法通过服务访问pod, 应该根据下面的列表进行排查:

  • 确保从集群内连接到服务的集群IP,而不是从外部
  • 不要通过ping服务IP 来判断服务是否可 访问(请记住, 服务的集群IP 是虚
    拟IP, 是无法ping通的)
  • 如果已经定义了就绪探针, 请确保 它返回成功;否则该pod不会成为服务的
    一部分
  • 要确认某个容器是服务的一部分, 请使用kubectl ge七 endpoints来检
    查相应的端点对象
  • 如果尝 试通 过FQDN或其 中 一 部 分来访问服务(例如, myservice.
    mynamespace.svc.cluster.local或 myservice.mynamespace), 但并不起作用, 请查看是否可以使用其集群IP而不是FQDN来访问服务
  • 检查是否连接到服务公开的端口,而不是目标端口
  • 尝试直接连接到podIP以确认pod正在接收正确端口上的 连接
  • 如果甚至无法通过pod的IP 访问应用, 请确保应用不是仅绑定到本地主机

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/268506.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于STM32的DS1302实时时钟模块应用及原理介绍

在嵌入式系统中,实时时钟模块是一个常见的功能模块,用于记录和管理系统的时间信息。DS1302是一款低功耗、具有多种功能的实时时钟芯片,被广泛应用于各种电子产品中。本文将介绍基于STM32微控制器的DS1302实时时钟模块的应用及原理&#xff0c…

案例163:基于微信小程序的校园二手交易平台系统设计与开发

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

快速入门学习定时任务框架-xxljob

定时任务框架-xxljob 简介 主要用于分布式任务调度,可以将任务调度和执行分布在多个节点上。它提供了一个集中式的管理平台,支持动态添加、修改、删除任务,以及任务的分片执行,确保任务在分布式环境中的高可用性的一个框架 spr…

OSI 七层参考模型及TCP/IP 四层模型

OSI 七层参考模型 七层模型,亦称 OSI ( Open System Interconnection )参考模型,即开放式系统互联。参考模型是国际标准化组织(ISO )制定的一个用于计算机或通信系统间互联的标准体系,一般称为…

在使用 npm install的时候提示node-sass command faile 解决方案

在使用npm install的时候错误提示node-sass 相关的。错误信息如下图: 解决方法(PS:凯哥的不适用) 出现这种问题基本是由于node版本与sass版本不匹配导致的 方案1:卸载node,安装对应版本 方案2&#xff1…

基于Arduino和HC-SR04的超声波测距系统设计

本文介绍了如何使用Arduino和HC-SR04超声波传感器设计并构建一个简单的超声波测距系统。我们将详细讨论硬件连线和编程步骤,并提供完整的Arduino代码。此系统可以应用于各种需要测量距离的项目,例如智能车辆、机器人和安防系统。 引言: 超声…

工具系列:PyCaret介绍_编写和训练自定义机器学习模型

文章目录 PyCaret安装PyCaret👉 让我们开始吧👉 数据集👉 数据准备PyCaret中的设置函数👉 可用模型👉 模型训练与选择👉 编写和训练自定义模型👉 GPLearn模型👉 NGBoost 模型&#x…

解决log4j多个日志都写到一个文件

之前客户端程序由于Websockt包依赖的log4j,就用log4j写日志了,Web用的log4j2没毛病。用log4j的多个logger的日志都写到一个文件里了,查了很多资料都没解决。今天闲了解决一下。 最后好使的配置 # 设置日志根 log4j.rootLogger INFO,Except…

嵌入式开发中利用strstr()对部分模块回传数据进行解析的问题(坑)

受到以下博文的启发: https://www.cnblogs.com/yup1983/p/11337837.html 验证: 最近通过ESP8266远程控制小车,在wifi回传的数据解析过程中遇到标题所述的烦恼 如上截图所示,数据回传过程中会接受到‘\0’字节对应的ASCII码为0x0…

基于IPP-FFT的线性调频Z(Chirp-Z,CZT)的C++类库封装并导出为dll(固定接口支持更新)

上一篇分析了三种不同导出C++类方法的优缺点,同时也讲了如何基于IPP库将FFT函数封装为C++类库,并导出为支持更新的dll库供他人调用。 在此基础上,结合前面的CZT的原理及代码实现,可以很容易将CZT变换也封装为C++类库并导出为dll,关于CZT的原理和实现,如有问题请参考: …

大数据应用开发1——配置基础环境

一、基础环境配置 1.配置虚拟网络 1.1、点击1、编辑2和3, 1.2、点开4,编辑网关 2、配置虚拟机环境 1.1、安装一台虚拟机,使用root用户登录,打开终端 1.2修改主机名 终端输入: vim /etc/hostname使用vim编辑/etc/ho…

MQ(消息队列)相关知识

1. 什么是mq 消息队列是一种“先进先出”的数据结构 2. 应用场景 其应用场景主要包含以下3个方面 应用解耦 系统的耦合性越高,容错性就越低。以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何…

SpringMVC核心处理流程梳理

1、处理流程图展示 当我拿出这张图,阁下又该如何应对呢?执行流程是不是一目了然了。 2、DispatcherServlet:中央处理器或者中央调度器 下图官方的解释应该最完善了。 3、SpringMVC三大核心组件 HandlerMapping 处理器映射器,…

iApp最新版无服务器多功能软件库源码

无需服务器的多功能软件库源码分享,仅需添加一个后台应用和一个文档即可 使用教程如下: 在浏览器中打开理想后台地址:http://apps.xiaofei.run/user/ 如果没有账号,请注册一个免费账号。 登录账号后,添加一个后台应…

Oracle 学习(1)

Oracle简介 Oracle是殷墟(yīn Xu)出土的甲骨文(oracle bone inscriptions)的英文翻译的第一个单词,在英语里是“神谕”的意思。Oracle公司成立于1977年,总部位于美国加州,是世界领先的信息管…

微信小程序(uniapp)api讲解

Uniapp是一个基于Vue.js的跨平台开发框架,可以同时开发微信小程序、H5、App等多个平台的应用。下面是Uniapp常用的API讲解: Vue.js的API Uniapp采用了Vue.js框架,因此可以直接使用Vue.js的API。例如:v-show、v-if、v-for、comput…

类和对象

1 类定义: class ChecksumAccumulator {// class definition goes here } 你就能创建 ChecksumAccumulator 对象:new CheckSumAccumulator 注:1scala类中成员默认是public类型,若设为私有属性则必须加private关键字。在scala中是…

Defi安全-Mono攻击事件分析--etherscan+phalcon

MonoX攻击事件相关信息 在Ethereum和Polygon网络都发生了,攻击手段相同,以Ethereum为例进行分析: 攻击者地址:MonoX Finance Exploiter | Address 0xecbe385f78041895c311070f344b55bfaa953258 | Etherscan 攻击合约&#xff1a…

JavaScript常用技巧专题五

文章目录 一、使用适当的命名和注释来提高代码可读性二、优雅的写条件判断代码2.1、普通的if else2.2、三元运算符2.3、多个if else2.4、switch case2.5、对象写法2.6、Map写法 三、封装条件语句四、函数应该只做一件事五、Object.assign给默认对象赋默认值六、函数参数两个以下…

OpenGL 绘制Mesh数据(Qt)

文章目录 一、简介二、实现代码三、实现效果一、简介 Mesh数据的结构主要就是点与三角面片,因此本质上仍然是对三角面片进行绘制。这里我们借助VCG这个库实现对Mesh数据的读取,这个库相对简单轻巧,很方便使用。 二、实现代码 由于修改的部分很多,我们逐一进行解释一下: --…