19.网络插件calico

官网: https://docs.projectcalico.org/v3.8/introduction/

calico默认工作在192.168.0.0/16 的网络

calico还不支持ipvs

====

Egres 出站

Ingress 入站

networkpolicy 网络策略,简写 netpol

查看网络策略帮助:

kubectl explain networkpolicy

查看某名称空间的网络策略:

[root@k8s-master networkpoliy]# kubectl get netpol -n dev

NAME POD-SELECTOR AGE

deny-all-ingress 73s

====

calico有多种部署方法,我们这里介绍的是使用flannel和calico混用的方法。这里也比较推荐这种方法。

flannel负责网络部分的功能,而calico我们只使用它的网络策略的功能。

calico部署:

1. 另外单独部署一个etcd

官方文档:

https://docs.projectcalico.org/v3.8/getting-started/kubernetes/installation/flannel

2. 公用集群的etcd
wget https://docs.projectcalico.org/v3.8/manifests/canal.yaml
kubectl apply -f canal.yaml [root@k8s-master networkpoliy]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
canal-j9mlh 2/2 Running 0 97m
canal-jgj2j 2/2 Running 0 97m

=====================

calico实例:

[root@k8s-master networkpoliy]# kubectl create namespace dev
namespace/dev created
[root@k8s-master networkpoliy]# kubectl create namespace prod
namespace/prod created [root@k8s-master networkpoliy]# cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
namespace: dev spec:
podSelector: {} #空表示选择该名称空间的所有pod
policyTypes: #当这里写了Ingress,则Ingress中定义的规则生效,如果规则为空则为全部拒绝。这里没有写Egres,则表示Egres规则不生效,默认全开。
- Ingress [root@k8s-master networkpoliy]# cat pod-a.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1 [root@k8s-master networkpoliy]# kubectl apply -f pod-a.yaml -n dev
pod/pod1 created [root@k8s-master networkpoliy]# kubectl apply -f pod-a.yaml -n prod
pod/pod1 created [root@k8s-master networkpoliy]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod1 1/1 Running 0 31s 10.244.1.2 k8s-node1 <none> <none> [root@k8s-master networkpoliy]# kubectl get pods -n prod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod1 1/1 Running 0 11s 10.244.1.3 k8s-node1 <none> <none> [root@k8s-master networkpoliy]# curl 10.244.1.2
^C
[root@k8s-master networkpoliy]# curl 10.244.1.3
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> dev的ns我们应用了策略,所以通过curl请求不到数据,prod的ns中我们没有应用网络策略,所以我们可以通过curl正常请求到。

添加入站规则

  ingress:
- {} #这个{}写法表示允许所有的入站,allow all [root@k8s-master networkpoliy]# cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
namespace: dev spec:
podSelector: {} #空表示选择该名称空间的所有pod
ingress:
- {} #这个{}写法表示允许所有的入站,allow all
policyTypes: #当这里写了Ingress,则Ingress中定义的规则生效,如果规则为空则为全部拒绝。这里没有写Egres,则表示Egres规则不生效,默认全开。 [root@k8s-master networkpoliy]# kubectl apply -f ingress.yaml -n dev
networkpolicy.networking.k8s.io/deny-all-ingress configured [root@k8s-master networkpoliy]# curl 10.244.1.2
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> 当我们修改策略允许dev上所有可以入站后可以正常请求到10.244.1.2了。

添加一个入站规则,允许10.244.0.0/16这个网段的除了10.244.1.3这个ip,都可以访问pod的80端口,使用podSelector来匹配pod

[root@k8s-master networkpoliy]# cat allow-netpol.demo.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-myapp-ingress
spec:
podSelector:
matchLabels:
app: myapp
ingress:
- from: #这里不写from则允许所有可以访问
- ipBlock:
cidr: 10.244.0.0/16 #指定网段
except:
- 10.244.1.3/32 #除开这个ip
ports:
- protocol: TCP
port: 80 [root@k8s-master networkpoliy]# kubectl apply -f allow-netpol.demo.yaml -n dev [root@k8s-master networkpoliy]# telnet 10.244.1.2 80
Trying 10.244.1.2...
Connected to 10.244.1.2.
Escape character is '^]'. 在本地测试,可以正常连接 [root@k8s-master networkpoliy]# kubectl exec pod1 -it -n prod -- /bin/sh
/ # telnet 10.244.1.2 80 登录到10.244.1.3这个pod上,则测试telnet 80端口不通,说明策略生效。

添加一个出站策略:

拒绝所有出站策略:

[root@k8s-master networkpoliy]# cat egress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
namespace: prod spec:
podSelector: {} #空表示选择该名称空间的所有pod
policyTypes: #当这里写了Ingress,则Ingress中定义的规则生效,如果规则为空则为全部拒绝。这里没有写Egres,则表示Egres规则不生效,默认全开。
- Egress [root@k8s-master networkpoliy]# kubectl apply -f egress.yaml -n prod [root@k8s-master networkpoliy]# kubectl exec pod1 -it -n prod -- /bin/sh
/ # ping 10.250.0.89
PING 10.250.0.89 (10.250.0.89): 56 data bytes ping k8s-master上的kube-scheduler-k8s-master 的ip发现ping不通,策略生效。 允许所有出去的策略:
[root@k8s-master networkpoliy]# cat egress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
namespace: prod spec:
podSelector: {} #空表示选择该名称空间的所有pod
egress:
- {}
policyTypes: #当这里写了Ingress,则Ingress中定义的规则生效,如果规则为空则为全部拒绝。这里没有写Egres,则表示Egres规则不生效,默认全开。
- Egress [root@k8s-master networkpoliy]# kubectl apply -f egress.yaml -n prod
networkpolicy.networking.k8s.io/deny-all-egress configured [root@k8s-master networkpoliy]# kubectl exec pod1 -it -n prod -- /bin/sh
/ # ping 10.250.0.89
PING 10.250.0.89 (10.250.0.89): 56 data bytes
64 bytes from 10.250.0.89: seq=119 ttl=63 time=0.384 ms
64 bytes from 10.250.0.89: seq=120 ttl=63 time=0.505 ms
64 bytes from 10.250.0.89: seq=121 ttl=63 time=0.373 ms
64 bytes from 10.250.0.89: seq=122 ttl=63 time=0.360 ms
64 bytes from 10.250.0.89: seq=123 ttl=63 time=0.504 ms ping通了,策略生效。

一般对于网络策略设置的规范:

对于网络策略来讲:

名称空间:

拒绝所有出站,入站规则

方形所有出站目标名称空间内的所有Pod

19.网络插件calico的更多相关文章

  1. k8s西游记 - 切换网络插件IP池

    前言 最近在另一个k8s集群中,搭建了kong网关,在配置OIDC插件时,希望使用Memcahe代替Cookie来存储会话信息,于是把部署在同一局域网Memcahe的内网IP,比如:192.168.1 ...

  2. Flannel和Calico网络插件工作流程对比

    Flannel和Calico网络插件对比   Calico简介 Calico是一个纯三层的网络插件,calico的bgp模式类似于flannel的host-gw Calico方便集成 OpenStac ...

  3. Flannel和Calico网络插件对比

    1.Kubernetes通信问题 1.容器间通信:即同一个Pod内多个容器间通信,通常使用loopback来实现. 2.Pod间通信:K8s要求,Pod和Pod之间通信必须使用Pod-IP 直接访问另 ...

  4. Calico网络插件

    以下大部分是本人参考各种资料{官方文档.书籍}对知识的汇总和整理,其中有理解错误的地方请大神留言和指正,嘿嘿~~ 1.概述 参考文档:https://projectcalico.docs.tigera ...

  5. K8S Calico网络插件

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

  6. k8s更换网络插件:从flannel更换成calico

    卸载flannel 查看已安装的flannel的信息 # 查看CNI插件,可以得知使用的是flannel # cat /etc/cni/net.d/10-flannel.conflist { &quo ...

  7. Docker网络解决方案 - Calico部署记录

    简单来说,实现docker跨主机容器间通信,常用的第三方网络方案是Flannel,Weave,Calico:Flannel会为每个host分配一个subnet,容器从这个subnet中分配ip,这些i ...

  8. 使用kubeadm安装kubernetes/部署前准备/flannel网络插件/镜像下载/

    本文内容参考<kuberneters进阶实战>/马哥的新书/推荐 部署前的准备 主机名称解析 分布式系统环境中的多主机通信通常基于主机名称进行,这在IP地址存在变化的可能性时为主机提供了固 ...

  9. k8s的flannel网络插件配置

    flannel的网络插件配置 Kubernetes网络通信需要解决以下问题:            (1)容器间通信:同一个Pod内的多个容器间的通信,lo            (2)Pod通信:P ...

随机推荐

  1. 【Hibernate】持久化对象状态及以及缓存

    一.持久化类状态 1.1 三种持久化对象的状态 1.2 区分三种状态 1.3 三种状态对象转换 1.瞬时态 2.持久态 3.脱管态 4.持久态对象有自动更新数据库的能力 一.持久化类状态 1.1 三种 ...

  2. Spring Boot实现自定义注解

    在Spring Boot项目中可以使用AOP实现自定义注解,从而实现统一.侵入性小的自定义功能. 实现自定义注解的过程也比较简单,只需要3步,下面实现一个统一打印日志的自定义注解: 1. 引入AOP依 ...

  3. 通过docker搭建ELK集群

    单机ELK,另外两台服务器分别有一个elasticsearch节点,这样形成一个3节点的ES集群. 可以先尝试单独搭建es集群或单机ELK https://www.cnblogs.com/lz0925 ...

  4. 日志实时查看、轮询、统计、监控工具 Loggrove

    Loggrove 是对日志文件进行 阅读.轮询.关键词匹配.监控告警.图表展示 的 Web 服务. 下载地址 https://github.com/olajowon/loggrove 超轻组件 Pyt ...

  5. Django基础目录

    Django基础(一):基础引用 Django基础(二):环境配置 Django—model系统:ORM基础 Django—model系统:ORM字段和参数 Django—model系统:ORM对数据 ...

  6. Go语言中的defer

    可以用作一些资源的释放. 1.在一个函数内的defer执行顺序是先写的后执行,后写的先执行(遵循栈结构) func DeferTest1(){ defer fmt.Println("我是 d ...

  7. SEO 统计算法

    1)简单粗暴型的,这里不用去管浏览器的user-agent,不管cookie等信息,每产生一次PV,就直接计数,优点:简单,缺点:可能不真实,也可能有刷量数据 2) 稍微细腻点的统计,会区分新老用户, ...

  8. libcurl 上传文件,不管文件什么格式 libcurl开发指南

    libcurl 上传文件,不管文件什么格式 libcurl开发指南 上传文件 https://curl.haxx.se/download.html curl命令参数很多,这里只列出我曾经用过.特别是在 ...

  9. go语言的defer语句

    转: https://www.jianshu.com/p/5b0b36f398a2 ---------------------------------------------------------- ...

  10. JS遍历表格获取每行数据及每个单元格数据

    /** * 遍历表格获取每行数据及每个单元格数据 * @param tableID 表格ID */ function GetTable(tableID) { var milasUrl = {};//新 ...