k8s基于canal的网络策略
安装条件:1、kubelet必须配置为CNI网络插件(即--network-plugin-cni,默认新版本默认就是CNI)2、kube-proxy必须以iptables模式启动,不能以ipvs方式启动;3、kube-proxy不能以--masquerade-all方式启动,因为这和calico策略冲突;4、k8s版本至少要v1.3.05、--cluster-cidr=10.24...
安装条件:
1、kubelet必须配置为CNI网络插件(即--network-plugin-cni,默认新版本默认就是CNI)
2、kube-proxy必须以iptables模式启动,不能以ipvs方式启动;
3、kube-proxy不能以--masquerade-all方式启动,因为这和calico策略冲突;
4、k8s版本至少要v1.3.0
5、--cluster-cidr=10.244.0.0/16 and --allocate-node-cidrs=true.
部署canal
1、如果集群启用了RBAC,则使用以下命令来配置Calico所需的角色和绑定。
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/rbac.yaml
2、部署canal
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/canal.yaml
kubernetes中的网络控制策略
networkpolicy.spec讲解:
1.egress:
出站流量规则,可以根据ports和to去定义规则。ports:指定目标端口和协议,如果此字段为空或丢失,则此规则
匹配所有端口(不受端口限制的流量)。to(目标地址):目标地址,分为ip地址段、pod、namespace,如果这个字段为空或丢失,此规则匹配所有目标
2.ingress:
入站流量规则,可以根据ports和from。ports(被访问端口):指定目标端口和协议,如果这个字段为空或丢失,此规则匹配所有端口from(来自哪个地址):地址分为ip地址段、pod、namespace,如果from字段为空或丢失,此规则匹配所有源
3.podSelector:
定义NetworkPolicy的限制范围。直白的说就是规则应用到哪个pod上。podSelector: {},空的podselector匹配所有此命名空间中的pods。没有定义白名单的话 默认就是Deny ALL (拒绝所有)
4.policyTypes:
指定那个规则 那个规则生效,不指定就是默认规则。
example:
在两个名称空间测试网络策略
Ingress测试
-
建立名称空间
]# kubectl create namespace dev ]# kubectl create namespace prod
-
建立网络策略ingress-def.yaml
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all-ingress spec: podSelector: {} #空的podselector匹配所有此命名空间中的pods policyTypes: - Ingress #表示只对ingress生效,但是ingress策略丢失(没有设置)则此策略默认拒绝所有,且podSelector设置为空,故表示规则所在名称空间的所有pods,拒绝所有入站请求 #但是我们这里面又没有加egress,所以默认egress是允许所有的 ]# kubectl apply -f ingress-def.yaml -n dev networkpolicy.networking.k8s.io/deny-all-ingress created ]# kubectl get netpol -n dev NAME POD-SELECTOR AGE deny-all-ingress <none> 1m
-
dev名称空间建立pod
]# cat pod-a.yaml apiVersion: v1 kind: Pod metadata: name: pod1 spec: containers: - name: myapp image: ikubernetes/myapp:v1 ]# kubectl apply -f pod-a.yaml -n dev pod/pod1 created ]# kubectl get pods -n dev -o wide NAME READY STATUS RESTARTS AGE IP NODE pod1 1/1 Running 0 1m 10.244.2.2 node2 ]# curl 10.244.2.2 #无法访问目标
-
修改策略测试
]# cat ingress-def.yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all-ingress spec: podSelector: {} ingress: - {} #设置此策略且为空表示允许所有入站访问 policyTypes: - Ingress #表示只对ingress生效 #但是我们这里面又没有加egress,所以默认egress是允许所有的 ]# kubectl apply -f ingress-def.yaml -n dev networkpolicy.networking.k8s.io/deny-all-ingress configured ]# curl 10.244.2.2 #这时我们就能在宿主机上访问到dev名称空间的pod Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
测试完成还原策略:
]# curl 10.244.2.2 #不能访问
-
prod名称空间建立pod
]# kubectl apply -f pod-a.yaml -n prod pod/pod1 created ]# kubectl get pods -n prod -o wide NAME READY STATUS RESTARTS AGE IP NODE pod1 1/1 Running 0 1m 10.244.2.3 node2 ]# curl 10.244.2.3 #由于该名称空间并没有定义规则,可以正常通信 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
定义具体规则测试ingress
]# kubectl label pods pod1 app=myapp -n dev #为pod1定义labels pod/pod1 labeled ]# cat allow-netpol-demo.yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-myapp-ingress spec: 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 ]# kubectl apply -f allow-netpol-demo.yaml -n dev networkpolicy.networking.k8s.io/allow-myapp-ingress created ]# kubectl get netpol -n dev NAME POD-SELECTOR AGE allow-myapp-ingress app=myapp 1m deny-all-ingress <none> 5h ]# curl 10.244.2.2 #生效allow-myapp-ingress网络策略后,可以正常访问dev:pod1 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
Egress测试
]# cat egress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
spec:
podSelector: {} #pod选择器设置为空,表示选择所有pod,即控制整个名称空间
policyTypes:
- Egress #表示只对egress生效,Egress策略丢失(没有设置)则此策略默认拒绝所有
]# kubectl apply -f egress-def.yaml -n prod
networkpolicy.networking.k8s.io/deny-all-egress created
]# kubectl get pods -n prod
]# kubectl exec pod1 -it -n prod -- /bin/sh
/ # ping 10.244.0.45
PING 10.244.0.45 (10.244.0.45): 56 data bytes #请求被拒绝策略生效
]# cat egress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
spec:
podSelector: {}
egress:
- {} #表示允许所有egress出去的流量
policyTypes:
- Egress #表示只对egress生效
]# kubectl apply -f egress-def.yaml -n prod
]# kubectl exec pod1 -it -n prod -- /bin/sh
/ # ping 10.244.0.45
PING 10.244.0.45 (10.244.0.45): 56 data bytes
64 bytes from 10.244.0.45: seq=0 ttl=62 time=0.227 ms
64 bytes from 10.244.0.45: seq=1 ttl=62 time=0.284 ms
更多推荐
所有评论(0)