Kubernetes中的PodIP、ClusterIP和外部IP

Kubernetes是Google开源的容器集群管理系统,是Docker容器的主要集群管理系统之一。

其中,Kubernetes中管理主要有三种类型的IP:Pod IP 、Cluster IP 和 外部IP。

Pod IP

Kubernetes的最小部署单元是Pod。利用Flannel作为不同HOST之间容器互通技术时,由Flannel和etcd维护了一张节点间的路由表。Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且”不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。

每个Pod启动时,会自动创建一个镜像为gcr.io/google_containers/pause:0.8.0的容器,容器内部与外部的通信经由此容器代理,该容器的IP也可以称为Pod IP。

Cluster IP

Pod IP 地址是实际存在于某个网卡(可以是虚拟设备)上的,但Service Cluster IP就不一样了,没有网络设备为这个地址负责。它是由kube-proxy使用Iptables规则重新定向到其本地端口,再均衡到后端Pod的。

Pod IP 地址是实际存在于某个网卡(可以是虚拟设备)上的,但Service Cluster IP就不一样了,没有网络设备为这个地址负责。它是由kube-proxy使用Iptables规则重新定向到其本地端口,再均衡到后端Pod的。

就拿上面我们提到的图像处理程序为例。当我们的Service被创建时,Kubernetes给它分配一个地址10.0.0.1。这个地址从我们启动API的service-cluster-ip-range参数(旧版本为portal_net参数)指定的地址池中分配,比如–service-cluster-ip-range=10.0.0.0/16。假设这个Service的端口是1234。集群内的所有kube-proxy都会注意到这个Service。当proxy发现一个新的service后,它会在本地节点打开一个任意端口,建相应的iptables规则,重定向服务的IP和port到这个新建的端口,开始接受到达这个服务的连接。

当一个客户端访问这个service时,这些iptable规则就开始起作用,客户端的流量被重定向到kube-proxy为这个service打开的端口上,kube-proxy随机选择一个后端pod来服务客户。这个流程如下图所示:

根据Kubernetes的网络模型,使用Service Cluster IP和Port访问Service的客户端可以坐落在任意代理节点上。外部要访问Service,我们就需要给Service外部访问IP。

外部IP

Service对象在Cluster IP range池中分配到的IP只能在内部访问,如果服务作为一个应用程序内部的层次,还是很合适的。如果这个Service作为前端服务,准备为集群外的客户提供业务,我们就需要给这个服务提供公共IP了。

外部访问者是访问集群代理节点的访问者。为这些访问者提供服务,我们可以在定义Service时指定其spec.publicIPs,一般情况下publicIP 是代理节点的物理IP地址。和先前的Cluster IP range上分配到的虚拟的IP一样,kube-proxy同样会为这些publicIP提供Iptables 重定向规则,把流量转发到后端的Pod上。有了publicIP,我们就可以使用load balancer等常用的互联网技术来组织外部对服务的访问了。

spec.publicIPs在新的版本中标记为过时了,代替它的是spec.type=NodePort,这个类型的service,系统会给它在集群的各个代理节点上分配一个节点级别的端口,能访问到代理节点的客户端都能访问这个端口,从而访问到服务。

原文地址:https://www.cnblogs.com/xingxiz/p/10416020.html

时间: 2024-10-03 02:46:52

Kubernetes中的PodIP、ClusterIP和外部IP的相关文章

Kubernetes仪表盘和外部IP代理漏洞及应对之策

近期,Kubernetes仪表盘和外部IP代理接连被发现存在安全问题.针对这两个漏洞,Kubernetes发布了相应的补丁版本供会受漏洞影响的用户解决问题.本文将更深入解读这两个安全漏洞的原理.会对您的Kubernetes部署造成的影响以及相应的应对之策.    通过kubernetes仪表盘访问自定义TLS证书 Kubernetes仪表盘漏洞(CVE-2018-18264)会影响v1.10.0或更早的仪表盘版本.因为这一漏洞,用户可以"跳过"登录过程,假设配置的服务帐户,最后获得仪表

实用干货:Kubernetes中的负载均衡全解

很多企业在部署容器的时候都会选择Kubernetes作为其容器编排系统.这是对Kubernetes的可靠性,灵活性和特性广泛的肯定.在这篇文章中,我们将对Kubernetes如何处理一个非常常见且必要的工作--负载均衡,进行深入的解读.在许多非容器环境(即服务器之间的均衡)中,负载均衡是一个相对简单的任务,但当涉及到容器时,就需要一些其他的.特殊的处理. 管理容器 要理解Kubernetes的负载均衡,首先需要了解Kubernetes是如何组建容器的. 容器通常用来执行特定的服务或者一组服务,因

大神教你轻松玩转Docker和Kubernetes中如何运行MongoDB微服务

本文介绍了利用Docker和Kubernetes搭建一套具有冗余备份集合的MongoDB服务,从容器对CI和CD引发的改变入手,讨论了容器技术对MongoDB带来的挑战和机会,然后实战如何部署一套稳定的MongoDB服务,非常的干货 介绍 想尝试在笔记本电脑上运行MongoDB么?希望通过执行一个简单的命令,然后就有一个轻量级.自组织的沙盒么?并可再通过一条命令就可以移除所有的痕迹么? 需要在多个环境中运行相同的应用程序栈?创建自己的容器镜像,使得开发.测试.操作和支持团队启动一份完全相同的环境

Kubernetes中,通过Service访问Pod快速入门

一.背景 理想状态下,我们可以认为Kubernetes Pod是健壮的.但是,理想与现实的差距往往是非常大的.很多情况下,Pod中的容器可能会因为发生故障而死掉.Deployment等Controller会通过动态创建和销毁Pod来保证应用整体的健壮性.众所周知,每个Pod都拥有自己的IP地址,当新的Controller用新的Pod替代发生故障的Pod时,我们会发现,新的IP地址可能跟故障的Pod的IP地址可能不一致.此时,客户端如何访问这个服务呢?Kubernetes中的Service应运而生

Kubernetes中Namespace与Pod

一.Namespace 1)Namespace概述 Namespace是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组.常见的pods, services, replication controllers和deployments等都是属于某一个namespace的(默认是default),而node, persistentVolumes等则不属于任何namespace. Namespace常用来隔离不同的用户,比如Kubernetes自带的服务一般运行在kub

第三章 pod:运行于kubernetes中的容器

本章内容涵盖 创建. 启动和停止 pod 使用标签组织 pod 和其他资源 使用特定标签对所有 pod 执行操作 使用命名空间将多个 pod 分到不重叠的组中 调度 pod 到指定类型的工作节点 上一章 已经大致介绍了在 Kubemetes 中创建的基本组件,包括它们的基本功 能概述. 那么接下来我们将更加详细地介绍所有类型的 Kubemetes 对象(或资源), 以便你理解在何时. 如何及为何要使用每一个对象. 其中 pod 是 Kubemetes 中最为 重要的核心概念,而其他对象仅仅是在管

Kubernetes中安装traefik ingress

Kubernetes中安装traefik ingress # 下载配置清单 wget https://github.com/containous/traefik/tree/v1.7/examples/k8s # 链接中以traefik-开头的文件有3个,都可以见名知意,其中traefik-deployment.yaml我们这里没有用到 # traefik-deployment.yaml跟traefik-ds.yaml二者选其一即可,由于底下的配置是根据traefik-ds.yaml来的所以建议使

如何在Kubernetes中管理有状态应用

在Kubernetes中,StatefulSet被用来管理有状态应用的API对象.StatefulSets在Kubernetes 1.9版本才稳定.StatefulSet管理Pod部署和扩容,并为这些Pod提供顺序和唯一性的保证.与Deployment相似的地方是,StatefulSet基于spec规格管理Pod:与Deployment不同的地方是,StatefulSet需要维护每一个Pod的唯一身份标识.这些Pod基于同样的spec创建,但互相之间不能替换,每一个Pod都保留自己的持久化标识.

kubernetes中的Pod简述与实践

Pod的概念详细的Pod解释可参考k8s官网,关于Pod的概念主要有以下几点:(1)Pod是kubernetes中你可以创建和部署的最小也是最简的单位.一个Pod代表着集群中运行的一个进程:(2)在Kubrenetes集群中Pod的使用方式:(3)Pod中如何管理多个容器 理解Pod上面已经说了"Pod是kubernetes中你可以创建和部署的最小也是最简的单位.一个Pod代表着集群中运行的一个进程."Pod中封装着应用的容器(有的情况下是好几个容器),存储.独立的网络IP,管理容器如