k8s03 - K8S的服务的内外部访问分类
目录
前言
K8S 的访问情况大致有分为3种
- 1、集群内部互访,PodA -> PodB
- 2、集群内部访问集群外部 PodA->外部 MySQL
- 3、集群外部访问集群内部
1、集群内部互访
场景:PodA 访问 PodB 和 PodC
方案1:通过 Pod 的 IP 直接访问
- 每个 Pod 都会被分配一个 IP,Pod 之间可以通过 IP 直接访问,但 Pod 重启后,该 IP 会变化,并且无法对 PodB 多个服务同时访问
方案2:通过 Service 访问
- DNS + ClusterIP,利用 K8S 的 DNS 和 Service,将 PodB 处理为 Service,例如叫做 SerB,此时 PodA 可直接访问 SerB 来实现访问,K8S 的 DNS 会将 SerB 解析到对应的 ClusterIP,并实现负载均衡
方案3:通过 HeadlessService 访问
- 将 PodC 处理为 HeadlessService, PodA 访问 HeadlessService 时,会拿到 PodC 的列表,然后自己进行负载均衡,例如指定访问其中的一个 Pod,此负载均衡由 PodA 自行控制。
2、集群内部访问集群外部
场景:集群内部的 PodA 需要访问外部的 MySQL 服务
方案1:直接访问
- 直接访问外部服务的 IP 和端口
方案2:通过 Service 访问
- 在集群中定义一个 ServiceMySQL,然后定义一个相同的 Endpoint ServiceMysql, Endpoint 中指定的是外部 MySQL 的具体地址,此时 K8S 的 DNS 此时会将 ServiceMysql 解析到 Endpoint 地址,即实现访问。若外部 MySQL 地址如果有变化,修改 ServiceMysql 的 Endpoint 地址即可;对于客户端 PodA 来说,跟访问内部 Service 没有区别。
3、集群外部服务访问集群内部的服务
场景:外部的 Client 访问集群内的 PodD 或 PodE
方案1:NodePort 方式
- NodePort 是 Service 的一种类型,该方式会在每个 Worker 节点上监听一个端口,若当前 Worker 节点没有被调度运行该 Pod,NodePort 也会将请求终转发到运行 Pod 的 Worker 节点去,NodePort 方式不太推荐,中间会增加转发的成本
方案2:HostPort
- Service 的另一种类型,只会在运行了 Pod 的 Worker 上监听端口,客户端必须访问运行了Pod 的 Worker IP和端口,访问其他的 Worker 不行
方案3:Ingress
- Service 的另一种类型,Ingress 需要配置以下信息:
- 域名
- 域名的请求的路径 Path
- 这个请求转发到的 Service 名称
最后由 IngressController 完成域名和请求的转发,以下是一个 kubernetes-dashboard 的 ingress 的配置
apiVersion: networking.k8s.io/v1
kind: Ingress # 资源类型
metadata:
annotations:
meta.helm.sh/release-name: kubernetes-dashboard
meta.helm.sh/release-namespace: kube-system
nginx.ingress.kubernetes.io/backend-protocol: HTTPS
nginx.ingress.kubernetes.io/ssl-redirect: "true"
service.alpha.kubernetes.io/app-protocols: '{"https":"HTTPS"}'
labels:
app.kubernetes.io/instance: kubernetes-dashboard
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: kubernetes-dashboard
app.kubernetes.io/version: 2.7.0
helm.sh/chart: kubernetes-dashboard-6.0.0
name: kubernetes-dashboard
namespace: kube-system
spec:
ingressClassName: nginx
rules:
- host: k8s.init.com # 指定域名
http:
paths:
- backend:
service:
name: kubernetes-dashboard # 指定要访问的 service
port:
number: 443
path: / # 指定 path,符合条件的请求才会被该 ingress 转发
pathType: ImplementationSpecific
tls: # 以下是证书
- hosts:
- k8s.init.com
secretName: init-com-tls-secret
status:
loadBalancer:
ingress:
- ip: 10.0.4.22
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下