环境构建

基础环境构建

  1. [root@master01 cksstudy]# vi studyns01.yaml
  2. apiVersion: v1
  3. kind: Namespace
  4. metadata:
  5. name: studyns01
  6. labels:
  7. role: studyns01
  8. [root@master01 cksstudy]# vi studyns02.yaml
  9. apiVersion: v1
  10. kind: Namespace
  11. metadata:
  12. name: studyns02
  13. labels:
  14. role: studyns02
  15. [root@master01 cksstudy]# vi studyns03.yaml
  16. apiVersion: v1
  17. kind: Namespace
  18. metadata:
  19. name: studyns03
  20. labels:
  21. role: studyns03
  22. [root@master01 cksstudy]# vi studyns04.yaml
  23. apiVersion: v1
  24. kind: Namespace
  25. metadata:
  26. name: studyns04
  27. labels:
  28. role: studyns04
  29. [root@master01 cksstudy]# vi studypod01.yaml
  30. apiVersion: v1
  31. kind: Pod
  32. metadata:
  33. name: studypod01
  34. namespace: studyns01
  35. labels:
  36. role: studypod01
  37. spec:
  38. containers:
  39. - name: studypod01
  40. image: training/webapp
  41. command:
  42. - python
  43. - app.py
  44. imagePullPolicy: IfNotPresent
  45. restartPolicy: Always
  46. [root@master01 cksstudy]# vi studypod02.yaml
  47. apiVersion: v1
  48. kind: Pod
  49. metadata:
  50. name: studypod02
  51. namespace: studyns01
  52. labels:
  53. role: studypod02
  54. spec:
  55. containers:
  56. - name: studypod02
  57. image: training/webapp
  58. command:
  59. - python
  60. - app.py
  61. imagePullPolicy: IfNotPresent
  62. restartPolicy: Always
  63. [root@master01 cksstudy]# vi studypod03.yaml
  64. apiVersion: v1
  65. kind: Pod
  66. metadata:
  67. name: studypod03
  68. namespace: studyns01
  69. labels:
  70. role: studypod03
  71. spec:
  72. containers:
  73. - name: studypod03
  74. image: training/webapp
  75. command:
  76. - python
  77. - app.py
  78. imagePullPolicy: IfNotPresent
  79. restartPolicy: Always
  80. [root@master01 cksstudy]# vi studypod04.yaml
  81. apiVersion: v1
  82. kind: Pod
  83. metadata:
  84. name: studypod04
  85. namespace: studyns02
  86. labels:
  87. role: studypod04
  88. spec:
  89. containers:
  90. - name: studypod04
  91. image: training/webapp
  92. command:
  93. - python
  94. - app.py
  95. imagePullPolicy: IfNotPresent
  96. restartPolicy: Always
  97. [root@master01 cksstudy]# vi studypod05.yaml
  98. apiVersion: v1
  99. kind: Pod
  100. metadata:
  101. name: studypod05
  102. namespace: studyns03
  103. labels:
  104. role: studypod05
  105. spec:
  106. containers:
  107. - name: studypod05
  108. image: training/webapp
  109. command:
  110. - python
  111. - app.py
  112. imagePullPolicy: IfNotPresent
  113. restartPolicy: Always
  114. [root@master01 cksstudy]# vi studypod06.yaml
  115. apiVersion: v1
  116. kind: Pod
  117. metadata:
  118. name: studypod06
  119. namespace: studyns04
  120. labels:
  121. role: studypod06
  122. spec:
  123. containers:
  124. - name: studypod06
  125. image: training/webapp
  126. command:
  127. - python
  128. - app.py
  129. imagePullPolicy: IfNotPresent
  130. restartPolicy: Always
  131. [root@master01 cksstudy]# kubectl apply -f .
  132. [root@master01 cksstudy]# kubectl -n studyns01 get pods -o wide
  133. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  134. studypod01 1/1 Running 0 14s 10.10.30.108 worker02 <none> <none>
  135. studypod02 1/1 Running 0 14s 10.10.5.46 worker01 <none> <none>
  136. studypod03 1/1 Running 0 14s 10.10.5.47 worker01 <none> <none>
  137. [root@master01 cksstudy]# kubectl -n studyns02 get pods -o wide
  138. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  139. studypod04 1/1 Running 0 16s 10.10.30.109 worker02 <none> <none>
  140. [root@master01 cksstudy]# kubectl -n studyns03 get pods -o wide
  141. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  142. studypod05 1/1 Running 0 19s 10.10.5.48 worker01 <none> <none>
  143. [root@master01 cksstudy]# kubectl -n studyns04 get pods -o wide
  144. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  145. studypod06 1/1 Running 0 21s 10.10.30.110 worker02 <none> <none>

网络测试

  1. [root@master01 cksstudy]# kubectl -n studyns01 exec -ti studypod01 -- /bin/sh
  2. # ping -c 1 10.10.5.46
  3. PING 10.10.5.46 (10.10.5.46) 56(84) bytes of data.
  4. 64 bytes from 10.10.5.46: icmp_seq=1 ttl=62 time=0.374 ms
  5. --- 10.10.5.46 ping statistics ---
  6. 1 packets transmitted, 1 received, 0% packet loss, time 0ms
  7. rtt min/avg/max/mdev = 0.374/0.374/0.374/0.000 ms
  8. # ping -c 1 10.10.5.47
  9. PING 10.10.5.47 (10.10.5.47) 56(84) bytes of data.
  10. 64 bytes from 10.10.5.47: icmp_seq=1 ttl=62 time=0.522 ms
  11. --- 10.10.5.47 ping statistics ---
  12. 1 packets transmitted, 1 received, 0% packet loss, time 0ms
  13. rtt min/avg/max/mdev = 0.522/0.522/0.522/0.000 ms
  14. # ping -c 1 10.10.30.109
  15. PING 10.10.30.109 (10.10.30.109) 56(84) bytes of data.
  16. 64 bytes from 10.10.30.109: icmp_seq=1 ttl=63 time=0.109 ms
  17. --- 10.10.30.109 ping statistics ---
  18. 1 packets transmitted, 1 received, 0% packet loss, time 0ms
  19. rtt min/avg/max/mdev = 0.109/0.109/0.109/0.000 ms
  20. # ping -c 1 10.10.5.48
  21. PING 10.10.5.48 (10.10.5.48) 56(84) bytes of data.
  22. 64 bytes from 10.10.5.48: icmp_seq=1 ttl=62 time=0.408 ms
  23. --- 10.10.5.48 ping statistics ---
  24. 1 packets transmitted, 1 received, 0% packet loss, time 0ms
  25. rtt min/avg/max/mdev = 0.408/0.408/0.408/0.000 ms
  26. # ping -c 1 10.10.30.110
  27. PING 10.10.30.110 (10.10.30.110) 56(84) bytes of data.
  28. 64 bytes from 10.10.30.110: icmp_seq=1 ttl=63 time=0.073 ms
  29. --- 10.10.30.110 ping statistics ---
  30. 1 packets transmitted, 1 received, 0% packet loss, time 0ms
  31. rtt min/avg/max/mdev = 0.073/0.073/0.073/0.000 ms

安全策略

策略配置

  1. [root@master01 cksstudy]# vi studynp01.yaml
  2. apiVersion: networking.k8s.io/v1
  3. kind: NetworkPolicy
  4. metadata:
  5. name: studynp01
  6. namespace: studyns01
  7. spec:
  8. podSelector:
  9. matchLabels:
  10. role: studypod01
  11. policyTypes:
  12. - Ingress
  13. - Egress
  14. ingress:
  15. - from:
  16. - ipBlock:
  17. cidr: 10.10.0.0/16
  18. except:
  19. - 10.10.30.0/24
  20. - namespaceSelector:
  21. matchLabels:
  22. role: studyns03
  23. - podSelector:
  24. matchLabels:
  25. role: studypod02
  26. ports:
  27. - protocol: TCP
  28. port: 5000
  29. egress:
  30. - to:
  31. - ipBlock:
  32. cidr: 10.10.30.0/24
  33. ports:
  34. - protocol: TCP
  35. port: 5000
  36. [root@master01 cksstudy]# kubectl apply -f studynp01.yaml

释义说明:

  • 必须字段:类似于Kubernetes其他安全策略,NetworkPolicy 资源需要 apiVersion、 kind 和 metadata 字段。
  • pec:NetworkPolicy spec中包含了在一个命名空间中定义特定网络策略所需的所有信息。
  • podSelector:每个 NetworkPolicy 都包括一个 podSelector,它对该策略所适用的一组 Pod 进行选择。空的 podSelector 表示匹配命名空间下的所有 Pod。
  • policyTypes: 每个 NetworkPolicy 都包含一个 policyTypes 列表,其中包含 Ingress 或 Egress 或两者兼具。policyTypes 字段表示该策略是应用于 进入所选 Pod 的入站流量还是来自所选 Pod 的出站流量,或两者都进行了配置。 如果 NetworkPolicy 未指定 policyTypes 则默认情况下始终设置 Ingress; 如果 NetworkPolicy 有需要配置任何出口规则的话则必须配置 Egress。
  • ingress: 每个 NetworkPolicy 可包含一个 ingress 规则的白名单列表。 每个规则都允许同时匹配 from 和 ports 部分的流量。
  • egress: 每个 NetworkPolicy 可包含一个 egress 规则的白名单列表。 每个规则都允许匹配 to 和 port 部分的流量。

如上网络策略示例表示:

  • 隔离 "studyns01" 命名空间下 "role:=studypod01" 的 Pod ,即隔离studypod01;
  • Ingress 规则允许以下 Pod 连接到 "studyns01" 命名空间下的带有 "role:=studypod01" 标签的所有 Pod 的 5000 TCP 端口:
    • 允许"studyns01" 命名空间下带有 "role:=studypod01" 标签的所有 Pod入;
    • 允许带有 "role=studyns03" 标签的命名空间中的所有 Pod入;
    • 允许IP 地址范围为除了 10.10.30.0/24 之外的所有 10.10.0.0/16入。
  • Egress 规则允许从"studyns01" 命名空间中带有 "role:=studypod01" 标签的任何 Pod 到 CIDR 10.0.0.0/16 下 5000 TCP 端口的连接。

策略测试

ingress方向测试
  • 拥有10.10.30.0/24 ip的Pod(如studypod04)访问studypod01(10.10.5.46):
  1. [root@master01 ~]# kubectl -n studyns02 exec -ti studypod04 -- /bin/bash
  2. root@studypod04:/opt/webapp# nc -v 10.10.30.108 5000 #根据策略应该不通
  • 拥有10.10.0.0/16 ip的Pod(如studypod03)访问studypod01(10.10.5.46):
  1. [root@master01 ~]# kubectl -n studyns01 exec -ti studypod03 -- /bin/bash
  2. root@studypod03:/opt/webapp# nc -v 10.10.30.108 5000 #根据策略应该能通
  3. Connection to 10.10.30.108 5000 port [tcp/*] succeeded!
  • 所有studyns03命名空间下的Pod(如studypod05)访问studypod01(10.10.5.46):
  1. [root@master01 ~]# kubectl -n studyns03 exec -ti studypod05 -- /bin/bash
  2. root@studypod05:/opt/webapp# nc -v 10.10.30.108 5000 #根据策略应该能通
  3. Connection to 10.10.30.108 5000 port [tcp/*] succeeded!
  • 所有带role=studypod02标签的Pod(如studypod02)访问studypod01(10.10.5.46):
  1. [root@master01 ~]# kubectl -n studyns01 exec -ti studypod02 -- /bin/bash
  2. root@studypod02:/opt/webapp# nc -v 10.10.30.108 5000 #根据策略应该能通
  3. Connection to 10.10.30.108 5000 port [tcp/*] succeeded!
egress方向测试
  • studypod01访问拥有10.10.30.0/24 ip的Pod(如studypod06):
  1. [root@master01 ~]# kubectl -n studyns01 exec -ti studypod01 -- /bin/bash
  2. root@studypod01:/opt/webapp# nc -v 10.10.30.109 5000 #根据策略应该能通
  3. Connection to 10.10.30.109 5000 port [tcp/*] succeeded!
  4. ^C
  5. root@studypod01:/opt/webapp# nc -v 10.10.30.110 5000 #根据策略应该能通
  6. Connection to 10.10.30.110 5000 port [tcp/*] succeeded!
  7. ^C
  8. root@studypod01:/opt/webapp# nc -v 10.10.5.46 5000 #根据策略应该不通
  9. ^C

to和from行为

在 ingress 的 from 部分或 egress 的 to 部分中指定四种选择器:

  • podSelector: 此选择器将在与 NetworkPolicy 相同的命名空间中选择特定的 Pod,ingress 的 from 则表示允许该选择器选定的Pod作为入站流量来源,egress 的 to则表示允许去往该选择器选定的Pod的出站流量(即该podSelector选定的Pod为目的地)。
  • namespaceSelector:此选择器将选择特定的命名空间,应将所有 Pod 用作其入站流量来源或出站流量目的地。
  • namespaceSelector 和 podSelector: 一个指定 namespaceSelector 和 podSelector 的 to/from 条目选择特定命名空间中的特定 Pod。

    示例001:只允许来自带有user=xhyns标签的命名空间下,且带有role=xhyuser的特定Pod的入请求连接。
  1. ...
  2. ingress:
  3. - from:
  4. - namespaceSelector:
  5. matchLabels:
  6. user: alice
  7. podSelector:
  8. matchLabels:
  9. role: client
  10. ...

示例002:允许来自带有user=xhyns标签的命名空间下的任何Pod,或来自该策略所在命名空间的带有role=xhyuser的Pod的入请求连接。

  1. ...
  2. ingress:
  3. - from:
  4. - namespaceSelector:
  5. matchLabels:
  6. user: xhyns
  7. - podSelector:
  8. matchLabels:
  9. role: xhyuser
  10. ...
  • ipBlock: 此选择器将选择特定的 IP CIDR 范围以用作入站流量来源或出站流量目的地。通常为集群外部IP,Pod IP通常为随机产生,使用Pod IP段无实际意义。

默认策略

默认情况下,如果命名空间中不存在任何策略,则所有进出该命名空间中 Pod 的流量都被允许。 可通过如下方式修改命名空间中的默认行为。

  • 默认拒绝所有入站流量

    禁止进入studyns01命名空间下的所有Pod的入流量,即默认拒绝所有进入studyns01命名空间任何Pod的流量。
  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: default-deny-ingress
  5. namespace: studyns01
  6. spec:
  7. podSelector: {}
  8. policyTypes:
  9. - Ingress

如上可以当做最后匹配策略,确保即使容器没有匹配到其他任何 NetworkPolicy,也仍然可以被隔离。 此策略不会更改默认的出口隔离行为。

  • 默认允许所有入站流量

    允许进入studyns01命名空间下的所有Pod的入流量,即默认允许所有进入studyns01命名空间任何Pod的流量。
  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: allow-all-ingress
  5. namespace: studyns01
  6. spec:
  7. podSelector: {}
  8. policyTypes:
  9. - Ingress
  10. ingress:
  11. - {}
  • 默认拒绝所有出站流量

    禁止studyns01命名空间下的所有Pod的出流量,即默认禁止studyns01命名空间任何Pod的出流量。
  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: default-deny-egress
  5. namespace: studyns01
  6. spec:
  7. podSelector: {}
  8. policyTypes:
  9. - Egress
  • 默认允许所有出站流量

    允许studyns01命名空间下的所有Pod的出流量,即默认允许studyns01命名空间任何Pod的出流量。
  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: allow-all-egress
  5. namespace: studyns01
  6. spec:
  7. podSelector: {}
  8. egress:
  9. - {}
  10. policyTypes:
  11. - Egress

匹配此策略后,能保证即使添加了导致某些 Pod 被视为“隔离”的策略也能显式的允许该命名空间中的所有出站流量。

  • 默认拒绝所有入口和所有出站流量

    禁止studyns01命名空间下的所有出入流量。
  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: default-deny-all
  5. spec:
  6. podSelector: {}
  7. policyTypes:
  8. - Ingress
  9. - Egress

如上可以当做最后匹配策略,确保即使没有被其他任何 NetworkPolicy 选择的 Pod 也不会被允许入站或出站流量。

附029.Kubernetes安全之网络策略的更多相关文章

  1. Kubernetes之canal的网络策略(NetworkPolicy)

    安装要求: 1.我们这里安装的是3.3的版本.kubernetes的要求: 支持的版本 1.10 1.11 1.12 2.CNI插件需要启用,Calico安装为CNI插件.必须通过传递--networ ...

  2. kubernetes学习笔记之十三:基于calico的网络策略入门

    一..安装calico [root@k8s-master01 ~]# kubectl apply -f https://docs.projectcalico.org/v3.3/getting-star ...

  3. Kubernetes学习之路(二十一)之网络模型和网络策略

    目录 Kubernetes的网络模型和网络策略 1.Kubernetes网络模型和CNI插件 1.1.Docker网络模型 1.2.Kubernetes网络模型 1.3.Flannel网络插件 1.4 ...

  4. Kubernetes 学习19基于canel的网络策略

    一.概述 1.我们说过,k8s的可用插件有很多,除了flannel之外,还有一个流行的叫做calico的组件,不过calico在很多项目中都会有这个名字被应用,所以他们把自己称为project cal ...

  5. 041.Kubernetes集群网络-K8S网络策略

    一 Kubernetes网络策略 1.1 策略说明 为实现细粒度的容器间网络访问隔离策略,Kubernetes发布Network Policy,目前已升级为networking.k8s.io/v1稳定 ...

  6. 附024.Kubernetes全系列大总结

    Kubernetes全系列总结如下,后期不定期更新.欢迎基于学习.交流目的的转载和分享,禁止任何商业盗用,同时希望能带上原文出处,尊重ITer的成果,也是尊重知识.若发现任何错误或纰漏,留言反馈或右侧 ...

  7. 【Kubernetes】K8S 网络隔离 方案

    参考资料: K8S-网络隔离参考 OpenContrail is an open source network virtualization platform for the cloud. – Kub ...

  8. canel的网络策略

    资源: https://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/flannel 基于pod Egress ...

  9. Calico网络策略实践

    因为Kubernetes官方用的flannel无法实现多租户环境下的网络隔离,建立起来的pod之间实际可以相互访问,而Calico可以实现,因此周末找个时间试了一下大概的过程. 前面的kubernet ...

随机推荐

  1. 一看就懂的:MySQL数据页以及页分裂机制

    文章公号 首发!连载中~ 欢迎各位大佬关注, 回复:"抽奖" 还可参加抽活动 文末有二维码 一.知识回顾 回顾一下之前和大家分享的知识点 看了前面的文章,想必你肯定了解了什么是Bu ...

  2. Ubuntu16.04配置静态ip

    1.安装好ubuntu16.04虚拟机之后,首先按照下图的步骤进行: 首先需要打开虚拟网络编辑器,点击VMnet8的虚拟网卡,如果没有这个网卡,只需在编辑虚拟机设置里面将网络适配器类型改为NAT模式, ...

  3. 【CF375D】Trees and Queries——树上启发式合并

    (题面不是来自Luogu) 题目描述 有一个大小为n且以1为根的树,树上每个点都有对应的颜色ci.现给出m次询问v, k,问以v为根的子树中有多少种颜色至少出现了k次. 输入格式 第一行两个数n,m表 ...

  4. 为什么不用UUID做主键?

    不易于存储:UUID太长,16字节128位,通常以36长度的字符串表示,很多场景不适用. 信息不安全:基于MAC地址生成UUID的算法可能会造成MAC地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制作者位 ...

  5. 解决linux挖矿病毒(kdevtmpfsi,sysupdate, networkservice)

    突然发现公司测试服务器CPU过高,是这两个sysupdate, networkservice进程,很明显是被挖矿了,记录下来以供参考. 病毒会把一些文件给加i锁或a锁,导致无法修改数据,所以某些操作需 ...

  6. FPGA PS2协议

    VerilogHDL那些事儿_建模篇(黑金FPGA开发板配套教程) 作者:akuei2 说明:参照该书将部分程序验证学习一遍 学习时间:2014年5月3号 主要收获: 1. 对PS2接口有初步了解: ...

  7. docker centos容器无法yum

      问题 dockerfile yum -y install vim的时候一直未响应 但是在本地虚拟机centos7上运行则没问题   https://blog.csdn.net/jimiao_xxx ...

  8. 自动化运维工具之Puppet变量、正则表达式、流程控制、类和模板

    前文我们了解了puppet的file.exec.cron.notify这四种核心资源类型的使用以及资源见定义通知/订阅关系,回顾请参考https://www.cnblogs.com/qiuhom-18 ...

  9. CAD插件

    CAD插件使用: 1.首先得有插件,插件解压,放那个盘都可以,只要自己觉得放得下,注:(每次打开CAD想要用插件都要的步骤)打开CAD---AP回车----找到插件所在文件夹-------Ctrl+A ...

  10. 第6.3节 Python动态执行之动态编译的compile函数

    Python支持动态代码主要三个函数,分别是compile.eval和exec.本节介绍compile函数的语法和相关使用.compile函数用来编译一段字符串的源码,将其编译为字节码或者AST(抽像 ...