我的应用程序通过主机名与某些服务进行通信。
当我的应用程序作为docker容器运行时,我曾经将主机名添加到hostmachine的/ etc / hosts中,并使用--net=host
运行容器。
现在我在kubernetes集群中运行我的容器。我想知道如何通过yaml
将/ etc / hosts条目添加到pod中。
我正在使用kubernetes v1.5.3。
答案 0 :(得分:4)
从k8s 1.7起,您可以添加hostAliases
。 Example from the docs:
apiVersion: v1
kind: Pod
metadata:
name: hostaliases-pod
spec:
restartPolicy: Never
hostAliases:
- ip: "127.0.0.1"
hostnames:
- "foo.local"
- "bar.local"
- ip: "10.1.2.3"
hostnames:
- "foo.remote"
- "bar.remote"
答案 1 :(得分:1)
主机文件会给你带来麻烦,但如果你真的需要,可以使用配置图。
像这样添加一个配置图
apiVersion: v1
kind: ConfigMap
metadata:
name: my-app-hosts-file-configmap
data:
hosts: |-
192.168.0.1 gateway
127.0.0.1 localhost
然后将其安装在您的吊舱内,如下所示:
volumeMounts:
- name: my-app-hosts-file
mountPath: /etc/
volumes:
- name: my-app-hosts-file
configMap:
name: my-app-hosts-file-configmap
答案 2 :(得分:0)
我自己还没有需要POD中的主机条目,但理论上会说你应该在dockerfile
中为容器添加这些条目,而不是作为一部分Pod yaml的内容 - 即使command
参数可以使用,如this answer中所述。
原因是Pod在逻辑上是一个包裹在容器周围的层,不应该关注容器内运行的应用程序的细节。
答案 3 :(得分:0)
这样做起来也很简单:
kind: Service
apiVersion: v1
metadata:
name: {HOST_NAME}
spec:
ports:
- protocol: TCP
port: {PORT}
targetPort: {PORT}
type: ExternalName
externalName: {EXTERNAL_IP}
现在,您可以直接使用pod中的HOST_NAME
访问外部计算机。
答案 4 :(得分:0)
另一种方法可能是使用Pod 生命周期上的 postStart 钩子,如下所示:
lifecycle: postStart: exec: command: ["/bin/sh", "-c", "echo '192.168.1.10 weblogic-jms1.apizone.io' >> /etc/hosts; echo '192.168.1.20
weblogic-jms2.apizone.io'>> / etc / hosts;回声'192.168.1.30 weblogic-jms3.apizone.io'>> / etc / hosts;回声'192.168.1.40 weblogic-jms4.apizone.io'>> / etc / hosts”]