当前位置:   article > 正文

K8S网络总结_k8s 169.254.1.1

k8s 169.254.1.1

K8S网络总结

前言

K8S的网络模型假定了所有pod都在一个可以直接连通的扁平的网络空间中(所有的pod都可以通过对方的ip直接"到达")。
在这里插入图片描述
在这里插入图片描述

本文主要研究

  • Docker容器和Docker容器之间的网络
  • CNI网络插件
  • Pod与Pod之间的网络
  • Pod与Service之间的网络
  • Internet与Service之间的网络

一、容器和容器之间的网络

1.Pod中的容器网络

在K8S的pod容器中,多容器之间共享网络堆栈,所以容器直接可以使用localhost访问其他容器。由于网络共享,因此每个容器不能有一样的端口号。如下图所示,图中有一个pause容器,k8s在启动容器的时候会先启动一个pause容器,这个容器的作用是
1.可以根据pause根容器为依据,评估整个Pod健康状态。
2.实现Pod内部中容器间网络共享

在这里插入图片描述

在这里插入图片描述

2.pause容器

参考文章
https://zhuanlan.zhihu.com/p/81666226

docker ps -a 查看
每个pod中都会有一个pause容器
  • 1
  • 2

在这里插入图片描述
1:为什么要pause容器?

  • Docker部署多个容器时候,比如有个java程序,然后还需要一些监控模块。需要通过namespace,cgruop机制来共享linux资源。
  • 创建一个父容器就可以配置docker来管理容器组之间的共享问题。这个父容器需要能够准确的知道如何去创建共享运行环境的容器,还能管理这些容器的生命周期。为了实现这个父容器的构想,kubernetes中,用pause容器来作为一个pod中所有容器的父容器。
  • pause容器有两个核心的功能,第一,它提供整个pod的Linux命名空间的基础。第二,启用PID命名空间,它在每个pod中都作为PID为1进程,并回收僵尸进程。

a.共享命名空间

在Linux中,当我们运行一个新的进程时,这个进程会继承父进程的命名空间。而运行一个进程在一个新的命名空间,是通过“unsharing”父进程的命名空间从而创建一个新的命名空间。这里举个例子,使用unshare工具来运行一个具有新PID,UTS,IPC以及mount命名空间的shell。

sudo unshare --pid --uts --ipc --mount -f chroot rootfs /bin/sh
  • 1

随后通过如下命令加入创建好的pause命名空间

docker run xxx --net=container:pause --ipc=container:pause --pid=container:pause nginx
  • 1

在这里插入图片描述

b.僵尸进程问题

子进程的结束和父进程的运行是一个异步过程
僵尸进程是指它的父进程已经退出(父进程没有等待(调用wait/waitpid)它),而该进程dead之后没有进程接受,就成为僵尸进程,也就是(zombie)进程。

每个进程在系统进程表里有存在一条记录。它记录了关于进程状态和退出码的相关信息。当子进程已经结束运行时,它在进程表中的记录仍然存在,只有当父进程通过使用wait系统调用取回了它的退出码。这个过程就叫做回收僵尸进程。
在这里插入图片描述
在容器中,每个PID命名空间必须有一个进程作为init进程。Docker中每个容器通常有自己的PID命名空间,入口点进程是init进程。但是,在kubernetes pod中,我们可以使容器在另一个容器的命名空间中运行。在这种情况下,一个容器必须承担init进程的角色,而其他容器则作为init进程的子元素添加到命名空间中。
在这里插入图片描述

Pause容器内其实就运行了一个非常简单的进程

static void sigdown(int signo) {
  psignal(signo, "Shutting down, got signal");
  exit(0);
}

static void sigreap(int signo) {
  while (waitpid(-1, NULL, WNOHANG) > 0);
}

int main() {
  if (getpid() != 1)
    /* Not an error because pause sees use outside of infra containers. */
    fprintf(stderr, "Warning: pause should be the first process\n");

  if (sigaction(SIGINT, &(struct sigaction){.sa_handler = sigdown}, NULL) < 0)
    return 1;
  if (sigaction(SIGTERM, &(struct sigaction){.sa_handler = sigdown}, NULL) < 0)
    return 2;
  if (sigaction(SIGCHLD, &(struct sigaction){.sa_handler = sigreap,
                                             .sa_flags = SA_NOCLDSTOP},
                NULL) < 0)
    return 3;

  for (;;)
    pause();
  fprintf(stderr, "Error: infinite loop terminated\n");
  return 42;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

在这里插入图片描述
其中第24行里一个无限循环for(;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/128306
推荐阅读
相关标签