千家信息网

docker中k8s基于canal的网络策略是什么

发表于:2025-11-15 作者:千家信息网编辑
千家信息网最后更新 2025年11月15日,这篇文章主要介绍了docker中k8s基于canal的网络策略是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前提条件1、kube
千家信息网最后更新 2025年11月15日docker中k8s基于canal的网络策略是什么

这篇文章主要介绍了docker中k8s基于canal的网络策略是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

前提条件

1、kubelet必须配置为CNI网络插件(即--network-plugin-cni,默认新版本默认就是CNI)

2、kube-proxy必须以iptables模式启动,不能以ipvs方式启动;

3、kube-proxy不能以--masquerade-all方式启动,因为这和calico策略冲突;

4、k8s版本至少要v1.3.0

部署canal

1、

[root@master ~]# kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/rbac.yaml

2、

[root@master ~]# kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/canal.yaml

3、

[root@master ~]# kubectl get pods -n kube-system -o wideNAME                                   READY     STATUS    RESTARTS   AGE       IP             NODEcanal-7q4k7                            3/3       Running   0          4m        172.16.1.101   node1canal-dk2tc                            3/3       Running   0          4m        172.16.1.102   node2canal-zr8l4                            3/3       Running   0          4m        172.16.1.100   master

看到每个pod上都有3个容器,这三个容器有各自不同的功能。


Egres:出站,表示pod自己是客户端,访问别人。

Ingress:入站,表示Pod自己是目标,别人来访问自己。

通常,客户端的端口是随机的,服务端的端口是固定的。

Network Policy:用来控制哪个pod来和外部或内部进行通信。

podSelecto:pod选择器

policyTypes:用来控制Ingres和Egres哪个生效。

例子

建立两个名称空间,一个是测试,一个是生产。

[root@master ~]# kubectl create namespace devnamespace/dev created[root@master ~]# kubectl create namespace prodnamespace/prod created

建立网络策略:

[root@master ~]# mkdir networkpolicy[root@master ~]# cd networkpolicy/[root@master networkpolicy]# vim ingress-def.yamlapiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:  name: deny-all-ingressspec:  podSelector: {} #pod选择器设置为空,表示选择所有pod,即控制整个名称空间  policyTypes:   - Ingress #表示只对ingress生效,但是我们上面又把podSelector设置为空,表示默认是ingress拒绝所有的    #但是我们这里面又没有加egress,所以默认egress是允许所有的
[root@master networkpolicy]# kubectl apply -f ingress-def.yaml -n dev  #-n表示只对哪个名称空间生效networkpolicy.networking.k8s.io/deny-all-ingress created
[root@master networkpolicy]# kubectl get netpol -n devNAME               POD-SELECTOR   AGEdeny-all-ingress            1m

建立个容器,放在dev名称空间里面:

[root@master networkpolicy]# cat pod-a.yamlapiVersion: v1kind: Podmetadata:  name: pod1spec:  containers:  - name: myapp    image: ikubernetes/myapp:v1
[root@master networkpolicy]# kubectl apply -f pod-a.yaml -n devpod/pod1 created
root@master networkpolicy]# kubectl get pods -n dev -o wideNAME      READY     STATUS    RESTARTS   AGE       IP           NODEpod1      1/1       Running   0          1m        10.244.2.2   node2
[root@master networkpolicy]# curl   10.244.2.2 #看到我们在宿主机上访问不到dev名称空间里面的pod10.244.2.2,这是因为dev名称空间里面有个deny-all-ingress网络策略,拒绝任何入站请求导致的。

接下来我们在prod名称空间里面建立个pod:

[root@master networkpolicy]#  kubectl apply -f pod-a.yaml  -n prodpod/pod1 created
[root@master networkpolicy]# kubectl get pods -n prod -o wideNAME      READY     STATUS    RESTARTS   AGE       IP           NODEpod1      1/1       Running   0          1m        10.244.2.3   node2
[root@master networkpolicy]# curl 10.244.2.4 #我们看到在宿主机上可以访问到prod名称空间里面的podHello MyApp | Version: v1 | Pod Name
[root@master networkpolicy]# cat ingress-def.yaml apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:  name: deny-all-ingressspec:  podSelector: {} #pod选择器设置为空,表示选择所有pod,即控制整个名称空间  ingress:  - {} #空表示允许所有入站访问  policyTypes:  - Ingress #表示只对ingress生效    #但是我们这里面又没有加egress,所以默认egress是允许所有的
[root@master networkpolicy]# kubectl apply -f ingress-def.yaml -n devnetworkpolicy.networking.k8s.io/deny-all-ingress configured
[root@master networkpolicy]# curl 10.244.2.2 #这时我们就能在宿主机上访问到dev名称空间里面的容器了Hello MyApp | Version: v1 | Pod Name

我们接下来再还原会原来的网络策略,即拒绝入所有入站请求:

[root@master networkpolicy]# cat ingress-def.yaml apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:  name: deny-all-ingressspec:  podSelector: {} #pod选择器设置为空,表示选择所有pod,即控制整个名称空间  policyTypes:  - Ingress #表示只对ingress生效    #但是我们这里面又没有加egress,所以默认egress是允许所有的
[root@master networkpolicy]# kubectl apply -f ingress-def.yaml -n devnetworkpolicy.networking.k8s.io/deny-all-ingress unchanged
[root@master networkpolicy]# curl 10.244.2.2 #发现在宿主机上又不能访问访问到dev里面的pod了

下面我们给dev名称空间里面的pod1打个标签叫app=myapp

[root@master networkpolicy]# kubectl label pods pod1 app=myapp -n devpod/pod1 labeled
[root@master networkpolicy]# cat allow-netpol-demo.yaml apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:  name: allow-myapp-ingressspec:  podSelector:    matchLabels:      app: myapp  ingress: #入站  - from:    - ipBlock:        cidr: 10.244.0.0/16 #指定网段,允许从10.244.0.0/16入站到pod里面        except:        - 10.244.1.2/32 #排除这个地址    ports:    - protocol: TCP      port: 80
[root@master networkpolicy]# kubectl apply -f allow-netpol-demo.yaml -n devnetworkpolicy.networking.k8s.io/allow-myapp-ingress created
[root@master networkpolicy]# kubectl get netpol -n devNAME                  POD-SELECTOR   AGEallow-myapp-ingress   app=myapp      1mdeny-all-ingress               5h
[root@master networkpolicy]# curl 10.244.2.2 #看到加了allow-myapp-ingress网络策略后,立即就能访问dev里面的pod了Hello MyApp | Version: v1 | Pod Name

上面我们介绍了ingress入站规则,下面我们介绍egress出站规则。

[root@master networkpolicy]# cat egress-def.yamlapiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:  name: deny-all-egressspec:  podSelector: {} #pod选择器设置为空,表示选择所有pod,即控制整个名称空间  policyTypes:  - Egress #表示只对egress生效
[root@master networkpolicy]# kubectl apply -f egress-def.yaml -n prodnetworkpolicy.networking.k8s.io/deny-all-egress created
[root@master ~]# kubectl get pods -n kube-system -o wideNAME                                   READY     STATUS    RESTARTS   AGE       IP             NODEcanal-7q4k7                            3/3       Running   0          6h        172.16.1.101   node1canal-dk2tc                            3/3       Running   0          6h        172.16.1.102   node2canal-zr8l4                            3/3       Running   0          6h        172.16.1.100   mastercoredns-78fcdf6894-2l2cf               1/1       Running   18         24d       10.244.0.46    mastercoredns-78fcdf6894-dkkfq               1/1       Running   17         24d       10.244.0.45    masteretcd-master                            1/1       Running   18         24d       172.16.1.100   masterkube-apiserver-master                  1/1       Running   19         24d       172.16.1.100   masterkube-controller-manager-master         1/1       Running   18         24d       172.16.1.100   master[root@master networkpolicy]# kubectl get pods -n prodNAME      READY     STATUS    RESTARTS   AGEpod1      1/1       Running   0          1h[root@master networkpolicy]# kubectl exec pod1 -it  -n prod -- /bin/sh/ # ping 10.244.0.45  #看到ping其他名称空间的容器被拒绝,这就是因为网络策略deny-all-egress起的作用,它表示拒绝容器所有出口流量PING 10.244.0.45 (10.244.0.45): 56 data bytes
[root@master networkpolicy]# cat egress-def.yaml apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:  name: deny-all-egressspec:  podSelector: {} #pod选择器设置为空,表示选择所有pod,即控制整个名称空间  egress:  - {} #表示允许所有egress出去的流量  policyTypes:  - Egress #表示只对egress生效
[root@master networkpolicy]# kubectl apply -f egress-def.yaml -n prod
[root@master networkpolicy]# kubectl exec pod1 -it  -n prod -- /bin/sh #看到放行出站后,容器就可以ping通外部的容器了/ # ping 10.244.0.45PING 10.244.0.45 (10.244.0.45): 56 data bytes64 bytes from 10.244.0.45: seq=0 ttl=62 time=0.227 ms64 bytes from 10.244.0.45: seq=1 ttl=62 time=0.284 ms

我们为了更安全,我们可以设置每个名称空间拒绝所有入站,拒绝所有出站,然后再单独放行。不过,这样也出现一个问题,就是一个名称空间中,所有pod之间也不能通信了。所以还要加条策略就是允许本名称空间中的pod之间可以互相通信(放行所有出站目标本名称空间内的所有pod),但是不允许和外部名称空间之间进行通信。

感谢你能够认真阅读完这篇文章,希望小编分享的"docker中k8s基于canal的网络策略是什么"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

空间 名称 选择 策略 网络 容器 控制 宿主 就是 篇文章 通信 之间 接下来 客户 宿主机 方式 本名 流量 目标 端口 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 cii在网络安全是什么缩写 企石金蝶管理软件开发 软件开发管理制度知乎 知网属于书目数据库吗 软件开发为什么需要短信 数据库分类 有什么区别 为什么显示服务器断开连接 国家宣传周四川网络安全博览会 python查询数据库返回数据 成都孝成浩网络技术有限公司 筑客网络技术这家公司怎么样 节前网络安全检查新闻 怎样学好网络安全课 金融法律网络安全知识班会 女生app软件开发 荣主网络技术服务公司 不用rlwrap登录数据库 iwebshop数据库类 失去与服务器的连接 汉南区海航网络安全维护联系人 数据库密码字段怎么建 福建服务器回收厂家哪家好云空间 广州有好戏网络技术有限公司 阿里云服务器维护招聘 重庆前端软件开发定制 天津大学网络技术教育学院 北京互联网科技研究院是什么 mysql两表更新数据库表 城阳区分销软件开发哪家做的好 异地女友服务器
0