使用 kube-ovn 安全组

38 阅读16分钟

测试下 kube-ovn 安全组给 pod 用,输出一些关联数据,最后删除 pod ip,触发 ip 删除,安全组相关的数据清理。

1. 创建 一个测试用的 ns 和 vpc subnet


kubectl create ns sg

kubectl apply -f 01-ns1-vpc1-subnet.yaml


root@empty:~/test/sg# cat 01-ns1-vpc1-subnet.yaml
kind: Vpc
apiVersion: kubeovn.io/v1
metadata:
  name: sg
spec:
  namespaces:
  - sg

---
apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
  name: sg-subnet1
spec:
  cidrBlock: 10.1.0.0/24
  default: false
  disableGatewayCheck: true
  disableInterConnection: true
  enableEcmp: false
  gatewayNode: ""
  gatewayType: distributed
  natOutgoing: false
  private: false
  protocol: IPv4
  provider: ovn
  vpc: sg
  namespaces:
  - sg
 
 
# k get sg sg -o yaml
apiVersion: kubeovn.io/v1
kind: SecurityGroup
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"kubeovn.io/v1","kind":"SecurityGroup","metadata":{"annotations":{},"name":"sg"},"spec":{"allowSameGroupTraffic":true,"egressRules":[{"ipVersion":"ipv4","policy":"allow","priority":1,"protocol":"all","remoteAddress":"10.1.0.0/24","remoteType":"address"}],"ingressRules":[{"ipVersion":"ipv4","policy":"deny","priority":1,"protocol":"icmp","remoteAddress":"10.1.0.0/24","remoteType":"address"}]}}
  creationTimestamp: "2023-12-19T02:49:16Z"
  generation: 1
  name: sg
  resourceVersion: "2237437"
  uid: 1ca31613-d083-4694-b138-a674017ff5a9
spec:
  allowSameGroupTraffic: true
  egressRules:
  - ipVersion: ipv4
    policy: allow
    priority: 1
    protocol: all
    remoteAddress: 10.1.0.0/24
    remoteType: address
  ingressRules:
  - ipVersion: ipv4
    policy: deny
    priority: 1
    protocol: icmp
    remoteAddress: 10.1.0.0/24
    remoteType: address
status:
  allowSameGroupTraffic: true
  egressLastSyncSuccess: true
  egressMd5: 9531e2913e13f6bbd9ebaae12478bb47
  ingressLastSyncSuccess: true
  ingressMd5: 8465449ebcc7ebbef0b3b4a37bdef2e0
  portGroup: ovn.sg.sg # 所有配置了 安全组的 pod 的端口都会添加到该 portGroup ovn.sg.sg 

2. 创建并使用安全组

---
apiVersion: kubeovn.io/v1
kind: SecurityGroup
metadata:
  name: sg
spec:
  allowSameGroupTraffic: true
  egressRules:
  - ipVersion: ipv4
    policy: allow
    priority: 1
    protocol: all
    remoteAddress: 10.1.0.0/24 # 10.16.0.0/16 配置网段
    remoteType: address
  ingressRules:
  - ipVersion: ipv4
    policy: deny
    priority: 1
    protocol: icmp
    remoteAddress: 10.1.0.0/24
    remoteType: address


该安全组相关的 acl


# k ko nbctl list acl
_uuid               : 9d71e4c0-e310-4aa7-9480-33fe8b78cdd8
action              : allow-related
direction           : to-lport
external_ids        : {parent=ovn.sg.sg}
label               : 0
log                 : false
match               : "inport == @ovn.sg.sg && icmp6.type == {130, 133, 135, 136} && icmp6.code == 0 && ip.ttl == 255"
meter               : []
name                : []
options             : {}
priority            : 2005
severity            : []

_uuid               : 2d68efe1-87e8-47d0-8984-bb14d52ca5d9
action              : allow-related
direction           : to-lport
external_ids        : {parent=ovn.sg.sg}
label               : 0
log                 : false
match               : "outport == @ovn.sg.sg && icmp6.type == {130, 134, 135, 136} && icmp6.code == 0 && ip.ttl == 255"
meter               : []
name                : []
options             : {}
priority            : 2005
severity            : []

_uuid               : 14802f81-6b0b-4d85-bf5d-1d27dbf3db6f
action              : allow-related
direction           : to-lport
external_ids        : {parent=ovn.sg.sg}
label               : 0
log                 : false
match               : "outport == @ovn.sg.sg && udp.src == 547 && udp.dst == 546 && ip6"
meter               : []
name                : []
options             : {}
priority            : 2005
severity            : []

_uuid               : 3e067012-24a5-47e7-85db-921825a9b0ac
action              : drop
direction           : from-lport
external_ids        : {parent=ovn.sg.kubeovn_deny_all}
label               : 0
log                 : false
match               : "inport == @ovn.sg.kubeovn_deny_all && ip"
meter               : []
name                : []
options             : {}
priority            : 2003
severity            : []

_uuid               : 4a557ba3-f296-46c6-94a3-befa9f2bfdf1
action              : allow-related
direction           : to-lport
external_ids        : {parent=ovn.sg.sg}
label               : 0
log                 : false
match               : "outport == @ovn.sg.sg && ip4 && ip4.src == $ovn.sg.sg.associated.v4"
meter               : []
name                : []
options             : {}
priority            : 2004
severity            : []

_uuid               : ab425fb5-3f82-4c7a-884b-033011b54600
action              : allow-related
direction           : from-lport
external_ids        : {parent=ovn.sg.sg}
label               : 0
log                 : false
match               : "inport == @ovn.sg.sg && ip4 && ip4.dst == $ovn.sg.sg.associated.v4"
meter               : []
name                : []
options             : {}
priority            : 2004
severity            : []

_uuid               : d8937f65-6398-4aeb-b990-e9a1b93a4256
action              : allow-related
direction           : from-lport
external_ids        : {parent=ovn.sg.sg}
label               : 0
log                 : false
match               : "inport == @ovn.sg.sg && ip4 && ip4.dst == 10.1.0.0/24"
meter               : []
name                : []
options             : {}
priority            : 2299
severity            : []

_uuid               : e5291967-85df-4554-8e64-332f814d8803
action              : allow-related
direction           : to-lport
external_ids        : {parent=ovn.sg.sg}
label               : 0
log                 : false
match               : "outport == @ovn.sg.sg && udp.src == 67 && udp.dst == 68 && ip4"
meter               : []
name                : []
options             : {}
priority            : 2005
severity            : []

_uuid               : 45526498-47fe-4f6a-b76e-67cf86e7596b
action              : drop
direction           : to-lport
external_ids        : {parent=ovn.sg.kubeovn_deny_all}
label               : 0
log                 : false
match               : "outport == @ovn.sg.kubeovn_deny_all && ip"
meter               : []
name                : []
options             : {}
priority            : 2003
severity            : []

_uuid               : fef65298-b96d-441b-9fe2-581a940c7721
action              : allow-related
direction           : to-lport
external_ids        : {parent=ovn.sg.sg}
label               : 0
log                 : false
match               : "outport == @ovn.sg.sg && ip6 && ip6.src == $ovn.sg.sg.associated.v6"
meter               : []
name                : []
options             : {}
priority            : 2004
severity            : []

_uuid               : ebfb3779-ac14-404c-9ab3-61d4f4391ff4
action              : allow-related
direction           : from-lport
external_ids        : {parent=ovn.sg.sg}
label               : 0
log                 : false
match               : "inport == @ovn.sg.sg && ip6 && ip6.dst == $ovn.sg.sg.associated.v6"
meter               : []
name                : []
options             : {}
priority            : 2004
severity            : []

_uuid               : f93bf079-df17-44bc-89a4-8eca03bfa997
action              : allow-related
direction           : to-lport
external_ids        : {parent=ovn.sg.sg}
label               : 0
log                 : false
match               : "inport == @ovn.sg.sg && udp.src == 68 && udp.dst == 67 && ip4"
meter               : []
name                : []
options             : {}
priority            : 2005
severity            : []

_uuid               : 99b917b9-ac55-457e-806e-1e326ed83d6c
action              : allow-related
direction           : to-lport
external_ids        : {parent=ovn.sg.sg}
label               : 0
log                 : false
match               : "outport == @ovn.sg.sg && arp"
meter               : []
name                : []
options             : {}
priority            : 2005
severity            : []

_uuid               : 2e2df429-f3c5-42c4-8068-093e4c0e8ec3
action              : allow-related
direction           : to-lport
external_ids        : {parent=ovn.sg.sg}
label               : 0
log                 : false
match               : "inport == @ovn.sg.sg && ip.proto == 112"
meter               : []
name                : []
options             : {}
priority            : 2005
severity            : []

_uuid               : a7b95f0a-de59-4ec2-85a0-3821908f0bed
action              : drop
direction           : to-lport
external_ids        : {parent=ovn.sg.sg}
label               : 0
log                 : false
match               : "outport == @ovn.sg.sg && ip4 && ip4.src == 10.1.0.0/24 && icmp4"
meter               : []
name                : []
options             : {}
priority            : 2299
severity            : []

_uuid               : 118681dd-69d3-4b05-9fba-d016d9734ea7
action              : allow-related
direction           : to-lport
external_ids        : {parent=ovn.sg.sg}
label               : 0
log                 : false
match               : "inport == @ovn.sg.sg && arp"
meter               : []
name                : []
options             : {}
priority            : 2005
severity            : []

_uuid               : 0e32e76f-7abf-4bec-b135-9b5889a3b816
action              : allow-related
direction           : to-lport
external_ids        : {parent=ovn.sg.sg}
label               : 0
log                 : false
match               : "inport == @ovn.sg.sg && udp.src == 546 && udp.dst == 547 && ip6"
meter               : []
name                : []
options             : {}
priority            : 2005
severity            : []

_uuid               : 43cf0e6f-f28e-4091-91c7-872e301836ab
action              : allow-related
direction           : to-lport
external_ids        : {parent=ovn.sg.sg}
label               : 0
log                 : false
match               : "outport == @ovn.sg.sg && ip.proto == 112"
meter               : []
name                : []
options             : {}
priority            : 2005
severity            : []

pod 使用安全组

使用前,查看 portGroup ovn.sg.sg


root@empty:~/test/sg# k ko nbctl list port-group
_uuid               : eda4e58c-d57f-4684-a340-cb2dbf9d2f50
acls                : []
external_ids        : {np="external/empty"}
name                : external.empty
ports               : []

_uuid               : d00452a8-6a74-4464-afe6-4c547a91744d
acls                : []
external_ids        : {np="ovn-default/empty"}
name                : ovn.default.empty
ports               : [0e7f7884-1005-4543-b2eb-46fc51ab22d6, 46a46ca0-b1a5-43b8-bb58-35baeb3ac882, 61139bf7-b2e0-4738-861b-cdd9792441c8, 8e38fb59-c966-4a2d-8196-004c4c0ea748, 9e7c3fbf-c834-4004-acf2-bd86b72b77a9, a3f6ef2b-1c83-4b2c-8a79-7dd1d8bcc53a, eac5c379-0d87-4f20-86d4-0124cf682a68]

_uuid               : 1d05da99-17f0-480e-827f-36fd7f9ba06a
acls                : [0e32e76f-7abf-4bec-b135-9b5889a3b816, 118681dd-69d3-4b05-9fba-d016d9734ea7, 14802f81-6b0b-4d85-bf5d-1d27dbf3db6f, 2d68efe1-87e8-47d0-8984-bb14d52ca5d9, 2e2df429-f3c5-42c4-8068-093e4c0e8ec3, 43cf0e6f-f28e-4091-91c7-872e301836ab, 4a557ba3-f296-46c6-94a3-befa9f2bfdf1, 99b917b9-ac55-457e-806e-1e326ed83d6c, 9d71e4c0-e310-4aa7-9480-33fe8b78cdd8, a7b95f0a-de59-4ec2-85a0-3821908f0bed, ab425fb5-3f82-4c7a-884b-033011b54600, d8937f65-6398-4aeb-b990-e9a1b93a4256, e5291967-85df-4554-8e64-332f814d8803, ebfb3779-ac14-404c-9ab3-61d4f4391ff4, f93bf079-df17-44bc-89a4-8eca03bfa997, fef65298-b96d-441b-9fe2-581a940c7721]
external_ids        : {sg=sg, type=security_group}
name                : ovn.sg.sg
ports               : [] # 目前 port 都为空,因为还没有 pod 使用该安全组

_uuid               : 25e6f4e2-120b-4536-890a-21486d797704
acls                : []
external_ids        : {np="node/empty"}
name                : node.empty
ports               : []

_uuid               : 638326f6-0a4f-45b2-86fd-052fc55a10d3
acls                : [3e067012-24a5-47e7-85db-921825a9b0ac, 45526498-47fe-4f6a-b76e-67cf86e7596b]
external_ids        : {sg=kubeovn_deny_all, type=security_group}
name                : ovn.sg.kubeovn_deny_all
ports               : []


root@empty:~/test/sg# cat 02-sg-netshoot.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: sg-netshoot1
  namespace: sg
  annotations:
    ovn.kubernetes.io/logical_switch: sg-subnet1
    ovn.kubernetes.io/port_security: "true"
    ovn.kubernetes.io/security_groups: sg
spec:
  containers:
    - name: netshoot
      image: nicolaka/netshoot:latest
      imagePullPolicy: Never
      command:
        - sh
        - -c
        - "sleep infinity"
      securityContext:
        capabilities:
          add:
            - NET_ADMIN

---
apiVersion: v1
kind: Pod
metadata:
  name: sg-netshoot2
  namespace: sg
  annotations:
    ovn.kubernetes.io/logical_switch: sg-subnet1
    ovn.kubernetes.io/port_security: "true"
    ovn.kubernetes.io/security_groups: sg
spec:
  containers:
    - name: netshoot
      image: nicolaka/netshoot:latest
      imagePullPolicy: Never
      command:
        - sh
        - -c
        - "sleep infinity"
      securityContext:
        capabilities:
          add:
            - NET_ADMIN
            
root@empty:~/test/sg# k get po -n sg -o wide
NAME           READY   STATUS    RESTARTS   AGE     IP          NODE    NOMINATED NODE   READINESS GATES
sg-netshoot1   1/1     Running   0          6m16s   10.1.0.12   empty   <none>           <none>
sg-netshoot2   1/1     Running   0          6m16s   10.1.0.13   empty   <none>           <none>



root@empty:~/test/sg# k ko nbctl list logical_switch_port | grep -C 9 "netshoot"

_uuid               : 3dac29b4-09a1-41c8-88b2-fdb7f632a112
addresses           : ["00:00:00:96:FA:C7 10.1.0.13"]
dhcpv4_options      : []
dhcpv6_options      : []
dynamic_addresses   : []
enabled             : []
external_ids        : {associated_sg_default-securitygroup="false", associated_sg_sg="true", ls=sg-subnet1, pod="sg/sg-netshoot2", security_groups=sg, vendor=kube-ovn}
ha_chassis_group    : []
mirror_rules        : []
name                : sg-netshoot2.sg
options             : {}
parent_name         : []
port_security       : ["00:00:00:96:FA:C7 10.1.0.13"]
tag                 : []
tag_request         : []
type                : ""
up                  : true


_uuid               : 4d95ded7-385c-47a7-9f6c-f6987a1c1dc8
addresses           : ["00:00:00:20:FF:C5 10.1.0.12"]
dhcpv4_options      : []
dhcpv6_options      : []
dynamic_addresses   : []
enabled             : []
external_ids        : {associated_sg_default-securitygroup="false", associated_sg_sg="true", ls=sg-subnet1, pod="sg/sg-netshoot1", security_groups=sg, vendor=kube-ovn}
ha_chassis_group    : []
mirror_rules        : []
name                : sg-netshoot1.sg
options             : {}
parent_name         : []
port_security       : ["00:00:00:20:FF:C5 10.1.0.12"]
tag                 : []
tag_request         : []
type                : ""
up                  : true


root@empty:~/test/sg# k ko nbctl list port-group
...


_uuid               : 1d05da99-17f0-480e-827f-36fd7f9ba06a
acls                : [0e32e76f-7abf-4bec-b135-9b5889a3b816, 118681dd-69d3-4b05-9fba-d016d9734ea7, 14802f81-6b0b-4d85-bf5d-1d27dbf3db6f, 2d68efe1-87e8-47d0-8984-bb14d52ca5d9, 2e2df429-f3c5-42c4-8068-093e4c0e8ec3, 43cf0e6f-f28e-4091-91c7-872e301836ab, 4a557ba3-f296-46c6-94a3-befa9f2bfdf1, 99b917b9-ac55-457e-806e-1e326ed83d6c, 9d71e4c0-e310-4aa7-9480-33fe8b78cdd8, a7b95f0a-de59-4ec2-85a0-3821908f0bed, ab425fb5-3f82-4c7a-884b-033011b54600, d8937f65-6398-4aeb-b990-e9a1b93a4256, e5291967-85df-4554-8e64-332f814d8803, ebfb3779-ac14-404c-9ab3-61d4f4391ff4, f93bf079-df17-44bc-89a4-8eca03bfa997, fef65298-b96d-441b-9fe2-581a940c7721]
external_ids        : {sg=sg, type=security_group}
name                : ovn.sg.sg
ports               : [3dac29b4-09a1-41c8-88b2-fdb7f632a112, 4d95ded7-385c-47a7-9f6c-f6987a1c1dc8]

_uuid               : 25e6f4e2-120b-4536-890a-21486d797704
acls                : []
external_ids        : {np="node/empty"}
name                : node.empty
ports               : []

_uuid               : 638326f6-0a4f-45b2-86fd-052fc55a10d3
acls                : [3e067012-24a5-47e7-85db-921825a9b0ac, 45526498-47fe-4f6a-b76e-67cf86e7596b]
external_ids        : {sg=kubeovn_deny_all, type=security_group}
name                : ovn.sg.kubeovn_deny_all
ports               : [3dac29b4-09a1-41c8-88b2-fdb7f632a112, 4d95ded7-385c-47a7-9f6c-f6987a1c1dc8]

目前 删除 ip ,清理 lsp ipam sg 本身没有问题。 只是 pod 如果依旧在用这个 ip(annos 没变)。 后面 lsp 依旧会被重建出来。 如果 ip 被其他 pod抢走了,这里就会一直报错。

但是我们的这个功能明确在于用户的 pod 不再使用该 ip 的场景下,所以这个逻辑应该不影响。

image.png

查看 清理 ip 后的 sg 的 port-group 是否有变化


root@empty:~# k ko nbctl list logical_switch_port | grep -C 10 sg-netshoot

_uuid               : 3dac29b4-09a1-41c8-88b2-fdb7f632a112
addresses           : ["00:00:00:96:FA:C7 10.1.0.13"]
dhcpv4_options      : []
dhcpv6_options      : []
dynamic_addresses   : []
enabled             : []
external_ids        : {associated_sg_default-securitygroup="false", associated_sg_sg="true", ls=sg-subnet1, pod="sg/sg-netshoot2", security_groups=sg, vendor=kube-ovn}
ha_chassis_group    : []
mirror_rules        : []
name                : sg-netshoot2.sg
options             : {}
parent_name         : []
port_security       : ["00:00:00:96:FA:C7 10.1.0.13"]
tag                 : []
tag_request         : []
type                : ""
up                  : true


_uuid               : 6873dcf6-6f1f-440c-b632-0a947525b130
addresses           : ["00:00:00:20:FF:C5 10.1.0.12"]
dhcpv4_options      : []
dhcpv6_options      : []
dynamic_addresses   : []
enabled             : []
external_ids        : {associated_sg_default-securitygroup="false", associated_sg_sg="true", ls=sg-subnet1, pod="sg/sg-netshoot1", security_groups=sg, vendor=kube-ovn}
ha_chassis_group    : []
mirror_rules        : []
name                : sg-netshoot1.sg
options             : {}
parent_name         : []
port_security       : ["00:00:00:20:FF:C5 10.1.0.12"]
tag                 : []
tag_request         : []
type                : ""
up                  : true

root@empty:~#
root@empty:~# k ko nbctl list port-group
_uuid               : eda4e58c-d57f-4684-a340-cb2dbf9d2f50
acls                : []
external_ids        : {np="external/empty"}
name                : external.empty
ports               : []

_uuid               : d00452a8-6a74-4464-afe6-4c547a91744d
acls                : []
external_ids        : {np="ovn-default/empty"}
name                : ovn.default.empty
ports               : [0e7f7884-1005-4543-b2eb-46fc51ab22d6, 46a46ca0-b1a5-43b8-bb58-35baeb3ac882, 61139bf7-b2e0-4738-861b-cdd9792441c8, 8e38fb59-c966-4a2d-8196-004c4c0ea748, 9e7c3fbf-c834-4004-acf2-bd86b72b77a9, a3f6ef2b-1c83-4b2c-8a79-7dd1d8bcc53a, eac5c379-0d87-4f20-86d4-0124cf682a68]

_uuid               : 1d05da99-17f0-480e-827f-36fd7f9ba06a
acls                : [0e32e76f-7abf-4bec-b135-9b5889a3b816, 118681dd-69d3-4b05-9fba-d016d9734ea7, 14802f81-6b0b-4d85-bf5d-1d27dbf3db6f, 2d68efe1-87e8-47d0-8984-bb14d52ca5d9, 2e2df429-f3c5-42c4-8068-093e4c0e8ec3, 43cf0e6f-f28e-4091-91c7-872e301836ab, 4a557ba3-f296-46c6-94a3-befa9f2bfdf1, 99b917b9-ac55-457e-806e-1e326ed83d6c, 9d71e4c0-e310-4aa7-9480-33fe8b78cdd8, a7b95f0a-de59-4ec2-85a0-3821908f0bed, ab425fb5-3f82-4c7a-884b-033011b54600, d8937f65-6398-4aeb-b990-e9a1b93a4256, e5291967-85df-4554-8e64-332f814d8803, ebfb3779-ac14-404c-9ab3-61d4f4391ff4, f93bf079-df17-44bc-89a4-8eca03bfa997, fef65298-b96d-441b-9fe2-581a940c7721]
external_ids        : {sg=sg, type=security_group}
name                : ovn.sg.sg
ports               : [3dac29b4-09a1-41c8-88b2-fdb7f632a112, 6873dcf6-6f1f-440c-b632-0a947525b130] 
# 可以看到这两个 port-group 正好是上面原 ip 删除后的新的 port id

_uuid               : 25e6f4e2-120b-4536-890a-21486d797704
acls                : []
external_ids        : {np="node/empty"}
name                : node.empty
ports               : []

_uuid               : 638326f6-0a4f-45b2-86fd-052fc55a10d3
acls                : [3e067012-24a5-47e7-85db-921825a9b0ac, 45526498-47fe-4f6a-b76e-67cf86e7596b]
external_ids        : {sg=kubeovn_deny_all, type=security_group}
name                : ovn.sg.kubeovn_deny_all
ports               : [3dac29b4-09a1-41c8-88b2-fdb7f632a112, 6873dcf6-6f1f-440c-b632-0a947525b130]
root@empty:~#