容器访问宿主机IP
K8S 设置 Pod 使用 host 网络、配置 DNS,Pod访问外部数据库,访问Redis。docker容器如何(通过IP)访问宿主机端口,访问外部数据库,访问Redis。
容器访问宿主机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 bridge
、docker network inspect host
、docker 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
更多推荐
所有评论(0)