.. _k8s_services: ============================ Kubeernetes服务(services) ============================ 在 :ref:`cilium_k8s_ingress_http` 我困扰于如何给Ingress配置External-IP,这需要理解Kubernetes对 ``公开为网络服务的抽象方法`` : - 在 Kubernetes 中,通常使用 ``deployment`` 来部署应用,此时会使用 ``pod`` 。但是需要注意 ``pod`` 是一个有生命周期的非永久性资源,会被动态创建和销毁 - ``pod`` 的生生死死,分配的IP地址不同,所以需要使用一种方式来管理提供工作负载的后端(也就是 ``workload`` 概念) - ``services`` 资源就是定义一组 ``pod`` 的访问策略 (也就是微服务) , ``service`` 针对的 ``pod`` 集合通常是使用 :ref:`labels_and_selectors` 来确定 - 在 ``deployment`` 中,后端的 ``pod`` 是可以互换(不区分)的,前端不应该也不必知道后端,而是通过 ``service`` 来管理 - 当 ``service`` 中的 ``pod`` 集合发生变化(pod的创建和销毁),则 ``kube-apiserver`` 提供的 ``Endpoints`` 资源就会更新,以提供查询(Kubernetes API 服务发现) 例如,我在 :ref:`z-k8s_nerdctl` 定义了 ``deployment`` : .. literalinclude:: ../../../real/priv_cloud/z-k8s_nerdctl/z-dev-depolyment.yaml :language: yaml :caption: z-dev部署配置z-dev-depolyment.yaml,定义了pod输出的3个服务端口 22,80,443 .. note:: 在构建 ``deployment`` 中定义 ``labels`` 可以配合后面的 ``service`` 中的 ``selector`` ,也就把 ``pod`` 和 ``service`` 关联了起来,这就是 :ref:`labels_and_selectors` 的秘密 然后,我又可以针对上述 ``worklod`` ( ``deployment`` ) 来定义 ``service`` : .. literalinclude:: ../../../real/priv_cloud/z-k8s_cilium_ingress/z-dev-svc.yaml :language: yaml :caption: 定义z-dev对外服务 .. note:: 定义 ``service`` 中的 ``port`` 可以映射到任意 ``targetPort`` ,而默认情况下, ``targetPort`` 设置成与 ``port`` 相同值 .. _k8s_services_nodeport: **NodePort类型** Kubernetes服务 --------------------------------- ``Service.Type=NodePort`` .. _k8s_services_loadbalancer: **LoadBalancer类型** Kubernetes服务 ------------------------------------- ``Service.Type=LoadBalancer`` 参考 ====== - `Kubernetes Concept - Service `_ - `Kubernetes 文档/概念/服务、负载均衡和联网/服务(Service) `_