2016-12-24 197 views
2

我有一個kubernetes中的DNS映射問題。請看詳細信息,將主機映射添加到Kubernetes中的/ etc/hosts中

我們有一些可以從互聯網上訪問的服務器。全球DNS將這些服務器的域名轉換爲公共互聯網IP。 出於安全考慮,某些服務無法通過公共IP訪問。

從公司內部,我們添加了具有專用IP的DNS映射到由kubernetes管理的docker容器內的/ etc/hosts以手動訪問這些服務器。

我知道docker支持命令--add-host在執行「docker run」時更改/ etc/hosts。我不確定這個命令是否支持最新的kubernetes,比如kuber 1.4或1.5?

在另一方面,我們可以包裝的啓動腳本的泊塢窗容器,

  • 追加映射到/ etc/hosts中首先
  • 啓動應用

我只想在每個容器中首次運行後更改文件一次。有沒有簡單的方法來做到這一點,因爲映射關係可能在開發和生產環境或與kubernetes本身提供的相關的任何命令不同?

感謝您的幫助。

回答

2

添加主機到主機文件中的一個「半成品」時尚動感,可以使用啓動後鉤:

spec: 
    containers: 
    - name: somecontainer 
    image: someimage 
    lifecycle: 
     postStart: 
     exec: 
      command: 
      - "cat" 
      - "someip" 
      - "somedomain" 
      - ">" 
      - "/etc/hosts" 

一個更好的辦法是但是使用較抽象的名字該服務分多個階段。例如,使用database01.production.company.com使用database01並設置環境,以便在生產設置和分段設置中分段生產。

最後,還可以編輯kubedns設置,使得kubernetes DNS可用於檢索外部DNS名稱。那麼你只需要在代碼中使用任何你需要的名字,它只是「自動地」運作。例如https://github.com/kubernetes/kubernetes/issues/23474關於如何設置(從版本到版本的skydns稍微變化一些:一些較舊的版本確實不適用於此,所以升級到至少kube 1.3以使其正常工作)

+0

真的非常感謝您的更新。這很有用。我剛剛閱讀了文檔http://kubernetes.io/docs/user-guide/container-environment/並嘗試了這一點。我認爲這個命令需要稍微改成'exec:command: - 「sh」 - 「-c」 - 「echo someip somedomain>/etc/hosts」。似乎kubernetes只是使用'os/exec exec.Command(args).Run()'來運行命令,以便不支持「|,>,>>」。感謝你的幫助:) – qingdaojunzuo

+0

@qingdaojunzuo是的,你是正確的:所有這些命令部分的命令語法遠不是用戶友好的,在沒有測試的情況下當場猜測它們是錯誤的方法:) –

1

您應該能夠添加Service沒有選擇和手動創建Endpoint對象,如這裏的文檔描述 - http://kubernetes.io/docs/user-guide/services/#services-without-selectors

服務一般抽象訪問Kubernetes吊艙,但他們可以 也是抽象的其他各種後端。

例如:

你想擁有生產外部數據庫集羣,但在測試你用你自己的數據庫。

您想將您的服務指向另一個 命名空間或其他羣集中的服務。

您正在將工作負載遷移到 Kubernetes和一些後端在Kubernetes之外運行。

+0

感謝響應。這在某些情況下對我很有用。我們可以使用服務名稱而不是kubernetes集羣內的域名/ IP。現在我們有一個服務A內部集羣。 A使用kafka&zookeeper。卡夫卡和動物園管理員在Kube集羣外部署。服務A通過域名從zookeeper獲取所有卡夫卡經紀人。這些域名不能更改爲kube服務名稱,因爲它們與kube羣集外的其他系統共享。這些域名需要被翻譯成私人IP,使用服務A.有什麼方法可以輕鬆解決這個問題嗎?非常感謝您的幫助。 – qingdaojunzuo

0

創建一個主機系統(或祕密),所有你需要額外的主機(例如,/ tmp目錄/額外的主機)

然後在K8S清單上的文件:

spec: 
    containers: 
    - name: haproxy 
     image: haproxy 
     lifecycle: 
     postStart: 
      exec: 
      command: ["/bin/sh", "-c", "cat /hosts >> /etc/hosts"] 

     volumeMounts: 
     - name: haproxy-hosts 
      mountPath: /hosts 

     volumes: 
     - name: haproxy-hosts 
      hostPath: 
      path: /tmp/extra-hosts