k8s篇之四、service
Ingress和我们之前提到的Service、Deployment也是一个k8s的资源类型,Ingress是用于实现用域名的方式访问k8s集群的内部应用,ingress受命名空间隔离。在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到:NodePort,此模式只能在云服务器上使用。Endpoint是kubernetes中的一个资源对象,存储
Service概念
- Kubernetes Pod是有生命周期的,它们可以被创建,也可以被销毁,然而一旦被销毁生命就永远结束,
- 每个 Pod 都会获取它自己的 IP 地址,可一旦销毁后,重新创建后,IP地址会产生改变。
这时候我们通过 k8s中的Service 访问整个pod集群,只要Service不被销毁,pod不断发生变化 入口访问的ip总是固定。 - Service资源用于为pod对象提供一个固定、统一的访问接口及负载均衡的能力,并借助新一代DNS系统的服务发现功能,解决客户端发现并访问容器化应用的问题。
- kubernetes中的service是一种逻辑概念。它定义了一个pod逻辑集合以及访问它们的策略,service与pod的关联同样是通过label完成的。service的目标是提供一种桥梁,他会为访问者提供一个固定的访问IP地址,用于在访问时重定向到相应的后端。
- Service 实现对pod 负载均衡
- labels 标签 来管理 pod集群的
Service类型
-
- ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。一个Service可能对应多个EndPoint(Pod),client访问的是Cluster IP,通过iptables规则转到Real Server,从而达到负载均衡的效果
-
- NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个
-
- NodeIP:nodePort都将路由到ClusterIP。
-
- LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到:NodePort,此模式只能在云服务器上使用。
-
- ExternalName:将服务通过 DNS CNAME记录方式转发到指定的域名(通过 spec.externlName 设定)
1.在同一个命名空间下启动三个不同的pod
2.修改每个pod里面的 nginx 容器信息 例如 nginx 1 nginx2 nginx3
Endpoint(端点)
Endpoint 类似我们在之前所学习的 服务注册中心 (eureka、nacos)
Endpoint是kubernetes中的一个资源对象,存储在etcd中,用于记录一个service对应的所有pod的访问地址
# 查询服务详情查看端点
kubectl describe svc mayikt-clusterip -n mayikt-sit
# 查询服务端点ip
kubectl get endpoints -n mayikt-sit -o wide
命令
# 查询服务信息 [服务名] [命名空间]
kubectl describe svc mayikt-clusterip -n mayikt-sit
# 查询ip
iptables -t nat -nL |grep 80
# 查询正在运行的pod/服务
kubectl get pods,service
一、ClusterIP(内部访问)
默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。一个Service可能对应多个EndPoint(Pod),client访问的是Cluster IP,通过iptables规则转到Real Server,从而达到负载均衡的效果
Service 是由 kube-proxy 组件,加上 iptables 来共同实现的
apiVersion: v1
kind: Service
# 命名空间配置
metadata:
name: mayikt-clusterip
namespace: mayikt-sit
spec:
# pod 标签选择器
selector:
app: nginx-pod
clusterIP: # service的ip地址, 如果不写默认会生成一个随机的IP
type: ClusterIP # service 类型
ports:
- port: 80 # Service端口
targetPort: 80 # pod端口
# 让同一个客户端的ip只会轮训到一个节点上
# sessionAffinity: ClientIP
可使用下方命令循环测试连接
while true ;do curl 10.103.216.229 ; sleep 1;done;
二、NodePort (节点端口, 暴露给外部可直接访问)
将我们的service端口映射到node节点上的一个端口,让后我们就可以通过 node节点ip:node节点端口访问接口。
各节点ip:30008 可以直接访问到, 节点中80端口的服务
apiVersion: v1
kind: Service
metadata:
name: mayikt-service
namespace: mayikt-sit
spec:
selector:
app: nginx-pod
type: NodePort # service类型
ports:
- port: 80 # Service端口
nodePort: 30008 # 指定绑定的node的端口(默认的取值范围是: 30000-32767), 如果不指定,会默认分配
targetPort: 80 # pod端口
三、LoadBalance
在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到:NodePort,此模式只能在云服务器上使用。
例如 f5 dns 轮询解析
四、Ingress
因为在pod多的时候,NodePort性能会急剧下降,如果你的k8s集群有成百上千的服务那岂不是要管理成百上千个NodePort
Ingress和我们之前提到的Service、Deployment也是一个k8s的资源类型,Ingress是用于实现用域名的方式访问k8s集群的内部应用,ingress受命名空间隔离
使用待定
更多推荐
所有评论(0)