龙空技术网

CKA备考实验 | 创建ingress类型的网络策略

热爱编程的通信人 105

前言:

此刻同学们对“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