容器访问宿主机IP

摘要:

K8S 设置 Pod 使用 host 网络、配置 DNS,Pod访问外部数据库,访问Redis。

docker容器如何(通过IP)访问宿主机端口,访问外部数据库,访问Redis。

一、K8S访问宿主机

添加hostNetwork

如果希望 Pod 可以使用宿主机的网络,可以添加 hostNetwork: true

apiVersion: apps/v1
kind: Deployment
metadata:
  name: blog-admin
  namespace: dev
spec:
  replicas: 2
  selector:
    matchLabels:
      app: oneblog
  template:
    metadata:
      labels:
        app: oneblog
    spec:
      hostNetwork: true
      containers:
      - name: blog-admin
        image: blog-admin:v2.3.4
        imagePullPolicy: Never
        envFrom:
        - configMapRef:
            name: oneblog-configmap
        ports:
        - containerPort: 8085

但这样起来后似乎就用不了 K8S 配置的 Service 的域名

K8S 使用的 DNS 是 Core DNS,可以在这里添加新的域名、IP

kubectl get cm -n kube-system

kubectl edit cm coredns -n kube-system

添加 hosts

apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        hosts {
           192.168.80.128 host-name
           fallthrough
        }
        prometheus :9153
        forward . /etc/resolv.conf {
           max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }
kind: ConfigMap
metadata:
  creationTimestamp: "2022-09-02T07:43:09Z"
  name: coredns
  namespace: kube-system
  resourceVersion: "230"
  uid: 93f3e651-7fb9-45c2-96da-e5e18cf20e99

DNS策略

kubernetes可以在pod级别通过 dnspolicy字段设置DNS策略。目前支持的DNS策略如下:

  • Default: 继承pod所在宿主机的域名解析设置。
  • ClusterFirst: 将优先使用kubernetes环境的dns服务(如coreDNS提供的域名解析服务),将无法解析的域名转发到系统配置的上游DNS服务器。
  • ClusterFirstWithHostNet: 适用与以hostNetwork模式运行的pod。
  • None: 忽略集群的DNS配置,需要手工通过dnsConfig自定义DNS配置。这个选项在1.9版本中开始引入,到1.10版本时升级为Beta,到1.14版本时达到稳定版本。

案例:

apiVersion: v1
kind: pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
 hostNetwork: true								#使用主机网络
 dnsPolicy: ClusterFirstWithHostNet      #设置dns策略

endpoints与service关联方式映射

集群内部访问外部数据库或者中间件一般采用endpoints与service关联方式映射。

apiVersion: v1
kind: Endpoints
metadata:
  name: mysql-svc
  namespace: ns-oneblog
subsets:
  - addresses:
    - ip: 192.168.80.128
    ports:
    - port: 3306
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-svc
  namespace: ns-oneblog
spec:
  clusterIP: 10.98.47.8
  ports:
  - port: 3306
    targetPort: 3306
    protocol: TCP

pod就可以通过clusterIP访问宿主机IP。

二、Docker容器访问宿主机端口

在宿主机安装并启动docker后,会自动创建3个docker network:bridge、host、none。可以用docker network ls命令查看。

[root@master ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
6128146cb126        bridge              bridge              local
c6bf5ff9423a        host                host                local
e0227a1db390        none                null                local

docker network inspect bridgedocker network inspect hostdocker network inspect none命令查看各docker network,会发现只有bridge有网段,假如是

[root@master ~]# docker network inspect bridge
......
{
    "Subnet": "172.17.0.0/16",
    "Gateway": "172.17.0.1"
}
......

在宿主机上执行ifconfig或ip address命令,可以发现有一个docker0网卡,注意观察其网段和docker network inspect bridge的网段是一致的,宿主机在此网段下也分配了一个ip,一般是网段中的第一个ip,假如是172.17.0.1。

bridge模式

1)假如用默认的bridge模式启动容器,即在启动时不指定network参数或者指定了--network bridge

在容器中执行ifconfig命令,可以发现容器的ip也在上面的网段中,假如是172.17.0.2。

在容器中,ping 172.17.0.1,可以ping通。在宿主机中ping 172.17.0.2,可以ping通。

在容器中,可以用172.17.0.1:port的方式访问宿主机的服务。

redis配置

# redis 配置
REDIS_DATABASE_INDEX=0
REDIS_HOST=172.17.0.1
REDIS_PORT=6379
REDIS_PASSWORD=123456
docker run --env-file .env -p 8082:8085/tcp -d blog-admin:v2.3.4

#查看所有
#docker ps -a 

#pensive_knuth 容器名
docker exec -it 'pensive_knuth' bash

在这里插入图片描述

host模式

假如容器用host网络模式启动,即在启动时添加了--netwok host参数,那么容器会和宿主机共享网络,直接telnet 127.0.0.1 8000可以telnet通。

.env

# redis 配置
REDIS_DATABASE_INDEX=0
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=123456
docker run --network host --env-file .env  blog-admin:v2.3.4 sh

docker run --network host --env-file .env -d blog-admin:v2.3.4

docker exec -it '17b1fe96df30' bash

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐