0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

k8s与pod之间是如何进行网络隔离的?

阿铭linux 来源:阿铭linux 2023-05-11 09:35 次阅读

0c1332b2-ef9a-11ed-90ce-dac502259ad0.png

NetworkPolicy用来控制Pod与Pod之间的网络通信,它也支持针对Namespace进行限制。基于白名单模式,符合规则的对象通过,不符合的拒绝。 应用场景举例:

Pod A不能访问Pod B;

开发环境所有Pod不能访问测试命名空间;

提供对外访问时,限制外部IP;

官方NetworkPolicy YAML示例:

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
说明:必需字段:apiVersion、 kind 和 metadata 字段。

podSelector:定义目标Pod的匹配标签,即哪些Pod会生效此策略;

policyTypes:表示给定的策略是应用于目标Pod的入站流量(Ingress)还是出站流量(Egress),或两者兼有。如果NetworkPolicy未指定policyTypes则默认情况下始终设置Ingress。

ingress:定义入流量限制规则,from用来定义白名单对象,比如网段、命名空间、Pod标签,Ports定义目标端口。

egress:定义出流量限制规则,定义可以访问哪些IP和端口

案例一: 需求:aming命名空间下所有Pod可以互相访问,也可以访问其他命名空间Pod,但其他命名空间不能访问aming命名空间Pod。 首先创建几个Pod:

kubectl run busybox --image=busybox -- sleep 3600  ## default命名空间里创建busybox Pod
kubectl run busybox --image=busybox -n aming -- sleep 3600    ## aming命名空间里创建busybox Pod
kubectl run web --image=nginx:1.23.2 -n aming  ## aming命名空间里创建web pod
在没有创建NetworkPolicy的情况下测试
kubectl exec busybox -n aming -- ping 10.18.235.161  ##aming命名空间的busybox ping default命名空间的busybox IP 
kubectl exec busybox -n aming -- ping 10.18.235.162 ##aming命名空间的busybox ping aming命名空间的web IP
kubectl exec busybox -- ping 10.18.235.162 ##default命名空间的busybox ping aming命名空间的web IP
创建networkpolicy的YAML
vi  deny-all-namespaces.yaml  ##内容如下
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-namespaces
  namespace: aming
spec:
  podSelector: {} # 为空,表示匹配本命名空间所有Pod
  policyTypes:
  - Ingress
  ingress:
    - from:
      - podSelector: {} # 为空,表示匹配该命名空间所有Pod,即允许该命名空间所有Pod访问,没有定义namespaceSelector,也就是说不允许其它namespace的Pod访问。
应用YAML
kubectl apply -f deny-all-namespaces.yaml
测试:
kubectl exec busybox -n aming -- ping 10.18.235.161  ##aming命名空间的busybox ping default命名空间的busybox IP
kubectl exec busybox -n aming -- ping 10.18.235.162 ##aming命名空间的busybox ping aming命名空间的web IP
kubectl exec busybox -- ping 10.18.235.162 ##default命名空间的busybox ping aming命名空间的web IP
将刚刚创建的所有资源删除:
kubectl delete po busybox  --force
kubectl delete po busybox -n aming --force
kubectl delete po web -n aming
kubectl delete -f deny-all-namespaces.yaml
案例二: 通过PodSelector限制
vipod-selector.yaml##内容如下
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: app-to-app
  namespace: aming
spec:
  podSelector:
    matchLabels:
      app: test
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: dev
      ports:
        - protocol: TCP
          port: 80
应用YAML
kubectl apply -f pod-selector.yaml
创建测试pod
kubectl run web01 --image=nginx:1.23.2 -n aming -l 'app=test'  #创建Pod时,指定label
kubectl get pod web01 -n aming --show-labels # 查看label
# 如果label创建错了,也可以修改,在本实验中不需要做如下操作
# kubectl label pod busybox app=test123 --overwrite 
kubectl run app01 --image=nginx:1.23.2 -n aming -l 'app=dev' 
kubectl run app02 --image=nginx:1.23.2 -n aming
查看web01的IP
kubectl describe po web01 -n aming |grep -i ip
测试
kubectl exec -n aming app01 -- curl 10.18.235.170
kubectl exec -n aming app02 -- curl 10.18.235.170
测试成功后,删除掉刚刚创建的资源
kubectl delete po app01 -n aming
kubectl delete po app02 -n aming
kubectl delete po web01 -n aming
kubectl delete -f pod-selector.yaml
案例三: 限制namespace
viallow-ns.yaml#内容如下
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-ns
  namespace: aming
spec:
  podSelector: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              name: test
      ports:
        - protocol: TCP
          port: 80
应用YAML
kubectl apply -f allow-ns.yaml
创建测试ns
kubectl create ns test
创建测试pod
kubectl run web01 --image=nginx:1.23.2 -n aming
kubectl run web02 --image=nginx:1.23.2 -n test
kubectl run web03 --image=nginx:1.23.2 
kubectl run web04 --image=nginx:1.23.2 -n aming
查看web01的IP
kubectl describe po web01 -n aming |grep -i ip
查看ns label
kubectl get ns --show-labels
给ns设置标签
kubectl label namespace test name=test
测试:
kubectl -n test exec web02 -- curl 10.18.235.172  #可以访问
kubectl exec web03 -- curl 10.18.235.172 #不可以访问
kubectl -n aming exec web04 -- curl 10.18.235.172  #不可以访问,即使同一个命名空间也无法访问

以上为NetworkPolicy的主要内容,你看明白了吗?






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • YAML
    +关注

    关注

    0

    文章

    21

    浏览量

    2274
  • TCP通信
    +关注

    关注

    0

    文章

    145

    浏览量

    4138

原文标题:来看看k8s里pod之间是如何进行网络隔离的

文章出处:【微信号:aming_linux,微信公众号:阿铭linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比

    等能力,同时提供了网络、文件系统的抽象与管理,所以对于已有应用上k8s或者基于k8s部署应用十分便捷。但这里有一部分令开发和运维人员比较头疼--日志采集。难点分析基于VM或者物理机部署的应用,日志采集
    发表于 02-28 12:49

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比

    等能力,同时提供了网络、文件系统的抽象与管理,所以对于已有应用上k8s或者基于k8s部署应用十分便捷。但这里有一部分令开发和运维人员比较头疼--日志采集。难点分析基于VM或者物理机部署的应用,日志采集
    发表于 02-28 12:50

    K8S容器编排的互通测试

    K8S容器编排之NetWorkPolicy官方实例
    发表于 06-06 11:28

    从零开始入门 K8s| 阿里技术专家详解 K8s 核心概念

    的资料中也会看到“ks”这个词,也就是“K8s”,它是通过将 8 个字母“ubernete ”替换为“8”而导致的一个缩写。Kubernetes 为什么要用“舵手”来命名呢?大家可以看一下这张图:这是一艘
    发表于 09-20 14:52

    从零开始入门 K8s| 详解 Pod 及容器设计模式

    和 cgroups 隔开的,所以现在实际要解决的是怎么去打破这个隔离,然后共享某些事情和某些信息。这就是 Pod 的设计要解决的核心问题所在。所以说具体的解法分为两个部分:网络和存储。1.共享
    发表于 09-20 15:12

    k8s核心原理学习指南3

    k8s学习3 - 核心原理
    发表于 09-25 16:37

    K8s 从懵圈到熟练 – 集群网络详解

    ,不同的地方在于 terway 支持 Pod 弹性网卡,以及 NetworkPolicy 功能。本文中,作者基于当前的 1.12.6 版本,以 flannel 为例,深入分析阿里云 K8S 集群网络的实现方法
    发表于 10-14 15:06

    K8s 从懵圈到熟练 – 镜像拉取这件小事

    一致。进阶方式上边的功能,一定程度上解决了集群节点登录镜像仓库不方便的问题。但是我们在创建 Pod 的时候,仍然需要给 Pod 指定 imagePullSecrets。K8s 通过变更准入控制
    发表于 10-14 15:38

    从零开始入门 K8s | 应用存储和持久化数据卷:核心知识

    的常见类型:本地存储,常用的有 emptydir/hostpath;网络存储:网络存储当前的实现方式有两种,一种是 in-tree,它的实现代码是放在 K8s 代码仓库中的,随着 K8s
    发表于 10-15 14:55

    从零开始入门 K8s | 应用存储和持久化数据卷:存储快照与拓扑调度

    等动作,如进行环境的复制、数据开发等功能时,都可以通过存储快照来满足需求,而 K8s 中通过 CSI Snapshotter controller 来实现存储快照的功能。存储快照用户接口
    发表于 10-15 15:07

    从零开始入门 K8s | 可观测性:你的应用健康吗?

    由于一些状态的恢复,它会重新恢复到 running 或者 successded 或者是 failed 。其实 K8s 整体的一个状态就是基于这种类似像状态机的一个机制进行转换的,而不同状态之间的转化都会
    发表于 10-15 15:32

    从零开始入门 K8s | 应用存储和持久化数据卷:核心知识

    首先看一下 Pod Volumes 的常见类型:本地存储,常用的有 emptydir/hostpath;网络存储:网络存储当前的实现方式有两种,一种是 in-tree,它的实现代码是放在 K8
    发表于 10-16 10:10

    k8s volume中的本地存储和网络存储

    八 、 k8s volume 本地存储和网络存储
    发表于 03-25 08:44

    搭建K8s环境平台的步骤

    1 搭建K8s环境平台规划1.1 单master集群1.2 多master集群
    发表于 11-04 06:03

    pod底层网络和数据存储是如何进行

    的 IP 地址和主机名 hostname,利用 namespace 进行资源隔离,相当于一台独立沙箱环境; pod 相当于一台独立主机,内部可以封装一个或多个容器(通常是一组相关的容器),内部容器
    的头像 发表于 09-24 11:35 1473次阅读