目录贴:Kubernetes学习系列

  在实际生产环境中,有些容器内应用(比如编码器)需要用到物理层面的网络资源(比如组播流)。这就要求Kubernetes中的该Pod以HOST模式来启动。以下实验了Kubernetes-HOST网络模式,并给出了一些运维建议。

1、Pod的网络

  每个Pod都会默认启动一个pod-infrastructure(或pause)的容器,作为共享网络的基准容器。其他业务容器在启动之后,会将自己的网络模式指定为“"NetworkMode": "container:pause_containerID”。这样就能做到Pod中的所有容器网络都是共享的,一个Pod中的所有容器中的网络是一致的,它们能够通过本地地址(localhost)访问其他用户容器的端口。在Kubernetes的网络模型中,每一个Pod都拥有一个扁平化共享网络命名空间的IP,称为PodIP。通过PodIP,Pod就能够跨网络与其他物理机和容器进行通信。

  也可以设置Pod为Host网络模式,即直接使用宿主机的网络,不进行网络虚拟化隔离。这样一来,Pod中的所有容器就直接暴露在宿主机的网络环境中,这时候,Pod的PodIP就是其所在Node的IP。从原理上来说,当设定Pod的网络为Host时,是设定了Pod中pod-infrastructure(或pause)容器的网络为Host,Pod内部其他容器的网络指向该容器。如下所示(65070affecfc61为业务容器,f60a2ee415e3为pod-infrastructure容器):

[root@k8s-node- ~]# docker inspect 65070affecfc6131b2385e5c40d4f21f73c343cc15e7983cdce8594e38ed020f | grep NetworkMode
"NetworkMode": "container:f60a2ee415e301491f30ffc12855880273da6eded2526a5319eed72a92caef7f",
[root@k8s-node- ~]# docker inspect f60a2ee415e301491f30ffc12855880273da6eded2526a5319eed72a92caef7f | grep NetworkMode
"NetworkMode": "host",
[root@k8s-node- ~]#

2、启动示例

[root@k8s-master yaml]# cat test-host.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: test-host
spec:
replicas:
template:
metadata:
labels:
name: test-host
spec:
containers:
- name: test-host
image: registry:/back_demon:1.0
command:
- /jboss/jboss-eap-6.1/bin/standalone.sh
ports:
- containerPort:
hostNetwork: true

3、运维经验

3.1 副本数量

  对于同Deployment下的Host模式启动的Pod,每个node上只能启动一个。也就是说,Host模式的Pod启动副本数不可以多于“目标node”的数量,“目标node”指的是在启动Pod时选定的node,若未选定(没有指定nodeSelector),“目标node”的数量就是集群中全部的可用的node的数量。当副本数大于“目标node”的数量时,多出来的Pod会一直处于Pending状态,因为schedule已经找不到可以调度的node了。

  以下示例中,集群只有4个node,当设置副本数量为5时,最后一个Pod状态会一直处于Pending状态。

[root@k8s-master yaml]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
test-host--11wbl / Running 17s 10.0.251.153 k8s-node-
test-host--2k35s / Running 17s 10.0.251.146 k8s-node-
test-host--lnlpy / Running 17s 10.0.251.222 k8s-node-
test-host--t6izr / Running 17s 10.0.251.155 k8s-node-
test-host--tf4mc / Pending 17s <none>

3.2 PodIP

  Pod的PodIP就是其所在Node的IP,具体如下:

[root@k8s-master yaml]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
test-host--11wbl / Running 2h 10.0.251.153 k8s-node-
test-host--2k35s / Running 2h 10.0.251.146 k8s-node-
test-host--lnlpy / Running 2h 10.0.251.222 k8s-node-
test-host--t6izr / Running 2h 10.0.251.155 k8s-node-

虽然PodIP是NodeIP,但也可以通过service的方式加到Kubernetes的虚拟化网络中被使用。具体如下:

[root@k8s-master yaml]# cat demon1/frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
name: frontend-service
labels:
name: frontend-service
spec:
type: NodePort
ports:
- port:
nodePort:
selector:
name: frontend-service
[root@k8s-master yaml]# kubectl create -f test-host-svc.yaml
service "test-host" created
[root@k8s-master yaml]# kubectl describe svc test-host
Name: test-host
Namespace: default
Labels: name=test-host
Selector: name=test-host
Type: NodePort
IP: 10.254.127.198
Port: <unset> /TCP
NodePort: <unset> /TCP
Endpoints: 10.0.251.146:,10.0.251.153:,10.0.251.155: + more...
Session Affinity: None
No events.

  创建成功之后,集群内部的应用可通过虚拟网络中的clusterIP:10.254.127.198:8080来访问后端服务,集群外部的应用(如浏览器)可以通过nodeIP+NodePort来访问后端服务。

3.3 端口占用

3.3.1 其他Pod端口占用

  若同集群中,用host模式启动的deployment(或RC)有多个,若这些 deployment中定义的containerPort有相同的值,那么,Kubernetes会校验出端口资源的冲突。示例如下:

[root@k8s-master yaml]# cat test-host.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: test-host
spec:
replicas:
template:
metadata:
labels:
name: test-host
spec:
containers:
- name: test-host
image: registry:/back_demon:1.0
command:
- /jboss/jboss-eap-6.1/bin/standalone.sh
ports:
- containerPort:
hostNetwork: true
[root@k8s-master yaml]# cat test-host1.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: test-host1
spec:
replicas:
template:
metadata:
labels:
name: test-host1
spec:
containers:
- name: test-host1
image: registry:/back_demon:1.0
command:
- /jboss/jboss-eap-6.1/bin/standalone.sh
ports:
- containerPort:
hostNetwork: true
[root@k8s-master yaml]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
test-host--9oo55 / Running 19m 10.0.251.155 k8s-node-
test-host--uc2v2 / Running 19m 10.0.251.146 k8s-node-
test-host--vxezq / Running 19m 10.0.251.153 k8s-node-
test-host1--q8e6o / Pending 19m <none>
test-host1--zmk5l / Running 19m 10.0.251.222 k8s-node-

  实验集群下,可用的node数量只有4个,而两个deployment——test-host、test-host1对外暴露额端口是相同的——8080。两个deployment一共要启动的副本数量为5,这时,最后启动的那个Pod就会一直处于Pending状态。

3.3.2 宿主机端口占用

  当Host模式的Deployment(或RC)声明一个端口时,比如8080,若宿主机上有非Kubernetes控制的程序占用了8080这个端口,这时Kubernetes是无法校验到的。也就是说,schedule仅仅会记录Kubernetes集群中的端口占用信息,并在调度时做相关的校验工作。但schedule不会校验宿主机上真正的端口占用信息。这其实是非常合理的,集群中的node通常成千上万,被当做一台台单纯的提供计算能力的资源,计算什么由中心节点来决定。没有必要,也没有场景需要在node上额外的跑其他程序。

在使用Host模式网络时,需注意的是,每个应用(部署成一个deployment)都要有自己固定的、和其他应用不同的端口,比如编码器永远固定成9525、源服务器永远固定成9537等。且宿主机在做了Kubernetes集群中的node之后,尽量不对非本集群应用提供服务。

3.4 镜像制作要求

  必须用Host模式启动的Pod,在镜像制作时要求端口唯一、且单一。

  一般Pod中只会存在一个业务主镜像,该业务镜像在制作时,应该只放一种应用,这个应用只对外开放一个接口。例如,编码器主控节点这个应用,主要有两方面的功能:1)接收组播流,并控制处理节点,占用端口9525;2)可视化操控界面,占用端口8080。其中接收组播流这块,需要使用Host模式的网络。拆分建议为两个业务镜像,部署时部署两个deployment。即接收组播流拆成一个镜像,固定端口9525,使用Host模式启动;可视化界面拆成一个镜像,用Kubernetes默认网络模式启动。

Kubernetes-Host网络模式应用的更多相关文章

  1. Docker网络模式介绍

    一.概述 docker的网络驱动有很多种方式,按照docker官网给出的网络解决方案就有6种,分别是:bridge.host.overlay.macvlan.none.Network plugins, ...

  2. Docker系列04—Docker的网络模式详解

    本文收录在容器技术学习系列文章总目录 1.Docker的四种网络模式 (1)docker四种网络模式如下: Bridge contauner   桥接式网络模式 Host(open) containe ...

  3. Docker 网络模式详解及容器间网络通信

    当项目大规模使用 Docker 时,容器通信的问题也就产生了.要解决容器通信问题,必须先了解很多关于网络的知识.Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜 ...

  4. Docker系列02—Docker 网络模式

    一.Docker的四种网络模式 1.Docker 的四种网络模式: Bridge container 桥接式网络模式 Host(open) container 开放式网络模式 Container(jo ...

  5. Docker Kubernetes Service 网络服务代理模式详解

    Docker Kubernetes  Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注 ...

  6. Docker bridge、host、container other、overlay 网络模式

    docker run创建Docker容器时,可以用--net 选项指定容器的网络模式,Docker有以下5种网络模式: bridge模式:使用–net =bridge指定,默认设置: host模式:使 ...

  7. Docker网络模式

    [编者的话] 本文是<Docker网络及服务发现>一书的一个章节,介绍了搭建Docker单主机网络的基础内容.关于Docker网络的更多内容,包括多主机的网络,请参考该书的其他章节. @C ...

  8. [转帖]Kubernetes CNI网络最强对比:Flannel、Calico、Canal和Weave

    Kubernetes CNI网络最强对比:Flannel.Calico.Canal和Weave https://blog.csdn.net/RancherLabs/article/details/88 ...

  9. Docker学习第四天(Docker四种网络模式)

    Docker四种网络模式 实现原理 Docker使用Linux桥接(参考<Linux虚拟网络技术>),在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根 ...

随机推荐

  1. laravel5.8笔记十:Redis操作

    > 位置:\vendor\laravel\framework\src\Illuminate\Redis\Connections\PhpRedisConnection.php > 参考:ht ...

  2. mysql关联表修改语句

    UPDATE tb_irms_trans_pip2optseg a,`tb_irms_trans_pip` b SET a.district=b.district WHERE a.prop_id=b. ...

  3. Spark RDD的默认分区数:(spark 2.1.0)

    本文基于Spark 2.1.0版本 新手首先要明白几个配置: spark.default.parallelism:(默认的并发数) 如果配置文件spark-default.conf中没有显示的配置,则 ...

  4. python和计算机的交互

    网易邮箱都2万+满了,但是只有手动删除.实在太多,于是想使用python脚本实现,python有很多现成的库可以使用,这就是python的好处,而不是c++或者java,python的库说明网站:ht ...

  5. artTemplate的使用案列

    (2) https://github.com/aui/art-template/wiki/syntax:simple

  6. poj 1873

    哇实验室里正在吵架,爽死了! wf水题.显然二进制枚举,注意剪枝,val>ans的时候剪一下,不然会tle.然后就没惹. 我老人家一开始写了个 感觉非常垃圾,wa了一发又t了一发. 感觉自己可以 ...

  7. js 表达式与语句

    引子:表达式和语句很基础,但是有时会犯错,比如: function(){}//报错 (function(){})//不报错 function f(x){ return x + 1 }()//报错 fu ...

  8. Strassen 矩阵相乘算法(转)

    偶尔在算法课本上面看到矩阵相乘的算法,联想到自己曾经在蓝桥杯系统上曾经做过一道矩阵相乘的题目,当时用的是普通的矩阵相乘的方法,效率极低,勉强通过编译.所以决定研究一下Strassen矩阵相乘算法,由于 ...

  9. 清理孤儿文件 clearing up outdated orphans

    pacman -Rns $(pacman -Qtdq) It lists all packages installed as dependencies but no longer required b ...

  10. Python学习之旅(三十二)

    Python基础知识(31):图形界面(Ⅱ) Python内置了turtle库,可以在计算机上绘图 运动控制: 1.画笔定位到坐标(x,y):turtle.goto(x,y) 2.向正方向运动 dis ...