tnblog
首页
视频
资源
登录

Pod中的网络通信方式

6672人阅读 2020/3/22 15:12 总访问:3475895 评论:0 收藏:0 手机
分类: 容器编排

前言

欢今天来讲讲pod中的各种网络的通信

目录:

Cluster IP

Target Ports

NodePort

Ingress

Load Balancer


Cluster IP


创建Kubernetes服务时,群集IP是默认方法。为该服务分配了一个内部IP,其他组件可以使用该IP来访问Pod。

通过使用单个IP地址,它可以使服务在多个Pod之间实现负载平衡。

1.png


clusterip.yaml

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: webapp1-clusterip-svc
  5.   labels:
  6.     app: webapp1-clusterip
  7. spec:
  8.   ports:
  9.   - port: 80
  10.   selector:
  11.     app: webapp1-clusterip
  12. ---
  13. apiVersion: extensions/v1beta1
  14. kind: Deployment
  15. metadata:
  16.   name: webapp1-clusterip-deployment
  17. spec:
  18.   replicas: 2
  19.   template:
  20.     metadata:
  21.       labels:
  22.         app: webapp1-clusterip
  23.     spec:
  24.       containers:
  25.       - name: webapp1-clusterip-pod
  26.         image: katacoda/docker-http-server:latest
  27.         ports:
  28.         - containerPort: 80
  29. ---



首先简单的介绍一下上面Yaml define的内容:


 (1)创建服务

 创建一个名为 webapp1-clusterip-svc 的服务并将它

 给自己创建一个标签名为 webapp1-clusterip

 开通的端口为 80 端口

 通过 selector 去筛选 Pod 上筛选标签 app:webapp1-clusterip


 (2)创建 Deployment Pod

 创建一个名为 webapp1-clusterip-deployment 的 Pod组

 并为每一个 Pod 标注标签为 app:webapp1-clusterip-pod 

 后面紧接着是 Pod 名称,镜像与容器中端口的定义


启动 Kubernetes proxy 模式:

$ kubectl proxy --port=8080


这样你可以通过Kubernetes API,使用如下模式来访问这个服务:

http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/


要访问我们上面定义的服务,你可以使用如下地址:

http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/


创建yaml文件中的定义

查看相关定义

  1. kubectl apply -f clusterip.yaml
  2. kubectl get svc --show-labels
  3. kubectl describe svc/webapp1-clusterip-svc


如图所示:



验证结果:


Target Ports

目标端口允许我们将应用程序可用的端口与应用程序正在侦听的端口分开。TargetPort是应用程序配置为侦听的端口。端口是从外部访问应用程序的方式。


clusterip-target.yaml

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: webapp1-clusterip-targetport-svc
  5.   labels:    app: webapp1-clusterip-targetport
  6. spec:  ports:
  7.   - port: 8080
  8.     targetPort: 80
  9.   selector:
  10.     app: webapp1-clusterip-targetport
  11. ---
  12. apiVersion: extensions/v1beta1
  13. kind: Deployment
  14. metadata:  name: webapp1-clusterip-targetport-deployment
  15. spec:
  16.   replicas: 2
  17.   template:
  18.     metadata:
  19.       labels:
  20.         app: webapp1-clusterip-targetport
  21.     spec:
  22.       containers:
  23.       - name: webapp1-clusterip-targetport-pod
  24.         image: katacoda/docker-http-server:latest
  25.         ports:
  26.         - containerPort: 80
  27. ---


上脚本

  1. kubectl apply -f clusterip-target.yaml
  2. kubectl get svc
  3. kubectl describe svc/webapp1-clusterip-targetport-svc


结果:




NodePort

NodePort 服务是引导外部流量到你的服务的最原始方式。NodePort,正如这个名字所示,在所有节点(虚拟机)上开放一个特定端口,任何发送到该端口的流量都被转发到对应服务。

2.png

NodePort 服务的 YAML 文件类似如下:

apiVersion: v1
kind: Service
metadata:  
name: my-nodeport-service
selector:    
app: my-app
spec:
type: NodePort
ports:  
- name: http
port: 80
targetPort: 80
nodePort: 30036
protocol: TCP


NodePort 服务主要有两点区别于普通的“ClusterIP”服务。第一,它的类型是“NodePort”。有一个额外的端口,称为 nodePort,它指定节点上开放的端口值 。如果你不指定这个端口,系统将选择一个随机端口。大多数时候我们应该让 Kubernetes 来选择端口,因为如评论中 thockin 所说,用户自己来选择可用端口代价太大。

何时使用这种方式?

这种方法有许多缺点:

  1. 每个端口只能是一种服务

  2. 端口范围只能是 30000-32767

  3. 如果节点/VM 的 IP 地址发生变化,你需要能处理这种情况。


基于以上原因,我不建议在生产环境上用这种方式暴露服务。如果你运行的服务不要求一直可用,或者对成本比较敏感,你可以使用这种方法。这样的应用的最佳例子是 demo 应用,或者某些临时应用。



Ingress

有别于以上所有例子,Ingress 事实上不是一种服务类型。相反,它处于多个服务的前端,扮演着“智能路由”或者集群入口的角色。

你可以用 Ingress 来做许多不同的事情,各种不同类型的 Ingress 控制器也有不同的能力。

GKE 上的默认 ingress 控制器是启动一个 HTTP(S) Load Balancer。它允许你基于路径或者子域名来路由流量到后端服务。例如,你可以将任何发往域名 foo.yourdomain.com 的流量转到 foo 服务,将路径 yourdomain.com/bar/path 的流量转到 bar 服务。

4.png


GKE 上用 L7 HTTP Load Balancer 生成的 Ingress 对象的 YAML 文件类似如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
spec:
backend:
serviceName: other
servicePort: 8080
rules:
- host: foo.mydomain.com
http:
  paths:
  - backend:
      serviceName: foo
      servicePort: 8080
- host: mydomain.com
http:
  paths:
  - path: /bar/*
    backend:
      serviceName: bar
      servicePort: 8080


何时使用这种方式?

Ingress 可能是暴露服务的最强大方式,但同时也是最复杂的。Ingress 控制器有各种类型,包括 Google Cloud Load Balancer, NginxContourIstio,等等。它还有各种插件,比如 cert-manager,它可以为你的服务自动提供 SSL 证书。

如果你想要使用同一个 IP 暴露多个服务,这些服务都是使用相同的七层协议(典型如 HTTP),那么Ingress 就是最有用的。如果你使用本地的 GCP 集成,你只需要为一个负载均衡器付费,且由于 Ingress是“智能”的,你还可以获取各种开箱即用的特性(比如 SSL,认证,路由,等等)。









Load Balaner

LoadBalancer 服务是暴露服务到 internet 的标准方式。在 GKE 上,这种方式会启动一个 Network Load Balancer,它将给你一个单独的 IP 地址,转发所有流量到你的服务。

3.png


何时使用这种方式?

如果你想要直接暴露服务,这就是默认方式。所有通往你指定的端口的流量都会被转发到对应的服务。它没有过滤条件,没有路由等。这意味着你几乎可以发送任何种类的流量到该服务,像 HTTP,TCP,UDP,Websocket,gRPC 或其它任意种类。

这个方式的最大缺点是每一个用 LoadBalancer 暴露的服务都会有它自己的 IP 地址,每个用到的 LoadBalancer 都需要付费,这将是非常昂贵的。


【转载】:http://dockone.io/article/4884





欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

Horizontal Pod Autoscaler (HPA) Pod动态扩容

Horizontal Pod Autoscaler (HPA) Pod动态扩容[TOC] HPA简介 我们都知道通过手工执行 kubectl scale 命令可以手工实...

Kubernetes Pod中断预算【PDB】

Kubernetes Pod中断预算【PDB】[TOC] 尽管Deployment或ReplicaSet一类的控制器能够确保相应Pod对象的副本数量不断逼近期...

Kubernetes 配置Pod 没有API 凭据

Kubernetes 配置Pod 没有API 凭据[TOC] 当你创建 Pod 时,如果没有指定服务账户,Pod 会被指定给命名空间中的 default 服...

k8s查询Pod的资源清单,查询Pod的spec

kubectl get pod nginx-deploy-7db697dfbd-2qh7v -o yaml #使用 -o 参数 加yaml,可以将资源的配置以 yaml的格式输出出来...

k8s Pod删除后重建

先删除对应的deploymentkubectl delete deployment nginx 然后在删除Podkubectl delete pod nginx 使用Deployment等方式...

k8s 重启 Pod

pod准备使用如下pod的yaml文件 [root@host131 config]# cat busybox-pod-test.yaml apiVersion: v1 kind: Pod metadat...

k8s常用命令,k8s查看Pod的详情与日志k8s相关日志文件等

查看pod运行状态 kubectl get pod 详细一点的 kubectl get pod -o wide 查看k8s系统pod的各种状态: 接名称空间...

kubeadm 集群初始化参数 Pod-network-cidr 有什么作用

如果创建集群时指定了该参数,那么 kube-controller-manager 的 cluster-cidr 启动参数就会被设置成该值。对于 kube-contro...

kubadm部署k8s时service-cidr网络和Pod-network-cidr的地址如何定义

在用kubadm安装k8s时出现一个疑问,service-cidr和pod-network-cidr这个地址如何配置参数说明--apiserver-advertise-addres...

路由器交换机的概念和区别

前言:各位看官老爷,大家早上好 俺是小付童鞋 今天和大家浅谈一下路由和交换机之间的连续。如有讲解错误的地方还请各位大佬...

rabbitmq官网上六大版块之二(Direct类型交换机通过routingKey分类型输出)

其实rabbitmq,老师都说得差不多了,下面是老师的连接。http://www.tnblog.net/aojiancc2/article/UserCategory/134官网教...

rabbitmq六大版块之三(Fanout类型交换机相同数据多逼格处理)

Fanout类型交换机的特点是:同样的数据分发给每一个自己所绑定的队列,每个队列可以按照自己的需求对数据进行不同的处理【...

rabbitmq中Header类型交换机的处理(and与or的处理)

headers类型交换机是通过 muliple attributes 代替 routing key.x-match [all/any]all: 所有地方header头信息必须匹配any:...

mq交换机的各种类型

《1》Message TTL (1) Queue TTL =》 给队列中的所有消息限定一个时间 (2) Message TTL =》 给队列中指定的消息限定一个时...
这一世以无限游戏为使命!
排名
2
文章
636
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术