Kubernetes 服务发现如何在 Ubuntu 上配置
导读:在 Ubuntu 上配置 Kubernetes 服务发现 一 核心原理与准备 服务发现依赖 Service + Endpoints + CoreDNS:Service 提供稳定的 ClusterIP 和端口,Endpoints 维护后端...
在 Ubuntu 上配置 Kubernetes 服务发现
一 核心原理与准备
- 服务发现依赖 Service + Endpoints + CoreDNS:Service 提供稳定的 ClusterIP 和端口,Endpoints 维护后端 Pod IP:Port 列表,CoreDNS 为每个 Service 自动生成 DNS 记录,典型全名为 ..svc.cluster.local,Pod 内可直接用服务名访问。也可辅以环境变量注入,但 DNS 是主流方式。
- 前置要求:在 Ubuntu 上部署好集群并安装 kubelet/kubeadm/kubectl,初始化 Master 后部署 Pod 网络插件(如 Flannel/Calico),确保节点状态为 Ready。示例初始化命令:sudo kubeadm init --pod-network-cidr=10.244.0.0/16;Flannel 安装:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml。
二 使用 Service 与 DNS 的标准做法
- 创建后端应用 Deployment(示例为 nginx:1.25,标签 app=backend),暴露 80 端口。
- 创建 Service(示例名 backend-svc,类型 ClusterIP,端口 80→80),标签选择器匹配 app=backend。
- 在集群内通过 DNS 访问:
- 同命名空间:直接 http://backend-svc:80
- 跨命名空间:使用全名 http://backend-svc..svc.cluster.local:80
- 验证要点:
- 查看 Endpoints 是否同步到后端 Pod IP:kubectl get endpoints backend-svc
- 进入临时调试容器验证解析:kubectl run -it --rm --image=busybox:1.36 --restart=Never dns-test – nslookup backend-svc.default.svc.cluster.local
- 最小示例清单(可直接 apply):
# backend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
labels:
app: backend
spec:
replicas: 2
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
---
# backend-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: backend-svc
spec:
selector:
app: backend
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
说明:Service 创建后,Kubernetes 为该服务分配稳定的 ClusterIP,CoreDNS 为其生成记录;Endpoints 会自动维护后端 Pod IP 列表,实现自动发现与负载分发。
三 Headless Service 与有状态场景
- 当需要对后端 Pod 逐一寻址(如数据库主从、有状态服务)时,将 Service 设置为 Headless(ClusterIP: None)。此时 DNS 不再返回单一 ClusterIP,而是返回匹配 Pod 的 A 记录列表,客户端可自行选择或实现自定义负载均衡。
- 示例:
apiVersion: v1
kind: Service
metadata:
name: backend-headless
spec:
selector:
app: backend
ports:
- protocol: TCP
port: 80
targetPort: 80
clusterIP: None # Headless
- 验证解析(返回多个 Pod IP):kubectl run -it --rm --image=busybox:1.36 --restart=Never dns-test – nslookup backend-headless.default.svc.cluster.local。
四 对外暴露与路由
- NodePort:在每个节点开放静态端口,将流量转发到 Service,适合测试或简单外部访问。
- LoadBalancer:在云环境自动创建外部负载均衡器(需要云厂商支持)。
- Ingress:基于 HTTP/HTTPS 的七层路由与域名统一入口,可与 Service 配合实现复杂路由规则。示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: backend-svc
port:
number: 80
说明:Ingress 本身不是服务发现机制,而是建立在 Service/DNS 之上的路由层,常与 CoreDNS 配合实现外部域名访问。
五 常见问题排查
- DNS 解析失败:确认 CoreDNS 在 kube-system 命名空间运行(kubectl get pods -n kube-system -l k8s-app=coredns),检查 kube-dns Service 的 ClusterIP 是否分配,Pod 内 /etc/resolv.conf 应包含 nameserver 且 search 包含 svc.cluster.local。
- Endpoints 为空:核对 Service 的 selector 与后端 Pod 的 labels 完全一致;查看 Endpoints:kubectl get endpoints ;确认应用容器 containerPort 与 Service targetPort 一致。
- 跨命名空间访问失败:使用全名 ..svc.cluster.local;或在客户端所在命名空间创建 ServiceAccount/RoleBinding 以允许跨命名空间解析与访问(如需要)。
- Headless 未返回 Pod IP:确认 clusterIP: None 且 Endpoints 中有后端 Pod IP:Port;若使用 StatefulSet,建议结合 Headless Service 使用稳定的网络标识。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Kubernetes 服务发现如何在 Ubuntu 上配置
本文地址: https://pptw.com/jishu/789019.html
