前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes 的hostPort 与 hostNetwork使用

Kubernetes 的hostPort 与 hostNetwork使用

作者头像
chen1900s
发布2022-05-20 16:36:14
7.3K0
发布2022-05-20 16:36:14
举报

hostPort示例

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: nginx-hostport
    qcloud-app: nginx-hostport
  name: nginx-hostport
  namespace: cjweichen
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: nginx-hostport
      qcloud-app: nginx-hostport
  template:
    metadata:
      labels:
        k8s-app: nginx-hostport
        qcloud-app: nginx-hostport
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
        ports:
        - containerPort: 80
          hostPort: 8000
          name: http
          protocol: TCP
        - containerPort: 443
          hostPort: 44300
          name: https
          protocol: TCP

访问测试 如下,通过PODIP+containerPort 和 node节点IP+hostPort 都可以正常访问到

hostPort 与 hostNetwork 异同

相同点

hostPort 与 hostNetwork 本质上都是暴露 pod 所在节点 IP 给终端用户,因为 pod 生命周期并不固定,随时都有可能异常重建,故 IP 的不确定最终导致用户使用上的不方便;此外宿主机端口占用也导致不能在同一台机子上有多个程序使用同一端口。因此一般情况下,不建议使用 hostPort 方式。

不同点

使用 hostNetwork,pod 实际上用的是 pod 宿主机的网络地址空间:即 pod IP 是宿主机 IP,而非 cni 分配的 pod IP,端口是宿主机网络监听接口。

使用 hostPort,pod IP 并非宿主机 IP,而是 cni 分配的 pod IP,跟其他普通的 pod 使用一样的 ip 分配方式,端口并非宿主机网络监听端口,只是使用了 DNAT 机制将 hostPort 指定的端口映射到了容器的端口之上(可以通过 iptables 命令进行查看)。外部访问此 pod 时,仍然使用宿主机和 hostPort 方式。pod ip 跟宿主机 ip 截图如

有关端口 DNAT 通过 iptables 命令进行查看,如下截图所示:

由上图可知,pod 所在宿主机上的 iptables nat 表流向如下:

1 当客户端发起 pod 访问时,比如 curl http://pod_in_host:hostPort

2 网络包会流经 pod 宿主机的 prerouting chain,会命中 CNI-HOSTPORT-DNAT 链

3 网络包会流经 CNI-HOSTPORT_DNAT 链中的第 3 条规则,即 DNAT 目标,此时会将 9998 端口访问的流量路由到 80 端口去

基于此,当客户端访问 pod 所在主机的 8000 端口时,流量会自动被路由到 IP 为 10.55.3.5(也就是 pod ip)的 80 端口上。

当 pod 同时使用了 hostNetwork 和 hostPort,那么 hostNetwork 将会直接使用宿主机网络命名空间,hostPort 其实就形同虚设了。可以认为 hostNetwork 选项优先级要高于 hostPort。

hostNetwork示例

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-hostnetwork
  namespace: cjweichen
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: nginx-hostnetwork
      qcloud-app: nginx-hostnetwork
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        k8s-app: nginx-hostnetwork
        qcloud-app: nginx-hostnetwork
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
        ports:
        - containerPort: 80
          hostPort: 80
          name: http
          protocol: TCP
        - containerPort: 443
          hostPort: 443
          name: https
          protocol: TCP
        resources: {}
      dnsPolicy: ClusterFirst
      hostNetwork: true
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • hostPort示例
  • hostPort 与 hostNetwork 异同
    • 相同点
      • 不同点
      • hostNetwork示例
      相关产品与服务
      容器镜像服务
      容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档