江小南

V1

2022/10/23阅读:96主题:默认主题

【CKA、CKS篇】CKA真题解析——配置网络策略 NetworkPolicy

真题解析

今天所说的内容需要对yaml编写有一定的了解。

题目

在现有的namespace my-app中创建一个名为allow-port-from-namespace的新NetworkPolicy。

确保新的NetwoekPolicy允许namespace echo中的Pods连接到namespace my-app中的Pod的9000端口。

进一步确保新的NetworkPolicy: 不允许对没有在监听端口9000的Pod的访问; 不允许非来自namespace echo中的Pods的访问

考察点

NetworkPolicy的创建。

解析

  1. 在my-app名称空间下创建一个名为allow-port-from-namespace的NetworkPolicy。
  2. 这个NetworkPolicy允许echo名称空间下的Pods访问my-app名称空间下的Pods的9000端口。
  3. 仅允许端口为9000的pod访问。
  4. 仅允许echo名称空间中的Pod访问。

帮助文档

https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/

实际操作

  1. 查看所有 ns 的标签 label
candidate@node01:~$ kubectl get ns --show-labels
NAME               STATUS   AGE   LABELS
app-team1          Active   33d   kubernetes.io/metadata.name=app-team1
calico-apiserver   Active   36d   kubernetes.io/metadata.name=calico-apiserver,name=calico-apiserver
calico-system      Active   36d   kubernetes.io/metadata.name=calico-system,name=calico-system
cpu-top            Active   33d   kubernetes.io/metadata.name=cpu-top
default            Active   36d   kubernetes.io/metadata.name=default
echo               Active   33d   kubernetes.io/metadata.name=echo
ing-internal       Active   33d   kubernetes.io/metadata.name=ing-internal
ingress-nginx      Active   33d   kubernetes.io/metadata.name=ingress-nginx
internal           Active   33d   kubernetes.io/metadata.name=internal
kube-node-lease    Active   36d   kubernetes.io/metadata.name=kube-node-lease
kube-public        Active   36d   kubernetes.io/metadata.name=kube-public
kube-system        Active   36d   kubernetes.io/metadata.name=kube-system
my-app             Active   33d   kubernetes.io/metadata.name=my-app
tigera-operator    Active   36d   kubernetes.io/metadata.name=tigera-operator,name=tigera-operator
candidate@node01:~$
  1. 手动打标签

如果访问者的 namespace 没有标签 label,则需要手动打一个。如果有一个独特的标签 label,则也可以直接使用。

candidate@node01:~$ kubectl label ns echo project=echo
namespace/echo labeled
candidate@node01:~$

再次查看标签发现echo已经被打上了标签project=echo

candidate@node01:~$ kubectl get ns --show-labels
NAME               STATUS   AGE   LABELS
...
echo               Active   33d   kubernetes.io/metadata.name=echo,project=echo
...
candidate@node01:~$
  1. 编写networkpolicy.yaml

注意:使用:set paste,防止 yaml 文件空格错序。

# networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-port-from-namespace
  namespace: my-app
spec:
  podSelector:
    matchLabels: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              project: echo
      ports:
        - protocol: TCP
          port: 9000
candidate@node01:~$
  1. 创建
candidate@node01:~$ kubectl apply -f networkpolicy.yaml
networkpolicy.networking.k8s.io/allow-port-from-namespace created
candidate@node01:~$
  1. 检查验证
candidate@node01:~$ kubectl describe networkpolicy -n my-app
Name:         allow-port-from-namespace
Namespace:    my-app
Created on:   2022-08-20 11:09:55 +0800 CST
Labels:       <none>
Annotations:  <none>
Spec:
  PodSelector:     <none> (Allowing the specific traffic to all pods in this namespace)
  Allowing ingress traffic:
    To Port: 9000/TCP
    From:
      NamespaceSelector: project=echo
  Not affecting egress traffic
  Policy Types: Ingress
candidate@node01:~$

至此这道题目完成。

下一篇我们详细讲解networkPolicy扩展知识,包括yaml配置含义等。

分类:

后端

标签:

后端

作者介绍

江小南
V1