Dockerイメージを作成してレジストリにプッシュし、それをKubernetesポッドで参照します。
コンテナがimage
サポートする属性docker
のプライベートラベルや倉庫など、同じ構文のコマンドを、。
ミラーを更新
デフォルトのプル戦略はIfNotPresentです。これにより、Kubeletは既存のイメージのプルをスキップします。常にプルを強制したい場合は、次のいずれかを実行できます。
- コンテナは、
imagePullPolicy
セットAlways
。 - 省略
imagePullPolicy
し、使用:latest
ラベル画像などが使用されます。 - 省略する
imagePullPolicy
と、ラベル画像が使用されるように、 - AlwaysPullImagesを有効にします(調整してください~~)アドミッションコントローラー。
我々は使用を避けるべきであるとしてください、ノートlatest
、詳細については、タグを参照してください構成のベストプラクティスを(~~しばらくお待ちください)。
マニフェストを使用してマルチアーキテクチャイメージを構築する
ドッカーCLIは現在、以下のコマンドをサポートdocerk manifest
し、このようにcreate
、annotate
とpush
サブコマンドは好きです。これらのコマンドを使用して、リストを作成およびプッシュできます。私たちは、使用できるdocker manifest inspect
リストを表示します。
こちらのDockerドキュメントを確認してください:https :
//docs.docker.com/edge/engine/reference/commandline/manifest/
ビルドツールでこの例を使用する方法を参照してください:https :
//cs.k8s.io/?q=docker%20manifest%20(create%7Cpush%7Cannotate)&i=nope&files=&repos=
これらのコマンドはDocker CLIに依存し、Docker CLIでのみ実装されます。私たちは、編集する必要があり$HOME/.docker/config.json
、テストキーセットenabled
、またはCLIコマンドのとき、単にDOCKER_CLI_EXPERIMENTAL
環境変数をenabled
することができます。
注:Docker 18.06以降を使用してください。次のバージョンにはエラーがあるか、実験的なコマンドラインオプションがサポートされていません。https://github.com/docker/cli/issues/1135の例では、コンテナの問題が発生します。
我々はトラブルアップロード古い在庫を持っている場合は、単にクリーンアップするために$HOME/.docker/manifests
、再び始めるために古い在庫を。
Kubernetesのために、我々は通常と接尾辞を使用して-$(ARCH)
ミラーリング。下位互換性を保つために、接尾辞付きの古いイメージを生成してください。アイデアは、すべてのアーチ(ES)のリストを生成することであるpause
ミラー、及びpause-amd64
それが古いまたはハードコードされたサフィックスを持つ画像を有していてもよいYAML構成ファイルとの下位互換性があります。
専用倉庫を使う
プライベートリポジトリは、それらからイメージを読み取るためにキーを必要とする場合があります。資格情報は、いくつかの方法で提供できます。
- Google Container Registryを使用します。
- 各クラスター
- Google Compute EngineまたはGoogle Kubernetes Engineでの自動構成。
- すべてのポッドはプロジェクトのプライベートウェアハウスを読み取ることができます。
- Amazon Elastic Container Registry(ECR)を使用:
- IAMロールとポリシーを使用して、ECRリポジトリへのアクセスを制御します。
- ECRログイン資格情報は自動的に更新されます。
- Oracle Cloud Infrastructure Registry(OCIR)を使用:
- IAMロールとポリシーを使用して、RCIRリポジトリへのアクセスを制御します。
- Azure Container Registry(ACR)を使用します。
- IBM Container Registryを使用します。
- IAMの役割とポリシーを使用して、IBM Cloud Container Registryへのアクセスを許可します。
- プライベートウェアハウスを認証するようにノードを構成します。
- すべてのポッドは、構成されたプライベートウェアハウスを読み取ることができます。
- クラスタ管理者はノードを構成する必要があります。
- プル前の画像:
- すべてのポッドは、ノードにキャッシュされた任意の画像を使用できます。
- 構築するすべてのノードにアクセスするには、ルート権限が必要です。
- ポッドでImagePullSecretsを指定します。
- 独自のキーを提供するポッドのみがプライベートリポジトリにアクセスできます。
各オプションの詳細な説明は次のとおりです。
Google Container Registryを使用する
Google Compute Engine(GCE)で実行する場合、KubernetesはGoogle Container Registry(GCR)をネイティブでサポートします。クラスタをGCまたはGoogle Kubernetes Engineで実行している場合は、完全なイメージ名(たとえばgcr.io/my_project/image:tag
)のみを使用する必要があります。
クラスタ内のすべてのポッドは、ウェアハウス内のミラーへの読み取りアクセス権を持っています。
KubeletはインスタンスのGoogleサービスアカウントを使用してGCRへの認証を行います。インスタンスのサービスアカウントにはがhttps://www.googleapis.com/auth/devstorage.read_only
あるため、プロジェクトのGCRから撤回できますが、プッシュすることはできません。
Amazon Elastic Container Registry(ECR)を使用
ノードがAWS EC2インスタンスの場合、KubernetesはAmazon Elastic Container Registryをネイティブでサポートしています。
ポッドの定義で完全なイメージ名(たとえばACCOUNT.dkr.ecr.REGION.amazonaws.com/imagename:tag
)を使用するだけです。
ポッドを作成できるクラスター内のすべてのユーザーは、ECRリポジトリ内の任意のイメージを使用してポッドを実行できます。
KubeletはECR資格情報を取得して定期的に更新します。この操作を実行するには、次の権限が必要です。
ecr:GetAuthorizationToken
ecr:BatchCheckLayerAvailability
ecr:GetDownloadUrlForLayer
ecr:GetRepositoryPolicy
ecr:DescribeRepositories
ecr:ListImages
ecr:BatchGetImage
要件:
- kubelet v1.2.0以降を使用する必要があります。(たとえば、実行
/usr/bin/kubelet --version=true
); - ノードがリージョンAにあり、2番目のウェアハウスがリージョンBにある場合、バージョンv1.3.0以降が必要です。
- ECRは私たちの地域で提供する必要があります。
トラブルシューティング:
- 上記の要件をすべて確認します。
$REGION
(たとえばus-west-2
)ワークステーションで資格情報を取得します。ホストにSSH接続し、これらの認証情報を使用して手動でDockerを実行します。うまくいきますか?- 使用すると、
--cloud-provider=aws
実行されていることを確認しkubelet。 - kubeletログレベルの詳細レベルを少なくとも3に増やし
journalctl -u kubelet
、kubeletログ(たとえば)のログ行を確認します。次に例を示します。aws_credentials.go:109] unable to get ECR credentials from cache, checking ECR API
aws_credentials.go:116] Got ECR credentials from ECR API for <AWS account ID for ECR>.dkr.ecr.<AWS region>.amazonaws.com
Oracle Cloud Infrastructure Registry(OCIR)を使用
なし
Azure Container Registry(ACR)を使用する
使用Azureのコンテナレジストリは、我々は、認証のための管理者ユーザーまたはサービスプリンシパルを使用することができます。どちらの方法でも、標準のDocker認証によって検証されます。これらの手順では、azure-cliコマンドラインツールが使用されていることを前提としています。
まず、ウェアハウスを作成して資格情報を生成する必要があります。完全なドキュメントは、Azure Container Warehouseのドキュメントにあります。
コンテナーウェアハウスの作成後、次の資格情報を使用してログインします。
DOCKER_USER
:サービスプリンシパルまたは管理者のユーザー名。DOCKER_PASSWORD
:サービスサブジェクトパスワードまたは管理者ユーザーパスワード。DOCKER_REGISTRY_SERVER
:${some-registry-name}.azurecr.io
DOCKER_EMAIL
:${some-email-address}
これらの変数を入力したら、Kubernetesシークレットを構成し、それを使用してポッドをデプロイできます。
IBM Container Registryを使用する
IBM Cloud Container Registryは、イメージを安全に保管および共有するために使用できるマルチテナントのプライベートイメージウェアハウスを提供します。デフォルトでは、統合された脆弱性アドバイザーはプライベートリポジトリのイメージをスキャンして、セキュリティの問題や潜在的な脆弱性をチェックします。IBM Cloudアカウントのユーザーは、イメージにアクセスできます。または、IAMロールとポリシーを使用して、IBM Cloud Container Registry名前空間へのアクセスを許可できます。
IBM Cloud Container Registry CLIプラグインをインストールしてイメージのネームスペースを作成するには、「IBM Cloud Container Registryの概要」を参照してください。
同じアカウントとリージョンを使用する場合、追加構成なしで、IBM Cloud Container Registryに保管されているイメージをIBM Cloud Kubernetes Serviceクラスターのデフォルトの名前空間にデプロイできます。イメージからのコンテナーの構築を参照してください。その他の構成オプションについては、クラスターがウェアハウスからイメージを抽出することを承認する方法についてを参照してください。
プライベートリポジトリを認証するようにノードを構成する
注:Google Kubernetes Engineで実行している場合は
.dockercgf
、Google Container Registryの認証情報を使用して、各ノードにすでに1つあります。この方法は使用できません。
注:AWS EC2で実行していて、EC2コンテナーウェアハウス(ECR)を使用している場合、各ノードのkubeletがECRログイン資格情報を管理および更新します。この方法は使用できません。
注:ストレートノード構成が可能な場合は、この方法が試行されます。GCEや、自動ノード交換を実行する他のクラウドプロバイダーでは、確実に実行できません。
注:今のところ、Kubernetesはドッキングウィンドウの設定をサポート
auths
してHttpHeaders
部品を。つまり、資格情報アシスタント(credHelpers
またはcredsStore
)はサポートされていません。
ドッカー秘密鍵は、倉庫に保管されている$HOME/.dockercfg
か、$HOME/.docker/config.json
ファイル。下の検索パスリストに同じファイルを配置すると、kubeletは画像を抽出するときに、それを資格情報プロバイダーとして使用します。
{--root-dir:-/var/lib/kubelet}/config.json
{cwd of kubelet}/config.json
${HOME}/.docker/config.json
/.docker/config.json
{--root-dir:-/var/lib/kubelet}/.dockercfg
{cwd of kubelet}/.dockercfg
${HOME}/.dockercfg
/.dockercfg
注:環境ファイルでkubeletを明示的に設定する必要がある場合があります
HOME=/root
。
以下は、プライベートウェアハウスを使用するようにノードを構成するための推奨手順です。この例では、デスクトップ/ラップトップコンピューターで次のコマンドを実行します。
- 使用する資格情報のセットごとにdocker login [server]を実行します。これは更新され
$HOME/.docker/config.json
ます。 - エディター
$HOME/.docker/config.json
をチェックインして、使用する資格情報のみが含まれていることを確認します。 - たとえば、ノードリスト
を取得しますnodes=$(kubectl get nodes -o jsonpath='{range.items[*].metadata}{.name} {end}')
:
a。名前を取得する場合:; b。IPを取得する場合:nodes=$(kubectl get nodes -o jsonpath='{range .items[*].status.addresses[?(@.type=="ExternalIP")]}{.address} {end}')
- 私たちの地元
.docker/config.json
:検索パスリストの1は、上記にコピーされる
A例:for n in $nodes; do scp ~/.docker/config.json root@$n:/var/lib/kubelet/config.json; done
。
プライベートイメージを使用してポッドを作成して確認します。次に例を示します。
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: private-image-test-1
spec:
containers:
- name: uses-private-image
image: $PRIVATE_IMAGE_NAME
imagePullPolicy: Always
command: [ "echo", "SUCCESS" ]
EOF
pod/private-image-test-1 created
すべてが正常であれば、しばらくしてから次のコマンドを実行できます。
kubectl logs private-image-test-1
そしてコマンド出力を見てください:
SUCCESS
コマンドが失敗したと思われる場合は、次のコマンドを実行できます。
kubectl describe pods/private-image-test-1 | grep 'Failed'
障害が発生すると、出力は次のようになります。
Fri, 26 Jun 2015 15:36:13 -0700 Fri, 26 Jun 2015 15:39:13 -0700 19 {kubelet node-i2hq} spec.containers{uses-private-image} failed Failed to pull image "user/privaterepo:v1": Error: image user/privaterepo:v1 not found
クラスタ内のすべてのノードが同じであることを確認する必要があります.docker/config.json
。それ以外の場合、ポッドは一部のノードで実行され、他のノードでは実行されません。我々は自動自己伸縮ノードを使用した場合、テンプレートの各インスタンスが含まれている必要があります.docker/config.json
またはそれを含むドライブをインストールします。
プライベートリポジトリが追加されると.docker/config.json
、すべてのポッドがプライベートリポジトリ内の画像への読み取りアクセス権を持つようになります。
プル前の画像
注:Google Kubernetes Engineで実行し
.dockercfg
ている場合、Google Container Registryの認証情報を使用して、各ノードに1つずつ存在します。この方法は使用できません。
注:このメソッドは、ノード構成を制御できる場合に使用されます。GCEや、自動ノード交換を実行する他のクラウドプロバイダーでは、確実に実行できません。
デフォルトでは、kubeletは指定されたリポジトリから各イメージを抽出しようとします。コンテナの場合は、imagePullPolicy
プロパティに設定されているIfNotPresent
、またはNever
、ローカルミラー(それぞれ、限定的または排他的)に使用されます。
レジストリ認証の代わりにプル前のミラーに依存する場合は、クラスター内のすべてのノードが同じプル前のミラーを持つようにする必要があります。
これは、特定のイメージをプリロードして速度を上げるために使用でき、プライベートリポジトリに対する認証の代わりに使用できます。
すべてのポッドには、描画済みの画像への読み取りアクセス権があります。
ポッドでImagePullSecretsを指定する
注:Google Kubernetes Engine、GCE、およびノードを自動的に作成するクラウドプロバイダーの場合、現在この方法が推奨されています。
Kubernetesは、ポッドでの倉庫アイテムの指定をサポートしています。
Docker Configでキーを作成する
次のコマンドを実行して、大文字の値を適切に置き換えます。
kubectl create secret docker-registry <name> --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
すでにDocker認証情報ファイルがある場合は、上記のコマンドを使用する代わりに、Kubernetesキーを使用して認証情報ファイルを注ぐことができます。既存のDockerクレデンシャルに基づいてキーを作成する(楽しみにしてください~~)設定方法を説明します。我々はので、特に有用であろう多くの民間コンテナ倉庫、使用している場合kubectl create secret docker-registry
のみ、単一の民間倉庫に適用されるキーを作成することを。
注:ポッドは自身の名前空間のミラープルキーのみを参照できるため、このプロセスは名前空間ごとに1回完了する必要があります。
ポッドの見積もり imagePullSecrets
今、私たちは、定義するためにポッドを追加することができimagePullSecrets
、キーパーツを作成するための参照ポッドを。
cat <<EOF > pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: foo
namespace: awesomeapps
spec:
containers:
- name: foo
image: janedoe/awesomeapp:v1
imagePullSecrets:
- name: myregistrykey
EOF
cat <<EOF >> ./kustomization.yaml
resources:
- pod.yaml
EOF
これは、プライベートウェアハウスを使用する各ポッドで行う必要があります。
ただし、serviceAccount(近日提供予定〜)リソースでimagePullSecretsを設定することで、このフィールドを簡単に設定できます。選択ImagePullSecretsを追加するには、サービスアカウントを詳細な手順については、(滞在はチューニング~~)。
私たちは、各ノードでそれを使用することができます.docker/config.json
組み合わせて用いることができます。資格情報がマージされます。この方法は、Google Kubernetes Engineに適用できます。
用例
個人倉庫を準備するための多くのソリューションがあります。一般的な使用例と推奨される解決策を以下に示します
- 制限されていない(オープンソースなど)ミラーではないクラスターのみを実行します。鏡を隠す必要はありません:
- Dockerハブで公開イメージを使用します。
- 設定は必要ありません。
- GCE / Google Kubernetes Engineでは、ローカルイメージが自動的に使用され、速度と可用性が向上します。
- Dockerハブで公開イメージを使用します。
- 特定のプロプライエタリミラーを実行しているクラスタ。これらのミラーは社外には表示されませんが、すべてのクラスタユーザーには表示されます。
- ホストされたプライベートDockerウェアハウスを使用します。
- Docker Hubまたは他の場所でホストできます。
- 上記のように、各ノードで手動で構成します
.docker/config.json
。
- または、オープンな読み取りアクセス権を持つファイアウォールの背後で内部プライベートレジストリを実行します。
- Kubernetesの構成は不要です。
- または、GCE / Google Kubernetes Engineを使用する場合は、プロジェクトのGoogleコンテナリポジトリを使用してください。
- 手動のノード構成と比較して、クラスターの自己スケーリングが向上します。
- または、ノード構成を変更するのが都合の悪いクラスターで使用します
imagePullSecrets
。
- ホストされたプライベートDockerウェアハウスを使用します。
- ワンダリングミラーを備えたクラスター。その一部には厳密なアクセス制御が必要です。
- AlwaysPulImagesアドミッションコントローラー(~~をお楽しみください)がアクティブであることを確認してください。そうしないと、すべてのポッドがすべてのミラーにアクセスできる場合があります。
- 機密データをイメージにパッケージ化するのではなく、「キー」リソースに移動します。
- 各テナントが独自のプライベートウェアハウスを必要とするマルチテナントクラスタ:
- AlwaysPulImagesアドミッションコントローラー(~~をお楽しみください)がアクティブであることを確認してください。それ以外の場合、すべてのテナントのすべてのポッドがすべての画像にアクセスできます。
- 個人倉庫へのアクセス許可が必要です。
- 各テナントのウェアハウス認証情報を生成してキーに入れ、各テナント名前空間のキーを入力します。
- テナントはこのキーを各名前空間のimagePullSecretsに追加します。複数の倉庫にアクセスする必要がある場合は、各倉庫のキーを作成できます。Kubeletは全てます
imagePullSecrets
仮想一つに結合すること.docker/config.json
。