在Kubernetes(K8s)中,Service是一种核心资源对象,主要用于将一组Pod抽象为网络服务,提供稳定的访问入口和负载均衡功能
1.其核心作用包括
2.负载均衡
将请求均匀分发到后端多个Pod副本,提高系统扩展性和可靠性
支持轮询、最少连接数等多种调度策略
3.故障隔离
4.网络抽象
对内:屏蔽Pod细节,客户端只需访问Service的Cluster IP
对外:通过Ingress配合可将HTTP/HTTPS流量路由到Service
5.服务类型
ClusterIP(默认):集群内部访问
NodePort:通过节点端口暴露服务
LoadBalancer:集成云提供商负载均衡器
ExternalName:映射外部服务
Service通过kube-proxy组件实现流量转发,支持userspace(用户空间代理)和iptables/IPVS等模式 ,是K8s微服务架构的关键组件
yml# 定义Kubernetes API版本和资源类型
apiVersion: apps/v1 # 使用apps/v1版本的API
kind: Deployment # 定义这是一个Deployment资源
# 元数据部分
metadata:
name: example-app # Deployment的名称为example-app
labels: # 为Deployment添加标签
name: songxuan01 # 键值对标签,标识这个应用
# Deployment的规格定义
spec:
replicas: 3 # 指定需要运行的Pod副本数量为3个
# 选择器,用于匹配要管理的Pod
selector:
matchLabels:
name: songxuan01 # 选择带有name=songxuan01标签的Pod
# Pod模板,定义如何创建Pod
template:
metadata:
labels:
name: songxuan01 # 为Pod添加标签,与selector匹配
spec:
# 容器定义
containers:
- name: nginx # 容器名称
image: nginx:1.19 # 使用nginx 1.19版本的镜像
ports:
- containerPort: 80 # 容器暴露的端口号
# 亲和性调度规则
affinity:
nodeAffinity: # 节点亲和性规则
# 必须满足的条件(硬性要求)
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: name # 节点区域标签
operator: In # 操作符,表示值必须在指定列表中
values:
- songxuan01 # 必须部署在songxuan01
# 优先满足的条件(软性偏好)
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 80 # 权重为80(相对权重)
preference:
matchExpressions:
- key: name # 磁盘类型标签
operator: In
values:
- songxuan02 # 优先选择有songxuan02磁盘的节点
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP # 协议选择TCP
port: 80 # Service暴露的端口
targetPort: 80 # Pod中Nginx容器监听的端口
type: NodePort # Service类型为NodePort 通过节点端口暴露服务
通过该yml文件配置了service服务,属于该命名空间下的pod都能互相访问
创建一个测试的pod用于测试
ymlapiVersion: apps/v1
kind: Deployment
metadata:
name: xuan
labels:
app: xuan
spec:
replicas: 1
selector:
matchLabels:
app: xuan
template:
metadata:
name: xuan
labels:
app: xuan
spec:
containers:
- name: alpine
image: alpine:3.18
command: ["/bin/sh", "-c"]
args: ["apk add --no-cache curl && while true; do sleep 30; done"]
imagePullPolicy: IfNotPresent
restartPolicy: Always
当我进入测试pod去访问NGINX做了service的pod是能成功访问的(pod内部访问)
当我用浏览器访问外部暴露端口时也是成功的
访问pod分配的是哪个工作节点的IP(该pod策略分配的是NODE1,IP就是192.168.201.101),外部端口没有固定是随机分配的固定在 30000-32767 之间
yml# 定义Kubernetes API版本和资源类型
apiVersion: apps/v1 # 使用apps/v1版本的API
kind: Deployment # 定义这是一个Deployment资源
# 元数据部分
metadata:
name: example-app # Deployment的名称为example-app
labels: # 为Deployment添加标签
name: songxuan01 # 键值对标签,标识这个应用
# Deployment的规格定义
spec:
replicas: 3 # 指定需要运行的Pod副本数量为3个
# 选择器,用于匹配要管理的Pod
selector:
matchLabels:
name: songxuan01 # 选择带有name=songxuan01标签的Pod
# Pod模板,定义如何创建Pod
template:
metadata:
labels:
name: songxuan01 # 为Pod添加标签,与selector匹配
spec:
# 容器定义
containers:
- name: nginx # 容器名称
image: nginx:1.19 # 使用nginx 1.19版本的镜像
ports:
- containerPort: 80 # 容器暴露的端口号
# 亲和性调度规则
affinity:
nodeAffinity: # 节点亲和性规则
# 必须满足的条件(硬性要求)
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: name # 节点区域标签
operator: In # 操作符,表示值必须在指定列表中
values:
- songxuan01 # 必须部署在songxuan01
# 优先满足的条件(软性偏好)
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 80 # 权重为80(相对权重)
preference:
matchExpressions:
- key: name # 磁盘类型标签
operator: In
values:
- songxuan02 # 优先选择有songxuan02磁盘的节点
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP # 协议选择TCP
port: 8080 # Service暴露的端口
targetPort: 80 # Pod中Nginx容器监听的端口
name: songxuan01
nodePort: 30001 # 通过节点端口暴露服务
- protocol: TCP
port: 8081
targetPort: 80
name: songxuan02
nodePort: 30002
type: NodePort # Service类型为NodePort 通过节点端口暴露服务
多端口访问指定的30001和30002
本文作者:松轩(^U^)
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!