江小南

V1

2022/08/22阅读:15主题:默认主题

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

标签label

Lable是一个key-value键值对,由用户自己制定。

  • 可以附加在各种资源上,比如node、ns、pod、svc、rc等。
  • 一个对象资源可以定义任意数量的lable。
  • 一个lable也可以被添加到任意数量的资源对象上去。
  • lable可以在资源对象定义时确定,也可以在对象创建后动态添加和删除。

功能:可以使用指定的资源对象绑定一个或者多个不同的lable来实现多维度的资源分组管理功能,以便于灵活、方便的对资源进行分配、调度、配置、部署等工作。

打标签

candidate@node01:~$ kubectl label pods front-end-55455ccf94-pjl2m mylabel=busybox
pod/front-end-55455ccf94-pjl2m labeled
candidate@node01:~$

查看资源标签

candidate@node01:~$ kubectl get pod front-end-55455ccf94-pjl2m --show-labels
NAME                         READY   STATUS    RESTARTS      AGE   LABELS
front-end-55455ccf94-pjl2m   1/1     Running   6 (73m ago)   36d   app=front-end,mylabel=busybox,pod-template-hash=55455ccf94
candidate@node01:~$

说明:上面打的标签mylabel=busybox可以看到了。

通过标签筛选

candidate@node01:~$ kubectl get pods -l mylabel=busybox
NAME                         READY   STATUS    RESTARTS      AGE
front-end-55455ccf94-pjl2m   1/1     Running   6 (76m ago)   36d
candidate@node01:~$

说明:通过标签mylabel=busybox筛选出了podfront-end-55455ccf94-pjl2m。多个标签之间用逗号隔开。

修改标签

# 加上 --overwrite 参数修改标签
candidate@node01:~$ kubectl label pods front-end-55455ccf94-pjl2m mylabel=busybox1 --overwrite
pod/front-end-55455ccf94-pjl2m labeled
candidate@node01:~$ kubectl get pods -l mylabel=busybox1
NAME                         READY   STATUS    RESTARTS      AGE
front-end-55455ccf94-pjl2m   1/1     Running   6 (78m ago)   36d
candidate@node01:~$

说明:将mylabel=busybox修改为mylabel=busybox1,再次筛选验证成功。

删除标签

candidate@node01:~$ kubectl label pod front-end-55455ccf94-pjl2m mylabel-
pod/front-end-55455ccf94-pjl2m unlabeled
candidate@node01:~$ kubectl get pod front-end-55455ccf94-pjl2m --show-labels
NAME                         READY   STATUS    RESTARTS      AGE   LABELS
front-end-55455ccf94-pjl2m   1/1     Running   6 (83m ago)   36d   app=front-end,pod-template-hash=55455ccf94
candidate@node01:~$

说明:删除标签的写法是key-,需要注意。

组合标签查询语法

# 标签选择器
name=redis-salve  # 表示只查询名字为redis-salve的资源对象。

env != production # 匹配所有不具有标签 env = production 的资源对象

name in( redis-master, redis-salve)# 匹配所有带有标签name=master或者name=salve的资源

name not in ( php)#匹配所有不具有标签name=php的资源对象

也可以多个条件一起使用。标签和标签选择器共同构成了k8s系统中核心的应用模型,使得被管理对象能够被精细的分组管理。

NetworkPolicy 资源

通过官网给的示例进行说明。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from:
        - ipBlock:
            cidr: 172.17.0.0/16
            except:
              - 172.17.1.0/24
        - namespaceSelector:
            matchLabels:
              project: myproject
        - podSelector:
            matchLabels:
              role: frontend
      ports:
        - protocol: TCP
          port: 6379
  egress:
    - to:
        - ipBlock:
            cidr: 10.0.0.0/24
      ports:
        - protocol: TCP
          port: 5978

yaml配置解析

  1. 隔离 "default" 名字空间下 "role=db" 的 Pod (如果它们不是已经被隔离的话)。
  2. (Ingress 规则)允许以下 Pod 连接到 "default" 名字空间下的带有 "role=db" 标签的所有 Pod 的 6379 TCP 端口:
  • "default" 名字空间下带有 "role=frontend" 标签的所有 Pod
  • 带有 "project=myproject" 标签的所有名字空间中的 Pod
  • IP 地址范围为 172.17.0.0–172.17.0.255 和 172.17.2.0–172.17.255.255 (即,除了 172.17.1.0/24 之外的所有 172.17.0.0/16)
  1. (Egress 规则)允许 “default” 命名空间中任何带有标签 “role=db” 的 Pod 到 CIDR 10.0.0.0/24 下 5978 TCP 端口的连接。

字段含义

podSelector:每个 NetworkPolicy 都包括一个 podSelector,它对该策略所 适用的一组 Pod 进行选择。

policyTypes: 每个 NetworkPolicy 都包含一个 policyTypes 列表,其中包含 Ingress 或 Egress 或两者兼具。policyTypes 字段表示给定的策略是应用于 进入所选 Pod 的入站流量还是来自所选 Pod 的出站流量,或两者兼有。 如果 NetworkPolicy 未指定 policyTypes 则默认情况下始终设置 Ingress; 如果 NetworkPolicy 有任何出口规则的话则设置 Egress。

ingress: 每个 NetworkPolicy 可包含一个 ingress 规则的白名单列表。 每个规则都允许同时匹配 from 和 ports 部分的流量。示例策略中包含一条 简单的规则:它匹配某个特定端口,来自三个来源中的一个,第一个通过 ipBlock 指定,第二个通过 namespaceSelector 指定,第三个通过 podSelector 指定。

egress: 每个 NetworkPolicy 可包含一个 egress 规则的白名单列表。 每个规则都允许匹配 to 和 port 部分的流量。该示例策略包含一条规则, 该规则将指定端口上的流量匹配到 10.0.0.0/24 中的任何目的地。

说明:to和from表示选择器,有podSelector,namespaceSelector,ipBlock等。ingress和from组合,egress和to组合,分别表示入方向和出方向。

需要注意

namespaceSelector 和 podSelector:一个指定 namespaceSelector 和 podSelector 的 to/from 条目选择特定名字空间中的特定 Pod。 注意使用正确的 YAML 语法;下面的策略:

  ...
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          user: alice
      podSelector:
        matchLabels:
          role: client
  ...

在 from 数组中仅包含一个元素,只允许来自标有 role=client 的 Pod 且 该 Pod 所在的名字空间中标有 user=alice 的连接。但是 这项 策略:

...
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          user: alice
    - podSelector:
        matchLabels:
          role: client
  ...

在 from 数组中包含两个元素,允许来自本地名字空间中标有 role=client 的 Pod 的连接,或 来自任何名字空间中标有 user=alice 的任何 Pod 的连接。

默认策略

默认情况下,如果名字空间中不存在任何策略,则所有进出该名字空间中 Pod 的流量都被允许。

换言之,当有了策略以后,就会严格按照策略影响流量的出入。

针对某个端口范围

在编写 NetworkPolicy 时,你可以针对一个端口范围而不是某个固定端口。这一目的可以通过使用 endPort 字段来实现,如下例所示:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: multi-port-egress
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 32000
      endPort: 32768

上面的规则允许名字空间 default 中所有带有标签 role=db 的 Pod 使用 TCP 协议 与 10.0.0.0/24 范围内的 IP 通信,只要目标端口介于 32000 和 32768 之间就可以。

基于名字指向某名字空间

只要 NamespaceDefaultLabelName 特性门控 被启用,Kubernetes 控制面会在所有名字空间上设置一个不可变更的标签 kubernetes.io/metadata.name。该标签的值是名字空间的名称。

如果 NetworkPolicy 无法在某些对象字段中指向某名字空间,你可以使用标准的 标签方式来指向特定名字空间。

分类:

后端

标签:

云计算

作者介绍

江小南
V1