K8s(七)四层代理Service

news2024/11/15 16:01:20

Service概述

Service在Kubernetes中提供了一种抽象的方式来公开应用程序的网络访问,并提供了负载均衡和服务发现等功能,使得应用程序在集群内外都能够可靠地进行访问。

每个Service都会自动关联一个对应的Endpoint。当创建一个Service时,Kubernetes会根据Service的选择器(selector)来找到匹配的Pod,并将这些Pod的IP地址和端口信息作为Endpoint的一部分。当Service接收到来自外部或内部的请求时,它会将请求转发到与之关联的Endpoint。Endpoint中包含了后端Pod的IP地址和端口信息,Service会根据负载均衡算法将请求转发到一个或多个后端Pod上。并且Service会自动关联到防火墙规则, 将pod的地址和端口保存在防火墙规则内

以上内容由gtp生成

举个例子,以前我访问pod资源要一个一个访问,现在我把一堆具有相同特征(如标签)的pod绑定一个service,然后在service内侧与pod端口绑定,service外侧映射一个端口到宿主机,service还能改dns改防火墙规则。这样直接访问宿主机的端口就能访问到一组pod的特定端口。跟nginx做反向代理负载均衡差不多

#查看帮助
kubectl explain Service
apiVersion   <string>
kind <string>
metadata     <Object>
spec <Object>
status       <Object>

kubectl explain Service.spec
allocateLoadBalancerNodePorts  <boolean>#是否是默认映射端口nodeports
#如果是,则会默认分配到30000-32767随机一个
clusterIP    <string>   #service的虚拟ip地址
externalIPs  <[]string> #公开到集群外的ip
externalName <string> #指定外部dns名称
externalTrafficPolicy <string> #定义外部流量策略,可选cluster或local
healthCheckNodePort  <integer> #用于健康检查的端口
sessionAffinity <string>  #会话策略,可选ClientIP或者None
type <string>  #类型,有四种,ExternalName, ClusterIP, NodePort, LoadBalancer
ports        <[]Object>

kubectl explain service.spec.ports
name <string>
nodePort     <integer> #对外映射的端口
port <integer> -required- #service的端口
protocol     <string> #可选SCTP、TCP、UDP

#在node上下载旧版本的nginx
ctr images pull docker.io/library/nginx:1.21
#创建被管理的pod的yaml文件
#
mkdir service
cd service
cat > pod.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pods
spec:
  replicas: 2
  selector:
    matchLabels:
      nginx: "1.21"
  template:
    metadata:
      labels:
        nginx: "1.21"
    spec:
      containers:
        - name: test1
          image: docker.io/library/nginx:1.21
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
          startupProbe:
            periodSeconds: 5
            initialDelaySeconds: 20
            timeoutSeconds: 5
            httpGet:
              scheme: HTTP
              port: 80
              path: /
          livenessProbe:
            periodSeconds: 5
            initialDelaySeconds: 20
            timeoutSeconds: 5
            httpGet:
              scheme: HTTP
              port: 80
              path: /
          readinessProbe:
            periodSeconds: 5
            initialDelaySeconds: 20
            timeoutSeconds: 5
            httpGet:
              scheme: HTTP
              port: 80
              path: /        
EOF
kubectl apply -f pod.yaml
#成功运行,就不去用curl验证了
kubectl get pods -w
NAME                   READY   STATUS    RESTARTS   AGE
pods-8599b54cf-6tzrx   0/1     Running   0          12s
pods-8599b54cf-vhxd8   0/1     Running   0          12s
pods-8599b54cf-6tzrx   0/1     Running   0          25s
pods-8599b54cf-vhxd8   0/1     Running   0          25s
pods-8599b54cf-6tzrx   1/1     Running   0          25s
pods-8599b54cf-vhxd8   1/1     Running   0          25s

ClusterIP模式

### ClusterIP模式仅允许集群内部访问
#创建servicea-clusterip.yaml
cat > service-clusterip.yaml << EOF
apiVersion: v1
kind: Service
metadata:
  name: service
spec:
  type: ClusterIP
  ports:
   - port: 80 #service内侧端口
     protocol: TCP
     targetPort: 80 #对应的pod的端口
  selector:    #筛选器,匹配标签nginx="1.21"的pod
     nginx: "1.21"
EOF
kubectl apply -f service.yaml
kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   12d
service      ClusterIP   10.107.178.176   <none>        80/TCP    31s
#查看Endpoint列表
#只有完成就绪探测的pod才会被service接管,才会被加入endpoint列表中。未完成启动探测的pod也不会
kubectl describe service service | grep Endpoint
Endpoints:         10.10.179.1:80,10.10.234.86:80
kubectl get ep service #也可以
NAME      ENDPOINTS                        AGE
service   10.10.179.1:80,10.10.234.86:80   2m54s
#测试
curl 10.10.179.1:80
#service自动生成域名,仅在pod内可以进行访问
service.default.svc.cluster.local:80
#进入pod
kubectl exec pods-8599b54cf-6tzrx -it -- /bin/sh
curl service.default.svc.cluster.local:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="<http://nginx.org/>">nginx.org</a>.<br/>
Commercial support is available at
<a href="<http://nginx.com/>">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
#清理
kubectl delete -f service-clusterip.yaml

nodeport模式

#nodeport允许将ServiceIp映射到宿主机外部
#创建service-nodeport.yaml
cat > service-nodeport.yaml << EOF
apiVersion: v1
kind: Service
metadata:
  name: service
spec:
  type: NodePort
  ports:
   - port: 80
     protocol: TCP
     targetPort: 80  #对应的pod的端口
     nodePort: 30080 #映射到物理机的端口,如果不写,会随机分配到30000-32767之间的一个
  selector:          #筛选器,匹配标签nginx="1.21"的pod
     nginx: "1.21"
EOF
kubectl apply -f service-nodeport.yaml
kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        12d
service      NodePort    10.108.9.134   <none>        80:30080/TCP   11s
#通过宿主机直接请求如图
ipvsadm -Ln | grep 30080 -A 2
TCP  172.17.0.1:30080 rr
  -> 10.10.179.1:80               Masq    1      0          0
  -> 10.10.234.86:80              Masq    1      0          0
--
TCP  192.168.8.160:30080 rr
  -> 10.10.179.1:80               Masq    1      0          1
  -> 10.10.234.86:80              Masq    1      0          0
--
TCP  192.168.122.1:30080 rr
  -> 10.10.179.1:80               Masq    1      0          0
  -> 10.10.234.86:80              Masq    1      0          0
--
TCP  10.10.189.192:30080 rr
  -> 10.10.179.1:80               Masq    1      0          0
  -> 10.10.234.86:80              Masq    1      0          0
kubectl delete -f service-nodeport.yaml

ExternalName模式

充当一个别名,将服务映射到集群外部的一个外部域名。当使用该服务时,Kubernetes会将服务的DNS解析为ExternalName指定的外部域名,从而实现对外部服务的访问。这种模式适用于需要将服务与集群外部的现有服务进行关联的场景。

#用以跨namespace调用资源
#创建一个新的ns
kubectl create ns server
#创建server中的yaml文件
cat > pod-in-server.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pods
  namespace: server
spec:
  replicas: 2
  selector:
    matchLabels:
      nginx: "1.21"
  template:
    metadata:
      labels:
        nginx: "1.21"
    spec:
      containers:
        - name: test1
          image: docker.io/library/nginx:1.21
          imagePullPolicy: IfNotPresent
EOF
kubectl apply -f pod-in-server.yaml
#创建pod in server中的service四层代理
cat > service-in-server.yaml << EOF
apiVersion: v1
kind: Service
metadata:
  name: service-in-server
  namespace: server
spec:
  selector:
     nginx: "1.21"
  ports:
   - name: http
     protocol: TCP
     port: 80
     targetPort: 80
EOF
kubectl apply -f service-in-server.yaml
#创建default中的service,设置为externalname
cat > service-externalname.yaml << EOF
apiVersion: v1
kind: Service
metadata:
  name: service
spec:
  type: ExternalName
  externalName: service-in-server.server.svc.cluster.local #设置要关联的service的域名
  ports:
   - port: 80
  selector: 
     nginx: "1.21"
EOF
kubectl apply -f service-externalname.yaml
kubectl get pods -n server
NAME                    READY   STATUS    RESTARTS   AGE
pods-8649769f54-fs72b   1/1     Running   0          22s
#进入默认的ns的pod中,通过域名访问server的ns中的pod资源
kubectl exec pods-8599b54cf-6tzrx -it -- /bin/sh
curl service-in-server.server.svc.cluster.local
#可以访问到
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="<http://nginx.org/>">nginx.org</a>.<br/>
Commercial support is available at
<a href="<http://nginx.com/>">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

#清理
kubectl delete -f service-externalname.yaml
kubectl delete -f service-in-server.yaml
kubectl delete -f pod-in-server.yaml

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

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

相关文章

springboot109新闻稿件管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的新闻稿件管理系统 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获…

SpringMVC下半篇之整合ssm

4.ssm整合 4.1.创建表 CREATE TABLE account (id int(11) NOT NULL AUTO_INCREMENT,name varchar(20) DEFAULT NULL,money double DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8;4.2.创建工程 4.3.pom.xml <?xml version"1.0" encoding&…

【图形学】颜色线性插值和Wu反走样算法

颜色线性插值 绘制一条颜色渐变的直线&#xff0c;直线上每一个点的颜色都来自端点颜色的线性插值。线性插值公式为 P ( 1 − t ) P s t a r t t P e n d P 是直线上任意一个点&#xff0c; P s t a r t 是直线的起点&#xff0c; P e n d 是直线的终点 对应直线上任意一点…

[flutter]GIF速度极快问题的两种解决方法

原因&#xff1a; 当GIF图没有设置播放间隔时间时&#xff0c;电脑上会默认间隔0.1s&#xff0c;而flutter默认0s。 解决方法一&#xff1a; 将图片改为webp格式。 解决方法二&#xff1a; 为图片设置帧频率&#xff0c;添加播放间隔。例如可以使用GIF依赖组件设置每秒运行…

低代码技术杂谈

一、探讨低代码的定义 “Low-Code”是什么&#xff1f;身为技术人员听到这种技术名词&#xff0c;咱们第一反应就是翻看维基百科 或者其他相关技术论文&#xff0c;咱们想看维基百科的英文介绍&#xff1a; A low-code development platform (LCDP) provides a development env…

Docker(七)使用网络

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; Docker 中的网络功能介绍 Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。 一、外部访问容器 容器中可以运行一些网络应用&…

数学建模常见算法的通俗理解(1)

目录 1.层次分析法&#xff08;结合某些属性及个人倾向&#xff0c;做出某种决定&#xff09; 1.1 粗浅理解 1.2 算法过程 1.2.1 构造判断矩阵 1.2.2 计算权重向量 1.2.3 计算最大特征根 1.2.4 计算C.I.值 1.2.5 求解C.R.值 1.2.6 判断一致性 1.2.7 计算总得分 2 神经…

go语言(八)---- map

map的声明方式有以下三种。 package mainimport "fmt"func main() {//第一种声明方式//声明map1是一个map类型&#xff0c;key是String&#xff0c;value是Stringvar myMap1 map[string] stringif myMap1 nil {fmt.Println("myMap1 是一个空map")}//在使…

多测师肖sir___ui自动化测试po框架(升级)

ui自动化测试po框架&#xff08;升级&#xff09; po框架 一、ui自动化po框架介绍 &#xff08;1&#xff09;PO是Page Object的缩写&#xff08;pom模型&#xff09; &#xff08;2&#xff09;业务流程与页面元素操作分离的模式&#xff0c;可以简单理解为每个页面下面都有一…

java数据结构与算法刷题-----LeetCode59. 螺旋矩阵 II

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 解题思路 初始&#xff0c;top行执向第一行&#xff0c;bottom行指向最后一…

积分梳状滤波器CIC原理与实现

CIC&#xff08;Cascade Intergrator Comb&#xff09;&#xff1a;级联积分梳状滤波器&#xff0c;是由积分器和梳状滤波器级联而得。滤波器系数为1&#xff0c;无需对系数进行存储&#xff0c;只有加法器、积分器和寄存器&#xff0c;资源消耗少&#xff0c;运算速率高&#…

TypeScript语法总结

JavaScript 与 TypeScript 的区别 TypeScript 是 JavaScript 的超集&#xff0c;扩展了 JavaScript 的语法&#xff0c;因此现有的 JavaScript 代码可与 TypeScript 一起工作无需任何修改&#xff0c;TypeScript 通过类型注解提供编译时的静态类型检查。 TypeScript 可处理已…

GitHub 13.7k star,一款让Windows和macOS瘦身减肥实用工具,免安装+开源+性能高

GitHub 13.7k star&#xff0c;一款让Windows和macOS瘦身减肥实用工具&#xff0c;免安装开源性能高 大家好&#xff01;我是老码农。 今天给大家推荐一款&#xff1a;让Windows和macOS操作系统瘦身减肥的实用工具&#xff0c;czkawka。 这款工具主要干啥事呢&#xff1f;说…

Latex绘图

排查Latex报错 “Command \csubfigure already defined” 这个可以通过添加如下命令&#xff1a; \usepackage{subfig} \usepackage{subfloat} ..... \begin{figure*}[h] \centering \subfloat[subfloat title]{ \label{fig:subfig:a} \includegraphics[scale0.7]{Figs/.....…

MeterSphere本地化部署实践

项目结构 搭建本地环境 安装JDK11&#xff0c;配置好JDK环境&#xff0c;系统同时支持JDK8和JDK11安装IEAD&#xff0c;配置JDK环境配置maven环境,IDEA配置(解压可以直接使用)无限重置IDEA试用期配置redis环境(解压可以直接使用) 配置kafka环境 安装mysql-5.7环境&#xff…

九州金榜|在孩子家庭教育中放手不放任

家庭教育&#xff0c;是每个父母都要面临的事情&#xff0c;也是每个家庭都要经历的&#xff0c;但是在目前的家庭教育中&#xff0c;孩子都是由父母规划&#xff0c;在一定程度上会对孩子的成长产生影响&#xff0c;如何科学家庭教育&#xff0c;九州金榜家庭教育有以下观点&a…

论文阅读笔记AI篇 —— Transformer模型理论+实战 (三)

论文阅读笔记AI篇 —— Transformer模型理论实战 &#xff08;三&#xff09; 第三遍阅读&#xff08;精读&#xff09;3.1 Attention和Self-Attention的区别&#xff1f;3.2 Transformer是如何进行堆叠的&#xff1f;3.3 如何理解Positional Encoding&#xff1f;3.x 文章涉及…

【蓝桥杯EDA设计与开发】立创开源社区分享的关于蓝桥被EDA真题与仿真题的项目分析

立创开源社区内有几个项目分享了往年 EDA 设计题目与仿真题&#xff0c;对此展开了学习。 【本人非科班出身&#xff0c;以下对项目的学习仅在我的眼界范围内发表意见&#xff0c;如有错误&#xff0c;请指正。】 项目一 来源&#xff1a;第十四届蓝桥杯EDA赛模拟题一 - 嘉立…

1432 - 走出迷宫的最少步数-广度优先搜索BFS

代码 #include<bits/stdc.h> using namespace std; char a[51][51]; int r,c; int fx[4]{0,0,1,-1}; int fy[4]{1,-1,0,0}; int tx,ty; struct Node{int x,y,step; }; int bfs(int x,int y){a[x][y]#;queue<Node> q;q.push({x,y,1});while(!q.empty()){Node Curre…

宋仕强论道之再混华强北(三十五)

我是2012年重新回到华强北的&#xff0c;宋仕强说来深圳市第一份工作就在华强北担任一名工程师&#xff0c;和华强北有深厚的感情。我回来后经常混华强北的上层圈子跟老板老板娘们吹牛逼&#xff0c;最初大家看我穿的衣冠楚楚人模狗样的但态度吊儿郎当&#xff0c;理论一套一套…