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. java中i=i++的问题

    java中 i = i++ 的结果 昨天看到下面这段代码,分享出来给大家看看,大家也可以讨论讨论. int i = 0; i = i++; System.out.println("i的值是 ...

  2. Image Processing and Analysis_15_Image Registration: A Method for Registration of 3-D shapes——1992

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

  3. Jupyter Notebook 插件安装

    刚才安装notebook插件jupyter_contrib_nbextensions,搜了很多教程都没有作用.直到用了这个命令,一行解决. pip install jupyter_contrib_nb ...

  4. Ubuntu系统---Ubuntu16.04进不了界面(登录界面循环,密码正确)(一体化安装(CUDA +NVIDIA驱动)+ cuDNN)

                                                 Ubuntu16.04进不了界面(登录界面循环,密码正确)(一体化安装(CUDA +NVIDIA驱动)+ cu ...

  5. OpenCV VideoCapture.get()参数详解

    转自https://blog.csdn.net/u011436429/article/details/80604590 方便查阅

  6. airflow--调度研究

    1.从调度到airflow ETL,是英文 Extract,Transform,Load 的缩写,用来描述将数据从来源端经过抽取(extract).转换(transform).加载(load)至目的端 ...

  7. WCF学习笔记二

    客户端调用WCF服务出现以下错误: “/”应用程序中的服务器错误. 远程服务器返回错误: (415) Unsupported Media Type. 说明: 执行当前 Web 请求期间,出现未经处理的 ...

  8. Python 12---图形界面

    def load(event):f= open(filename.GetValue())contents.SetValue(f.read())f.close() def save(event):new ...

  9. Shell 脚本来自动监控 Linux 系统的内存

    # vim /scripts/swap-warning.sh #!/bin/bash #提取本服务器的IP地址信息 IP=`ifconfig eth0 | grep "inet addr&q ...

  10. The method setCharacterEncoding(String) is undefined for the type HttpServletResponse

    今天将以前做的一个web项目从不笔记本上移到台式机上,import项目后出现“The method setCharacterEncoding(String) is undefined for the ...