K8S知识点记录—网络通信

前言

对于刚接触K8s的新人来说,K8S的网络通信太复杂了,每个点都可以深入很多很多,这篇文章记录自己网络通信的一个整体认识,帮助快速上手。


一、K8S的网络通信汇总

根据自己的梳理画了一个图(从用户到pod的一个网络通信图,目的是快速打通网络流)
在这里插入图片描述
图中的概念介绍:

  • K8S中三类IP,NodeIP,PodIP,ClusterIP

Node IP:Node节点的IP地址,即物理网卡的IP地址
Pod IP:Pod的IP地址,即docker容器的IP地址,此为虚拟IP地址
Cluster IP:Service的IP地址,此为虚拟IP地址。
讲得比较透彻的文章: https://ld246.com/article/1579223129877

  • 三种IP之间的通信(使用busybox去做测试)

NodeIP ping PodIP —》yes Flannel插件解决
NodeIp ping ClusterIP —>No —》k8s的kube-proxy支持iptables、ipvs模式,默认iptables模式,改为ipvs即可以实现pod与service通信
PodIp ping ClusterIp —> No —》k8s的kube-proxy支持iptables、ipvs 模式,默认iptables模式,改为ipvs即可以实现pod与service通信
外网 Ping三个Ip --> ping NodeIP(公网) OK;ping PodIP No;ping Cluster IP No;

  • Flannel 作用:网络插件

CNI CNI(container network interface)是容器网络接口 是K8s中提供的一种通用网络标准规范,因为k8s本身不提供网络解决方案 以插件方式使用, 为用户在pod创建或者销毁时动态配置网络。

  1. 确保整个集群中Pod IP不重复
  2. 建立所有Pod的覆盖网络,使得Pod之间可以相互通信
  • k8s中关于kube-proxy的iptables模式和ipvs模式探讨

k8s默认为iptables,从1.8版本加入了ipvs模式,
ipvs和iptables都是基于netfilter的,他们的差别为:
ipvs 为大规模集群提供了更好的可扩展性和性能
ipvs 支持比 iptables 更复杂的复制均衡算法(最小负载、最少连接、加权轮询等)
ipvs 支持服务器健康检查和连接重试等功能

  • k8s中Ingress探讨:k8s还提供一种集群维度暴露服务的方式的对象

Ingress 主要分为两部分:

  • Ingress Controller 是流量的入口,是一个实体软件, 一般是Nginx 和 Haproxy 。
  • Ingress 描述具体的路由规则。
  • 集群内通信&外部通信

我们知道集群内,Pod与Pod之间的通信(服务暴露和发现):

  • service会自动为pod创建环境变量,在其他Pod中可以通过该环境变量访问。要求Service在Pod只之前创建。进入Pod,可以通过Env查看环境变量。
  • DNS:CoreDNS,kubelet自动为Pod设置DNS,Pod之间可以直接通过 解析域名访问,也可以自定义定义:spec.hostname spec.subdomain ----->DNS注册机制

想要直接把集群服务暴露出来,我们可以使用NodePort 和 Loadbalancer 类型的 Service

  • ClusterIP 默认的,仅在集群内可用
  • NodePort 暴露端口到节点,提供了集群外部访问的入口 端口范围固定 30000 ~ 32767
  • LoadBalancer 需要负载均衡器(通常都需要云服务商提供) 会额外生成一个 IP 对外服务 。K8S 支持的负载均衡器:负载均衡器
  • Headless 适合数据库 clusterIp 设置为 None 就变成 Headless 了,不会再分配 IP,后面会再讲到具体用法
  • Ingress:在Service基础上进行一层封装,做路由配置,流量转发。

二、实际测试

在实际应用中,重点是怎么测试网络是否联通,以下是个人采用的一些方法:总的来说,测试网络是否联通就用如下命令:ping(busybox) + curl(nginx做测试)+telnet node-ip node-port

1. 网络插件 Flannel的使用

K8S提供 CNI接口,但是不实现网络解决方案,需要使用插件解决。看安装提示语句:
在这里插入图片描述
初始化Master之后有明确提示:
You should now deploy a pod network to the cluster.
Run “kubectl apply -f [podnetwork].yaml” with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
我们选择最简单的。最常用的Flannel作为 K8S的CNI。

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

2. 修改kube-proxy iptables模式为ipv模式

到目前为止:解决pod与service直接的通信,跨主机,跨namespace
参考:https://blog.csdn.net/Urms_handsomeyu/article/details/106294085?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2defaultCTRLISTRate-1.pc_relevant_aa&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultCTRLISTRate-1.pc_relevant_aa&utm_relevant_index=2

修改方法:
查看: kubectl get cm kube-proxy -n kube-system -o yaml
修改: kubectl edit configmap kube-proxy -n kube-system
metricsBindAddress: “127.0.0.1:10249
mode: “ipvs
删除kube-system 命名空间下的kube-proxy:kubectl -n kube-system delete pods kube-proxyxxx kube-proxyxxy kube-proxyxxz…(删除之后,会自动重新创建)
查看是否生效:kubectl logs kube-proxy-xxx, 查找关键字 Using ipvs Proxier
在这里插入图片描述

3. 通过Endpoint对象查看 Service与Pod关联情况

如下图,Service通过spec.selector去匹配Deployment中的spec.template.metadata.labels。
在这里插入图片描述
通过kubectl describe svc my-busybox 查看Endpoint对象,从下图中可以看出 PodIP与ClusterIP的关系。
在这里插入图片描述

4. 使用busybox测试网络联通性

  • 创建:NS(cni-test)、SVC(my-busybox)、Deployment(app)
  • 创建:NS(cni-test-2c)、SVC(my-busybox)、Deployment(app)
  • 进入随意一个Pod,ping NodeIP, ping ClusterIP, ping PodIP,可以看到都能ping通,证明网络是联通的。
    在这里插入图片描述
    Yaml文件:
apiVersion: v1
kind: Namespace
metadata:
  name: cni-test

---
apiVersion: v1
kind: Service
metadata:
  name: my-busybox
  namespace: cni-test
spec:
  selector:
    run: app
  ports:
  - port: 80
    targetPort: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
  namespace: cni-test
spec:
  replicas: 10
  selector:
    matchLabels:
      run: app
  template:
    metadata:
      labels:
        run: app
    spec:
      containers:
      - name: app
        image: busybox        #内置的linux大多数命令,多用于测试
        args:
        - /bin/sh
        - -c
        - sleep 10; touch /tmp/healthy; sleep 30000
        readinessProbe:           #就绪探针
          exec:
            command:
            - cat
            - /tmp/healthy
          initialDelaySeconds: 10         #10s之后开始第一次探测
          periodSeconds: 5                #第一次探测之后每隔5s探测一次
apiVersion: v1
kind: Namespace
metadata:
  name: cni-test-2c

---
apiVersion: v1
kind: Service
metadata:
  name: my-busybox
  namespace: cni-test-2c
spec:
  selector:
    run: app
  ports:
  - port: 80
    targetPort: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
  namespace: cni-test-2c
spec:
  replicas: 3
  selector:
    matchLabels:
      run: app
  template:
    metadata:
      labels:
        run: app
    spec:
      containers:
      - name: app
        image: busybox        #内置的linux大多数命令,多用于测试
        args:
        - /bin/sh
        - -c
        - sleep 10; touch /tmp/healthy; sleep 30000
        readinessProbe:           #就绪探针
          exec:
            command:
            - cat
            - /tmp/healthy
          initialDelaySeconds: 10         #10s之后开始第一次探测
          periodSeconds: 5                #第一次探测之后每隔5s探测一次

---
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
  namespace: cni-test-2c
spec:
  replicas: 3
  selector:
    matchLabels:
      run: app-2
  template:
    metadata:
      labels:
        run: app-2
    spec:
      containers:
      - name: app-2
        image: busybox        #内置的linux大多数命令,多用于测试
        args:
        - /bin/sh
        - -c
        - sleep 10; touch /tmp/healthy; sleep 30000
        readinessProbe:           #就绪探针
          exec:
            command:
            - cat
            - /tmp/healthy
          initialDelaySeconds: 10         #10s之后开始第一次探测
          periodSeconds: 5                #第一次探测之后每隔5s探测一次

5. 腾讯云CVM部署 K8S的外网访问排查

在这里插入图片描述
1、创建 nginx测试 NodePort功能
2. 外网IP:31090 ,无法访问
在这里插入图片描述
排查: 查看如上信息,pod、service都没问题,就是外网访问的时候,提示无法访问。

step1:Node上 curl pod资源 ---->通信OK
在这里插入图片描述
Step2:在Node上 curl service资源 —》通信OK
在这里插入图片描述
Step3:Node上 Curl 内网IP:31090 —>通信Ok
在这里插入图片描述
Step4:在外网上,Curl 外网IP:31090 —》No,说明在获取公网地址:端口 的时候 未获取到资源。
在这里插入图片描述
---- 百度查找:原因是 Linux禁止 iptables,ipvs流量转发?
对于iptables:设置 iptables -P FORWARD ACCEPT,#再查看 sudo iptables -S; 可以参考:https://www.cnblogs.com/gaoyuechen/p/14307141.html
对于ipvs:需要通过ipvsadm 管理,可以参考:
https://blog.csdn.net/cloudvtech/article/details/80199653
https://www.jianshu.com/p/865fe1469c74
还是无法解决,问题就出在 内网相关端口,或者其他不知道的什么东西没有暴露给外网,服务器本身有问题。而我的环境是 腾讯云,
WC,腾讯云创建的时候选择了一个安全组,一查,发现问题了,31090端口没暴露给外网…

在这里插入图片描述
解决办法: 直接将安全组设置为【放通全部端口-…】
在这里插入图片描述
nginx测试NodePort的yaml如下:

apiVersion: v1
kind: Namespace
metadata:
  name: pod-nginx-test

---
apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  namespace: pod-nginx-test
spec:
  selector:
    name: my-nginx-pod-test
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 31090

---
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod-test
  namespace: pod-nginx-test
  labels:
    name: my-nginx-pod-test
spec:
  containers:
  - name: my-nginx-pod-test
    image: nginx
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
    ports:
      - containerPort: 80

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Kubernetes 的网络系统是由多个组件组成的, 它们协作为应用程序提供网络连接和通信. 其中一些主要的组件包括: - kube-proxy: 运行在每个节点上, 负责为 Pod 和 Service 提供代理服务. - kube-dns: 为应用程序提供 DNS 服务. - 网络插件: 用于为 Pod 提供网络连接, 支持不同的网络模型, 如 Calico, Flannel, Cilium 等. - Service: 为应用程序提供负载均衡和服务发现. Kubernetes 的网络模型是基于 Pod 的, 每个 Pod 都有一个独立的 IP 地址, 使得容器间直接通信成为可能. Service 则提供了一种发现和负载均衡的机制, 让外部客户端可以访问 Pod. ### 回答2: Kubernetes(K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。下面是一些与K8s网络相关的知识点。 1. 服务发现:K8s通过DNS(域名系统)服务提供内部服务发现机制。每个服务都会被分配一个唯一的域名,其他服务可以通过该域名访问该服务。 2. Pod网络:PodK8s中的最小调度单元,它可以包含一个或多个容器。每个Pod都有一个唯一的IP地址,容器可以通过本地回环地址访问其他Pod中的容器。 3. 容器网络接口(CNI):CNI是一个规范,用于定义容器网络的实现方式。K8s使用CNI插件来设置和管理Pod的网络。不同的CNI插件可以支持不同的网络方案,如VLAN、VXLAN、Calico等。 4. 服务代理:K8s使用服务代理来实现服务之间的通信。服务代理可以在集群各个节点上运行,并通过负载均衡来分发到后端Pod。 5. 网络策略:K8s允许用户通过网络策略来定义集群中的网络访问规则。网络策略可以限制哪些Pod可以与另一个Pod通信,以及允许的协议和端口。 6. Ingress控制器:Ingress控制器是K8s中用于管理入站网络流量的组件。它可以将外部流量路由到集群内部的服务,并提供负载均衡和SSL终止等功能。 7. 可插拔网络解决方案:K8s提供了一些可插拔的网络解决方案,如Flannel、Calico等。这些解决方案可以根据具体需求选择,以提供不同的网络拓扑结构和性能。 总而言之,K8s网络相关的知识点包括服务发现、Pod网络、CNI、服务代理、网络策略、Ingress控制器和可插拔网络解决方案。这些知识点帮助我们理解和管理K8s集群中的网络配置和通信。 ### 回答3: Kubernetes(简称k8s)是一种用于容器编排和管理的开源平台,它涉及到一些重要的网络概念和组件。 首先,k8s网络模型是基于虚拟网络的概念。每个k8s集群中的容器都会被分配一个独立的IP地址,并且可以通过这个IP地址跨节点进行通信。这是通过一个称为kube-proxy的组件实现的,它会在每个节点上监听API服务器上的变化,并使用iptables或者IPVS等工具在宿主机上进行流量转发。 其次,k8s通过Service和Endpoint来暴露和访问容器。Service是一个逻辑概念,用于封装一组具有相同功能的容器,在集群内部提供服务的访问入口。一个Service可以通过ClusterIP、NodePort或者LoadBalancer等不同的类型暴露。而Endpoint是实际运行容器的IP和端口的集合,用于告诉Service流量应该转发到哪里。 此外,k8s还支持Ingress资源,用于在集群外部暴露服务,实现外部访问。Ingress通过定义一个或多个规则,将外部流量转发到不同的Service上,从而实现域名或路径的复杂路由。 最后,网络插件是k8s网络中的重要组件。k8s提供了一些默认的网络插件,如Flannel、Calico等,用于管理Pod之间的网络通信。网络插件负责创建网络的子网和路由表,并将Pod的IP地址与宿主机的虚拟网卡进行关联。 总结来说,k8s网络涉及到虚拟网络、kube-proxy、Service、Endpoint、Ingress等概念和组件,这些都是为了实现容器间的通信和外部访问的需求。不同的网络插件可以根据具体需求选择,以满足集群的网络需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值