<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Kubernetes学习笔记 – 服务网络</title>
    <link>https://skyao.net/learning-kubernetes/concepts/services-networking/</link>
    <description>Recent content in 服务网络 on Kubernetes学习笔记</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <lastBuildDate>Wed, 05 Mar 2025 00:00:00 +0000</lastBuildDate>
    
	  <atom:link href="https://skyao.net/learning-kubernetes/concepts/services-networking/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Concepts: 服务网络概述</title>
      <link>https://skyao.net/learning-kubernetes/concepts/services-networking/overview/</link>
      <pubDate>Wed, 05 Mar 2025 00:00:00 +0000</pubDate>
      
      <guid>https://skyao.net/learning-kubernetes/concepts/services-networking/overview/</guid>
      <description>
        
        
        &lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/services-networking/&#34;&gt;https://kubernetes.io/zh-cn/docs/concepts/services-networking/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;kubernetes-网络模型&#34;&gt;Kubernetes 网络模型&lt;/h2&gt;
&lt;p&gt;Kubernetes 强制要求所有网络设施都满足以下基本要求（从而排除了有意隔离网络的策略）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pod 能够与所有其他&lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/architecture/nodes/&#34;&gt;节点&lt;/a&gt;上的 Pod 通信， 且不需要网络地址转译（NAT）&lt;/li&gt;
&lt;li&gt;节点上的代理（比如：系统守护进程、kubelet）可以和节点上的所有 Pod 通信&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kubernetes 的 IP 地址存在于 &lt;code&gt;Pod&lt;/code&gt; 范围内 —— 容器共享它们的网络命名空间 —— 包括它们的 IP 地址和 MAC 地址。&lt;/p&gt;
&lt;p&gt;Kubernetes 网络解决四方面的问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pod 中的容器之间&lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/services-networking/dns-pod-service/&#34;&gt;通过本地回路（loopback）通信&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;集群网络在不同 Pod 之间提供通信。&lt;/li&gt;
&lt;li&gt;Service API 允许向外暴露 Pod 中运行的应用， 以支持来自于集群外部的访问。
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/&#34;&gt;Ingress&lt;/a&gt; 提供专门用于暴露 HTTP 应用程序、网站和 API 的额外功能。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;你也可以使用 Service 来&lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/services-networking/service-traffic-policy/&#34;&gt;发布仅供集群内部使用的服务&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Concepts: Service</title>
      <link>https://skyao.net/learning-kubernetes/concepts/services-networking/service/</link>
      <pubDate>Mon, 01 Feb 2021 00:00:00 +0000</pubDate>
      
      <guid>https://skyao.net/learning-kubernetes/concepts/services-networking/service/</guid>
      <description>
        
        
        &lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/&#34;&gt;https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Service 是将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。&lt;/p&gt;
&lt;h2 id=&#34;动机&#34;&gt;动机&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Pod 是非永久性资源&lt;/li&gt;
&lt;li&gt;每个 Pod 都有自己的 IP 地址&lt;/li&gt;
&lt;li&gt;在 Deployment 中，在同一时刻运行的 Pod 集合可能与稍后运行该应用程序的 Pod 集合不同。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;service-资源&#34;&gt;Service 资源&lt;/h2&gt;
&lt;p&gt;Kubernetes Service 定义了这样一种抽象：逻辑上的一组 Pod 和一种可以访问它们的策略&lt;/p&gt;
&lt;h2 id=&#34;定义-service&#34;&gt;定义 Service&lt;/h2&gt;
&lt;p&gt;定义 service 需要最基本的两个元素：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;service selector / 服务选择算符&lt;/li&gt;
&lt;li&gt;service port&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;v1&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;kind&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Service&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;metadata&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;my-service&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;selector&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;MyApp&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;ports&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;protocol&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;TCP&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;port&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;80&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;targetPort&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;9376&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;小知识：Pod 中的端口定义是有名字的，可以在 Service 的 &lt;code&gt;targetPort&lt;/code&gt; 属性中引用这些名称。这样可以只修改pod定义，service 这边就自动改过来了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;没有选择算符的-service&#34;&gt;没有选择算符的 Service&lt;/h3&gt;
&lt;p&gt;服务没有选择算符时，不会自动创建相应的 EndpointSlice（和旧版 Endpoint）对象。 可以通过手动添加 EndpointSlice 对象，将服务手动映射到运行该服务的网络地址和端口&lt;/p&gt;
&lt;h2 id=&#34;发布服务服务类型&#34;&gt;发布服务（服务类型）&lt;/h2&gt;
&lt;p&gt;Kubernetes &lt;code&gt;ServiceTypes&lt;/code&gt; 允许指定你所需要的 Service 类型。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Type&lt;/code&gt; 的取值以及行为如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ClusterIP&lt;/code&gt;：通过集群的内部 IP 暴露服务，选择该值时服务只能够在集群内部访问。 这也是你没有为服务显式指定 &lt;code&gt;type&lt;/code&gt; 时使用的默认值。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/#type-nodeport&#34;&gt;&lt;code&gt;NodePort&lt;/code&gt;&lt;/a&gt;：通过每个节点上的 IP 和静态端口（&lt;code&gt;NodePort&lt;/code&gt;）暴露服务。 为了让节点端口可用，Kubernetes 设置了集群 IP 地址，这等同于你请求 &lt;code&gt;type: ClusterIP&lt;/code&gt; 的服务。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/#loadbalancer&#34;&gt;&lt;code&gt;LoadBalancer&lt;/code&gt;&lt;/a&gt;：使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 &lt;code&gt;NodePort&lt;/code&gt; 服务和 &lt;code&gt;ClusterIP&lt;/code&gt; 服务上。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/#externalname&#34;&gt;&lt;code&gt;ExternalName&lt;/code&gt;&lt;/a&gt;：通过返回 &lt;code&gt;CNAME&lt;/code&gt; 记录和对应值，可以将服务映射到 &lt;code&gt;externalName&lt;/code&gt; 字段的内容（例如，&lt;code&gt;foo.bar.example.com&lt;/code&gt;）。 无需创建任何类型代理。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;特别注意： &lt;code&gt;type&lt;/code&gt; 字段被设计为嵌套功能 - 每个级别都添加到前一个级别。&lt;/p&gt;
&lt;p&gt;也可以使用 &lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/&#34;&gt;Ingress&lt;/a&gt; 来暴露自己的服务。&lt;/p&gt;
&lt;h3 id=&#34;nodeport-类型&#34;&gt;NodePort 类型&lt;/h3&gt;
&lt;p&gt;如果你将 &lt;code&gt;type&lt;/code&gt; 字段设置为 &lt;code&gt;NodePort&lt;/code&gt;，则 Kubernetes 控制平面将在 &lt;code&gt;--service-node-port-range&lt;/code&gt; 标志指定的范围内分配端口（默认值：30000-32767）。&lt;/p&gt;
&lt;h4 id=&#34;选择你自己的端口&#34;&gt;选择你自己的端口&lt;/h4&gt;
&lt;p&gt;如果需要特定的端口号，你可以在 &lt;code&gt;nodePort&lt;/code&gt; 字段中指定一个值。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需要自己注意可能发生的端口冲突&lt;/li&gt;
&lt;li&gt;必须使用有效的端口号，该端口号在配置用于 NodePort 的范围内。&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Concepts: Ingress</title>
      <link>https://skyao.net/learning-kubernetes/concepts/services-networking/ingress/</link>
      <pubDate>Mon, 01 Feb 2021 00:00:00 +0000</pubDate>
      
      <guid>https://skyao.net/learning-kubernetes/concepts/services-networking/ingress/</guid>
      <description>
        
        
        &lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/&#34;&gt;https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ingress 是对集群中服务的外部访问进行管理的 API 对象&lt;/p&gt;
&lt;h2 id=&#34;术语&#34;&gt;术语&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;节点（Node）: Kubernetes 集群中的一台工作机器，是集群的一部分。&lt;/li&gt;
&lt;li&gt;集群（Cluster）: 一组运行由 Kubernetes 管理的容器化应用程序的节点。 在此示例和在大多数常见的 Kubernetes 部署环境中，集群中的节点都不在公共网络中。&lt;/li&gt;
&lt;li&gt;边缘路由器（Edge Router）: 在集群中强制执行防火墙策略的路由器。可以是由云提供商管理的网关，也可以是物理硬件。&lt;/li&gt;
&lt;li&gt;集群网络（Cluster Network）: 一组逻辑的或物理的连接，根据 Kubernetes &lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/networking/&#34;&gt;网络模型&lt;/a&gt;在集群内实现通信。&lt;/li&gt;
&lt;li&gt;服务（Service）：Kubernetes &lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/&#34;&gt;服务（Service）&lt;/a&gt;， 使用&lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/labels/&#34;&gt;标签&lt;/a&gt;选择器（selectors）辨认一组 Pod。 除非另有说明，否则假定服务只具有在集群网络中可路由的虚拟 IP。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ingress-是什么&#34;&gt;Ingress 是什么？&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/#ingress-v1beta1-networking-k8s-io&#34;&gt;Ingress&lt;/a&gt; 暴露从集群外部到集群内&lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/&#34;&gt;服务&lt;/a&gt;的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。&lt;/p&gt;
&lt;p&gt;下面是一个将所有流量都发送到同一 Service 的简单 Ingress 示例：&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://mermaid.live/edit#pako:eNqNkktLAzEQgP9KSC8Ku6XWBxKlJz0IHsQeuz1kN7M2uC-SrA9sb6X26MFLFZGKoCC0CIIn_Td1139halZq8eJlE2a--TI7yRn2YgaYYCc6EDRpod39DSdCyAs4RGqhMRndffRfs6dxc9Euox0NgZR2NhpmF73sqos2XVFD-ctt_vY2uTnPh8PJ4BGV7Ro3ZKOoaH5Li6Bt19r56zi7fM4fupP-oC1BHHEPGnWzGlimruno87qXvd__qjdpw2pXErOlxl7Mmn_j1VkcImb-i0q5BT5KAsoj5PMgICXGmCWViA-BlHzfL_b2MWeqRVaSE8uLg1iQUqVS2ZiTHK7LQrFcXfNg9V8WnZu3eEEqFYjCNCslJdd15zXVmcacODP9TMcqJmBN5zL9VKdt_uLM1ZoBzIVNF8WqM06ELRyCCCln-oWcTVkHqxaE4GCitwx8mgbK0Y-no9E0YVTBNuMqFpj4NJBgYZqquH4aeZgokcIPtMWpvtywoDpfU3_yww&#34;&gt;&lt;img src=&#34;https://d33wubrfki0l68.cloudfront.net/4f01eaec32889ff16ee255e97822b6d165b633f0/a54b4/zh-cn/docs/images/ingress.svg&#34; alt=&#34;ingress-diagram&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时，通常使用 &lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/#type-nodeport&#34;&gt;Service.Type=NodePort&lt;/a&gt; 或 &lt;a href=&#34;https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/#loadbalancer&#34;&gt;Service.Type=LoadBalancer&lt;/a&gt; 类型的 Service。&lt;/p&gt;

      </description>
    </item>
    
  </channel>
</rss>
