注意看spec.hostNetwork = true这个是干啥的?

apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: nginx
spec:template:metadata:labels:app: nginxspec:hostNetwork: truednsPolicy: ClusterFirstWithHostNetcontainers:- name: nginximage: nginxports:- containerPort: 80

这玩意就可以让Pod中容器内的进程,对接暴露在宿主机所在物理网络上,换句话说,就好像容器内的进程是直接运行在宿主机上,比如这里是一个nginx,那完全可以直接在宿主机上启动一个nginx。

所以一旦指定了spec.hostNetwork:true,那么宿主机所在局域网内的其他机器,就可以直接访问到这个nginx容器了,上面的containerPort: 80,就会在宿主机上占用80端口,我怎么感觉这就是让nginx就是直接裸奔跑在宿主机上了嘛,只不过nginx被容器包了一层,然后又被Pod包了一层,这样可以受k8s的监控和调度(比如容器挂了,k8s会自动把它拉起来,或者干脆调度到其它物理机上)

spec.dnsPolicy: ClusterFirstWithHostNet,这也非常重要,指定Pod的DNS策略,其实就是会影响到Pod容器内的/etc/resolv.conf文件,设定为ClusterFirstWithHostNet,意思是使用k8s集群范围内的DNS服务,这样的话,pod就可以通过ServiceName访问集群内的其他Pod了。

比如你的K8S集群有N台物理主机组成,然后呢上面部署了一些Service,比如Service1,Service2,Service3......等等,Service1由10个Pod组成,这10个Pod是通过一个Deployment资源描述yaml文件创建的,创建的时候如果不指定spec.dnsPolicy: ClusterFirstWithHostNet,那么这10个Pod就无法通过Service2这个服务名称访问到Service2提供的服务,比如RPC调用。

本质上指定spec.dnsPolicy: ClusterFirstWithHostNet,核心是修改容器/etc/resolv.conf文件中的dns服务器的IP地址,如果设定为k8s集群内dns服务,因为每次创建Service的时候,都会去DNS服务上注册,所以如果指定k8s集群内的dns服务,那么必然是可以通过Servicename互相访问的。

本质上,Kubernetes的hostNetwork,hostPort,NodePort,LoadBalancer和Ingress功能都可以对外暴露服务,让集群外的客户端可以访问运行在k8s集群内的Pod,Pod中的所有容器就直接暴露在宿主机的网络环境中,这时候,Pod的PodIP就是其所在Node的IP,但是我们一般不这样干呀,因为让Pod的IP设置为所在Node的IP,就失去了网络虚拟化所带来的好处呀,而且多租户的情况下也是操蛋的呀,这种就不适合多租户了。

而且如果是这种模式,就没法在1个宿主机上启动同一个Deployment中的2个Pod副本了,因为这样会导致端口冲突,比如上面的nginx,如果直接通过spec.hostNetwork:true,那么2个进程都要占用80端口,就不好弄了。

这个spec.hostNetwork:true,所谓的主机网络模式,不是让我们写的容器应用程序可以从群集外部访问的好方法,不建议使用。

创建Deployment时指定hostnetwork是干啥的?相关推荐

  1. MySQL创建数据库时指定编码和用户授权

    为什么80%的码农都做不了架构师?>>>    MySQL创建数据库时指定编码和用户授权 转载于:https://my.oschina.net/michao/blog/2989144

  2. mysql创建数据库指定utf 8_MySQL创建数据库时指定编码utf8mb4和添加用户

    MySQL创建数据库时指定编码utf8mb4和添加用户 CREATE DATABASE `wordpress` DEFAULT CHARACTER SET utf8 COLLATE utf8_gene ...

  3. php指定编码创建,MYSQL创建数据库时指定编码

    mysql 创建 数据库时指定编码很重要,很多开发者都使用了默认编码,但是我使用的经验来看,制定数据库的编码可以很大程度上避免倒入导出带来的乱码问题. 我们遵循的标准是,数据库,表,字段和页面或文本的 ...

  4. docker 创建容器时指定容器ip

    docker 创建容器时指定容器ip Docker创建容器时默认采用bridge网络,自行分配ip,不允许自己指定. 在实际部署中,我们需要指定容器ip,不允许其自行分配ip,尤其是搭建集群时,固定i ...

  5. Docker创建容器时指定IP

    Docker创建容器时指定IP --net extnetwork --ip 172.10.0.2

  6. 创建索引时指定同义词

    1.创建索引时指定同义词 下载elasticsearch-7.10.0版本,并解压:https://www.elastic.co/cn/downloads/past-releases/elastics ...

  7. MySQL如何创建表时指定约束

    一.MySQL中的约束类型 非空约束(not null): 唯一性约束(unique): 主键约束(primary key)PK: 外键约束(foreign key)FK: (检查约束(目前 ...

  8. Ubuntu16.04创建用户时指定工作目录

    Linux下创建用户时会用到useradd和adduser这两个命令,他们的区别如下: 1.使用useradd时,如果后面不添加任何参数选项,例如:#sudo useradd test创建出来的用户将 ...

  9. 通过jira开放接口创建issue时指定链接的问题

    {"fields": {"summary": "这是一个很长很长的summary","issuetype": {&quo ...

最新文章

  1. 0127-python内置函数(一).abb
  2. Node.js基本讲解
  3. jzoj3889-序列问题【dp,高精度】
  4. codeforces 158B-C语言解题报告
  5. 输入流与输出流的区别
  6. 等级保护2.0常见问题集
  7. lammps教程:NEMD方法计算热导率公式详解
  8. 【java web学习小结】JSP的response对象的动态响应实例
  9. 计算机睡眠和休眠哪个好,休眠和睡眠哪个好?电脑休眠和睡眠有什么区别?
  10. Windows调试技巧工具
  11. 监控摄像头进行网页直播和微信直播的技术方案
  12. 五分钟入门 Dingo API 1
  13. Android开发 更改返回按钮的图标
  14. 小鸡腿U T7 NEERC2011
  15. 2018秋季阿里实习生面试总结
  16. 23王道数据结构代码题全解(二)
  17. Andro Studio 中JNI学习使用记录
  18. “年轻气盛少年时,晚年迟暮悔当初” 致 初入 Android 开发时的我
  19. matlab数据处理,有表头文字字符输出 采用元胞数组处理数据
  20. 模型驱动的开发解决方案支撑工具的总结

热门文章

  1. Concurrent 包结构介绍
  2. 基于javaweb的旅游管理系统(java+jsp+html5+bootstrap+servlet+mysql)
  3. FlatBuffer
  4. 国内最大个人信息泄露案,54亿条数据泄露
  5. 数学在机器学习中的重要性
  6. 中国原盐产业发展现状分析,原盐主要应用于化工行业「图」
  7. 全国英语计算机等级考试报名费,通知 | 全国大学生英语竞赛计算机等级考试报名...
  8. 视频拼接 python_LeetCode-python 1024.视频拼接
  9. 如何:创建 C# 控制台应用程序
  10. gke下载_我们如何在GKE上升级Kubernetes