1、什么是Pod

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。任何容器任务都要封装在pod内部运行

Pod,就像在豌豆荚里,(不知道的去百度)是一组(一个或多个) 容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。 Pod 所建模的是特定于应用的 “逻辑主机”,其中包含一个或多个应用容器, 这些容器相对紧密地耦合在一起。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于在同一逻辑主机上运行的云应用。

除了应用容器,Pod 还可以包含在 Pod 启动期间运行的 Init 容器。 你也可以注入临时性容器来调试正在运行的 Pod

2、Pod特性

  1. pause容器,在启动时,pause总是位于Pod第一个启动的容器,它要第一个启动来帮pod实现初始化网络栈、挂载可能存在的存储卷、回收僵尸进程等任务
  2. Pod内部容器与pause容器共享名字空间(network、pid、ipc)

实验案例,用docker来模拟一个Pod的运行

#写一个简易的nginx配置
cat >> nginx.conf << EOF
error_log stderr;
events {worker_connections 1024;}
http {
    access_log /dev/stdout combined;
    server {
        listen 80 default_server;
        server_name example.com www.example.com;
        location / {
            proxy_pass http://127.0.0.1:2368;
        }
    }
}
docker run --name pause -p 8080:80 --ipc=shareable -d k8s.gcr.io/pause:3.1

docker run --name nginx \
-v /root/nginx.conf:/etc/nginx/nginx.conf \
--net=container:pause --ipc=container:pause \
--pid=container:pause -d nginx

docker run -d --name ghost \
-e NODE_ENV=development \
--net=container:pause \
--ipc=container:pause 
--pid=container:pause ghost

去到浏览器访问本机ip即可,访问成功即代表了三个容器是一个pod,因为nginx容器并没有进行端口映射,做出映射的是pause容器

以上就是基于docker部署的一个简易pod,更容易理解

 3、网络略述

kubernetes的网络模型假定了所有pod都在一个可以直接连通的扁平的网络空间中,这在GCE(gloogle conpute engine)里面是现成的网络模型,kubernetes假定这个网络已经存在。但是在私有云内搭建kubernetes集群,就不能假定这个网络已经存在了,我们需要自己实现这个网络架设,将不同节点上的docker容器之间的互相访问先打通,然后kubernetes才能运行成功

简单来说,先不考虑公网环境,优先解决内部之间的网络环境

4、kubernetes网络模型原则

原则有分为三点

  1. 在不使用网络地址转换(nat)的情况下,集群中的pod能与任意其他pod进行通信
  2. 在不使用网络地址转换(nat)的情况下,在集群节点上运行的程序能与同一节点上的任何pod通信
  3. 每个pod都有自己的ip地址(ip-per-pod),并且任意其他pod都可以通过相同的这个地址访问他

借助CNI(Container Network Interface)标准,kubernetes可以实现容器网络问题的解决。通过插件化方式来集成各种网络插件,实现集群内部网络互相通信,只要实现CNI标准中定义的核心接口操作

CNI的接口并不是指HTTP,gRPC这种接口。CNI接口是指对可执行程序的调用(exec),调用可执行程序。kubernetes官方默认的CNI插件路径为/opt/cni/bin,如下

[root@k8s-master bin]# ls
bandwidth  bridge  calico  calico-ipam  dhcp  dummy  firewall  flannel  host-device  host-local  ipvlan  loopback  macvlan  portmap  ptp  sbr  static  tap  tuning  vlan  vrf

 5、网络插件分类

CNI通过json格式的配置文件来描述网络配置,当需要配置容器网络时,由容器运行时负责调用执行CNI插件,并通过CNI插件的标准输入来传递配置文件信息,通过标准输出接收插件的执行结果。网络插件从功能可以分为五类:

Main(interface-creating)

创建具体网络设备,包含插件有

  1. bridge:网桥设备,连接container和host
  2. ipvlan:为容器增加ipvlan网卡
  3. loopback:IO设备,解决回环接口问题
  4. macvlan:为容器创建mac地址
  5. plp:创建一对VethPair(虚拟以太网对)
  6. vlan:分配一个vlan设备
  7. host-device:将已存在的设备移到容器内

IPAM(IP address allocation)

负责ip分配,包含插件有

  1. dhcp:容器向服务器发起请求,给pod发放或回收ip地址
  2. host-local:使用预先配置的ip地址段来分配ip
  3. static:为容器分配一个静态ipv4/ipv6地址,主要用于debug

Meta(other plugins)

顾名思义其他,无法分类的插件。包含插件有

  1. tuning:通过sysctl调整网络设备参数
  2. portmap:通过iptables配置端口映射
  3. bandwidth:使用Token Bucket Filter来限流(TBF,一种限流算法)
  4. sbr:为网卡设置source based routing
  5. firewall:通过iptables给容器网络的进出流量进行限制规则,就像iptables

Windows specific

专门用于windows的CNI插件

  1. win-bridge
  2. win-overlay

第三方插件

为kubernetes网络提供解决方案,太多了举例典型

  1. calico:这个博主写的非常好,Calico-介绍、原理与使用_calico的三种模式-CSDN博客
  2. flannel
  3. cilium
  4. OVN

6.组件、插件调用关系

和怎么利用CNI插件实现pod的分配,一图流

​​

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐