kubernetes(三)k8s中通信和Service
目录
1.同一个Pod中的容器通信
2.集群内Pod之间的通信
3 集群内Service-Cluster IP
4.外部服务访问集群中的Pod
4.1 Service-NodePort
4.2.Service-LoadBalance
4.3.Ingress
1.同一个Pod中的容器通信
Each Pod is assigned a unique IP address. Every container in a Pod shares the network namespace, including the IP address and network ports.
K8S最小的操作单位是Pod,由官网的这段话可以看出,同一个pod中的容器是共享网络ip地址和端口号的,通信显然没问题
在docker中,如果想在docker的网络中使用docker 的container name来进行通信,就需要通过connect命令将这些容器都加入到
同一个容器的网络中
k8s中也是这样做的,Pod里的这个容器被称之为pause container。
每个Pod里除了我们在yaml文件里定义的容器等,都会有一个默认的pause container
apiVersion: v1
kind: Pod
metadata:name: nginx-podnamespace: cppns
spec:containers:- name: nginx1image: nginxports:- containerPort: 80- name: nginx2image: nginxports:- containerPort: 80
如下图所示:
因为在一个网络内,Pod里的容器可以通过ip和容器名进行通信
k8s进入容器命令:
kubectl exec -it <podName> -c <containerName> -n <namespace> -- shell comand
2.集群内Pod之间的通信
我们都知道Pod会有独立的IP地址,这个IP地址是被Pod中所有的Container共享的
那么在多个Pod之间的通信能通过这个IP地址吗?
从两个角度考虑这个问题:一是集群中同一台机器中的Pod,二是集群中不同机器中的Pod
准备两个pod:一个Nginx,一个Busybox(运行一段小程序的应用)
apiVersion: v1kind: Podmetadata:name: nginx-podlabels:app: nginxspec:containers:- name: nginx-containerimage: nginxports:- containerPort: 80
---apiVersion: v1kind: Podmetadata:name: busyboxlabels:app: busyboxspec:containers:- name: busyboximage: busyboxcommand: ['sh', '-c', 'echo The app is running! && sleep 3600']
运行后查看两个容器的运行情况,这里刚好两个pod都运行在同一个Node上
发现:nginx-pod的ip为192.168.80.202 busybox-pod的ip为192.168.80.203 这里的ip是由calico网络插件帮助pod生成的
在任意一个Node,都可以通过Pod的ip进行访问(这里是Master节点)
可以多试几次,就有可能分别在不同的Node上 : 注意此时在两个节点上都不能有对应类型的Pod(nginx和busybox,否则k8s会默认把Pod分配给不含有该类型Pod的节点
注意:这里在nginx容器内ping busybox的ip无法成功,不是因为网络原因,而是在容器内不支持ping命令,根本原因是因为nginx的image镜像里没有对应的layer层.(可以参考下这篇文章:docker学习笔记(二)创建自己的镜像)
结论:centos上的任一集群nginx机器都能通过pod ip访问对应的pod
pods on a node can communicate with all pods on all nodes without NAT
pods in the host network of a node can communicate with all pods on all nodes without NAT
3 集群内Service-Cluster IP
上述的Pod虽然实现了集群内部互相通信,但是Pod是不稳定的,比如通过Deployment管理Pod,随时可能对Pod进行扩缩容,这时候Pod的IP地址是变化的。这就希望能够有一个固定的IP,使得集群内能够访问。
也就是前面在架构描述的时候所提到的,能够把相同或者具有关联的Pod,打上Label,组成一个Service。由Service提供固定的IP访问Pod集群。这样一来,不管Pod怎么创建和销毁,都可以通过不变的Service IP进行访问(这点其实跟docker swarm里的service很像)
An abstract way to expose an application running on a set of Pods as a network service.
Kubernetes gives Pods their own IP addresses and a single DNS name for a set of Pods, and can load-balance across them.
(1)创建一个有3个副本的whoami的yaml(Deployment)
apiVersion: apps/v1
kind: Deployment
metadata:name: whoami-deploymentlabels:app: whoami
spec:replicas: 3selector:matchLabels:app: whoamitemplate:metadata:labels:app: whoamispec:containers:- name: whoamiimage: jwilder/whoamiports:- containerPort: 8000
(2)查看pod以及service
kubectl get svc:可以发现目前并没有关于whoami的service
在集群内可以通过任一节点访问whoami的Pod
(3)创建对应的Service
kubectl expose deployment whoami-deployment
发现有一个Cluster IP类型的service,名称为whoami-deployment,IP地址为10.100.14.56
(4)通过对应的Cluster IP访问
这里的ClusterIP只能供集群内部访问
不难看出该service对三个pod实现了负载均衡
(5)具体查看一下whoami-deployment的详情信息,发现有一个Endpoints连接了具体3个Pod
[root@m ~]# kubectl describe svc whoami-deployment
扩容后,service里的Endpoints的Pod信息也会发生变化
[root@m ~]# kubectl scale deployment whoami-deployment --replicas=5
deployment.extensions/whoami-deployment scaled
[root@m ~]# kubectl describe svc whoami-deployment
Name: whoami-deployment
Namespace: default
Labels: app=whoami
Annotations: <none>
Selector: app=whoami
Type: ClusterIP
IP: 10.100.14.56
Port: <unset> 8000/TCP
TargetPort: 8000/TCP
Endpoints: 192.168.190.75:8000,192.168.190.76:8000,192.168.190.77:8000 + 2 more...
Session Affinity: None
Events: <none>
(6)Service的创建除了前面的命令行kubectl expose的形式,还有yaml的方式
apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app: MyAppports:- protocol: TCPport: 80targetPort: 9376type: Cluster
4.外部服务访问集群中的Pod
4.1 Service-NodePort
Service的一种类型,可以通过NodePort的方式让外部服务访问集群的Pod
因为外部是能够访问到集群机器的物理机器IP,所以NodePort就是在集群中每台物理机器Node上暴露一个相同的IP,然后暴露一个端口将集群中的Pod映射到对应的端口
(1)创建一个whoami的yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: whoami-deploymentlabels:app: whoami
spec:replicas: 3selector:matchLabels:app: whoamitemplate:metadata:labels:app: whoamispec:containers:- name: whoamiimage: jwilder/whoamiports:- containerPort: 8000
(2)创建NodePort类型的service,名称为whoami-deployment
kubectl expose deployment whoami-deployment --type=NodePort
通过NodePort将容器内部的8000端口映射到了宿主机的32717端口
注意:从请求的结果可以看出,虽然集群的每个Node都开放了一个端口供外部访问service,但哪怕请求同一个ip:port,其内部也是实现了负载均衡的
结论:NodePort虽然能够实现外部访问Pod的需求,但其实不好,因为会占用了各个物理主机上的端口(3个Node就会在3台Node上各占用一个端口)
4.2.Service-LoadBalance
在Service上做端口映射 通常需要第三方云提供商支持,有约束性
4.3.Ingress
https://kubernetes.io/docs/concepts/services-networking/ingress/
An API object that manages external access to the services in a cluster, typically HTTP.
Ingress can provide load balancing, SSL termination and name-based virtual hosting.Ingress exposes HTTP and HTTPS routes from outside the cluster to services within the cluster. Traffic routing is controlled by rules defined on the Ingress resource.
简单来说,Ingress就是帮助我们访问集群内的服务
ingress包括:ingress controller和ingress resources
ingress controller:核心是一个deployment,实现方式有很多,比如nginx, Contour, Haproxy, trafik, Istio,需要编写的yaml有:Deployment, Service, ConfigMap, ServiceAccount(Auth),其中service的类型可以是NodePort或者LoadBalancer。
ingress resources:这个就是一个类型为Ingress的k8s api对象了,这部分面向开发人员,用来配置一些映射规则
Ingress就相当于一个负载均衡器,是k8s对反向代理的一个抽象。大概的工作原理类似于Nginx,可以理解成在 Ingress 里建立一个个映射规则 , Ingress Controller 通过监听 Ingress 这个api对象里的配置规则并转化成 Nginx 的配置 , 然后对外部提供服务。
之所以需要分成ingress-controller和ingress resources,我觉得是由于网关部分的功能,大部分的组件都帮我们实现了,所以ingress直接提供controller接口,让厂商去实现负载均衡等网关功能,使用方只需要关注映射配置了(相当于把Nginx里的配置拿出来在yaml里进行配置,不需要进入容器内去修改配置文件)
https://github.com/kubernetes/ingress-nginx
https://kubernetes.github.io/ingress-nginx/
(1)先定义我们要运行的Service
apiVersion: apps/v1
kind: Deployment
metadata:name: tomcat-deploymentlabels:app: tomcat
spec:replicas: 1selector:matchLabels:app: tomcattemplate:metadata:labels:app: tomcatspec:containers:- name: tomcatimage: tomcatports:- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:name: tomcat-service
spec:ports:- port: 80 protocol: TCPtargetPort: 8080selector:app: tomcat
(2)以Deployment方式创建Ingress Nginx Controller Pod
可以通过Service的NodePort或者HostPort方式让外界访问到,这里选择HostPort,比如指定worker01运行该Pod(给Node打标签,然后在指定标签的Node上运行)
对应的mandatory.yaml下载:https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
安装指导:https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md
# 确保nginx-controller运行到w1节点上
kubectl label node w1 name=ingress # 使用HostPort方式运行,需要增加配置
hostNetwork: true
nginx-ingress-controller在w1启动成功
(3) 定义ingress规则
#ingress 访问tomcat.chenpp.com的默认路径,转发到tomcat-service的80端口
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: nginx-ingress
spec:rules:- host: tomcat.chenpp.comhttp:paths:- path: /backend:serviceName: tomcat-serviceservicePort: 80
在本地的hosts(C:\Windows\System32\drivers\etc)文件下添加对应的域名映射:
打开浏览器访问成功
如果以后想要使用Ingress网络,其实只要定义ingress和service和pod即可,前提是要保证nginx ingress controller已经配置好了。
在使用ingress的时候,如果发现当pod和nginx-ingress-controller不在一个节点上无法访问时,可以设置下iptables,设置允许端口转发: iptables -P FORWARD ACCEPT或者如下图让pod和ingress在一个节点上也可以
XXXXspec: containers: - name: tomcatimage: tomcatports: - containerPort: 8080nodeSelector:name: ingress
kubernetes(三)k8s中通信和Service相关推荐
- K8S中deployment和service案例
文章目录 案例要求: 1.案例一 1 创建deployment,在还原到之前版本 2.案例二: 副本数扩容 3.案例三 多端口实例 4.部署service端,在容器外进行访问 案例要求: 1.创建一个 ...
- 学习笔记之-Kubernetes(K8S)介绍,集群环境搭建,Pod详解,Pod控制器详解,Service详解,数据存储,安全认证,DashBoard
笔记来源于观看黑马程序员Kubernetes(K8S)教程 第一章 kubernetes介绍 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署 ...
- @Kubernetes(k8s)
Kubernetes 文章目录 Kubernetes 1. Kubernetes介绍 1.1 应用部署方式演变 1.2 kubernetes简介 1.3 kubernetes组件 1.4 kubern ...
- Kubernetes(k8s)集群搭建,完整无坑,不需要科学上网~
文章目录 写在前面 一.准备三个centos7虚拟机 1.创建Vagrantfile 2.启动三台虚拟机 3.配置centos7支持ssh登录(所有机器) 4.修改 linux 的 yum 源(所有机 ...
- [k8s] 第七章 Service详解
本章节主要介绍kubernetes的流量负载组件:Service和Ingress. Service介绍 在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但 ...
- k8s 各种类型的Service讲解,及Ingress代理
一.Service 在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问. 为 ...
- @kubernetes(k8s)label标签的使用及service代理模式
文章目录 label 一.label的介绍 1.label的概述 2.label的分类 二.label的使用 1.增加标签 2.更改(更新)标签label 3.删除标签lael 4.查看标签label ...
- CentOS7.2中使用Kubernetes(k8s)1.4.6源码搭建k8s容器集群环境
一.相关准备工作 1.1.准备工作 准备至少两台已安装好CentOS7.2操作系统的物理机或者虚拟机(本文配置时使用的是三台KVM虚拟机): 设置hostname命令: hostnamectl set ...
- k8s中hostname, hosts文件, DNS和代理问题, service和pod的访问问题
全栈工程师开发手册 (作者:栾鹏) 架构系列文章 验证一个域名的ip地址可以使用 nslookup xx.xx..xx 在kubernets中不同命名空间的服务相互访问 涉及到的是Pod和Servic ...
最新文章
- SQL Server 2012高可用性组
- 用new关键字对一个String 变量赋值和用literal值直接赋值有什么不同(转)
- git 32位_编译64位的BorderlessGaming
- win10家庭版 安装docker并成功使用
- java list 之详解_java集合(二)List集合之ArrayList详解
- AJAX 框架Jquery的使用方法
- 计算机机房空调设计规范,计算机机房空调设计规范
- 华为获颁中国首个5G基站设备进网许可证:可支持中国规模部署;IBM推出新一代企业平台Z15;Testin最新AI产品发布……...
- 计算机log是代表什么,Log是什么文件?Log文件可以删除吗?
- 拥抱“互联网+”,开拓渠道发展新业态
- java毕业设计选题基于JavaWeb实现疫情环境下校园宿舍|寝室管理系统
- 【20210305期AI简报】基于TensorRT完成NanoDet模型部署、Google AI发布TensorFlow 3D
- [转载]《澄明之境》:投资是一种信仰
- 微信小程序之获取当前位置附近的美食、酒店、娱乐、超市等,并显示标记
- VUI参数语义,色彩原色图表,高宽比标示符含义图表
- 4-3. 统计素数并求和(20)
- cacti安装/配置
- web一些实用的网址(免费API、美图、实用工具)
- spring AOP依赖配置大全
- 利用集群技术实现Web服务器的负载均衡 集群和负载均衡的概念
热门文章
- 递归 递归的案例 递归的案例
- 解决del找不到关键词‘province‘的问题和思想
- JAVA数据类型及字符编码
- return和break的区别
- MAX13085E/MAX485 _中文翻译
- airflow零基础入门
- JavaScript字符串操作方法大全,包含ES6方法 1
- BootStrap 学习笔记(一)
- 23种设计模式的有趣见解 .
- 背包 http://blog.csdn.net/insistgogo/article/details/8579597