【Kubernetes】第十八篇 - k8s 服务发现简介
一,前言
上一篇,介绍了阿里云 ECS 服务器重启后的环境修复;
本篇,介绍 k8s 服务发现;
二,服务发现简介
当 A服务依赖了 B服务,而 B服务的IP和端口未知(或相对不固定),这时就需要服务发现;
服务发现:是指使用一个注册中心,来记录分布式系统中全部服务的信息,以便于其他服务能够快速找到这些在注册中心的已注册服务;
三,CoreDNS
Pod 的 IP 是漂移且不固定的,所以需要使用 Service 来将 pod 的访问入口进行固定;
(pod 的 ip 和端口号可能会改变,但 service 是不会变的)
可以利用 DNS 机制为每一个 Service 添加一个内部的域名,指向其真实 IP;
通过访问服务的域名访问到 ip;
在 K8s中,对 Service 的服务发现,是通过 CoreDNS 组件实现的;
(coreDNS 是 Go 语言实现的一个 DNS 服务器)
- -n 按命名空间过滤
- -l 按标签过滤
- -o wide 输出额外信息。对于Pod,将输出Pod所在的Node名
kubectl -n kube-system get all -l k8s-app=kube-dns -o wide[root@k8s-master ~]# kubectl -n kube-system get all -l k8s-app=kube-dns -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/coredns-54d67798b7-rlktq 1/1 Running 1 13d 10.244.0.4 k8s-master <none> <none>
pod/coredns-54d67798b7-w8p5k 1/1 Running 1 13d 10.244.0.5 k8s-master <none> <none>NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 13d k8s-app=kube-dnsNAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/coredns 2/2 2 2 13d coredns registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0 k8s-app=kube-dnsNAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset.apps/coredns-54d67798b7 2 2 2 13d coredns registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0 k8s-app=kube-dns,pod-template-hash=54d67798b7
四,服务发现的规则
- kubectl exec 的作用是可以直接在容器内执行Shell脚本
-
- 命令格式:kubectl exec -it [PodName] – [Command]
- -i:即使没有连接,也要保持标准输入保持打开状态。一般与 -t 连用。
- -t:分配一个伪TTY(终端设备终端窗口),一般与 -i 连用。可以分配给我们一个Shell终端
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
user-v1-84bdcc465b-vxvl2 1/1 Running 0 5d
v4-57b4cf7fd9-zcl45 0/1 ImagePullBackOff 0 4d23h
v4-fb4cd75f5-bf2pf 0/1 ImagePullBackOff 0 16h[root@k8s-master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13d
service-user-v1 NodePort 10.104.13.40 <none> 80:31071/TCP 12d
目前只有service-user-v1这一个服务,是不够的,需要再启动一个(启动一个 pay 的服务)
[root@k8s-master ~]# cd deployment/
[root@k8s-master deployment]# ls
deployment-pay-v1.yaml ingress-gray.yaml service-user-v2.yaml
deployment-user-v1.yaml ingress.yaml shell-probe.yaml
deployment-user-v2.yaml pay-service-v1.yaml tcp-probe.yaml
deployment-v4.yaml registry-auth-file.yaml user-service-v1.yaml
deploy.yaml registry-login-file.yaml
http-probe.yaml secret-opaque-flie.yaml// 将 deployment-pay-v1.yaml 副本集修改为 1 个
[root@k8s-master deployment]# vi deployment-pay-v1.yaml apiVersion: apps/v1 #API版本号
kind: Deployment #资源类型部署
metadata:name: pay-v1 #资源名称
spec:selector:matchLabels:app: pay-v1 #告诉deployment根据规则匹配相应的Pod进行控制和管理,matchLabels字段>匹配Pod的label值replicas: 1 #声明Pod副本的数量template:metadata:labels:app: pay-v1 #Pod名称spec: #描述Pod内的容器信息containers:- name: nginx #容器的名称image: nginx:pay #镜像ports:- containerPort: 80 #容器内映射的端口// 生效配置-部署一个 pay 服务
[root@k8s-master deployment]# kubectl apply -f deployment-pay-v1.yaml
deployment.apps/pay-v1 created// 启动服务 pay-service-v1.yaml
[root@k8s-master deployment]# kubectl apply -f pay-service-v1.yaml
service/service-pay-v1 created// 查看 pod
[root@k8s-master deployment]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pay-v1-655587b6f5-gv8hc 1/1 Running 0 20s
user-v1-84bdcc465b-vxvl2 1/1 Running 0 5d
v4-57b4cf7fd9-zcl45 0/1 ImagePullBackOff 0 4d23h
v4-fb4cd75f5-bf2pf 0/1 ImagePullBackOff 0 16h// 查看 service
[root@k8s-master deployment]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13d
service-pay-v1 NodePort 10.97.250.199 <none> 80:30114/TCP 21s
service-user-v1 NodePort 10.104.13.40 <none> 80:31071/TCP 12d
目前共有两个 pod:user-v1-84bdcc465b-vxvl2 和 pay-v1-655587b6f5-gv8hc
两个 service : service-pay-v1和 service-user-v1
都在运行中了
从 user-v1 中访问 pay-v1:
// 进入 pod : user-v1
[root@k8s-master deployment]# kubectl exec -it user-v1-84bdcc465b-vxvl2 -- /bin/sh
// 从 user-v1 的 pod 中,访问 service-pay-v1
# curl http://service-pay-v1
// 返回信息
pay
五,namespace(命名空间)
namespace(命名空间)是 k8s 中比较重要的一个概念;
在启动集群后,kubernetes 会分配一个默认的 default 命名空间;不同的命名空间能够实现资源隔离,服务隔离,甚至权限隔离;
之前创建的服务由于没有指定 namespace ,所以这些服务都在同一个默认的 default 命名空间下;
[root@k8s-master deployment]# kubectl describe service service-pay-v1
Name: service-pay-v1
Namespace: default #默认命名空间
Labels: <none>
Annotations: <none>
Selector: app=pay-v1
Type: NodePort
IP Families: <none>
IP: 10.97.250.199
IPs: 10.97.250.199
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort:
<unset> 30114/TCP
Endpoints: 10.244.1.84:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
在相同 namespace 下的规则,只需要直接访问 http://ServiceName:Port 就可以访问到相应的 Service
curl http://service-pay-v1:80 (同 curl http://service-pay-v1)备注:内部访问(pod 中)时,访问的是内部端口号,即 80(见下面 service-pay-v1 的 PORT 内部/外部)
外部访问需要通过外网 ip+30114访问
[root@k8s-master deployment]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13d
service-pay-v1 NodePort 10.97.250.199 <none> 80:30114/TCP 21s
service-user-v1 NodePort 10.104.13.40 <none> 80:31071/TCP 12d
- 不同 namespace 下的规则是 [ServiceName].[NameSpace].svc.cluster.local
- ServiceName 就是我们创建的 Service 名称
- NameSpace 则是命名空间。如果你没有命名空间,则这个值为 default。
// 假如 service-pay-v1 和 service-user-v1 不在同一个命名空间下
[root@k8s-master deployment]# kubectl exec -it user-v1-84bdcc465b-vxvl2 -- /bin/sh
# curl http://service-pay-v1.default.svc.cluster.local
pay
六,结尾
相关文章:
【Kubernetes】第十八篇 - k8s 服务发现简介
一,前言 上一篇,介绍了阿里云 ECS 服务器重启后的环境修复; 本篇,介绍 k8s 服务发现; 二,服务发现简介 当 A服务依赖了 B服务,而 B服务的IP和端口未知(或相对不固定)&…...
Codeforces Round 856 (Div. 2) 最好ak的div2
最近几场的div2 E都是一个思路啊,代码大差不差的,感觉随便ak啊。 A. Prefix and Suffix Array 题意 给你前n−1n-1n−1个字符串前缀和后n−1n-1n−1个字符串后缀,判断原字符串是否是回文串 思路 相同长度的判断是否是对称的即可。 代码 B C…...
最新JVM技术: GraalVM,让你一文了解它的方方面面
1. 什么是GraalVM? GraalVM是一种开源的虚拟机平台,由Oracle公司开发。它支持多种编程语言,包括Java、JavaScript、Python、Ruby、R、C++等,旨在提高应用程序的性能和扩展性。 GraalVM通过提供即时编译器(Just-in-Time Compiler,JIT)和Ahead-of-Time(AOT)编译器来提…...
MySQL索引失效的场景
1.like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。 2.数据库表数据量过小 如果表的数据量非常小,则MySQL可能不会使用索引,因为它认为全表扫描的代价更小。 3.or语句前后没有同时使用索引 …...

Java - 对象的比较
一、问题提出 前面讲了优先级队列,优先级队列在插入元素时有个要求:插入的元素不能是null或者元素之间必须要能够进行比较,为了简单起见,我们只是插入了Integer类型, 那优先级队列中能否插入自定义类型对象呢…...

[算法]选择排序
目录 1、选择排序的实现 2、例子 3、代码实现 4、时间复杂度和空间复杂度 5、选择排序的缺点——不稳定性 1、选择排序的实现 选择排序就是每一轮选择最小的元素直接交换到左侧。这种排序的最大优势,就是省去了多余的元素交换。 2、例子 原始数组和选择排序的…...

dp模型——状态机模型C++详解
状态机定义状态机顾名思义跟状态有关系,但到底有什么关系呢。在实际解决的时候,通常把状态想成节点,状态的转换想成有向边的有向图,我们来举个例子。相信大家都玩过类似枪战的游戏(没玩过的也听说过吧)&…...

1.4 条件概率与乘法公式
1.4.1 条件概率在实际问题中,除了直接考虑某事件 B 发生的概率P(B)外,有时还会碰到这样的问题,就是“在事件A 已经发生的条件下,事件B 发生的概率”。一般情况下,后概率与前一概率不同,为了区别,我们常把后者称为条件概率,记为P(B…...

VITA/PYTHON/LUPA families
Image Sensor Group Top to Bottom Portfolio in Industrial Imaging Machine Vision • Factory automation and inspection • Robotic vision • Biometrics High-End Surveillance • Aerial Surveillance • Intelligent Traffic Systems (ITS) • Mapping Medical and Sc…...

ChatGPT概述:从模型训练到基本应用的介绍
ChatGPT概述:从模型训练到基本应用的介绍 目录 本文是对ChatGPT的由来、训练过程以及实际落地场景的解释,主要内容包括如下三个方面: 1、ChatGPT是什么 2、ChatGPT的原理 3、ChatGPT的思考 4、ChatGPT的应用 ChatGPT是什么 ChatGPT可能是近…...

C语言实现扫雷【详细讲解+全部源码】
扫雷的实现1. 配置运行环境2. 扫雷游戏的初步实现2.1 建立扫雷分布模块2.2 创建名为board的二维数组并进行棋盘初始化2.3 打印棋盘3. 接下来该讨论的事情3.1 布置雷3.2 排查雷3.3 统计坐标周围有几个雷4. 完整扫雷游戏的实现4.1 game.h4.2 game.c4.3 扫雷.c1. 配置运行环境 本游…...

Vue2.0开发之——购物车案例-Goods组件封装-商品名称和图片(46)
一 概述 循环渲染Goods组件为Goods组件封装title属性为Goods组件封装pic属性 二 循环渲染Goods组件 2.1 App.vue中导入Goods组件 import Goods from /components/Goods/Goods.vue2.2 App.vue中注册Goods组件 components: {Header,Goods}2.3 循环渲染每一个商品的信息 <…...

0201基础-组件-React
1 组件和模块 1.1 模块 对外提供特定功能的js程序,一般就是一个js文件 为什么拆分模块呢?随着业务逻辑增加,代码越来越多,越来越复杂。作用:复用js,简化js,提高js运行效率 1.2 模块化 当应用…...

论文笔记 | Conducting research in marketing with quasi-experiments
这篇论文是Journal of Marketing上的论文,讲了使用准实验来进行论文研究的一些事项。外生性识别的来源、几种准实验方法的注意点还有内生性的解决。 这篇论文对于准实验或者是平常论文的展开有一个非常友善的指导功能,可以阅读~ 摘要:本文旨…...
有关Android导览(Android Navigation component)
文章目录小结有关Android导览(Android Navigation component)碰到的问题参考小结 在使用Android导览(Android Navigation component)碰到很多问题。解决了一些问题,但是“Skipped xxx frames! The application may be doing too much work on its main thread”这样…...

01 C语言计算
C语言计算 1、变量 用途:需要存放输入的数据 定义格式:数据类型 变量名(用于区分其他变量) 变量名格式:只能由字母/下划线/数字构成,首位不能是数字;且变量名不能是标识符 **变量赋值和初始…...
java单元测试简介(基于SpringBoot)
java单元测试简介(基于SpringBoot)mockitomock创建mock对象的另一种方式:Mockverifystubbing(存根)Spy(间谍)mock 静态方法mockito在springboot mock中的实战mockito 通常,在我们写单测时,会遇…...

Linux常用命令操作
文件目录操作 查看文件列表 ls #输出列表信息 ls -l #输出详细列表信息 ls -a #输出隐藏文件 ls -la #输出包含的隐藏文件及详细信息 ll # ls-l的缩写rwx分别对应读取,写入,执行权限,前面有d代表是文件夹 创建文件 touch file.txt #创建…...
SpringCloud GateWay配置—TLS 和 SSL、Http超时配置
一、TLS 和 SSL网关可以按照通常的 Spring 服务器配置侦听 HTTPS 上的请求。 以下示例演示如何执行此操作:application.ymlserver:ssl:enabled: truekey-alias: scgkey-store-password: scg1234key-store: classpath:scg-keystore.p12key-store-type: PKCS12您可以将…...

python Django中的cookies和session会话保持技术
cookies和session都是为了保持会话状态而诞生的两个存储技术会话定义: 从打开浏览器访问一个网站,到关闭浏览器结束此次访问,称之为一次会话HTTP协议是无状态的,导致会话状态难以保持Cookies-定义 cookies是保存在客户端浏览器上的…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...