大家好,我是Zhan,一名个人练习时长一年半的大二后台练习生
这篇文章是学习 Kubernetes 的第五篇学习笔记
假如有不对的当地,欢迎各位指正
与君同舟渡,达岸各自归
引语
在上篇文章【云原生 • Kubernetes】(四) k8s 本来不是直接创立 Pod!! – ()中,我们解说了 Kubernetes 中 四种Controller 的运用,了解到了,是 Controller
让 Pod 有了 运维的才能 以及更好的 办理,不过在文章末尾处我也提到了:Pod 无法供给网络服务、以及完成负载均衡,因此为了让 Pod 供给对外的网络拜访,本文将会解说 Service:
- 什么是 Service 以及 Service 的效果与特性
- Service 与 Pod 之间又是什么样的联系
- 怎么运用和装备 Service
- Service 有哪些类型
1️⃣ 什么是 Service
官网地址:kubernetes.io/zh-cn/docs/…
1.1 界说
官网给出的界说是:Service 是 将运行在一个或一组Pod上的网络运用程序揭露为网络服务的办法。
浅显来讲,Service 是为 Pod 供给网络服务的一种办法
1.2 为什么需求 Service
在上文中我们也提到了,仅仅靠控制器无法供给网络服务,假如一组 Pod(例如 MySQL) 为集群内的其他的 Pod(Java) 供给服务,那么 Java 怎么找到 MySQL 的 IP 地址,假如 MySQL 具有多个副本,又当怎么呢?
有点类似于 SpringCloud 中的 注册中心,front pod
无需关怀它们调用了哪个 backend pod
,假如 backend pod
发生了何种改变,也无需 front pod
知情,Service 界说的笼统能够做到这种解耦。
1.3 Service 与 Ingess 的差异
Service
和Ingress
是Kubernetes
中用于办理和揭露运用程序的两个重要概念,它们有着不同的效果和功能。
-
Service
是 Kubernetes 中的一种笼统,Service 答应运用程序内部的各个组件(Pod)能够经过Service称号和端口号来相互通讯,而不需求直接露出Pod的IP地址。 -
Ingress
是 Kubernetes 中的一种资源对象,Ingress能够将外部的HTTP恳求路由到 Kubernetes 集群内部的Service,然后完成从集群外部拜访运用程序的才能 - 简而言之:
-
Service
用于在Kubernetes 内部 办理和拜访运用程序的不同组件 -
Ingress
用于从集群 外部 揭露运用程序的路由和拜访办法
-
- 一般情况下,Ingress会运用一个反向代理来处理外部的恳求,并将其转发到相应的Service上。
2️⃣ 特性
- Pod 经过 Label 与 Service 进行关联。这与 Controller 中的 Selector 一样,经过标签进行挑选。
- Service 生命周期与 Pod 无关,不会由于 Pod 的重新创立而改变 IP。无论 Service 关联的 Pod 怎么增缩,它的 IP 都不会改变。
- Service 供给了一种逻辑上的稳定网络端点,它能够将 恳求负载均衡 到后端的多个Pod实例上,然后完成运用程序的高可用性和扩展性。
- 能够对集群外部供给拜访端口。仅仅方便测验,在上面我们说的是一般运用情况,一般我们不会这么去用。
- 集群内部能够经过服务姓名进行拜访,不需求直接露出Pod的IP地址。
3️⃣ 运用 Service
3.1 装备文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 3
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
restartPolicy: Always
selector:
matchLabels:
app: nginx
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
# 经过标签进行挑选
selector:
app: nginx
ports:
# Service 的端口
- port: 80
# Pod 的端口,也就是 Container 中运用服务的端口
targetPort: 80
# 露出外部服务的端口,假如不写会自动分配,固定在 30000-32767
nodePort: 30080
# 通讯协议:TCP / UDP
protocol: TCP
# Service 的类型,NodePort 代表揭露NGINX运用程序
type: NodePort
3.2 装备解释
在spec部分:
-
selector
指定了Service将路由到具有标签app: nginx
的Pod
。 -
ports
界说了Service的端口装备,这儿将容器端口 80 映射到Service
的端口 80。一同指定了NodePort
为30080
,表明该Service
将在一切节点上的30080端口上揭露。 -
protocol
设置为TCP
,表明运用TCP协议
进行通讯。 - 最后,Service的
type
设置为NodePort
,表明运用NodePort类型的Service来揭露NGINX运用程序。
3.3 测验运用
至此,成功创立好一个 Service,我们能够做到:
-
在同一个命名空间下的其他容器,能够经过
curl Service的IP:port
拜访到 Pod 的targetPort
- 查看 Service 的 IP 的办法:
kubectl get services -o wide
- 能够创立一个
busybox:1.28
去进行测验,运用指令wget Service的IP:80
,就能够拉取到index.html
- 查看 Service 的 IP 的办法:
-
在容器外部拜访该Service对应的Pod,能够拜访
节点IP:NodePort
拜访到Nginx 的 Index.html
- 查看 Pod 在哪个结点上:
kubectl get pods -o wide
,拿到该节点地点的服务器的公网 IP - 浏览器拜访:
http://节点IP:30080
就能够拜访到index.html
- 查看 Pod 在哪个结点上:
3.4 负载均衡
为了验证拜访 Service 是否会有负载均衡,我们别离进入这三个容器:
- 修正它们的
Index.html
别离为:Nginx-01、Nginx-02、Nginx-03
- 然后在某个节点不断的运用指令拜访:
curl Service的IP:port
,这儿我们能够看到他们三者都会出现
4️⃣ 类型 type
上文中我们演示的类型为:NodePod,表明运用NodePort类型的Service来揭露NGINX运用程序。而 type 其实有四种类型:
-
ClusterIP
: 在集群内部露出 Service,只能被集群内部的其他对象拜访,一般用于内部服务发现,不会向集群外部拜访。- 比如在一个 Web 运用中,你或许需求连接到一个数据库,但是这个数据库并不需求在运用之外露出,这时就能够运用 ClusterIP 类型的 Service,让运用能够拜访到数据库。
-
NodePort
: 将 Service 露出在 Node 的某个端口上,然后能够经过 Node 的 IP 和 端口号来拜访 Service,一般用于开发和测验环境 -
LoadBalancer
: 经过云服务供给的负载均衡器来将 Service 露出到公网上,使得外部用户能够拜访 Service- 适用于需求将运用程序揭露给公共互联网,或许需求经过云平台供给的负载均衡器来处理流量分发的情况。
-
ExternalName
: 将 Service 映射到一个DNS
称号上,然后能够经过DNS
称号来拜访 Service,一般用于外部拜访服务- 适用于需求将Service称号解析为外部DNS称号的情况,例如连接到集群外部的数据库或其他服务。
总结
为了处理 Controller 无法供给网络服务、以及完成负载均衡的问题,Service 应运而生,完成了 Pod 之间的通讯,经过Service称号和端口号来相互通讯,而不需求直接露出Pod的IP地址,与 Ingress 之间的差异也要记住,Controller 是 内部 办理和拜访运用程序的不同组件,Ingress 是 外部 揭露运用程序的路由和拜访办法。
友链
- ChatGPT
- 【编程不夫君】Kubernetes(k8s)实战教程
- 【Kubernetes文档】| Kubernetes 官方文档
- 【云原生 • Kubernetes】(一) 初识 Kubernetes – ()
- 【云原生 • Kubernetes】(二) Kubernetes 的组件与架构 – ()
- 【云原生 • Kubernetes】(三) k8s 怎么运行 Container? – ()
- 【云原生 • Kubernetes】(四) k8s 本来不是直接创立 Pod!! – ()
✒ 写在最后
都看到这儿啦~,给个点赞再走呗~,也欢迎各位大佬指正以及补充,在评论区一同交流,共同进步!也欢迎加微信一同交流:Goldfish7710。我们明天见~