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
posted @ 2023-01-31 20:40  unchch  阅读(446)  评论(0编辑  收藏  举报