NetworkPolicy是kubernetes对pod的隔离手段,是宿主机上的一系列iptables规则。

Egress 表示出站流量,就是pod作为客户端访问外部服务,pod地址作为源地址。策略可以定义目标地址或者目的端口

Ingress 表示入站流量,pod地址和服务作为服务端,提供外部访问。pod地址作为目标地址。策略可以定义源地址和自己端口

官网

https://docs.projectcalico.org/v3.1/getting-started/kubernetes/

我们这里使用的是 flannel 构建 K8S 网络,使用 Calico 构建网络规则

mkdir ~/networkpolicy ; cd ~/networkpolicy

kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/rbac.yaml
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/canal.yaml
kubectl get pods -n kube-system # 创建两个命名空间 dev 和 prod 进行测试
kubectl create namespace dev
kubectl create namespace prod vi pod-a.yaml
# 内容如下
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1 # 在命名空间 dev 创建 pod1
kubectl apply -f pod-a.yaml -n dev
kubectl get pods -n dev -o wide
# 运行结果:
NAME READY STATUS RESTARTS AGE IP NODE
pod1 1/1 Running 0 14m 10.244.2.2 node2 # 在命名空间 prod 创建 pod1
kubectl apply -f pod-a.yaml -n prod
kubectl get pods -n prod -o wide
# 运行结果:
NAME READY STATUS RESTARTS AGE IP NODE
pod1 1/1 Running 0 14m 10.244.1.2 node1 # 测试网络
curl 10.244.1.2 # 正常访问
curl 10.244.2.2 # 正常访问 kubectl exec pod1 -it -n prod -- /bin/sh
ping 10.244.2.2 # 链路正常

Ingress

# Ingress 默认禁止所有的入站流量
vi ngress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
spec:
podSelector: {}
policyTypes:
- Ingress kubectl apply -f ingress-def.yaml -n dev # 查看 networkpolicy 规则
kubectl get netpol -n dev curl 10.244.2.2 # 命名空间 dev pod1 无法访问 curl 10.244.1.2 # 命名空间 prod pod1 正常访问 # 开放所有的入站流量
vi ingress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
spec:
podSelector: {}
ingress:
- {}
policyTypes:
- Ingress kubectl apply -f ingress-def.yaml -n dev curl 10.244.1.2 # 命名空间 prod pod1 正常访问 curl 10.244.2.2 # 命名空间 dev pod1 正常访问

通过规则限制入站流量

kubectl delete netpol deny-all-ingress -n dev

kubectl label pods pod1 app=myapp -n dev

# 添加网络规则
vi allow-netpol-demo.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-myapp-ingress
spec:
podSelector:
matchLabels:
app: myapp # 选择app=myapp 的标签放行
ingress:
- from:
- ipBlock: # 地址段
cidr: 10.244.0.0/16 # 允许这个地址段访问
except: # 排除一下地址不可以访问
- 10.244.1.2/32
ports:
- protocol: TCP
port: 80 # 允许访问80端口
- protocol: TCP
port: 443 kubectl apply -f allow-netpol-demo.yaml -n dev kubectl get netpol -n dev curl 10.244.2.2:80 # 命名空间 dev pod1 正常访问 curl 10.244.2.2:443 # NetworkPolicy 放行,没有开放 443 端口,服务器拒绝
curl: (7) Failed connect to 10.244.2.2:443; Connection refused curl 10.244.2.2:6443 # 卡住,被 NetworkPolicy 拒绝

Egress

# 默认限制所有的出站流量
vi egrees-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
spec:
podSelector: {}
policyTypes:
- Egress kubectl apply -f egrees-def.yaml -n prod kubectl get pods -n kube-system -o wide
# 选取一个 coredns 的 pod ip kubectl exec pod1 -it -n prod -- /bin/sh
ping 10.244.0.4 # 无法正常 ping 通 # 放行所有的出站流量
vi egrees-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
spec:
podSelector: {}
egress:
- {}
policyTypes:
- Egress kubectl apply -f egrees-def.yaml -n prod kubectl exec pod1 -it -n prod -- /bin/sh
ping 10.244.0.4 # 正常 ping 通

K8S Calico的更多相关文章

  1. K8S Calico网络插件

    0.前言 参考文档:https://github.com/containernetworking/cni Pod网络插件,为了实现Pod网络而需要的插件.组件.由于Kubernetes通过开放的CNI ...

  2. K8S从入门到放弃系列-(11)kubernetes集群网络Calico部署

    摘要: 前面几个篇幅,已经介绍master与node节点集群组件部署,由于K8S本身不支持网络,当 node 全部启动后,由于网络组件(CNI)未安装会显示为 NotReady 状态,需要借助第三方网 ...

  3. k8s的两种网络方案与多种工作模式[flannel与calico]

    k8s的两种网络方案与多种工作模式 1. Flannel: flannel有三种工作模式: 1. vxlan(隧道方案) 2. host-gw(路由方案) 2. udp(在用户态实现的数据封装解封装, ...

  4. Kubeasz部署K8s基础测试环境简介

    下面介绍使用Kubeasz部署K8s集群环境. https://github.com/easzlab/kubeasz在需要使用kubeeasz项目安装的k8s时,需要将所有需要它来部署的节点上,都安装 ...

  5. 8、二进制安装K8s之部署CIN网络

    二进制安装K8s之部署CIN网络 部署CIN网络可以使用flannel或者calico,这里介绍使用calico ecd 方式部署. 1.下载calico二进制安装包 创建所需目录 mkdir -p ...

  6. 从一到万的运维之路,说一说VM/Docker/Kubernetes/ServiceMesh

    摘要:本文从单机真机运营的历史讲起,逐步介绍虚拟化.容器化.Docker.Kubernetes.ServiceMesh的发展历程.并重点介绍了容器化阶段之后,各项重点技术的安装.使用.运维知识.可以说 ...

  7. 使用Kubeadm(1.13+)快速搭建Kubernetes集群

    Kubeadm是管理集群生命周期的重要工具,从创建到配置再到升级,Kubeadm处理现有硬件上的生产集群的引导,并以最佳实践方式配置核心Kubernetes组件,以便为新节点提供安全而简单的连接流程并 ...

  8. k8s网络之Calico网络

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

  9. k8s网络之calico

    一.概述 前面我们部署calico由于集群规模不是很大,使用的是calico的bgp模式的node-to-node-mesh全节点互联,这种模式在小规模集群里面还可以用,3.4.0版本的calico支 ...

随机推荐

  1. Ubuntu16.04.1 安装Nginx

    Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev ...

  2. C++ Opencv split()通道分离函数 merge()通道合并函数 使用操作详解

    一. split()通道分离函数 split()函数的C++版本有两个原型,他们分别是: C++: void split(const Mat& src, Mat*mvbegin);//& ...

  3. 第81节:Java中的数组

    第81节:Java中的数组 本节介绍数组的基本概念,数据就是一种数据结构,可以用来存储多个数据,每个数组中可以存放相同类型的数据.比如,在学校,我们是一个班,这里的班级中每个同学都是这个班级数组中的元 ...

  4. 字体图标三种格式区别(Unicode / Font class / Symbol)

    在实际项目中,或多或少会用到字体图标,优点是即减少了体积,又减少了http请求,可谓一举两得 我一般是在阿里巴巴矢量图库下载字体图标:http://www.iconfont.cn/   下面以阿里巴巴 ...

  5. Kali学习笔记5:被动信息收集工具集

    1.Shodan SHODAN搜索引擎不像百度谷歌等,它们爬取的是网页,而SHODAN搜索的是设备. 物联网使用过程中,通常容易出现安全问题,如果被黑客用SHODAN搜索到,后果不堪设想. 网站:ht ...

  6. 嘿!我用python帮我干这些事

    python 无疑是当下火上天的语言,但是我们又不拿来工作,那么能拿来干啥呢?我是这么干的. 1. 平时工作开发用不上,就当个计算器吧! python # 加减乘除 >>> (3 + ...

  7. Python 字符串增删改查的使用

    #coding=utf-8a = 'haha'a = "hao"print(a)s = 'Hello World!'print(s.swapcase()) #大写变小写,小写变大写 ...

  8. Python find函数用法和概念

    概念: Python find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返 ...

  9. mysql 开发基础系列12 选择合适的数据类型(上)

    一. char 与varchar比较 在上图的最后一行的值只适用在"非严格模式",关于严格模式后面讲到.在“开发基础系列4“ 中讲到CHAR 列删除了尾部的空格.由于char是固定 ...

  10. 了解Java内存模型,看完这一篇就够了

    前言(此文草稿是年前写的,但由于杂事甚多一直未完善好.清明假无事,便收收尾发布了) 年关将近,个人工作学习怠惰了不少.两年前刚做开发的时候,信心满满想看看一个人通过自己的努力,最终能达到一个什么样的高 ...