编辑
2025-08-19
K8S(重新复习)
00

目录

一、Service概念
二、使用Service
Service多端口使用

一、Service概念

在Kubernetes(K8s)中,Service是一种核心资源对象,主要用于将一组Pod抽象为网络服务,提供稳定的访问入口和负载均衡功能

1.其核心作用包括

  • ‌服务发现与稳定性‌
  • 为动态变化的Pod提供固定IP和DNS名称,即使Pod因扩缩容或故障导致IP变化,客户端仍可通过Service稳定访问
  • 通过Label Selector自动关联匹配标签的Pod,实现服务自动发现

‌2.负载均衡‌

  • 将请求均匀分发到后端多个Pod副本,提高系统扩展性和可靠性

  • 支持轮询、最少连接数等多种调度策略

‌3.故障隔离‌

  • 自动检测故障Pod并将其从服务池中剔除,确保请求不被故障节点处理

‌4.网络抽象‌

  • 对内:屏蔽Pod细节,客户端只需访问Service的Cluster IP

  • 对外:通过Ingress配合可将HTTP/HTTPS流量路由到Service

‌5.服务类型‌

  • ClusterIP(默认):集群内部访问

  • NodePort:通过节点端口暴露服务

  • LoadBalancer:集成云提供商负载均衡器

  • ExternalName:映射外部服务

Service通过kube-proxy组件实现流量转发,支持userspace(用户空间代理)和iptables/IPVS等模式 ,是K8s微服务架构的关键组件

二、使用Service

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用于测试

yml
apiVersion: 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内部访问)

image.png

image.png

当我用浏览器访问外部暴露端口时也是成功的

访问pod分配的是哪个工作节点的IP(该pod策略分配的是NODE1,IP就是192.168.201.101),外部端口没有固定是随机分配的固定在 30000-32767 之间

image.png image.png

Service多端口使用

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 image.png

本文作者:松轩(^U^)

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

Document