Kubernetes数据流分析
以一个网页应用的访问为例
首先在部署阶段,需要启动两个容器WebApp容器和Mysql容器。
整个部署过程:
- 启动Mysql,mysql-rc.yaml在之后给出,创建对应的Service
- 启动myweb, myweb-rc.yaml在之后给出,创建对应的Service,并通过NodePort方式暴露服务
- 通过浏览器访问网页
此时,如果从外部访问服务,则流程如图:
有三种访问方式:
过程原理
从Service到Pod
k8s在创建服务的时候会为服务分配一个虚拟的IP地址,然后客户端通过访问这个虚拟的IP地址来访问服务,而服务则负责将请求转发到后端的Pod上。
而真正起到作用的就是kube-proxy,每个Node都会运行一个kube-proxy进程。对每个TCP类型的Service,kube-proxy都会在本地Node上建立一个SocketServer来负责接收请求,然后转发都后端某个Pod的端口上,这个过程默认采用Round Robin负载均衡算法。
此外,Service的ClusterIP与NodePort等概念是kube-proxy服务通过iptables的NAT转换实现的,kube-proxy在运行过程中动态创建与Service相关的Iptables规则
容器与容器间通信
同一个Pod内共享同一个网络命名空间,可以直接使用Linux本地IPC进行通信
Pod之间通信
同一个Node上通信
Pod1和Pod2都是通过Veth连接在同一个docker0网桥上的,它们的IP地址IP1,IP2都是从docker0的网段上动态获取的,它们和网桥本身的IP3是同一个网段的。
另外,在Pod1, Pod2的Linux协议栈上,默认路由都是docker0的地址,也就是说所有非本地地址的网络数据,都会被默认发送到docker0网桥上,由docker0网桥直接中专
不同Node上的Pod通信
从NodePort到ServicePort
具体文件
mysql-rc.yaml文件:
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql
spec:
replicas:1
selector:
app:mysql
template:
metadata:
labels:
app:mysql
spec:
containers:
- name:mysql
image:mysql
ports:
- containerPort:3306
env:
- name: MYSQL_ROOT_PASSWORD
value:"123456"
Mysql Service创建:
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
-port: 3306
selector:
app: mysql
myweb-rc.yaml文件:
apiVersion: v1
kind: ReplicationController
metadata:
name: myweb
spec:
replicas:1
selector:
app:myweb
template:
metadata:
labels:
app:myweb
spec:
containers:
- name: myweb
image: kubeguide/tomcat-app:v1
ports:
- containerPort:8080
Myweb Service创建:
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
-port: 8080
nodePort: 30001
selector:
app: mysql
上一篇: 10个有趣的Linux命令【图】
下一篇: 哭的图片,哭泣的图片,女人哭图片。