有的时候我们需要在容器里面绑定hosts,比如我们用logstash需要消费kafka消息,但是kafka监听的地址是hostname,这个时候就需要绑定hosts(规范一点是做解析)
在容器里面绑定hosts常见的方法一种是挂载主机的hosts文件,一种是修改容器的启动CMD,每次启动修改hosts,这两种方法都有个缺点,就是不受kubelet管理了,默认的hosts内容也会被覆盖掉
在k8s环境下有更好的解决方案:那就是让k8s自己来管理
使用hostAliases来绑定hosts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| apiVersion: apps/v1 kind: Deployment metadata: name: logstash-k8s namespace: ops spec: replicas: 1 selector: matchLabels: app: logstash-k8s template: metadata: labels: app: logstash-k8s spec: hostAliases: - ip: "192.168.13.127" hostnames: - "elk" - ip: "192.168.13.128" hostnames: - "elk2" - ip: "192.168.13.129" hostnames: - "elk3"
|
进入容器查看hosts文件
1
| kubectl exec -n ops logstash-k8s-68d6bf4dff-sxnst -- cat /etc/hosts
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| # Kubernetes-managed hosts file. 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet fe00::0 ip6-mcastprefix fe00::1 ip6-allnodes fe00::2 ip6-allrouters 172.20.16.108 logstash-k8s-68d6bf4dff-sxnst
# Entries added by HostAliases. 192.168.13.127 elk 192.168.13.128 elk2 192.168.13.129 elk3
|
这个hosts包括两个部分,一部分是容器自带的hosts,另一部分是我们自己添加的
在docker下绑定hosts
运行时候修改
docker可以通过 –add-host 参数来添加hosts信息到容器的/etc/hosts文件中
1
| docker run --rm --add-host=example.com:192.168.1.2 ubuntu cat /etc/hosts
|
1 2 3 4 5 6 7 8
| 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 192.168.1.2 example.com 172.17.0.2 eece89ee8fc7
|
构建时修改
Dockerfile中,可以在CMD命令下进行修改,在RUN里面修改会提示文件只读无法修改。
1 2 3 4
| FROM centos:7 CMD echo "111" >> /etc/hosts && \ echo "Hosts: " && \ cat /etc/hosts
|
在docker-compose环境下绑定hosts
在yml文件里
1 2 3
| extra_hosts: - "test.com:192.168.1.1" - "example.com:192.168.1.2"
|
显示出来的效果/etc/hosts
1 2
| 192.168.1.1 test.com 192.168.1.2 example.com
|