kubernetes-Service

news2025/1/1 21:56:11

文章目录

  • 1、前言
  • 2、基本语法
    • 2.1 Service yaml
    • 2.2 关键字段
    • 2.3 port、nodePort、targetPort、containerPort字段说明
  • 3、Service 类型
    • 3.1 ClusterIP
    • 3.2 NodePort
    • 3.3 LoadBalancer
    • 3.4 ExternalName
  • 4、无头服务(Headless Services)
  • 5、访问service
  • 参考

1、前言

我们不应该期望Kubernetes Pod是健壮的,而是要假设Pod中的容器很可能因为各种原因发生故障而死掉。Deployment等Controller会通过动态创建和销毁Pod来保证应用整体的健壮性。换句话说,Pod是脆弱的,但应用是健壮的。每个Pod都有自己的IP地址。当Controller用新Pod替代发生故障的Pod时,新Pod会分配到新的IP地址。这样就产生了一个问题:如果一组Pod对外提供服务(比如HTTP),它们的IP很有可能发生变化,那么客户端如何找到并访问这个服务呢?Kubernetes给出的解决方案是Service。

2、基本语法

2.1 Service yaml

apiVersion: v1
kind: Service
metadata:
  name: httpd-demo-1
  namespace: test
  labels:
    app: httpd-demo
spec:
  selector:
    app: httpd-demo
  ports:
  - port: 80
    protocol: TCP

2.2 关键字段

  • selector:选择器。selector是一个键值对,用于指定Service要代理的Pod的标签。Service会自动检测满足selector条件的Pod,并将流量转发给它们。
  • ports:用于定义Service所使用的端口。这个字段是一个对象,其中包含多个字段,最常用的两个字段是port和targetPort

2.3 port、nodePort、targetPort、containerPort字段说明

image

port是暴露在cluster ip上的端口,:port提供了集群内部客户端访问service的入口,即clusterIP:port。

nodePort提供了集群外部客户端访问service的一种方式,:nodePort提供了集群外部客户端访问service的端口,即nodeIP:nodePort提供了外部流量访问k8s集群中service的入口。

targetPort是pod上的端口,从port/nodePort上来的数据,经过kube-proxy流入到后端pod的targetPort上,最后进入容器。

containerPort是在pod控制器中定义的、pod中的容器需要暴露的端口。

3、Service 类型

3.1 ClusterIP

Service通过Cluster内部的IP对外提供服务,只有Cluster内的节点和Pod可访问,这是默认的Service类型。

3.2 NodePort

将Service通过指定的Node上的端口暴露给外部,访问任意一个 NodeIP:nodePort都将路由到ClusterIP。

端口范围:30000-32767,可以不指定,k8s会生成一个nodePort

3.3 LoadBalancer

使用云平台的负载均衡器向外部公开 Service。Kubernetes 不直接提供负载均衡组件; 你必须提供一个,或者将你的 Kubernetes 集群与某个云平台集成。

3.4 ExternalName

将服务映射到 externalName 字段的内容(例如,映射到主机名 api.foo.bar.example)。 该映射将集群的 DNS 服务器配置为返回具有该外部主机名值的 CNAME 记录。 集群不会为之创建任何类型代理。

4、无头服务(Headless Services)

service 有一个特别的形态就是 Headless Service。service 创建的时候可以指定 clusterIP:None,告诉 K8s 说我不需要 clusterIP(就是刚才所说的集群里面的一个虚拟 IP),然后 K8s 就不会分配给这个 service 一个虚拟 IP 地址,它没有虚拟 IP 地址怎么做到负载均衡以及统一的访问入口呢?

它是这样来操作的:pod 可以直接通过 service_name 用 DNS 的方式解析到所有后端 pod 的 IP 地址,通过 DNS 的 A 记录的方式会解析到所有后端的 Pod 的地址,由客户端选择一个后端的 IP 地址,这个 A 记录会随着 pod 的生命周期变化,返回的 A 记录列表也发生变化,这样就要求客户端应用要从 A 记录把所有 DNS 返回到 A 记录的列表里面 IP 地址中,客户端自己去选择一个合适的地址去访问 pod。

无头 Service 不会获得集群 IP,kube-proxy 不会处理这类 Service, 而且平台也不会为它们提供负载均衡或路由支持。你可以使用无头 Service 与其他服务发现机制交互,而不必绑定到 Kubernetes 的实现。

5、访问service

启动demo

apiVersion: v1
kind: Service
metadata:
  name: httpd-demo-1
  namespace: test
  labels:
    app: httpd-demo
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    app: httpd-demo

---

apiVersion: v1
kind: Service
metadata:
  name: httpd-demo-2
  namespace: test
  labels:
    app: httpd-demo
spec:
  type: NodePort
  ports:
  - nodePort: 32181
    port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: httpd-demo

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd-demo
  namespace: test
  labels:
    app: httpd-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: httpd-demo
  template:
    metadata:
      labels:
        app: httpd-demo
    spec:
      containers:
      - name: httpd-demo
        image: httpd:latest
kubectl --kubeconfig=xxx apply -f service.yaml  

启动一个busybox镜像的pod,方便连接service进行测试

apiVersion: v1
kind: Pod
metadata:
  name: busybox-test
  namespace: test
  labels:
    app: busybox
spec:
  containers:
  - name: busybox-test
    image: busybox:latest
    command: ["/bin/sh", "-c"]
    args:
    - |
      sleep 100000

查看当前service

kubectl --kubeconfig=xxx get svc -n test

NAME                          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
httpd-demo-1                  ClusterIP   10.30.99.106    <none>        80/TCP         1h
httpd-demo-2                  NodePort    10.30.167.74    <none>        80:32181/TCP   1h

通过nodeIp:nodePort访问
http://xx.xx.xx.xx:32181/

集群内访问
curl 10.30.99.106:80

其他pod访问

kubectl --kubeconfig=xxx exec -it -n test busybox-test sh

# 通过clusterIp访问service
wget -O- 10.30.99.106
# 通过环境变量访问service
wget -O- $HTTPD_DEMO_1_SERVICE_HOST
# 通过服务名访问service,如果是不同namespace,加上.namaspace
wget -O- httpd-demo-1
wget -O- httpd-demo-1.test

# 查看环境变量,可以看到写入了很多环境变量,如xxx_SERVICE_HOST xxx_PORT
env |grep HTTPD_DEMO

image

参考

  • https://kubernetes.io/docs/concepts/overview/
  • 阿里云——云原生技术公开课
  • https://blog.csdn.net/GuXiaoyan12/article/details/103751227

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

R文件详细介绍、瘦身方案和原理

文章目录 1. 背景2. R文件介绍2.1 R文件概念2.1.1 标识符是怎么与资源联系起来的&#xff1f; 2.2 R文件内容2.3 library module和aar的R文件内容生成规则2.4 是谁生成的R文件&#xff1f;2.5 打包之后的R文件2.6 R文件为啥大&#xff1f;这么多&#xff1f; 3. 为什么R文件可以…

RK356x U-Boot研究所(开发篇)5.1 启动SATA硬盘中的固件

平台U-Boot 版本Linux SDK 版本RK356x2017.09v1.2.3RK356x支持从SATA硬盘中启动固件,只要板卡中有预留这个接口即可。值得注意的是,这个固件不能从maskrom阶段就直接进行加载,需要从别的媒介启动(Flash、eMMC或者TF卡)后跑到U-Boot阶段,在这个U-Boot阶段再去加载SATA硬盘…

黑豹程序员-架构师学习路线图-百科:Java的第二春Spring框架

文章目录 1、 Spring的发展历史2、为什么Spring能霸屏&#xff1f;2.1、容器的设计2.2、通过四个策略2.3、三种方式 3、学习编程设计的典范 1、 Spring的发展历史 正当SUN公司的EJB在全球开始热炒时&#xff0c;正当程序员纷纷转型EJB开发时&#xff0c;正当程序员为跑通EJB程…

昇腾CANN 7.0 黑科技:大模型训练性能优化之道

目前&#xff0c;大模型凭借超强的学习能力&#xff0c;已经在搜索、推荐、智能交互、AIGC、生产流程变革、产业提效等场景表现出巨大的潜力。大模型经过海量数据的预训练&#xff0c;通常具有良好的通用性和泛化性。用户基于“大模型预训练微调”开发范式即可在实际业务场景取…

量子力学期末复习--1

量子力学解题技巧--1 基础知识 薛定谔方程 Ehrenfest 定理 不确定性原理&#xff1a;正则对易关系&#xff1a;自由粒子&#xff1a;对于自由粒子&#xff0c;分离变量解不代表物理上可实现的态。但其含时薛定谔方程的一般解仍旧是分离变量解的线性组合 典型题目 自由粒子…

029-第三代软件开发-加载本地字体库

第三代软件开发-加载本地字体库 文章目录 第三代软件开发-加载本地字体库项目介绍加载本地字体库 关键字&#xff1a; Qt、 Qml、 QFont、 QFontDatabase、 ttf 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object Langu…

深圳世有伯乐教育科技有限公司——LJ培训

今天来吐槽一波 深圳世有伯乐教育科技有限公司就是一个垃圾的培训机构&#xff0c;不&#xff0c;说是培训机构都是扭曲事实了&#xff0c;因为它根本就没有国家认可的办学许可证。光说没法让人信服&#xff0c;以下是企查查的截图&#xff1a; 世有伯乐的工商信息图片 续上&…

MPC预测控制概述和C++ 中的模型库

系列续篇&#xff1a; C 中的模型预测路径积分 (MPPI) 控制-CSDN博客 一、说明 以下文章描述了应用模型预测控制器的简单控制系统方法。本文讨论了这种类型的控制的基本机制&#xff0c;该机制适用于各种工程领域。 MPC 涉及对未来系统行为的预测&#xff08;由一组方程描述的模…

.net6部署到linux上(CentOS Linux 7)

目录 一、先在linux上配置.net环境 添加 Microsoft 包存储库 安装 SDK 安装运行时 检查 SDK 版本可使用终端查看当前安装的 .NET SDK 版本。 打开终端并运行以下命令。 二、创建.net6 mvc项目 并发布 创建项目 修改默认端口 打包发布到文件夹 运行打包项目查看项目是否…

华为OD机试 - 代表团坐车 - 动态规划(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

【vue】vue本地储存、会话存储插件vue-ls的使用:

文章目录 一、安装&#xff1a;二、vue项目中使用&#xff1a;三、API说明&#xff1a; 一、安装&#xff1a; npm install vue-ls -S 或 yarn add vue-ls二、vue项目中使用&#xff1a; //在vue项目中的入口文件main.js中引入import Storage from vue-ls;options {namespac…

DNS和ICMP协议

目录 一、DNS协议 二、ICMP协议 1.ICMP协议 2.ping命令 在讲完了OSI模型每层协议的讲解后&#xff0c;还有一些协议我们需要再讲解一下。 一、DNS协议 DNS是一整套从域名映射到IP地址的系统&#xff0c;也叫做域名解析服务&#xff0c;端口号为53。 我们生活中访问网站都…

微软 Win11 Dev 预览版 Build 23570 发布,修复文件资源管理器卡顿问题

本心、输入输出、结果 文章目录 微软 Win11 Dev 预览版 Build 23570 发布&#xff0c;修复文件资源管理器卡顿问题前言微软 Win11 Dev 预览版 Build 23570 发布&#xff0c;修复文件资源管理器卡顿问题完整的更新日志[Windows 中的 Copilot][开始菜单][任务栏搜索][设置] 已知问…

P1950 长方形

题目&#xff1a; P1950 长方形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 算法&#xff1a; dp动态规划 代码&#xff1a; #include<iostream> #include<string> typedef unsigned long long ull; const int N 1010; using namespace std;int r, c, i, …

kali安装nodejs、npm失败

更新apt-get再安装&#xff0c;更新时间比较久&#xff0c;看网速&#xff0c;中间有一些确认步骤 22 apt-get update23 apt-get upgrade24 apt-get install nodejs25 node26 npm27 apt-get install npm

vulnhub靶机Funbox11

下载地址&#xff1a;Funbox: Scriptkiddie ~ VulnHub 主机发现 arp-scan -l 目标192.168.21.164 端口扫描 nmap --min-rate 1000 -p- 192.168.21.164 端口好多处理一下吧 nmap --min-rate 1000 -p- 192.168.21.164 |grep open |awk -F / {print $1} |tr \n , 端口服务版本…

Openssl数据安全传输平台004:套接字C语言API封装为C++类 / 客户端及服务端代码框架

1. 客户端C API // 客户端 // C API int sckClient_init(); /* 客户端 连接服务器 */ int sckClient_connect(char *ip, int port, int connecttime, int *connfd); /* 客户端 关闭和服务端的连接 */ int sckClient_closeconn(int connfd); /* 客户端 发送报文 */ int sckClie…

1024MSF工具的基本使用(第十五课)

1024MSF工具的基本使用(第十五课) 1 MSF 介绍 MSF&#xff08;Metasploit Framework&#xff09;是一款开源的渗透测试工具&#xff0c;旨在帮助安全专家进行安全测试&#xff0c;评估和漏洞利用。MSF提供了一系列的漏洞利用、Payload以及Post Exploit模块&#xff0c;使得渗…

【经验分享】WSL中使用USB设备

具体步骤&#xff1a; 首先在windows中安装 USBIP 工具&#xff0c;在GitHub上下载安装包并根据README文档的说明进行操作&#xff1a; 下载链接&#xff1a;https://github.com/dorssel/usbipd-win/releases 同时在 WSL Linux 端也需要安装编译内核所需的库和工具&#xff0c…

在 Python 中执行 Shell 命令并获取输出

在本文中&#xff0c;我们将学习如何借助 os.system() 从 Python 脚本执行 cmd 命令。 我们还将学习如何借助 Python 中的 subprocess 模块以更简单的方式从脚本执行 cmd 命令。 从 Python 脚本执行 CMD 命令并使用 os.system() 获取输出 我们出于不同目的在命令提示符或任何其…