工作中遇到需要在容器中配置hosts文件。直接写在镜像里是没有用的,因为容器启动时会覆盖镜像中的hosts文件 。所以使用此方法来做配置。下面引用的官方文档的说明。

当 DNS 配置以及其它选项不合理的时候,通过向 Pod 的 /etc/hosts 文件中添加条目,可以在 Pod 级别覆盖对主机名的解析。

建议通过使用 HostAliases 来进行修改,因为该文件由 Kubelet 管理,并且可以在 Pod 创建/重启过程中被重写

8WRhge.jpg

默认的hosts文件内容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[root@k8s-77-40 k8s]# kubectl exec -it nginx-test-5f8d8ff4bf-2d8fs /bin/bash
root@nginx-test-5f8d8ff4bf-2d8fs:/# 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.21.1.9	nginx-test-5f8d8ff4bf-2d8fs

通过HostAliases增加额外的解析

  • 修改相关yaml, 其中spec.template.spec.hostAliases为添加内容。增加了两个地址解析
 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
26
27
28
29
30
31
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
     # hostname: test
      hostAliases:
      - ip: "172.16.2.57"
        hostnames:
        - "saps4dev.test.com"
      - ip: "172.16.7.176"
        hostnames:
        - "saps4prd.test.com"
      terminationGracePeriodSeconds: 3 #k8s将会给应用发送SIGTERM信号,可以用来正确、优雅地关闭应用,默认为30秒
      containers:
      - name: nginx
        image: nginx:1.17.6
        imagePullPolicy: Always
        ports:
          - containerPort: 80
  • 更新
1
[root@k8s-77-40 k8s]# kubectl apply -f nginx.yaml
  • 再次查看对应的hosts文件
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[root@k8s-77-40 k8s]# kubectl exec -it nginx-test-6bcb84f7c5-9zwx5 /bin/bash
root@nginx-test-6bcb84f7c5-9zwx5:/# 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.21.2.11	nginx-test-6bcb84f7c5-9zwx5

# Entries added by HostAliases.
172.16.2.57	saps4dev.test.com
172.16.7.176	saps4prd.test.com

至此 hosts修改成功