2017-05-09 43 views
0

啓動Kubernetes集羣時,我將ecd加上核心kubernetes進程 - kube-proxy,kube-apiserver,kube-controller-manager和kube-scheduler - 作爲來自私有註冊表的靜態pod。過去,通過確保爲kubelet設置$ HOME環境變量爲「/ root」,然後使用專用docker註冊表的憑據定義/root/.docker/config.json,過去一直有效。如何爲啓用了CRI的Kubernetes靜態窗格指定docker憑據?

當試圖運行Kubernetes 1.6並啓用CRI時,我在kubelet日誌中發現錯誤,指出由於沒有身份驗證,無法從我的私人Docker註冊表中取消暫停:3.0容器。

在kubelet命令行上設置--enable-cri = false時有效,但啓用CRI時,它似乎沒有使用/root/.docker/config文件進行身份驗證。

是否有一些新的方式來提供在啓用CRI的情況下運行時加載靜態窗格所需的docker憑據?

回答

0

事實證明,Kubernetes 1.6中的CRI功能存在缺陷。通過CRI,現在稱爲「Pod Sandbox Image」的「暫停」容器被視爲一種特殊情況 - 因爲它是容器運行時的「實現細節」,無論您是否需要它。在1.6發行版中,例如,從/root/.docker/config.json中爲其他容器應用的憑證在嘗試拉取Pod Sandbox Image時未使用。

因此,如果您嘗試從私有註冊表中提取此映像,則CRI邏輯不會將憑據與拉取請求相關聯。現在有一個Kubernetes問題(#45738)解決這個問題,目標是1.7。

與此同時,一個簡單的解決方法是在啓動kubelet過程之前,將「Pause」容器預拉入節點的本地泊塢窗圖像緩存中。

0

在1.6,我設法使之與以下配方工作,https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod

$ kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL 

您需要在吊艙規範指定新創建myregistrykey作爲憑據下imagePullSecrets場。

apiVersion: v1 
kind: Pod 
metadata: 
    name: foo 
    namespace: awesomeapps 
spec: 
    containers: 
    - name: foo 
     image: janedoe/awesomeapp:v1 
    imagePullSecrets: 
    - name: myregistrykey 
+0

這裏似乎有一個雞與雞蛋的問題。我正在嘗試將kube-apiserver作爲一個靜態的pod加載,從而啓動集羣。在kube-apiserver運行之前,我無法通過kubectl創建一個祕密,可以嗎? –

相關問題