前言:
此刻同学们对“get network”可能比较重视,兄弟们都需要剖析一些“get network”的相关文章。那么小编在网摘上收集了一些有关“get network””的相关文章,希望姐妹们能喜欢,同学们一起来了解一下吧!书籍来源:《CKA/CKAD应试指南:从Docker到Kubernetes完全攻略》
一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:CKA备考实验 | 汇总-CSDN博客
允许特定标签的pod能访问
创建网络策略时需要指定:这个策略要应用到哪些pod上(保护哪些pod),以及指定哪些客户端可以访问。在指定哪些允许客户端能访问的时候,可以通过标签、网段及命名空间来指定。这里先演示通过标签来指定允许的客户端。
步骤1:创建网络策略的yaml文件,内容如下。
##########实操验证##########[root@vms10 net]# cat net1.yaml apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: mypolicyspec: podSelector: matchLabels: run: pod1 # 此策略作用在标签为run=pod1的pod policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: xx: xx # 只允许当前命名空间里标签为xx=xx的pod来访问 ports: - protocol: TCP port: 80[root@vms10 net]#
spec.podSelector设置策略应用在哪些pod上,即要保护哪些pods。spec.ingress.from设置的是允许哪些客户端来访问。
整体意思是,此策略应用在当前命名空间里标签名为run=pod1的pod上,即此策略应用到pod1上,而没有应用到pod2上。哪些客户端能访问呢?当前命名空间具有标签为xx=xx的那些pod可以访问,且只允许访问pod1的端口80。
注意:在spec.podSelector.matchLabels下没写任何标签的话,则会保护当前命名空间里所有的pod,如图13-6所示。
因为网络策略只作用于pod1,不会影响pod2,所以测试pod是可以继续访问pod2的,但不能访问pod1。
步骤2:创建网络策略。
##########实操验证##########[root@vms10 net]# kubectl apply -f net1.yamlnetworkpolicy.networking.k8s.io/mypolicy created[root@vms10 net]#
下面开始测试。
步骤3:再次在浏览器里测试。
在物理机里访问svc1对应的IP 192.168.26.111,如图13-7所示。
答案是访问不到,因为只有标签为xx=xx的pod才能访问,其他任何主机不能访问。
步骤4:在测试pod里进行测试,注意这个测试pod不存在标签xx=xx。
##########实操验证##########/home # curl svc2222/home # /home # curl svc1^C/home #
可以看到是不能访问pod1的,但是可以正常访问pod2,因为pod1被网络策略限制只有特定的客户端才能访问,但是pod2没有被限制。
这里是通过访问svc的方式来访问pod的,svc会把请求转发给pod,所以本质上就是访问pod。
步骤5:为测试pod添加一个标签xx=xx,然后测试访问端口80。
##########实操验证##########[root@vms10 net]# kubectl get pods busybox --show-labelsNAME READY STATUS RESTARTS AGE LABELSbusybox 1/1 Running 0 5m58s run=busybox,xx=xx[root@vms10 net]#
这里通过curl能正常访问pod1和pod2,因为测试pod含有标签xx=xx,如图13-8所示。
步骤6:切换到ssh客户端的第一个标签,测试ping的连通性。
##########实操验证##########[root@vms10 net]# ping 10.244.14.36 -c1PING 10.244.14.36 (10.244.14.36) 56(84) bytes of data.^C--- 10.244.14.36 ping statistics ---1 packets transmitted, 0 received, 100% packet loss, time 0ms[root@vms10 net]# [root@vms10 net]# ping 10.244.14.37 -c1PING 10.244.14.37 (10.244.14.37) 56(84) bytes of data.64 bytes from 10.244.14.37: icmp_seq=1 ttl=63 time=0.272 ms--- 10.244.14.37 ping statistics ---1 packets transmitted, 1 received, 0% packet loss, time 0msrtt min/avg/max/mdev = 0.272/0.272/0.272/0.000 ms[root@vms10 net]#
这里在集群中任一节点上(vms 10~12)测试ping,发现pod2可以正常ping通,但是pod1是不通的,因为策略里只允许访问端口80,而不允许访问其他的协议,比如ICMP。
注意下面的策略。
##########实操验证##########[root@vms10 net]# cat net1.yaml apiVersion: networking.k8s.io/v1kind: NetworkPolicy metadata: name: mypolicyspec: podSelector: matchLabels: #matchLabels下没指定任何标签,会影响当前命名空间里所有pod policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: #这下面也没指定任何标签,允许当前命名空间里所有的pod访问 ports: - protocol: TCP port: 80[root@vms10 net]#
这个网络策略则是应用到当前命名空间里所有的pod,且允许当前命名空间里所有标签的pod访问。
允许特定网段的客户端能访问
步骤6:修改net1.yaml文件,内容如下。
##########实操验证##########[root@vms10 net]# cat net1.yaml apiVersion: networking.k8s.io/v1kind: NetworkPolicy metadata: name: mypolicy spec: podSelector: matchLabels: run: pod1 policyTypes: - Ingress ingress: - from: - ipBlock: cidr: 192.168.1.0/24 # 注意这里和 - ipBlock之间是4个空格的缩进 ports: - protocol: TCP port: 80[root@vms10 net]#
这里允许192.168.26.0/24网段的主机可以访问标签为run=pod1的pod(当然也可以访问svc1这个服务),其他的不允许,如图13-9所示。
步骤7:应用此文件。
##########实操验证##########[root@vms10 net]# kubectl apply -f net1.yaml networkpolicy.networking.k8s.io/mypolicy configured[root@vms10 net]#
步骤8:在物理机里刷新浏览器,如图13-10所示。
步骤9:在busybox这个测试pod(此pod具有xx=xx标签)里进行测试。
##########实操验证##########/home # curl svc1^C/home #
这里没有访问成功,因为网络策略里并没有允许指定标签的pod访问,只允许某个网段的客户端访问,这个测试pod的IP并没有出现在指定网段,所以访问不了。
如果在网络策略里podSelector和ipBlock都写的话,它们是“或”的关系,如下所示。
ingress:- from: - podSelector: matchLabels: xx: xx - ipBlock: cidr: 192.168.26.0/24
这里的意思就是既允许当前命名空间里标签xx=xx的pod访问,也允许192.168.26.0/24网段里客户端访问。
删除网络策略的命令很简单,语法如下。
kubectl delete -f yaml文件 或者kubectl delete networkpolicies 名字
下面删除刚刚创建的网络策略mypolicy。
步骤10:查看现在有的网络策略。
##########实操验证##########[root@vms10 net]# kubectl get networkpoliciesNAME POD-SELECTOR AGEmypolicy run=pod1 83s[root@vms10 net]#
步骤11:删除网络策略mypolicy。
##########实操验证##########[root@vms10 net]# kubectl delete networkpolicies mypolicynetworkpolicy.networking.k8s.io "mypolicy" deleted[root@vms10 net]#允许特定命名空间里的pod能访问
如果要限制其他某个命名空间里的客户端pod能否访问当前命名空间里的pod,则可以通过namespaceSelector来限制。
本节实验要实现的效果是,允许default命名空间里的pod可以访问命名空间nsnet里的pod,但是不允许自己命名空间里的其他pod访问,如图13-11所示。
实验的思路为,给命名空间nsnet设置一个标签name=nsnet,给命名空间default设置一个标签name=default。然后创建一个网络策略,这个网络策略只允许命名空间default里的pod来访问nsnet里所有的pod,其他客户端均不允许访问。
步骤1:先为default和net这两个命名空间设置标签。
##########实操验证##########[root@vms10 net]# kubectl label ns default name=default namespace/default labeled[root@vms10 net]# kubectl label ns nsnet name=nsnet namespace/nsnet labeled[root@vms10 net]#
步骤2:查看这两个命名空间的标签。
##########实操验证##########[root@vms10 net]# kubectl get ns --show-labels NAME STATUS AGE LABELSdefault Active 144d kubernetes.io/metadata.name=default,name=defaultingress-nginx Active 29m app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx,kubernetes.io/metadata.name=ingress-nginxkube-node-lease Active 144d kubernetes.io/metadata.name=kube-node-leasekube-public Active 144d kubernetes.io/metadata.name=kube-publickube-system Active 144d kubernetes.io/metadata.name=kube-systemmetallb-system Active 67m kubernetes.io/metadata.name=metallb-systemnsnet Active 123m kubernetes.io/metadata.name=nsnet,name=nsnetnssvc Active 81m kubernetes.io/metadata.name=nssvc[root@vms10 net]#
步骤3:修改net1.yaml的内容。
##########实操验证##########[root@vms10 net]# cat net1.yaml apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: mypolicyspec: podSelector: matchLabels: #matchLabels下没指定任何标签 policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: name: default ports: - protocol: TCP port: 80[root@vms10 net]# [root@vms10 net]# kubectl apply -f net1.yaml networkpolicy.networking.k8s.io/mypolicy created[root@vms10 net]#
这里的意思是只允许标签为name=default的命名空间里的pod,能访问当前命名空间(nsnet)里的pod,其他客户端是没法访问的。当前命名空间里的pod也是访问不了自己命名空间里其他pod的。
步骤3:在测试pod里访问pod1。
##########实操验证##########/home # curl svc2^C/home # curl svc1^C/home #
因为这里测试pod是在命名空间nsnet里的,但是网络策略只允许defaut命名空间里的pod能访问,所以可以看到测试pod是访问失败的。
步骤4:下面在default命名空间里创建一个pod来测试。
打开第三个ssh客户端标签,在default命名空间里创建一个名字为busybox的pod。
##########实操验证##########[root@vms10 net]# kubectl run busybox --rm -it --image=busybox --image-pull-policy=IfNotPresent -n default shIf you don't see a command prompt, try pressing enter./ #
然后开始访问命名空间nsnet里的svc1和svc2。
##########实操验证##########/home # curl svc1.nsnet111/home # curl svc2.nsnet222/home #
可以看到default命名空间里的pod是可以正常访问的。
正骤5:修改net1.yaml,把namespaceSelector下matchLabels的值去掉,如下面的内容。
##########实操验证##########[root@vms10 net]# cat net1.yaml apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: mypolicy spec: podSelector: matchLabels: policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: # 下面没有指定哪些命名空间,则是允许所有的命名空间 ports: - protocol: TCP port: 80[root@vms10 net]#
这里没有指定哪个命名空间,则是允许所有的命名空间里的pod访问。
步骤6:删除此网络策略。
##########实操验证##########[root@vms10 net]# kubectl delete -f net1.yaml networkpolicy.networking.k8s.io "mypolicy" deleted[root@vms10 net]#
标签: #get network