Concept-Kubernetesイメージ

Dockerイメージを作成してレジストリにプッシュし、それをKubernetesポッドで参照します。

コンテナがimageサポートする属性dockerのプライベートラベルや倉庫など、同じ構文のコマンドを、。

ミラーを更新

デフォルトのプル戦略はIfNotPresentです。これにより、Kubeletは既存のイメージのプルをスキップします。常にプルを強制したい場合は、次のいずれかを実行できます。

  • コンテナは、imagePullPolicyセットAlways
  • 省略imagePullPolicyし、使用:latestラベル画像などが使用されます。
  • 省略するimagePullPolicyと、ラベル画像が使用されるように、
  • AlwaysPullImagesを有効にします(調整してください~~)アドミッションコントローラー。

我々は使用を避けるべきであるとしてください、ノートlatest、詳細については、タグを参照してください構成のベストプラクティスを(~~しばらくお待ちください)。

マニフェストを使用してマルチアーキテクチャイメージを構築する

ドッカーCLIは現在、以下のコマンドをサポートdocerk manifestし、このようにcreateannotatepushサブコマンドは好きです。これらのコマンドを使用して、リストを作成およびプッシュできます。私たちは、使用できる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 kubeletkubeletログ(たとえば)のログ行を確認します。次に例を示します。
    • 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

以下は、プライベートウェアハウスを使用するようにノードを構成するための推奨手順です。この例では、デスクトップ/ラップトップコンピューターで次のコマンドを実行します。

  1. 使用する資格情報のセットごとにdocker login [server]を実行します。これは更新され$HOME/.docker/config.jsonます。
  2. エディター$HOME/.docker/config.jsonチェックインして、使用する資格情報のみが含まれていることを確認します。
  3. たとえば、ノードリスト
    を取得します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}')
  4. 私たちの地元.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 Hubまたは他の場所でホストできます
      • 上記のように、各ノードで手動で構成します.docker/config.json
    • または、オープンな読み取りアクセス権を持つファイアウォールの背後で内部プライベートレジストリを実行します。
      • Kubernetesの構成は不要です。
    • または、GCE / Google Kubernetes Engineを使用する場合は、プロジェクトのGoogleコンテナリポジトリを使用してください。
      • 手動のノード構成と比較して、クラスターの自己スケーリングが向上します。
      • または、ノード構成を変更するのが都合の悪いクラスターで使用しますimagePullSecrets
  • ワンダリングミラーを備えたクラスター。その一部には厳密なアクセス制御が必要です。
    • AlwaysPulImagesアドミッションコントローラー(~~をお楽しみください)がアクティブであることを確認してください。そうしないと、すべてのポッドがすべてのミラーにアクセスできる場合があります。
    • 機密データをイメージにパッケージ化するのではなく、「キー」リソースに移動します。
  • 各テナントが独自のプライベートウェアハウスを必要とするマルチテナントクラスタ:
    • AlwaysPulImagesアドミッションコントローラー(~~をお楽しみください)がアクティブであることを確認してください。それ以外の場合、すべてのテナントのすべてのポッドがすべての画像にアクセスできます。
    • 個人倉庫へのアクセス許可が必要です。
    • 各テナントのウェアハウス認証情報を生成してキーに入れ、各テナント名前空間のキーを入力します。
    • テナントはこのキーを各名前空間のimagePullSecretsに追加します。複数の倉庫にアクセスする必要がある場合は、各倉庫のキーを作成できます。Kubeletは全てますimagePullSecrets仮想一つに結合すること.docker/config.json
232の元の記事を公開 14を 高く評価 20,000以上の訪問

おすすめ

転載: blog.csdn.net/stevenchen1989/article/details/105592701