目录

Kubernetes 绑定Hosts的正确姿势

有的时候我们需要在容器里面绑定hosts,比如我们用logstash需要消费kafka消息,但是kafka监听的地址是hostname,这个时候就需要绑定hosts(规范一点是做解析)
在容器里面绑定hosts常见的方法一种是挂载主机的hosts文件,一种是修改容器的启动CMD,每次启动修改hosts,这两种方法都有个缺点,就是不受kubelet管理了,默认的hosts内容也会被覆盖掉
在k8s环境下有更好的解决方案:那就是让k8s自己来管理

使用hostAliases来绑定hosts

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文件

kubectl exec -n ops logstash-k8s-68d6bf4dff-sxnst -- cat /etc/hosts
# 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文件中

docker run --rm --add-host=example.com:192.168.1.2 ubuntu cat /etc/hosts
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

在docker-compose环境下绑定hosts

在yml文件里

extra_hosts:
 - "test.com:192.168.1.1"
 - "example.com:192.168.1.2"

显示出来的效果/etc/hosts

192.168.1.1  test.com
192.168.1.2  example.com