服务发现 —— Service(主要用于服务内的网络共享)
1.K8S基础2.搭建 Kubernetes 集群 —— 搭建方案 kubeadm3.搭建 Kubernetes 集群 —— 命令行工具 kubectl4.搭建 Kubernetes 集群 —— API 概述5.深入Pod —— 配置文件6.深入Pod —— 探针7.深入Pod —— 生命周期 及 PreStop事件的应用8.资源调度 —— Label 和 Selector:标签和选择器9.资源调度 —— Deployment(针对部署的无状态应用)10.资源调度 —— StatefulSet(针对部署的有状态应用)11.资源调度 —— DaemonSet:守护进程应用场景(Fluent日志收集程序)12.资源调度 —— HPA:Pod基于负载指标自动水平扩容 / 缩容
13.服务发现 —— Service(主要用于服务内的网络共享)
14.服务发现 —— Ingress(用于外部服务的发现和统一入口)15.配置与存储 —— 配置管理16.配置与存储 —— 持久化存储17.高级调度 —— CronJob计划任务、初始化容器 InitContainer18.高级调度 —— 污点、容忍19.高级调度 —— 亲和力(Affinity)20.身份认证与权限21.Helm 包管理器负责东西流量(同层级/内部服务网络通信)的通信
一、Service 的定义
apiVersion: v1
kind: Service # 资源类型为 Service
metadata:
name: nginx-svc # Service 名字
labels:
app: nginx-svc # Service 自己本身的标签
spec:
selector: # 选中当前 service 匹配哪些 pod,对哪些 pod 的东西流量进行代理(配置后会自动生成 endpoint)
app: nginx # 所有匹配到这些标签的 pod 都可以通过该 service 进行访问
ports: # 端口映射
- name: http # service 端口配置名称
protocol: TCP # 端口绑定的协议,支持 TCP、UDP、SCTP,默认为 TCP
port: 80 # service 自己的端口,在使用内网 ip 访问时使用
targetPort: 9527 # 转发到目标 pod 的端口,
- name: https
port: 443
protocol: TCP
targetPort: 443
type: NodePort # 随机启动一个端口(30000 ~ 32767),映射到ports中的端口,该端口是直接绑定在node上的,且集群中的每一个node都会绑定这个端口。
# 也可以用于将服务暴露给外部访问,但是这种方式实际生产环境不推荐,效率较低,而且Service 是四层负载。
一)常用类型
1、NodePort
会在所有安装了 kube-proxy 的节点都绑定一个端口,此端口可以代理至对应的 Pod,集群外部可以使用任意节点 ip + NodePort 的端口号访问到集群中对应 Pod 中的服务。
当类型设置为 NodePort 后,可以在 ports 配置中增加 nodePort 配置指定端口,需要在下方的端口范围内,如果不指定会随机指定端口
端口范围:30000~32767
端口范围配置在 /usr/lib/systemd/system/kube-apiserver.service 文件中
2、ClusterIP
只能在集群内部使用,不配置类型的话默认就是 ClusterIP,对于微服务可以绝大多数满足
3、ExternalName
返回定义的 CNAME 别名,可以配置为域名
4、LoadBalancer
使用云服务商(阿里云、腾讯云等)提供的负载均衡器服务
NodePort 和 LoadBalancer 均可实现外网暴露,但是不建议,因为效率不高
二)命令操作
# 创建 service
kubectl create -f nginx-svc.yaml
# 查看 service 信息,通过 service 的 cluster ip 进行访问
kubectl get svc
# 查看 pod 信息,通过 pod 的 ip 进行访问
kubectl get po -owide
# 查看 service 详细信息(含 endpoint 关联的ip和端口)
kubectl describe svc nginx-svc
# 创建其他 pod 通过 service name 进行访问(推荐)
kubectl exec -it busybox -- sh
curl http://nginx-svc
# 默认在当前 namespace 中访问,如果需要跨 namespace 访问 pod,则在 service name 后面加上 .<namespace> 即可
curl http://nginx-svc.default
三)Endpoint
Service、Endpoint、Pod之间的关系
过程:外部请求 通过 api-server 根据ip 找到 Servie ,Service 再找到 endpoing,通过 iptables 的转发 找到目标服务器,通过目标服务器找到对应的容器,进入容器再执行。

二、代理 k8s 外部服务
实现方式:
- 编写 service 配置文件时,不指定 selector 属性,就不会自动创建 endpoint
- 自己创建 endpoint
endpoint 配置:
apiVersion: v1
kind: Endpoints
metadata:
labels:
app: wolfcode-svc-external # 与 service 一致!!!!!!!!!!!!
name: wolfcode-svc-external # 与 service 一致!!!!!!!!!!!!!
namespace: default # 与 service 一致
subsets:
- addresses:
- ip: <target ip> # 目标 ip 地址
ports: # 与 service 一致
- name: http # **必须与 service 中 ports name 一致!!!!!!!!!!!!!!**
port: 80
protocol: TCP

使用场景
- 各环境访问名称统一
- 访问 k8s 集群外的其他服务
- 项目迁移
三、反向代理外部域名
apiVersion: v1
kind: Service
metadata:
labels:
app: wolfcode-external-domain
name: wolfcode-external-domain
spec:
type: ExternalName
externalName: www.wolfcode.cn
合集:
Kubernetes
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)