Kubernetes(k8s)-服务(Service)介绍
Kubernetes(k8s)-服务(Service)介绍
Kubernetes(k8s)中的Service是实现负载均衡和访问控制的核心组件。本文将详细介绍Service的基本概念、不同类型以及如何通过选择器与Pods建立连接。通过具体的YAML配置示例,帮助读者深入理解Service的工作原理和应用场景。
在前面的内容中,我们介绍了Docker的基本情况。目前,在规模较大的容器集群中,Kubernetes已经成为主流选择。然而,Kubernetes涉及的概念和功能确实很多,随着版本迭代还在不断增加。本文将基于作者的理解,重点介绍Kubernetes中的Service组件。
Service基本概念
在Kubernetes (k8s) 中,Service是一个抽象概念,它定义了一种访问和暴露一组运行在Pods中的应用的方法。Service使得外部访问Pods变得容易,并且为内部集群通信提供了一种稳定的方式,因为Pods可能会被杀死和动态创建。
Service有几种类型,每种类型提供不同的网络特性:
ClusterIP:这是默认的Service类型,它为Service在集群内部提供一个内部的IP地址,这样集群中的其他组件就可以访问它。这个IP地址是集群内部的,外部网络无法访问它。
NodePort:这种类型的Service在ClusterIP的基础上,为Service在每个节点的IP上提供一个静态端口(NodePort)。这样,Service可以通过
<NodeIP>:<NodePort>
的方式从集群外部访问。NodePort通常在30000-32767之间的范围内分配。LoadBalancer:这种Service类型在NodePort的基础上,还会请求云提供商的负载均衡器。这个负载均衡器会将外部的流量分发到集群中的Pods。这是让Service能够从互联网上可达的常用方式。
Service通过选择器(Selector)与Pods建立连接,选择器定义了Service要管理的Pods的标签。当一个Service被定义后,它会自动创建一个端点(Endpoints)对象来表示后端的Pods IP地址。
例如,假设你有一组标记为app=myapp
的Pods,你可以创建一个Service来选择这些Pods,并为它们提供一个单一的访问点。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 80
在这个例子中,Service将监听端口80,并将流量转发到标记为app=myapp
的Pods的80端口。其中port:80
是服务的端口,targetPort: 80
是容器的80端口。
但是如果我们没有相匹配的标签的pod,则这个时候svc是无法被访问的,因为它没有对应的后端。我们通过这个网络插件的iptables实现可以看到没有连接直接被REJECT(拒绝)。
如果我们准备好对应的匹配的pod,则这个svc就会有后端,访问就没问题。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: myapp
spec:
replicas: 3 # 设置你想要维持的Pod副本数量
selector:
matchLabels:
app: myapp # 定义选择器,用于确定哪些Pod属于此Deployment
template: # 这是创建新Pod时使用的模板
metadata:
labels:
app: myapp # 确保Pod标签与选择器匹配
spec:
containers:
- name: nginx
image: nginx # 使用Nginx镜像的特定版本
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80 # 容器监听的端口
#注意替换自己的ip地址
[root@master01 ~]# curl -o /dev/null \
> -s -w "%{http_code}\n" http://10.104.0.217
200
Service的存在确保即使后端Pods发生变化,前端客户端也无需知道这些变化,可以继续通过Service访问应用,因为svc会自动调整对后端的访问,实现自动屏蔽pod和增加扩容pod。这对于实现无缝的扩展和动态管理很重要。