首页 > 其他分享 >k8s之hostport 在daemonset 上面暴露端口

k8s之hostport 在daemonset 上面暴露端口

时间:2023-06-06 09:22:58浏览次数:55  
标签:DN iptables 10000 -- hostport daemonset HOSTPORT k8s CNI

NodePort 虽然可以给 pod 提供节点级别的 porxy,但是如果对于一个daemonset,采用 NodePort 方式来申明节点端口就不这么直观了,这个时候就可以使用pod的 hostport 来直接在pod的节点上暴露端口。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: tools-test
  name: tools-test
spec:
  selector:
    matchLabels:
      app: tools-test
  template:
    metadata:
      labels:
        app: tools-test
    spec:
      containers:
      - command:
        - python
        - -m
        - http.server
        ports:
        - containerPort: 8000
          # When you bind a Pod to a hostPort, it limits the number of places the Pod can be scheduled, because each <hostIP, hostPort, protocol> combination must be unique
          hostPort: 10000
          name: http
          protocol: TCP
        image: python:3.9.5
        imagePullPolicy: IfNotPresent
        name: tools-jupyter
        resources: {}

那 hostport 的实现原理是怎么样的呢?是不是也是开了一个程序监听?通过到节点执行 netstat -anp| grep 10000,发现并没有启动一个监听程序,那说明很可能走的是iptables,我们看看 iptables 的 nat 表:

$ iptables -S -t nat | grep CNI-DN-9c969028fa2789c46c080
# Warning: iptables-legacy tables present, use iptables-legacy to see them
root@kubeflow-worker:/# iptables -S -t nat                                    

-N CNI-HOSTPORT-SETMARK
-N CNI-HOSTPORT-MASQ
-N CNI-HOSTPORT-DNAT
-N CNI-DN-2a6b9967ebd3cd7a5eeb3

-A PREROUTING -m addrtype --dst-type LOCAL -j CNI-HOSTPORT-DNAT
-A POSTROUTING -m comment --comment "CNI portfwd requiring masquerade" -j CNI-HOSTPORT-MASQ
-A OUTPUT -m addrtype --dst-type LOCAL -j CNI-HOSTPORT-DNAT

-A CNI-HOSTPORT-SETMARK -m comment --comment "CNI portfwd masquerade mark" -j MARK --set-xmark 0x2000/0x2000
-A CNI-HOSTPORT-MASQ -m mark --mark 0x2000/0x2000 -j MASQUERADE
-A CNI-HOSTPORT-DNAT -p 6 -m comment --comment "dnat name: \"kindnet\" id: \"07dbe45d8e31690c76141e5e16132b086f6a2d5b63216584009b990a7c08552c\"" -m multiport --dports 10000 -j CNI-DN-2a6b9967ebd3cd7a5eeb3
-A CNI-DN-2a6b9967ebd3cd7a5eeb3 -s 10.244.1.155/32 -p 6 -m tcp --dport 10000 -j CNI-HOSTPORT-SETMARK
-A CNI-DN-2a6b9967ebd3cd7a5eeb3 -s 127.0.0.1/32 -p 6 -m tcp --dport 10000 -j CNI-HOSTPORT-SETMARK
-A CNI-DN-2a6b9967ebd3cd7a5eeb3 -p 6 -m tcp --dport 10000 -j DNAT --to-destination 10.244.1.155:8000

iptables 用法参考:
这里目标 pod 的 ip 是 10.244.1.155,通过 iptables 可以看到,通过CNI-HOSTPORT-DNAT匹配目标端口 10000, jump 到 CNI-DN-2a6b9967ebd3cd7a5eeb3 chain,CNI-DN-2a6b9967ebd3cd7a5eeb3 对于源IP不等于10.244.1.155/32和127.0.0.1/32 的流量转到 10.244.1.155:8000,这个地址就是目标 pod 对应的 containerPort。

注意:按照官方文档说的,除非绝对必要,否则不要为 Pod 指定 hostPort。 将 Pod 绑定到hostPort时,它会限制 Pod 可以调度

标签:DN,iptables,10000,--,hostport,daemonset,HOSTPORT,k8s,CNI
From: https://www.cnblogs.com/gaoyuechen/p/17459596.html

相关文章

  • K8S核心概念以及部署
    架构以及核心组件介绍:Master -APIServer(接口中心)j接口服务,基于rest风格开放的k8s接口服务 -kubeControllerManager:管理各个类型的控制器,针对k8s中的各种资源进行管理 -nodecontroller节点控制器:负责在节点出现故障时进行通知和响应 -jobcontroller任务控制器......
  • 云原生第六周--k8s组件详解(下)
    一Velero结合minio实现kubernetesetcd数据备份与恢复Velero简介:Velero是vmware开源的一个云原生的灾难恢复和迁移工具,它本身也是开源的,采用Go语言编写,可以安全的备份、恢复和迁移Kubernetes集群资源数据Velero支持标准的K8S集群,既可以是私有云平台也可以是公有云,除了灾备......
  • 安装k8s 时报错No package kubelet-1.20.9 available.
    报错信息:[root@vm~]#sudoyuminstall-ykubelet-1.20.9kubeadm-1.20.9kubectl-1.20.9--disableexcludes=kubernetesLoadedplugins:fastestmirrorLoadingmirrorspeedsfromcachedhostfileepel:mirror-icn.yuki.net.ukNopackagekubelet-1.20.9available.No......
  • k8s--etcd 基本操作
    介绍Etcd是CoreOS基于Raft开发的分布式key-value存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)。在分布式系统中,如何管理节点间的状态一直是一个难题,etcd像是专门为集群环境的服务发现和注册而设计,它提供了数据TTL失效、数据改变监视、多值、目录监......
  • 【Azure K8S】演示修复因AKS密钥过期而导致创建服务不成功的问题(The provided client
    问题描述在AzureKubernetes服务中,创建一个InternalLoadBalancer服务,使用以下yaml内容:internallb.yamlapiVersion:v1kind:Servicemetadata:name:ilb-myappannotations:service.beta.kubernetes.io/azure-load-balancer-internal:"true"spec:type:LoadBala......
  • k8s镜像使用
    docker搜索镜像dockersearchbusyboxdocker拉取到本地dockerpullbusyboxdocker本地保存dockersave-obusybox.tarbusybox:latestctr工具导入k8s命名空间ctr-nk8s.ioimageimportbusybox.tarcrictl查看导入结果crictlimagelist......
  • K8S in Action 读后感(概念简介)
    一、K8S的用武之地今天,大型单体应用正被逐渐拆分成小的、可独立运行的组件,我们称之为微服务。微服务彼此之间解耦,所以它们可以被独立开发、部署、升级、伸缩。这使得我们可以对每一个微服务实现快速迭代,并且迭代的速度可以和市场需求变化的速度保持一致。但是,随着部署组件的增多......
  • k8s安装过程遇到的问题处理
    一、安装过程,参照 尚硅谷的安装流程:https://www.yuque.com/leifengyang/oncloud/ghnb83 我是一个master节点和2个从节点 1.从节点报错:Theconnectiontotheserverlocalhost:8080wasrefused-didyouspecifytherighthostorport? 解决方案参考: https://www.cnbl......
  • windows访问k8s
    windows访问ekspods安装AWSCLI网址为https://awscli.amazonaws.com/AWSCLIV2.msi。查看aws版本。aws--version配置AWSCLI凭证eksctl和AWSCLI均要求您在环境中配置AWS凭证。awsconfigure命令是设置安装以供一般使用的最快方法。$awsconfigureAWSAccessKeyID[N......
  • k8s集群外的linux加入prometheus监控
    client配置:准备一台linux,不在k8s集群中,安装node_exporterwgethttps://github.com/prometheus/node_exporter/releases/download/v1.6.0/node_exporter-1.6.0.linux-amd64.tar.gztar-xvfnode_exporter-1.6.0.linux-amd64.tar.gzmvnode_exporter-1.6.0.linux-amd64/usr/lo......