zoukankan      html  css  js  c++  java
  • kubernetes pod infra container网络原理

    刚开始接触kubernetes时,对kubelet的--pod-infra-container-image参数非常不能理解,不理解为什么我的业务应用需要依赖一个第三方的容器;

    上文入门级kubernetes安装流程中简单提了一句,启动pod后的两个容器会有相同的网络地址,这样,多个容器可以绑定为一个pod进行管理;

    本文展开来说一下这里的网络原理;其实就是一层窗户纸,捅破了就明白了;

    在node上,看一下上文启动的两个container:

    # docker ps
    CONTAINER ID        IMAGE                                           COMMAND                  CREATED             STATUS              PORTS               NAMES
    3e5e69a69950        <registry>/nginx/nginx                       "nginx -g 'daemon of…"   23 hours ago        Up 23 hours                             k8s_nginx_nginx-55cc995fdb-27t7z_default_1ca63ddd-7ab5-11e8-be61-3440b59f0098_0
    ec311fee295d        <registry>/rhel7/pod-infrastructure:latest   "/pod"                   23 hours ago        Up 23 hours                             k8s_POD_nginx-55cc995fdb-27t7z_default_1ca63ddd-7ab5-11e8-be61-3440b59f0098_0

    然后看一下它们的PID:

    # docker inspect ec311fee295d|grep '<Pid>'
                "Pid": 26252,
    # docker inspect 3e5e69a69950|grep '<Pid>'
                "Pid": 26349,

    再看一下这两个进程的network namespace:

    # ls -l /proc/26252/ns/net
    lrwxrwxrwx 1 opss root 0 6月  28 17:24 /proc/26252/ns/net -> net:[4026532927]
    # ls -l /proc/26349/ns/net
    lrwxrwxrwx 1 root root 0 6月  29 16:06 /proc/26349/ns/net -> net:[4026532927]

    这两个进程共用一个network namespace;但这个network namespace没有创建在/var/run/netns下,所以ip命令查看不了,做个软链好了:

    # mkdir -p /var/run/netns
    # ln -s /proc/26349/ns/net /var/run/netns/pod1
    # ip netns 
    pod1

    这样就能查看这个network namespace下的网络信息了:

    # ip netns exec pod1 ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
    315: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP 
        link/ether 02:42:ac:0a:3f:02 brd ff:ff:ff:ff:ff:ff
        inet 172.10.63.2/24 brd 172.10.63.255 scope global eth0
           valid_lft forever preferred_lft forever

    这就是在两个容器里看到的相同的网络信息;

    现在也启动一个容器,用container网络模式加入到已有的network namespace;

    # docker run -d --rm --net="container:ec311fee295d" xxxxxx

    这样启动一个xxxxxx容器,加入到已有的网络,然后按同样的办法查看/proc/<pid>/ns/net,会发现这个容器使用的ns与前两个相同;进入容器查看网络信息,ip地址也与前两个相同;

    参考:深入解析Docker背后的namespace技术

  • 相关阅读:
    zoj1028-Flip and Shift
    OSI七层模型基础知识及各层常见应用
    隐藏AutoCompleteTextView下拉框的滚动条
    VC++笔记七
    [置顶] 无名管道的C++封装
    张佩的Dump服务
    Oracle Autonomous Transactions(自治事务)
    Computational Geometry Template
    普通人和牛人之间的差距之举一反三能力
    关于选择
  • 原文地址:https://www.cnblogs.com/ZisZ/p/9244171.html
Copyright © 2011-2022 走看看