精华内容
下载资源
问答
  • k8s-集群里的三种IP(NodeIP、PodIP、ClusterIP

    万次阅读 多人点赞 2019-09-25 14:19:40
    初学k8s,对集群里面的IP真的不是很理解,一会是PodIP,一会是ClusterIP,总结一下这些IP。 Kubernetes集群里有三种IP地址,分别如下: Node IP:Node节点的IP地址,即物理网卡的IP地址。 Pod IP:Pod的IP地址,即...

    初学k8s,对集群里面的IP真的不是很理解,一会是PodIP,一会是ClusterIP,总结一下这些IP。

    Kubernetes集群里有三种IP地址,分别如下:

    • Node IP:Node节点的IP地址,即物理网卡的IP地址。
    • Pod IP:Pod的IP地址,即docker容器的IP地址,此为虚拟IP地址。
    • Cluster IP:Service的IP地址,此为虚拟IP地址。

    Node IP

    可以是物理机的IP(也可能是虚拟机IP)。每个Service都会在Node节点上开通一个端口,外部可以通过NodeIP:NodePort即可访问Service里的Pod,和我们访问服务器部署的项目一样,IP:端口/项目名

    在kubernetes查询Node IP
    1.kubectl get nodes
    2.kubectl describe node nodeName
    3.显示出来的InternalIP就是NodeIP
    在这里插入图片描述
    在这里插入图片描述

    Pod IP

    Pod IP是每个Pod的IP地址,他是Docker Engine根据docker网桥的IP地址段进行分配的,通常是一个虚拟的二层网络

    • 同Service下的pod可以直接根据PodIP相互通信
    • 不同Service下的pod在集群间pod通信要借助于 cluster ip
    • pod和集群外通信,要借助于node ip

    在kubernetes查询Pod IP
    1.kubectl get pods
    2.kubectl describe pod podName
    在这里插入图片描述

    Cluster IP

    Service的IP地址,此为虚拟IP地址。外部网络无法ping通,只有kubernetes集群内部访问使用。

    在kubernetes查询Cluster IP
    kubectl -n 命名空间 get Service即可看到ClusterIP
    在这里插入图片描述

    Cluster IP是一个虚拟的IP,但更像是一个伪造的IP网络,原因有以下几点

    1. Cluster IP仅仅作用于Kubernetes Service这个对象,并由Kubernetes管理和分配P地址
    2. Cluster IP无法被ping,他没有一个“实体网络对象”来响应
    3. Cluster IP只能结合Service Port组成一个具体的通信端口,单独的Cluster IP不具备通信的基础,并且他们属于Kubernetes集群这样一个封闭的空间。
    4. 在不同Service下的pod节点在集群间相互访问可以通过Cluster IP


    三种IP网络间的通信

    service地址和pod地址在不同网段,service地址为虚拟地址,不配在pod上或主机上,外部访问时,先到Node节点网络,再转到service网络,最后代理给pod网络。

    在这里插入图片描述
    Kubernetes在其所有节点上开放一个端口给外部访问(所有节点上都使用相同的端口号), 并将传入的连接转发给作为Service服务对象的pod。这样我们的pod就可以被外部请求访问到
    在这里插入图片描述

    注:
    k8s暴露服务给外部访问有三种方式,NodePort、LoadBalane、Ingress三种暴露服务的方式,上图是用了NodePort的方式,缺点是服务一旦多起来,NodePort 在每个节点上开启的端口数量会极其庞大,难以维护,详解k8s暴露服务的三种方式:k8s-(七)暴露服务的三种方式

    其他网络知识
    《计算机网络-DHCP的工作原理,IP地址如何获取》
    《计算机网络-学习交换机》
    《计算机网络-学习路由器》




    k8s-学习笔记总结(从入门到放弃的学习路线)
    k8s-(五) 最全的安装教程(使用kubeadm在Centos7上部署kubernetes1.18)

    展开全文
  • Kubernetes Service之ClusterIP

    万次阅读 2018-12-13 16:48:51
    转载自麦兜搞ip的博客Kubernetes Service之ClusterIP Kubernetes Service ClusterIP Kubernetes的service有三种类型:ClusterIP,NodePort,LoadBalancer,今天我们来看看ClusterIP。 创建Deployment 首先我们先创建...

    转载自麦兜搞ip的博客Kubernetes Service之ClusterIP

    Kubernetes Service ClusterIP

    Kubernetes的service有三种类型:ClusterIP,NodePort,LoadBalancer,今天我们来看看ClusterIP。

    创建Deployment

    首先我们先创建一个Deployment,这个Deployment是一个Python实现的HTTP服务,请求这个Web Server的时候,会发回给我们这个server的hostname(如果是container,那就是container的hostname)。

    这个Deployment有四个Replica。

    $ more deployment_python_http.yml
    apiVersion:  apps/v1
    kind: Deployment
    metadata:
      name: service-test
    spec:
      replicas: 4
      selector:
        matchLabels:
          app: service_test_pod
      template:
        metadata:
          labels:
            app: service_test_pod
        spec:
          containers:
          - name: simple-http
            image: python:2.7
            imagePullPolicy: IfNotPresent
            command: ["/bin/bash"]
            args: ["-c", "echo \"<p>Hello from $(hostname)</p>\" > index.html; python -m SimpleHTTPServer 8080"]
            ports:
            - name: http
              containerPort: 8080
    
    $ kubectl create -f deployment_python_http.yml
    deployment.apps "service-test" created
    

    创建完我们看到pod是这样的;

    $ kubectl get pod -o wide
    NAME                            READY     STATUS    RESTARTS   AGE       IP          NODE
    service-test-54b5b4b547-8l9s4   1/1       Running   0          1m        10.36.0.0   ks8-node2
    service-test-54b5b4b547-c2t85   1/1       Running   0          1m        10.36.0.1   ks8-node2
    service-test-54b5b4b547-nxn9z   1/1       Running   0          1m        10.40.0.1   k8s-node1
    service-test-54b5b4b547-vlpff   1/1       Running   0          1m        10.40.0.0   k8s-node1
    

    这四个pod IP我们都可以在k8s cluster任意一个节点上访问,每一个都会返回自己的container name。

    $ curl 10.36.0.0:8080
    <p>Hello from service-test-54b5b4b547-8l9s4</p>
    

    创建Service

    通过kubectl expose给刚才这个deployment创建一个service,端口绑定为8088.

    kubectl expose deployment service-test --port 8088 --target-port=8080
    service "service-test" exposed
    

    这样,就给我们生成了一个类型为ClusterIP的service,这个service有一个Cluster IP,其实就一个VIP。

    kubectl get service -o wide
    NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE       SELECTOR
    kubernetes     ClusterIP   10.96.0.1       <none>        443/TCP    1d        <none>
    service-test   ClusterIP   10.101.90.210   <none>        8088/TCP   11s       app=service_test_pod
    

    首先我们可以通过这个Cluster IP加端口8088访问我们的deployment。

    $ for i in `seq 4`; do curl 10.101.90.210:8088; done
    <p>Hello from service-test-54b5b4b547-nxn9z</p>
    <p>Hello from service-test-54b5b4b547-vlpff</p>
    <p>Hello from service-test-54b5b4b547-vlpff</p>
    <p>Hello from service-test-54b5b4b547-nxn9z</p>
    

    并且我们发现,这个VIP实现了负载均衡,每次返回的hostname不同。

    VIP和负载均衡的实现

    为什么我们访问VIP就能访问我们的四个pod,并且还做了负载均衡呢?下面我们就看一下,

    其实呢,我们刚才创建这个deployment,service的时候,k8s集群下面的几个部件参与了相关的工作。

    apiserver kubectl命令向apiserver发送创建service的命令,apiserver接收到请求以后将数据存储到etcd中。
    kube-proxy kubernetes的每个节点中都有一个叫做kube-proxy的进程,这个进程负责感知service,pod的变化,并将变化的信息写入本地的iptables中。
    iptables 使用NAT等技术将virtualIP的流量转至endpoint中。
    那么IPtable到底是如何转发我们的流量的呢,我们到任意一台k8s节点运行 sudo iptables -L -v -n -t nat

    首先找到我们的ClusterIP 10.101.90.210,发现他在一个iptables chain中

    Chain KUBE-SERVICES (2 references)
     pkts bytes target     prot opt in     out     source               destination
        0     0 KUBE-MARK-MASQ  tcp  --  *      *      !172.100.0.0/16       10.101.90.210        /* default/service-test: cluster IP */ tcp dpt:8088
        0     0 KUBE-SVC-LY73ZDGF4KGO4YFJ  tcp  --  *      *       0.0.0.0/0            10.101.90.210        /* default/service-test: cluster IP */ tcp dpt:8088
    

    这个chain类似一个链条,那么访问10.101.90.210:8088的流量到底怎么被转发了呢,我们需要看一下 KUBE-SVC-LY73ZDGF4KGO4YFJ 这个Chain, 找到这个chain

    Chain KUBE-SVC-LY73ZDGF4KGO4YFJ (1 references)
     pkts bytes target     prot opt in     out     source               destination
        0     0 KUBE-SEP-YOQWVZZ4NQDNEBVN  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/service-test: */ statistic mode random probability 0.25000000000
        0     0 KUBE-SEP-WHOFXZ2VQXEUUKVO  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/service-test: */ statistic mode random probability 0.33332999982
        0     0 KUBE-SEP-3TBKTCTGJZ27RFOH  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/service-test: */ statistic mode random probability 0.50000000000
        0     0 KUBE-SEP-6LDVTIHDBDOU3D3G  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/service-test: */
    

    这个Chain比较有意思,过来的流量它按照随机的概率,分别以0.25000000000, 0.33332999982,0.50000000000的概率,转发到这三个Chain,这三个Chain其实就是我们的pod,那为啥有一个pod不会被转发呢,这个应该是负载均衡的配置,最大几个负载均衡的问题。

    我们随便拿出一个

    Chain KUBE-SEP-WHOFXZ2VQXEUUKVO (1 references)
     pkts bytes target     prot opt in     out     source               destination
        0     0 KUBE-MARK-MASQ  all  --  *      *       10.36.0.1            0.0.0.0/0            /* default/service-test: */
        0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/service-test: */ tcp to:10.36.0.1:8080
    

    好的,那经过这么一转发,我们的流量就可以转发到正确的pod上了,不知道大家明白没有。

    展开全文
  • k8s的服务访问之ClusterIP

    千次阅读 2020-08-28 11:24:05
    kube-proxy 支持 ipvs ...kubectl -n 命名空间 get Service即可看到ClusterIP Cluster IP是一个虚拟的IP,但更像是一个伪造的IP网络,原因有以下几点 Cluster IP仅仅作用于Kubernetes Service这个对象,并由Kubernetes

    kube-proxy 支持 ipvs iptables两种模式

    Cluster IP

    Service的IP地址,此为虚拟IP地址。外部网络无法ping通,只有kubernetes集群内部访问使用。

    在kubernetes查询Cluster IP
    kubectl -n 命名空间 get Service即可看到ClusterIP

    Cluster IP是一个虚拟的IP,但更像是一个伪造的IP网络,原因有以下几点

    Cluster IP仅仅作用于Kubernetes Service这个对象,并由Kubernetes管理和分配P地址
    Cluster IP无法被ping,他没有一个“实体网络对象”来响应
    Cluster IP只能结合Service Port组成一个具体的通信端口,单独的Cluster IP不具备通信的基础,并且他们属于Kubernetes集群这样一个封闭的空间。
    在不同Service下的pod节点在集群间相互访问可以通过Cluster IP

    ClusterIP: 默认方式。根据是否生成ClusterIP又可分为普通Service和Headless Service两类:
    普通Service:通过为Kubernetes的Service分配一个集群内部可访问的固定虚拟IP(Cluster IP),实现集群内的访问。为最常见的方式。
    Headless Service:该服务不会分配Cluster IP,也不通过kube-proxy做反向代理和负载均衡。而是通过DNS提供稳定的网络ID来访问,DNS会将headless service的后端直接解析为podIP列表。主要供StatefulSet使用。

    kafka0-kafka.svc.XX ====> pod ip列表 ( 客户端获得这个列表,自行处理)
    service ip => cluster ip =>kube proxy 负载均衡(RR) => pod ip

    cluster-ip 是虚拟ip 只能curl 不能ping
    [root@cs2-k8s1 k8s]# kubectl get svc
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    nginx-test NodePort 10.68.126.157 80:30002/TCP 79s

    [root@cs2-k8s1 k8s]# kubectl exec -it post-zdjkl /bin/bash
    [root@post-zdjkl snake]# ping 10.68.126.157
    PING 10.68.126.157 (10.68.126.157) 56(84) bytes of data.
    — 10.68.126.157 ping statistics —
    15 packets transmitted, 0 received, 100% packet loss, time 14006ms

    [root@post-zdjkl snake]# curl 10.68.126.157

    ......(省略)

    ClusterIP
    此类型会提供一个集群内部的虚拟IP(与Pod不在同一网段),以供集群内部的pod之间通信使用。ClusterIP也是Kubernetes service的默认类型。
    !
    在这里插入图片描述

    为了实现图上的功能主要需要以下几个组件的协同工作:
    apiserver:在创建service时,apiserver接收到请求以后将数据存储到etcd中。
    kube-proxy:k8s的每个节点中都有该进程,负责实现service功能,这个进程负责感知service,pod的变化,并将变化的信息写入本地的iptables中。
    iptables:使用NAT等技术将virtualIP的流量转至endpoint中。

    展开全文
  • Kubernetes中的PodIP、ClusterIP和外部IP

    万次阅读 2018-01-23 16:31:57
    其中,Kubernetes中管理主要有三种类型的IP:Pod IPCluster IP 和 外部IP。 Pod IP Kubernetes的最小部署单元是Pod。利用Flannel作为不同HOST之间容器互通技术时,由Flannel和etcd维护了一张节点间的路由表。...

    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的。

    就拿上面我们提到的图像处理程序为例。当我们的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,系统会给它在集群的各个代理节点上分配一个节点级别的端口,能访问到代理节点的客户端都能访问这个端口,从而访问到服务。

    转自:Kubernetes中的PodIP、ClusterIP和外部IP

    展开全文
  • 三、Cluster IP Service的IP地址,此为虚拟IP地址。 四、关系 service地址和pod地址在不同网段,service地址为虚拟地址,不配在pod上或主机上,外部访问时,先到Node节点网络,再转到service网络,最后代理给...
  • k8s之PodIP、ClusterIP和ExternalIP

    千次阅读 2020-06-30 18:09:52
    k8s之PodIP、ClusterIP和ExternalIP https://www.cnblogs.com/embedded-linux/p/12657128.html Pod IP Kubernetes的最小部署单元是Pod。利用Flannel作为不同HOST之间容器互通技术时,由Flannel和etcd维护了一张...
  • 内部通讯-ClusterIP

    2019-10-18 09:11:51
    Cluster IP Kubernetes以Pod作为应用部署的最小单位。kubernetes会根据Pod的声明对其进行调度,包括创建、销毁、迁移、水平伸缩等,因此Pod 的IP地址不是固定的,不方便直接采用Pod IP对服务进行访问。 为解决该问题...
  • Node/Pod/Cluster IP的异同

    2020-04-05 08:59:40
    文章目录Node IPPod IPCluster IPReference Node IP Node IP 是集群每个节点的物理网卡的 IP 地址。 Pod IP Pod IPIP 地址,是 Docker Engine 根据 ...Cluster IP 是属于 Service 的概念,也是一种虚拟的 I...
  • 1.创建Services的方法: 1).kubectl expoese命令,会给我们...2).service主要有三种类型:一种叫clusterIP,一种叫nodePort,一种叫外部的LoadBalancer l ClusterIP: 仅仅使用一个集群内部的IP地址 - 这是默认值。...
  • K8S系列:ClusterIP和NodePort

    千次阅读 2020-06-14 17:55:21
    ClusterIP:只对集群内部可见 NodePort:对外部可见
  • 在之前文章中我们介绍了基于iptable方式实现的k8s集群中cluster ip类型和node port类型service的负载均衡。其本质上是当网络数据包从pod的network namespace中通过linux veth pair设备进入到host宿主中的network ...
  • 获取svc,查看nginx-deployment为ClusterIP类型 [root@k8s-master01 ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 ...
  • 问题:Pod内部无法ping通ClusterIP或servicename 原因:k8s kube-proxy使用默认的iptables模式 解决:修改kube-proxy使用ipvs模式。 测试:在Pod内部ping通CLusterIP或servicename
  • 问题: 集群的POD内不能访问clusterIP和service 问题描述: 进入集群的任意一个POD,ping不通集群内的clusterIP和service 问题解决方案: 步骤: ①我们需要修改kube-proxy的配置文件,添加mode 为ipvs。 在master...
  • cluster IP 是和 service 绑定的 其中ip和 get svc 列出的port对应  container IP 是 容器自己的IP  node IP 是 容器所在的 node 节点的IP ip describe svc 对应的node port 对应   VIP 是用来做 LB 用的 ip和...
  • Kubernetes K8S使用IPVS代理模式,当Service的类型为ClusterIP时,如何处理访问service却不能访问后端pod的情况。
  • svc (clusterip): --- kind: Service apiVersion: v1 metadata: name: prod-svc-data-receiver namespace: jzyq spec: clusterIP: 10.96.0.13 ports: - name: data-receiver protocol: TCP por...
  • 2、在Pod中为什么ping不通ClusterIP?简述: Rancher2.0中的一个用户,在K8S环境中,创建两个namespace,对应用进行分割管理,在一个namespace的pod中,如何访问另一个namespace中的服务?--K8S使用kube-DNS实现...
  • ClusterIP Deployment.yaml service.yaml ipvsadm -Ln headless service dig需要安装bind-utils NodePort 30715是随机生成的端口: master,node01,node02都会开放37015端口,都可以访问 Ln...
  • svc.spec.type包含 ExternalName, ClusterIP, NodePort, and LoadBalancer. 端口三剑客: 路径 作用 svc.spec.ports.nodePort 节点的端口, 仅在type是nodeport类型时,这个才生效 svc.spec.ports:port ...
  • 在node上和pod中无法ping通cluster ip 节点之前的网络是kube-proxy管理的,检查kube-proxy 的配置 [Unit] Description=Kubernetes Proxy After=network.target [Service] WorkingDirectory=/var/lib/kube-proxy ...
  • clusterIP主要在每个node节点使用iptables,将发向clusterIP对应端口的数据,转发到kube-proxy中。 然后kube-proxy自己内部实现有负载均衡的方法,并可以查询到这个service下对应pod的地址和端口,进而把数据转发给...
  • ClusterIP Service 通过 Cluster 内部的 IP 对外提供服务,只有 Cluster 内的节点和 Pod 可访问,这是默认的 Service 类型。 ClusterIP是一种虚拟IP,他并不是真实存在的,它由kubernetes中的iptables规则管理着。 ...
  • 本文基于kubernetes 1.5.2版本编写配置方式kubernetes版本大于或者等于1.2时,外部网络(即非K8S集群内的网络)访问cluster IP的办法是: 修改master的/etc/kubernetes/proxy,把KUBE_PROXY_ARGS=”“改为KUBE_...
  • 文章目录1.Service介绍2.开启kube-proxy的ipvs模式3.创建service 1.Service介绍 ...• ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。 • NodePort:将Service通过指定的Node
  • 问题描述: kubernetes创建了一个svc,里面只有一个pod,使用nodeport方式访问,只有容器在的那个节点加上nodeport端口可以访问,测试ping 容器的cluster ip 发现另一个节点不通。 master机子ping 2台node上的pod ...
  •   本文介绍一个iptables比较好玩的模块,即CLUSTERIP,顾名思义,这是一个与负载均衡有关的东西。 动机 将 同一个服务分布在不同的进程中,一直以来都非常具有吸引力,特别是当我们知道受制于摩尔定律,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 161,654
精华内容 64,661
关键字:

clusterip