docker容器的四种网络类型

1.桥接       
    2.联盟
    3.主机
    4.无

docker跨节点的容器通信必须通过NAT机制  宿主机上的容器一般都是私网地址 它可以通过宿主机的物理网卡把数据包

发送到其它物理节点 但是无法接收到其它节点的响应报文   所以数据包经过宿主机网卡时候必须通过NAT做源地址转换

请求报文在本物理机需要做源地址转换(SNAT) 发送到目标物理机后  需要做目标地址转换(DNAT) 必须经过两级NAT 性能比较差

其NAT规则由docker自动创建 无需用户手动创建

网络虚拟化的常用方案

1.虚拟网桥 用纯软件的方式实现一个虚拟网桥设备
       必须依靠叠加网络来实现 需要增加额外的网络开销
       需要多封装IP首部或者MAC首部
       1.vxlan
       2.host-gw
          路由表信息量比较大
          所有的宿主机必须在同一个二层网络中
  2.多路复用

MacVLAN
  3.硬件交换

物理网卡直接支持虚拟出多个接口

k8s网络类型

1.容器间通信
         同一个pod内的所有容器通过lo接口直接通信
     2.Pod间通信
        k8s要求pod间的通信必须通过podIP直接到达不能经过任何转发
     3.Pod和Service通信
        两者的IP不在同一个网段
        依靠iptables或者ipvs规则来实现数据转发通信
        ipvs只能用来实现负载均衡 其它功能无法实现如NAT转发
    4.Service和集群外部客户端通信
       依靠ingress来实现

flannel配置

k8s中的所有Pod都是属于同一个网段中 都可以直接通信      flannel无法实现网络策略控制某些pod不能相互通信

网络管理包含以下功能

1.接口创建
       2.地址分配
       3.网络创建 
         默认使用vxlan的方式 flannel.1的接口就是用来封装隧道报文的
         每创建一个Pod 创建一对虚拟网络接口 一个连接pod 一个连接到虚拟网桥    虚拟网桥有一个接口连接到物理网卡

网络策略 NetWorkPolicy

控制pod和pod之间是否能够相互通信

flannel配置参数
       Network: flannel使用的CIDR格式的网络地址 为pod分配地址
          10.244.0.0/16 一级网络
          master: 10.244.1.0/24 一级网络中的子网
          node1: 10.244.2.0/24
     SubnetLen: 把Network切分子网供各节点使用时,使用多长的掩码进行切分
        默认是24位
       用于动态控制支持的节点数和节点上能够运行的Pod数
       主机地址越长 支持的节点数就越多
       网络地址越长 同一主机上支持的pod数就越多
       Backend: vxlan host-gw udp

flannel网络测试 选择两个不同节点上的pod进行通信测试
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
myapp-deploy-67f6f6b4dc-jnsbg / Running 18s 10.244.2.116 node3
myapp-deploy-67f6f6b4dc-pd8ss / Running 18s 10.244.1.4 node2
myapp-deploy-67f6f6b4dc-zdxht / Running 18s 10.244.2.115 node3
[root@k8s-master ~]# kubectl exec -it myapp-deploy-67f6f6b4dc-pd8ss -- /bin/sh
/ # ping 10.244.2.116
PING 10.244.2.116 (10.244.2.116): data bytes
bytes from 10.244.2.116: seq= ttl= time=1.258 ms
bytes from 10.244.2.116: seq= ttl= time=5.573 ms
bytes from 10.244.2.116: seq= ttl= time=0.951 ms
bytes from 10.244.2.116: seq= ttl= time=0.764 ms 网络抓包 查看数据包的转发路径
说明flannel默认为数据从cni0接口进来 经过flannel.0接口
最后从从物理网卡发出去的是vxlan的叠加网络报文
[root@node2 ~]# tcpdump -i cni0 -nn icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on cni0, link-type EN10MB (Ethernet), capture size bytes
::20.765638 IP 10.244.1.4 > 10.244.2.116: ICMP echo request, id , seq , length
::20.766146 IP 10.244.2.116 > 10.244.1.4: ICMP echo reply, id , seq , length
::21.766591 IP 10.244.1.4 > 10.244.2.116: ICMP echo request, id , seq , length
::21.767360 IP 10.244.2.116 > 10.244.1.4: ICMP echo reply, id , seq , length #默认是通过flannel.1接口进行通信
[root@k8s-master ~]# ip route show
default via 192.168.11.2 dev ens33 proto dhcp metric
10.244.0.0/ dev cni0 proto kernel scope link src 10.244.0.1
10.244.1.0/ via 10.244.1.0 dev flannel. onlink
10.244.2.0/ via 10.244.2.0 dev flannel. onlink
172.17.0.0/ dev docker0 proto kernel scope link src 172.17.0.1
192.168.11.0/ dev ens33 proto kernel scope link src 192.168.11.141 metric [root@k8s-master ~]# kubectl delete -f kube-flannel.yml
clusterrole.rbac.authorization.k8s.io "flannel" deleted
clusterrolebinding.rbac.authorization.k8s.io "flannel" deleted
serviceaccount "flannel" deleted [root@k8s-master ~]# kubectl apply -f kube-flannel.yml #直接通过物理网卡ens33进行通信
[root@node2 ~]# ip route show
default via 10.200.106.1 dev ens34 proto dhcp metric
default via 192.168.11.2 dev ens33 proto dhcp metric
10.200.106.0/ dev ens34 proto kernel scope link src 10.200.107.98 metric
10.244.0.0/ via 192.168.11.141 dev ens33
10.244.1.0/ dev cni0 proto kernel scope link src 10.244.1.1
10.244.2.0/ via 192.168.11.143 dev ens33
172.17.0.0/ dev docker0 proto kernel scope link src 172.17.0.1
192.168.11.0/ dev ens33 proto kernel scope link src 192.168.11.142 metric 直接在物理网卡上进行抓包测试
[root@node2 ~]# tcpdump -i ens33 -nn icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size bytes
::24.054961 IP 10.244.1.5 > 10.244.2.117: ICMP echo request, id , seq , length
::25.055260 IP 10.244.1.5 > 10.244.2.117: ICMP echo request, id , seq , length
::26.056018 IP 10.244.1.5 > 10.244.2.117: ICMP echo request, id , seq , length

flannel配置实例

calico配置和使用

网络策略 NetWorkPolicy

拒绝所有出站和入站规则

放行所有出站目标为本名称空间内的所有pod

 [root@k8s-master ~]# kubectl apply -f \
> https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/rbac.yaml
clusterrole.rbac.authorization.k8s.io/calico created
clusterrole.rbac.authorization.k8s.io/flannel configured
clusterrolebinding.rbac.authorization.k8s.io/canal-flannel created
clusterrolebinding.rbac.authorization.k8s.io/canal-calico created
[root@k8s-master ~]# kubectl apply -f \
> https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/canal.yaml
#创建了一些自定义的k8s资源
configmap/canal-config created
daemonset.extensions/canal created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created #每个节点都需要运行一个canal pod 表示canal安装成功
[root@k8s-master ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
canal-9nt4d / Running 3m
canal-fpxqt / Running 3m
canal-jbpd7 / Running 3m

canal安装

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
spec:
podSelector: {}
policyTypes:
- Ingress apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
spec:
podSelector: {}
policyTypes:
- Egress

ingress-deny.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all-ingress
spec:
podSelector: {}
ingress:
- {}
policyTypes:
- Ingress apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-egress
spec:
podSelector: {}
egress:
- {}
policyTypes:
- Egress
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow--ingress
spec:
podSelector:
matchLabels:
app: myapp
ingress:
- from:
- ipBlock:
cidr: 10.244.0.0/
except:
- 10.244.1.2/
ports:
- protocol: TCP
port:
- protocol: TCP
port:

ingress-80.yaml

#同一网络规则在不同的配置清单中都定义过的话
#后执行的清单设置会覆盖前面执行清单中的配置
[root@k8s-master networkpolicy]# kubectl apply -f ingress-allow.yaml -n dev
networkpolicy.networking.k8s.io/deny-all-ingress configured
[root@k8s-master networkpolicy]# curl 10.244.2.2
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@k8s-master networkpolicy]# curl 10.244.1.2
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@k8s-master networkpolicy]# kubectl apply -f ingress-def.yaml -n dev
networkpolicy.networking.k8s.io/deny-all-ingress configured
[root@k8s-master networkpolicy]# curl 10.244.2.2 [root@k8s-master networkpolicy]# kubectl get networkpolicy -n dev
NAME POD-SELECTOR AGE
allow-all-ingress <none> 17s
deny-all-ingress <none> 12m [root@k8s-master networkpolicy]# kubectl label pods pod1 app=myapp -n dev
pod/pod1 labeled [root@k8s-master networkpolicy]# curl 10.244.2.2:
^C
[root@k8s-master networkpolicy]# curl 10.244.2.2:
curl: () Failed connect to 10.244.2.2:; Connection refused

k8s网络配置管理的更多相关文章

  1. 【Kubernetes】K8S网络方案--最近在看的

    K8S网络-最近在看的 Create a Minikube cluster - Kubernetes Kubernetes Documentation - Kubernetes Kubernetes ...

  2. 【Kubernetes】K8S 网络隔离 方案

    参考资料: K8S-网络隔离参考 OpenContrail is an open source network virtualization platform for the cloud. – Kub ...

  3. k8s网络之Flannel网络

    k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 简介 Flannel是CoreOS团队针对Kubernetes设计的一个网络规划 ...

  4. k8s网络之Calico网络

    k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 简介 Calico 是一种容器之间互通的网络方案.在虚拟化平台中,比如 Open ...

  5. k8s网络之设计与实现

    k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 K8s网络设计与实现是在学习k8s网络过程中总结的内容.在学习k8s网络各种插件 ...

  6. ASP.NET Core on K8S深入学习(11)K8S网络知多少

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.Kubernetes网络模型 我们都知道Kubernetes作为容器编排引 ...

  7. 一次客户需求引发的K8S网络探究

    前言 在本次案例中,我们的中台技术工程师遇到了来自客户提出的打破k8s产品功能限制的特殊需求,面对这个极具挑战的任务,攻城狮最终是否克服了重重困难,帮助客户完美实现了需求?且看本期K8S技术案例分享! ...

  8. 从零开始入门 K8s | 应用配置管理

    一.需求来源 背景问题 首先一起来看一下需求来源.大家应该都有过这样的经验,就是用一个容器镜像来启动一个 container.要启动这个容器,其实有很多需要配套的问题待解决: 第一,比如说一些可变的配 ...

  9. k8s网络原理

    https://blog.csdn.net/watermelonbig/article/details/80646988 k8s中,每个 Pod 都有一个独立的 IP 地址,所有 Pod 在一个网络空 ...

随机推荐

  1. centos定时删除log文件

    #!bin/bash #获取年 time=$(date "+%Y") #查找并删除7天前的文件 find /opt/applog/travelsky -type f -mtime ...

  2. yarn rest api未授权漏洞

    项目集群之前在yarn8088的web资源管理页面上看到一堆莫名的定时任务,就是黑客利用漏洞挖矿,最后禁用了8088端口. freebuff传送门: https://www.freebuf.com/v ...

  3. 【洛谷P3835】 【模板】可持久化平衡树

    可持久化非旋转treap,真的是又好写又好调 ~ code: #include <cstdio> #include <cstdlib> #include <algorit ...

  4. 回溯法 | n皇后问题

    今早上看了一篇英语阅读之后,莫名有些空虚寂寞冷.拿出算法书,研读回溯法.我觉得n皇后问题完全可以用暴力方式,即先对n个数进行全排列,得到所有结果的下标组合,问题规模为n!. 全排列花了比较久的时间才编 ...

  5. luogu P2430 严酷的训练 题解

    By:Soroak 知识点:DP 思路:就是一道简单的DP 一开始我想用二维数组做 做着做着发现,没有那么难啊啊啊 完全可以用一维数组来做 我们先开两个一维数组来存每个题目的时间 一个是老王的时间,另 ...

  6. 【BZOJ3837】[PA2013]Filary

    [BZOJ3837][PA2013]Filary 题面 darkbzoj 题解 考虑到模数为\(2\)时答案至少为\(\frac n2\),这是我们答案的下界. 那么我们对于任意的一个数,它们答案集合 ...

  7. ZROI 暑期高端峰会 A班 Day3 字符串

    FBI Warning:本文含有大量人类的本质之一 后缀树 反正后缀树就是反串的后缀自动机的 Parent 树,就不管了. 然而 SAM 也忘了 好的假装自己会吧--dls 后缀自动机 大概记得,不管 ...

  8. 测试之selenium简介

    目录 selenium是什么? 应该具备的知识 Selenium功能特性 Selenium的局限性 Selenium与QTP比较 Selenium工具套件 Selenium集成开发环境(IDE) Se ...

  9. Hbase安装使用

    启动Hadoop 启动Hbase jps 进入shell 建立表及使用

  10. github下载速度慢甚至多次失败,通过码云的导入功能导入github项目到码云上,然后再从码云下载

    github下载速度慢甚至多次失败,通过码云的导入功能导入github项目到码云上,然后再从码云下载 参考 https://blog.csdn.net/kcx64/article/details/83 ...