K8s服务发布基础
目录
一:Service 的概念和原理
1:Service定义
2:Service原理
1:service 基本原理介绍
2:Service 的负载均衡机制
3:kubeproxy 的代理模式
4:service 的 4 种类型
二:ClusterIP 类型 service
三:NodePort 类型的 service
四:LoadBalancer 类型的 service
五:ExternalName 类型的 service
六:service的其他应用
1:Service的多端口设置
2:Kubernetes服务发现
七:案例练习
1:案例一
一:Service 的概念和原理
1:Service定义
service 是 kubernetes 中的一种抽象,用于定义一组 pod 以及访问这一组 pod 的策略、service 的作用是将一组 pod 封装为一个虚拟的服务,并提供一个统一的入口,供客户端访问。service 支持负载均衡、服务发现、服务暴露等功能。
Service 用于为一组提供服务的 Pod 抽象一个稳定的网络访问地址,是 k8s 实现微服务的核心概念。通过 Service 的定义设置的访问地址是 DNS 域名格式的服务名称,对于客户端应用来说,网络访问方式并没有改变。Service 还提供了负载均衡器的功能,将客户端请求负载分发到后端提供具体服务的各个 Pod 上。
Service 主要用于提供网络服务,通过 Service 的定义,能够为客户端应用提供稳定的访问地址(域名或 IP 地址)和负载均衡功能,以及屏蔽后端 EndPoint 的变化,是 Kubernetes 实现微服务的核心资源。
总之,service 是 kubernetes 中一个非常重要的概念,service 用于将外部请求代理到内部 pod 上,提供 4 层负载均衡和服务发现的功能,使得我们可以构建高可用和可扩展的应用程序。
2:Service原理
1:service 基本原理介绍
在 kubernetes 中,pod 的 IP 地址是动态变化的,因此无法直接通过 pod 的 IP 地址进行访问。service 的出现正式为了解决这个问题的。service 会为一组 pod 创建一个虚拟的 IP 地址,通过这个 IP 地址可以访问这组 pod 中的任意一个 pod。当客户端请求这个虚拟 IP 地址时,请求会被负载均衡到一组 pod 中的某一个 pod 上,从而完成对 pod 的访问。
service 的实现依赖于 kube-proxy 组件。kube-proxy 会在每个节点上监听 service 的变化,一旦有 service 发生变化,kube-proxy 会更新本地的 iptables 规则,从而实现流量的转发和负载均衡。
另外,service 还与 CoreDNS 有关。CoreDNS 是 kubernetes 集群中的 DNS 解析服务。在 kubernetes 中 service 的虚拟 IP 地址还会注册到 CoreDNS 中,从而使得客户端还可以通过 service 名称访问 service 的虚拟 IP 地址。在 service 的定义中,可以通过 spec.selector 字段指定哪些 pod 属于这个 service,这样,就可以将请求负载均衡到这些 pod 中。
总之,service 是 kubernetes 中一种非常重要的资源对象,它可以让 pod 对外提供服务,并提供负载均衡、服务发现等功能。service 的实现依赖于 kube-proxy 和 CoreDNS 组件,他们共同协作,将 service 与 pod 连接起来,实现对 pod 的代理访问。
2:Service 的负载均衡机制
当一个 Service 对象在 Kubernetes 集群中被定义出来时,集群内的客户端应用就可以通过服务 IP 访问到具体的 Pod 容器提供的服务了。从服务 IP 到后端 Pod 的负载均衡机制,则是由每个 node 上的 kube-proxy 代理来负责实现的。
3:kubeproxy 的代理模式
kubeproxy 的代理模式有:userspace、iptables、ipvs 和 kernelspace。
4:service 的 4 种类型
kubernetes 支持 4 种 service 类型。
clusterIP类型
NodePort类型
LoadBalancer类型
ExternalName类型
二:ClusterIP 类型 service
描述:ClusterIP 是默认的 Service 类型。它将创建一个虚拟的 ClusterIP 地址,用于在集群内部访问 Service。使用场景:适用于集群内部的服务通信,例如将前端服务和后端服务连接起来,供内部其他服务使用。
方法一:通过 expose 命令创建 ClusterIP 类型的 Service
为了让客户端应用能够访问到前面创建的两个 Tomcat Pod 实例,需要创建一个 Service 来提供服务。k8s 提供了一种快速地方法,即通过 kubectl expose 命令来创建 Service。
#执行expose命令暴露端口
kubectl expose deployment webapp
#查看创建的Service
kubectl get svc
#访问测试
cur1 10.104.162.209:80
#删除此Service
kubect1 delete service webapp
方法二:使用 yaml 文件创建 Service
除了使用 expose 的命令创建 Service,更便于管理的方式是 yaml 文件来创建 Service。
#编辑service文件
vim webapp-service.yam1修改:port: 80targetPort: 80
#利用yam1创建此服务
kubect1 create -f webapp-service.yam1
kubect1 delete service webapp
(如果错了可以删除重建)
kubect1 create -f webapp-service.yam1
#查看创建的Service,并访问测试
kubectl get svc
cur1 10.108.79.50:80
#查看EndPoint列表
kubectl describe svc webapp
#查看EndPoint资源对象
kubectl get endpoints【删除这个Service
kubectl delete -f webapp-service.yam1
或
kubect1 delete service webapp】
三:NodePort 类型的 service
NodePort 将在每个节点上公开一个端口,并将流量转发到 Service。它会创建一个 ClusterIP,并将指定的端口映射到每个节点上的相同端口。
这种 service 适用于需要从外部访问集群中的服务时,可以通过节点的 IP 地址和映射的端口进行访问。这对于开发和测试环境非常有用。
#创建Service文件
vim webapp-svc-nodeport.yam1修改:port: 80targetPort: 80(要调成自己的端口)#创建此Service
kubectl create-f webapp-svc-nodeport.yam1
#查看创建的Service
kubectl get svc
#在windows宿主机上用浏览器测试访问
http://192.168.10.201:30008
http://192.168.10.202:30008
http://192.168.10.203:30008
#删除该Service
kubectl delete -f webapp-svc-nodeport.yam1
各关键字的含义如下:
- port:8080:这是Service的内部端口,即在Service内部暴露的端口。客户端请求会发送到这 个端口,并由Kubernetes负载均衡到后端的Pods上。
- targetPort:8080:这是指向后端Pods上的实际容器端口。当流量通过Service到达后端Pods 时,将被转发到这个端口。
- >nodePort:30008:这是在每个节点上打开的端口,用于外部流量进入集群。外部客户端可以通过 <node-ip>:<node-port>访问该Service。
四:LoadBalancer 类型的 service
通常在公有云的环境中会使用LoadBalancer的类型,可以将Service映射到公有云提供的某个负 载均衡器的IP地址上,客户端通过负载均衡器的IP和Service的端口号就可以访问到具体的服务。
描述:LoadBalancer为Service创建一个外部负载均衡器,并分配一个外部IP地址。它通常由 云提供商的负载均衡服务实现。
使用场景:适用于需要将流量从外部负载均衡器分发到集群内部的服务,例如在生产环境中暴露Web 应用程序。
#编写LoadBalancer类型的Service文件
vim webapp-svc-1oadbalancer.yam1修改:port: 80(要调成自己的端口)targetPort: http#创建此Service
kubectl create -f webapp-svc-1oadbalancer.yam1
#查看创建结果
kubectl get svc
#访问
#在windows宿主机上访问
http://192.168.10.201:30371(30371是随机生成的)
http://192.168.10.202:30371
http://192.168.10.203:30371#用于修改webapp
ku edit svc webapp
#删除此Service
kubectl delete -f webapp-svc-1oadbalancer.yam1
五:ExternalName 类型的 service
Externa1Name允许Service通过返回CNAME记录来引用集群外部的服务。它没有ClusterIP, NodePort或LoadBalancer。
适用于需要将K8s内部的服务与集群外的现有服务进行关联,例如连接到外部的数据库或其他资源。
ExternalName类型是Service的特例,用于将集群外的服务定义为Kubernetes的集群Service, 并通过ExternalName字段指定外部服务的地址,可以使用域名或IP格式。集群内客户端应用通过访问 这个Service就能访问外部服务了。他没有选择器,没有定义任何端口和EndPoint,他通过返回该外部 服务的别名来提供服务。
也可以用于两个不同的namespace之间的不同pod可以通过name的形式访问。
两个不同的命名空间中的pod,可以直接使用他们的IP地址进行通信,但是pod的IP地址是随机分 配的,重建pod后其IP地址就改变了,因此我们要用pod对应的service名称进行通信。但是跨命名空 间是不能解析其他命名空间中创建的service名称的。这个时候就可以使用Externa1Name实现两个不 同命名空间中的各个pod间的通信。接下来,我们一两个命名空间内Pod之间的访问为例,讲解 ExternalName的使用方法。
#创建案例所需的两个命名空间
kubectl create namespace test01
kubectl create namespace test02#创建第一个Pod
#创建命名空间为test01的Pod
vim myapp01.yam1
kubect1 create -f myapp01.yam1
#创建一个无头(headless)Service
vim myapp-svc-headless01.yam1
kubectl create -f myapp-svc-headless01.yam1
#创建extername
vim myapp-vc-extername01.yam1
kubectl create -f myapp-svc-extername01.yam1
ku get svc -n test01#创建第二个Pod
#创建命名空间为test02的Pod
vim myapp02.yam1
kubect1 create -f myapp02.yam1
#创建一个无头(headless)Service
vim myapp-svc-headless02.yam1
kubectl create -f myapp-svc-headless02.yam1
#创建extername
vim myapp-vc-extername02.yam1
kubectl create -f myapp-svc-extername02.yam1
ku get svc -n test02#验证Pod间的通信
#查看命名空间为test01的Pod
kubectl get pods -n test01
kubectl exec-it myapp01-696c886d6b-tq7vv -n test01--/bin/sh
/#nslookup myapp-svcname02
/#ping myapp-svcname02
/#nslookup myapp-svc02.test02.svc.cluster.local
/#ping myapp-svc02.test02.svc.cluster.1ocalkubectl get pods -n test02 -o wide
kubectl get pods -n test01 -o wide#查看命名空间为test02/01的Pod
kubectl get svc -n test02 -o wide
kubectl get svc -n test01 -o wide
六:service的其他应用
1:Service的多端口设置
一个容器应用可以提供多个端口的服务,在Service的定义中也可以相应的设置多个端口号。
#创建service文件
[root@k8s-master~]#cat service-multiple-ports.yam1
apiVersion:v1
kind: Service
metadata:
name:webapp
spec:
ports:
port:8080
targetPort:8080
name:web
protocol:TCP
port:8005
targetPort:8005
name:management
protocol:TCP
selector:
app:webapp
#创建service
[root@k8s-master ~]#kubectl create -f service-multiple-ports. yam1
#查看EndPoint列表
[root@k8s-master~]#kubectl describe svc webapp
#查看创建的Service
[root@k8s-master~]# kubect1 get svc webapp
#删除这个Service
[root@k8s-master ~]#kubect1 delete -f webapp-service.yam1
[root@k8s-master~]#kubectl delete service webapp
2:Kubernetes服务发现
- 基于环境变量的服务发现
- 基于DNS的服务发现
七:案例练习
1:案例一
[root@k8s-master ~]#cat<EOF>nginx-service.yam1
apiVersion:v1
kind: Service
metadata:
name:mynginx
namespace:default
labels:
app:mynginx
spec:
type:LoadBalancer
ports:
port:80
targetPort:http
工场
protoco1:TCP
name:http
selector:
app:mynginx
apiVersion:apps/v1
kind:Deployment
metadata:
name:mynginx-deployment
namespace:default
1abels:
app:mynginx
spec:
replicas:2
州课
selector:
matchLabels:
app:mynginx
template :
metadata:
1abels:
app:mynginx
spec:
containers:
name:mynginx
image:nginx:1.7.9
ports:
- name:http
containerPort:80
protoco1:TCP
EOF