hostNetwork实现pod和宿主机的通信

avatar 2024年1月10日18:25:32 评论 813 次浏览

首先,我们需要理解一下`hostNetwork: true` 是 Kubernetes 中一个用于 Pod 配置的选项,它允许 Pod 直接使用主机的网络命名空间。当你将 `hostNetwork` 设置为 `true` 时,Pod 中的容器将共享主机的网络栈,这意味着它们可以使用主机上的网络接口和端口。

使用 `hostNetwork: true` 可能会带来一些注意事项和潜在的安全风险。下面是一些需要考虑的因素:

1. 端口冲突:如果多个 Pod 使用相同的端口,可能会导致冲突。你需要确保在同一主机上的不同 Pod 或容器使用不同的端口。

2. 网络隔离:使用 `hostNetwork: true` 可能会降低 Pod 的网络隔离性。Pod 中的容器可以直接与主机上的其他进程进行通信,这可能增加了安全风险。

3. 资源竞争:如果多个 Pod 共享主机的网络资源,如带宽和连接数限制,可能会导致资源竞争和性能问题。

在使用 `hostNetwork: true` 时,请确保你了解并考虑了这些因素,并根据你的特定需求和安全要求做出适当的决策。

下面我们创建一个nginx看一下是否可以实现通信。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      hostNetwork: true
      # 使用主机网络
      dnsPolicy: ClusterFirstWithHostNet
      # 该设置是使POD使用k8s的dns,dns配置在/etc/resolv.conf文件中
      # 如果不加,pod默认使用所在宿主主机使用的DNS,这样会导致容器
      # 内不能通过service name访问k8s集群中其他POD
      containers:
      - name: nginx
        image: nginx:1.7.9
        #ports:
        #  - name: metrics
        #    hostPort: 80
        #    containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
    -
      name: http
      port: 80
      targetPort: 80
      protocol: TCP
      nodePort: 30080

直接创建,创建后我们你会发现创建的pod所在的宿主机上也会增加一个80端口,我们直接访问宿主机的80端口是可以请求到pod容器中的内容的。

[root@k8s-master ~]# kubectl get pod -o wide
NAME                                      READY   STATUS    RESTARTS        AGE    IP              NODE         NOMINATED NODE   READINESS GATES
nfs-client-provisioner-7b44b7f8fd-v52q5   1/1     Running   8 (5h39m ago)   179d   10.244.58.218   k8s-node02   <none>           <none>
nginx-55c94bc4f-4fsfs                     2/2     Running   0               36m    192.168.6.119   k8s-node42   <none>           <none>
nginx-55c94bc4f-zk7s7                     2/2     Running   0               36m    192.168.6.85    k8s-node17   <none>           <none>
[root@k8s-master ~]# curl http://192.168.6.85
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a rel="external nofollow" target="_blank" href="https://www.wulaoer.org/wp-content/themes/begin/go.php?url=aHR0cDovL25naW54Lm9yZy8=">nginx.org</a>.<br/>
Commercial support is available at
<a rel="external nofollow" target="_blank" href="https://www.wulaoer.org/wp-content/themes/begin/go.php?url=aHR0cDovL25naW54LmNvbS8=">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

如果我们把ingress做hostNetwork: true,直接在ingress里做路由解析岂不是更简单也不需要多什么转发里,直接请求ingress所在的宿主机即可。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: