kubernetes的网络

server/2024/10/20 11:01:15/
  1. kubernetes网络模型
    1. Kubernetes采用的是基于扁平地址空间的网络模型,集群中的每个Pod都有自己的IP地址,Pod之间不需要配置NAT就能直接通信,同一个Pod中的容器共享Pod的IP,能够通过localhost通信
    2. Pod容器内的通信
      1. 当Pod被调度到某个节点,Pod中的所有容器都在这个节点上运行,这些容器共享相同的本地文件系统,IPC和网络命名空间
      2. 不同Pod之间不存在端口冲突的问题,因为每个Pod都有自己的IP地址,当某个容器使用localhost时,意味着使用的是容器所属的Pod的地址空间
      3. 比如Pod A有两个容器container-A1和container-A2,container-A1在端口1234上监听,当container-A2连接到localhost:1234时,实际上就是在访问container-A1,这不会与同一个节点上的Pod B冲突,即使Pod B中的容器container-B1也在监听1234端口
    3. Pod之间的通信
      1. Pod的IP是集群可见的,即集群中的任何其他Pod和节点都可以通过IP直接与Pod通信,这种通信不需要借助任何网络地址转换,隧道或代理技术,Pod内部和外部使用的是同一个IP,这也意味着标准的命名服务和发现机制,比如DNS可以直接使用
    4. Pod与Service的通信
      1. Pod间可以直接通过IP地址通信,但前提是Pod知道对方的IP,在Kubernetes集群中,Pod可能会频繁的销毁和创建,也就是说Pod的IP不是固定的,为了解决这个问题,Service提供了访问Pod的抽象层,无论后端的Pod如何变化,Service都作为稳定的前端对外提供服务,同时,Service还提供了高可用和负载功能,Service负责将请求转发给正确的Pod
    5. 外部访问
      1. 无论是Pod的IP还是Service的Cluster IP,他们只能在Kubernetes集群中可见,对集群之外的世界,这些IP是私有的
      2. kubernetes提供了两种方式让外界能够与Pod通信
        1. NodePort,service通过Cluster节点的静态端口对外提供服务,外部可以通过:访问Service
        2. LoadBalancer:Service利用cloud provider提供的load balancer对外提供服务cloud provider负责将load provider的流量导向Service,目前支持的cloud provider有GCP,AWS,Azur等
  2. 各种网络方案
    1. 为了保证网络方案的标准化,扩展性和灵活性,kubernetes采用了Container Networking Interface(CNI)规范
      1. CNI是由CoreOS提出的容器网络规范,使用了插件模型创建容器网络

      2. 在这里插入图片描述

      3. CNI的优点是支持多种容器runtime,不仅仅是Docker

      4. 目前已有多种支持Kubernetes的网络方案,比如Flannel,Calico,Canal,Weave Net等,因为他们都实现了CNI规范,无论选择哪种方案,得到的网络模型都一样,即每个Pod都有独立的IP,可以直接通信,

    2. Network Policy
      1. Network Policy是Kubernetes的一种资源,Network Policy通过Label选择Pod,并指定其他Pod或外界如何与这些Pod通信
      2. 默认情况下,所有Pod是非隔离的,即任何来源的网络流量都能够访问Pod,没有任何限制,当为Pod定义了Network Policy时,只有Policy允许的流量才能访问Pod
      3. 不是所有的Kubernetes网络方案都支持Network Policy,比如Flannel就不支持,Calico支持,
    3. Canal:他用Flannel实现Kubernete集群网络,同时又用Calico实现Network Policy
      1. Canal作为DaemonSet部署到每个节点,属于kube-system这个namespace
    4. 实践Network Policy
      1. 部署一个httpd应用,配置文件为httpd.yaml在这里插入图片描述

      2. httpd有三个副本,通过NodePort类型的Service对外提供服务,部署应用在这里插入图片描述

      3. 当前没有定义任何Network Policy,验证应用可以被访问

        1. 启动一个busybox Pod,既可以访问Service,也可以Ping到副本Pod在这里插入图片描述

        2. 集群节点既可以访问到Service,也可以Ping到副本Pod在这里插入图片描述

        3. 集群外可以访问Service在这里插入图片描述

      4. 创建Network Policy

        1. 在这里插入图片描述

          1. 定义将次Network Policy中的访问规则应用于label为run:httpd的Pod,即httpd应用的三个副本Pod
          2. ingress中定义只有label为accsee: "true"的Pod才能访问应用
          3. 只能访问80端口
        2. 通过kubectl apply创建Network Policy

          1. 在这里插入图片描述

          2. 验证Network Policy的有效性

            1. busybox Pod已经不能访问Service

              1. 在这里插入图片描述

              2. 如果Pod添加了label access:"true"就能访问到应用,但Ping已经被禁止在这里插入图片描述

            2. 集群节点已经不能访问Service,也Ping不到副本Pod

              1. 在这里插入图片描述
            3. 集群外也不能访问Service

              1. 在这里插入图片描述

              2. 如果希望让集群节点和集群外(192.168.56.1)也能够访问到应用,可以对Network Policy做修改在这里插入图片描述

              3. 应用新的Network Policy在这里插入图片描述

              4. 现在集群节点和集群外(192.168.56.1)已经能够访问了在这里插入图片描述

          3. 通过ingress限制进入的流量,也可以用ingress限制外出的流量


http://www.ppmy.cn/server/125971.html

相关文章

计算机网络:计算机网络概述 —— 初识计算机网络

文章目录 计算机网络组成部分网络架构协议与标准网络设备网络类型作用实际应用案例 计算机网络 计算机网络是指将多台计算机通过通信设备和通信链路连接起来,以实现数据和信息的交换和共享的技术和系统。它是现代信息社会的基础设施之一,也是互联网的基…

【数据结构】堆(Heap)详解

在深入了解堆这一重要的数据结构之前,不妨先回顾一下我之前的作品 ——“二叉树详解”。 上篇文章👉剖析二叉树(Binary Tree) 二叉树作为一种基础的数据结构,为我们理解堆以及其他更复杂的数据结构奠定了坚实的基础。它…

Leetcode 环形链表

java 代码: /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public class Solution {public boolean hasCycle(ListNode head) {//初始…

使用 Nginx 和 Gunicorn 部署 Flask 项目详细教程

使用 Nginx 和 Gunicorn 部署 Flask 项目详细教程 在这篇文章中,我们将介绍如何使用 Nginx 和 Gunicorn 来部署一个 Flask 项目。这种部署方式非常适合在生产环境中使用,因为它能够提供更好的性能和更高的稳定性。 目录 Flask 项目简介环境准备Gunico…

【分布式微服务云原生】使用Docker体验不同Linux发行版

Docker 允许用户在同一个宿主机上运行多种不同的Linux发行版,而共享同一个宿主机内核。这种方式不仅节省资源,还非常方便进行环境测试和开发。 1. Docker与Linux发行版 Linux内核 发行版 Linux内核与各种发行版软件包组合,构成了一个完整的…

Docker精讲:基本安装,简单命令及核心概念

docker服务部署 docker是一个容器管理工具,其内部容器才是具体服务,所以我们在安装docker时不需要有太多定制内容,只需要通过yum安装即可 1. 更新系统包 #更新现有依赖包,防止现有依赖包版本过低影响docker安装 yum update2. 安…

k8s 分布式存储平台 -- Longhorn

文章目录 一、什么是 Longhorn二、架构设计1、工作原理2、工作流程3、基于微服务设计的优势 三、安装1、安装要求2、使用 Longhorn 命令行工具(验证方式一)3、使用环境检查脚本(验证方式之二)3.1、安装 jq3.2、运行脚本 4、安装 o…

【GO语言】卡尔曼滤波例程

本文给出一个简单的卡尔曼滤波的 Go 语言实现示例,以及相应的讲解文档。 源代码 package mainimport ("fmt" )type KalmanFilter struct {x float64 // 状态估计P float64 // 估计误差协方差F float64 // 状态转移矩阵H float64 //…