改善を提案. Node. Podが稼働するNodeを特定のものに指定したり、優先条件を指定して制限することができます。 以下のようなラベルが該当します。, Nodeにラベルを付与することで、Podは特定のNodeやNodeグループにスケジュールされます。 問題を報告する

Stack Overflow. 言い換えると、AffinityはPodをスケジュールする際にのみ考慮されます。, preferredDuringSchedulingIgnoredDuringExecution内のweightフィールドは、1から100の範囲で指定します。 前述のNode Affinityのセクションを参照してください。

インストールするKubernetesのバージョンを指定する--node-name: ノード名を指定する--pod-network-cidr: Podに割り当てるIPアドレスの範囲を指定する。任意のものが指定できるが、既存のネットワー … Masterの自動スケジューリングはそれぞれのノードの利用可能なりソースを考慮します。, 2章でkubectlのCLIを使いました。 Inter-Pod Affinity/Anti-Affinity 共有するリソースは以下です。, Podはアプリケーション特有の"論理ホスト"を形成しており、密結合された異なるアプリケーションコンテナを含むことができます。 Deploymentには、1つのNodeにレプリカを共存させないためにPodAntiAffinityを付与しています。, ウェブサーバーのDeploymentを記載した以下のyamlファイルには、podAntiAffinity とpodAffinityが設定されています。 拡張機能は以下の通りです。, Affinityは”Node Affinity”と”Inter-Pod Affinity/Anti-Affinity”の2種類から成ります。 Node Affinityでは、In、NotIn、Exists、DoesNotExist、Gt、Ltのオペレーターが使用できます。 nodeNameはPodSpecのフィールドです。

Pod Affinityは、「キーが”security”、値が”S1”のラベルが付与されたPodが少なくとも1つは稼働しているNodeが同じゾーンにあれば、PodはそのNodeにスケジュールされる」という条件を指定しています(より正確には、キーが”security”、値が”S1”のラベルが付与されたPodが稼働しており、キーがfailure-domain.beta.kubernetes.io/zone、値がVであるNodeが少なくとも1つはある状態で、 Pod AffinityとPod Anti-Affinityや、requiredDuringSchedulingIgnoredDuringExecutionとpreferredDuringSchedulingIgnoredDuringExecutionに関する他の使用例はデザインドックを参照してください。, Pod AffinityとPod Anti-Affinityで使用できるオペレーターは、In、NotIn、 Exists、 DoesNotExistです。.

この例では、KubernetesのPod に ... RESTARTS AGE IP NODE redis-cache-1450370735-6dzlj 1/1 Running 0 8m 10.192.4.2 kube-node-3 redis-cache-1450370735-j2j96 1/1 Running 0 8m 10.192.2.2 kube-node-1 redis-cache-1450370735-z73mh 1/1 Running 0 8m 10.192.3.1 kube-node-2 web-server-1287567482-5d4dz 1/1 Running 0 7m 10.192.2.3 kube-node-1 web-server-1287567482-6f7v5 1/1 Running 0 7m 10.192.4… Podのコンテナ群はひとつのIPアドレスとポート空間を共有し、いつも一緒にスケジュールされ配置され、同じNode上で起動します。, PodはKubernetesにおける最小の単位です。

labels にKey/Valueの形で指定する。. 全てのレプリカがapp=storeのラベルが付与されたPodと同じゾーンで稼働するよう、スケジューラーに設定されます。 ここに値が設定されると、schedulerはそのPodを考慮しなくなり、その名前が付与されているNodeのkubeletはPodを稼働させようとします。

Node Nがキーfailure-domain.beta.kubernetes.io/zone、値Vのラベルを持つ場合に、PodはNode Nで稼働させることができます)。 Configuring your kubernetes cluster to self-host the control plane, kubesprayを使ったオンプレミス/クラウドプロバイダへのKubernetesのインストール, IBM Cloud Privateを使ってマルチクラウドでKubernetesを動かす, Guide for adding Windows Nodes in Kubernetes, 終了したリソースのためのTTLコントローラー(TTL Controller for Finished Resources), HostAliasesを使用してPodの/etc/hostsにエントリーを追加する, ボリュームの動的プロビジョニング(Dynamic Volume Provisioning), Organizing Cluster Access Using kubeconfig Files, Resource Bin Packing for Extended Resources, Compute, Storage, and Networking Extensions, Configure GMSA for Windows Pods and containers, Configure RunAsUserName for Windows pods and containers, Configure a Pod to Use a PersistentVolume for Storage, Configure a Security Context for a Pod or Container, Liveness Probe、Readiness ProbeおよびStartup Probeを使用する, Translate a Docker Compose File to Kubernetes Resources, Configure Default Memory Requests and Limits for a Namespace, Configure Default CPU Requests and Limits for a Namespace, Configure Minimum and Maximum Memory Constraints for a Namespace, Configure Minimum and Maximum CPU Constraints for a Namespace, Configure Memory and CPU Quotas for a Namespace, Change the Reclaim Policy of a PersistentVolume, Control CPU Management Policies on the Node, Control Topology Management Policies on a node, Guaranteed Scheduling For Critical Add-On Pods, Reconfigure a Node's Kubelet in a Live Cluster, Reserve Compute Resources for System Daemons, Safely Drain a Node while Respecting the PodDisruptionBudget, Set up High-Availability Kubernetes Masters, Declarative Management of Kubernetes Objects Using Configuration Files, Declarative Management of Kubernetes Objects Using Kustomize, Managing Kubernetes Objects Using Imperative Commands, Imperative Management of Kubernetes Objects Using Configuration Files, Update API Objects in Place Using kubectl patch, Define a Command and Arguments for a Container, Expose Pod Information to Containers Through Files, Distribute Credentials Securely Using Secrets, Inject Information into Pods Using a PodPreset, Specifying a Disruption Budget for your Application, Coarse Parallel Processing Using a Work Queue, Fine Parallel Processing Using a Work Queue, Use Port Forwarding to Access Applications in a Cluster, Minikube上でNGINX Ingressコントローラーを使用してIngressをセットアップする, Developing and debugging services locally, Extend the Kubernetes API with CustomResourceDefinitions, Use an HTTP Proxy to Access the Kubernetes API, Externalizing config using MicroProfile, ConfigMaps and Secrets, Interactive Tutorial - Configuring a Java Microservice, 例: PHP / Redisを使用したゲストブックの例にロギングとメトリクスを追加する, 例: Persistent Volumeを使用したWordpressとMySQLをデプロイする, Running ZooKeeper, A Distributed System Coordinator, Restrict a Container's Access to Resources with AppArmor, Restrict a Container's Syscalls with Seccomp, Kubernetes Security and Disclosure Information, Well-Known Labels, Annotations and Taints, Contributing to the Upstream Kubernetes Code, Generating Reference Documentation for the Kubernetes API, Generating Reference Documentation for kubectl Commands, Generating Reference Pages for Kubernetes Components and Tools, Update content/ja/docs/tasks/configure-pod-container/assign-pods-nodes.md (0de2cecac). Node障害の場合は、同一のPod(群)がクラスタ内の他の利用可能なNodeにスケジュールされます。, Podは必ずNode上で実行されます。 Yはnamespaceのリストで指定したLabelSelectorで表されます。

この記事は Kubernetes道場 Advent Calendar 2018 17日目の記事です。, 今回はLabel / NodeSelector / Annotationについて。, Labelはkey/valueの組み合わせKubernetesオブジェクトに指定することができる。, システムに直結する意味合いを持つ設定ではなく、 LabelSelectorなどで使ってきたが、オブジェクトの選択やサブセットの指定などで使用される。, LabelのKeyは/ を使って2つのセグメントに分割して表現することができる。/ より前をPrefix、後をNameと呼ぶ。, PrefixはDNS_LABELに従った253文字以下の文字列である。Prefixを省略すると、ユーザー固有のものとして扱われる。, 要は最初と最後はアルファベットか数字、間の文字ではそれらに加えて - / _ / .

For example, a Pod might include both the container with your Node.js app as well as a different container that feeds the data to be published by the Node.js webserver.

スケジューラーが最適な配置を選択するため、一般的にはこのような制限は不要です(例えば、複数のPodを別々のNodeへデプロイしたり、Podを配置する際にリソースが不十分なNodeにはデプロイされないことが挙げられます)が、 or

将来的には、requiredDuringSchedulingIgnoredDuringExecutionに、PodのNode Affinityに記された必須要件を満たさなくなったNodeからそのPodを退避させることができる機能を備えたrequiredDuringSchedulingRequiredDuringExecutionが提供される予定です。, それぞれの使用例として、 これは、安全性が損なわれたNodeがkubeletの認証情報をNodeのオブジェクトに設定したり、スケジューラーがそのようなNodeにデプロイすることを防ぎます。, NodeRestrictionプラグインは、kubeletがnode-restriction.kubernetes.io/プレフィックスを有するラベルの設定や上書きを防ぎます。 「Kubernetes」は2014年の登場以来順調に利用者を増やしており、現在ではコンテナ管理ツールのデファクトスタンダードとなっている。新機能や関連ツールなどの開発も活発だ。そこで本記事では、ここ最新導入されたKubernetesの新機能や特徴を紹介するとともに、導入ツール「kubeadm」による最新版Kubernetesの環境構築方法を紹介する。, Kubernetesについては以前にも紹介しているが、ここで改めてその概要や背景にある技術について簡単ではあるが紹介しておこう。, Kubernetesは、複数台のコンピュータをネットワークで接続した「クラスタ環境」を使い、「ノード」と呼ばれるクラスタ内のコンピュータ上で実行されるサーバーソフトウェアを管理するソフトウェアシステムだ(図1)。, 最近ではコンピュータの低価格化により、少数の超高性能なコンピュータでシステムを構築するよりも、低価格でそれなりの性能のコンピュータを多数組み合わせてシステムを構築するほうがコストパフォーマンス的に優位なことが多い。また、冗長にシステムを構築することで、一部のコンピュータが故障した場合でもほかのコンピュータがその役割を肩代わりしてシステム全体では正常動作を続けられるような構成が現実的に可能だということが証明されている。Kubernetesはこうした構成のクラスタを構築するのに向いており、特に最近注目されているマイクロサービスアーキテクチャとの相性も良いため、採用例が増えている。, なお、Kubernetesは、基本的には複数台のコンピュータを組み合わせて構築したクラスタ環境で利用する。テストや実験のために1台のみでクラスタを構築することも可能ではあるものの、この場合Kubernetesクラスタを構築するメリットはほぼない。, さて、このように多数のコンピュータを組み合わせてシステムを構築する場合、使用するすべてのコンピュータをすべて完全に同一のハードウェアでそろえようとすると、運用コストが高くなることが見込まれる。運用開始時にすべて同一のハードウェアでそろえることは難しくないが、たとえば一定期間の経過後に故障したハードウェアを取り替えたり、追加でハードウェアを投入したりするといったことはよくある話だ。その場合、完全に同一のハードウェアを入手することが難しくなっている可能性がある。また、より高性能なコンピュータを追加したいといったケースもあるだろう。さらに、ハードウェアだけでなくOS/カーネルのバージョンについても、異なるものが混在できるほうが好ましい。そこでKubernetesでは、「コンテナ」という技術を使い、ソフトウェアの実行環境をハードウェアやOSに依存しないようにしている。, コンテナというと一般的には物を入れる箱のようなイメージだが、ここではあらかじめ指定された以外のリソースにアクセスできないように制限をかけてアプリケーションを実行する仕組みをコンテナ技術と呼び、閉じ込めたリソースをコンテナと呼ぶ(図2)。, 箱(コンテナ)の中にアプリケーションの実行に必要なすべてのプログラムやライブラリ、設定ファイル、各種リソースなどを閉じ込めて、プログラムからはコンテナ内にあるものしか利用できない、といったものをイメージしてもらうと分かりやすいだろう。また、コンテナ技術ではコンテナで使用するプログラムや各種設定ファイル、依存ライブラリなどを「イメージファイル」として管理することで、容易に必要なリソースを配布する仕組みも用意されている。, コンテナを使ってアプリケーションを実行させる場合、そのアプリケーションは基本的にコンテナ外のリソースにアクセスすることができない。つまりコンテナを利用することでハードウェアやOSのバージョン、インストールされているライブラリといったコンテナ外の環境に影響されずにアプリケーションを実行できるようになり、結果的にアプリケーションのハードウェアやOSへの依存性を減らすことができる。, こういったコンテナ技術は複数が開発されており、Kubernetesも特定のコンテナ技術に依存しないように開発されているが、多くのKubernetes環境では現在主流となっているコンテナ技術である「Docker」と組み合わせて運用されている。, Dockerではイメージファイルを共有・公開する「DockerHub」というサービスも提供されている。ここではApache HTTP ServerやNGINX、MySQLといったよく使われるアプリケーションのイメージファイルが公開されており、これらを利用することで簡単にコンテナを用意できる。, なお、コンテナではOSのカーネルだけは共有するため、カーネルのバージョンやカーネルビルド時の設定などの影響は受けるものの、多くの場合でこの影響は小さい。, Kubernetesでは、実行するアプリケーションや各種設定などは「リソースオブジェクト(resource object)」(単に「リソース」などとも呼ばれる)という単位で定義・管理する。主なリソースとしては表1のものがあり、たとえば使用するコンテナや実行するプログラムは「Pod」というリソースで定義・管理する。, Kubernetesが標準で提供するリソースの一覧はAPIドキュメントで確認できる。また、独自のリソースを定義して利用することもできる。, Kubernetesでは、「マニフェスト(manifest)」と呼ばれる形式で各種リソースを定義する。マニフェストは木(ツリー)構造で表現できるデータであり、たとえばコマンドラインツール「kubectl」ではYAML形式で記述されたマニフェストを元にリソースの作成や削除、変更といった操作を行える。, kubectlの使い方についてはドキュメントを参照して欲しいが、たとえば、DockerHubで公開されている「httpd」コンテナイメージを利用してApache HTTP Serverを実行させるには、まず次のようなマニフェストファイルを用意する。, このファイルを指定して「kubectl apply -f <マニフェストファイル>」コマンドを実行することでPodリソースが作成され、その内容に応じて以下のような処理が実行される。, また、作成したコンテナを削除するには「kubectl delete -f <マニフェストファイル>」コマンドを実行すれば良い。, この一連の作業はすべてKubernetesによって自動的に行われるため、明示的にマニフェストで指定しない限りはどのノード上でプログラムが動作するのか、またIPアドレスなどのリソースがどのように割り当てられるかといった情報を事前に知ることはできない。そのため、コンテナ間の通信や外部からのコンテナへの通信は「Service」と呼ばれる、ネットワークルーティングを管理するためのリソースを使って制御することになる。, Kubernetesで2015年7月にバージョン1.0がリリースされ、基本的な機能がほぼ完成した。その後性能向上や管理機能の強化などが続けられているが、ここ最近で安定扱いとなった大きな新機能としては次が挙げられる。, 今回はこの中でも、Kubernetesクラスタを構築するためのツールである「kubeadm」について紹介していく。, 昨今では設定済みのKubernetesクラスタを提供するクラウドサービスも多くあるが、いっぽうで自ら管理しているサーバーでアプリケーションを実行したいという需要もあるだろう。その場合、自前でKubernetesクラスタを構築する必要がある。Kubernetesクラスタの環境構築についてはいくつかの方法があり、Kubernetes公式ドキュメントでは構築方法を選ぶためのガイドページも用意されているが、自ら管理しているサーバーで構築するための代表的な方法としては以下が挙げられる。, Linuxディストリビューションで提供されているKubernetes関連パッケージを使う例については以前の記事で紹介している。こちらはやや古い情報となるが、現在でもおおむね同じ手順で作業が可能だ。ただし、Linuxディストリビューションによっては提供されているKubernetes関連パッケージのバージョンが古い場合がある点には注意が必要だ。たとえば記事執筆時のKubernetesの最新バージョンは1.13系だが、CentOS 7で提供されているパッケージは2016年にリリースされたバージョン1.5系をベースとしたものでかなり古い。Debian Linuxでは開発版(unstable)でのみの提供となっており、2017年リリースのバージョン1.7系がベースだ。Fedoraでは比較的新しいバージョンのパッケージが提供されているが、それでもFedora 29(2018年11月リリース)で提供されているのはv1.10ベースのパッケージとなっている。, 「Minikube」を利用する方法は、以前『簡単にローカルKubernetes環境を構築できるツール「Minikube」』という記事で紹介したが、こちらはVirtualBoxなどの仮想化ソフトウェアを使ってローカルマシン上にテスト用にKubernetes環境を作るもので、複数台構成のクラスタを作るのには適していない。, 「conjure-up」はUbuntuなどで推奨されている方法で(Ubuntuのドキュメント)、conjure-upという環境構築ツールを使ってKubernetesのインストール作業を自動で行うというものだ。, また、「Tectonic」はCoreOSが提供しているKubernetesディストリビューションで、10ノードまでのクラスタであれば無料で利用できる。商用ソリューションということで独自の管理機能なども提供されている。, 最後の「kubeadm」は、Kubernetesが提供しているKubernetes環境構築ツールだ(公式ドキュメント)。対応するOSがUbuntu 16.04以上、Debian 9(Stretch)、CentOS 7、Red Hat Enterprise Linux 7、Fedora 25/26などと幅広く、また公式ツールということで、最新バージョンのKubernetes環境のインストールが可能という特徴がある。「kubeadm」というコマンドラインツールで操作を行う点と、多数のインストールオプションがあるためにやや難しい印象もあるが、ポイントさえ押さえてしまえば比較的容易にクラスタを構築できる。, ということで、以下ではこのkubeadmを使ったKubernetesクラスタ構築の流れを紹介していく。, kubeadmは2016年9月にリリースされたKubernetes 1.4から導入されたツールで、2017年3月にリリースされたKubernetes 1.6でベータ扱いに、2018年12月にリリースされたKubernetes 1.13で主要機能がGA(General Availability、一般利用可能)というステータスとなっている。, Kubernetes環境を構築する際には、クラスタを構成する各ノードに「kubelet」や「flanneld」といったノード管理用コンポーネントをインストールし、さらにクラスタ管理用のノード(マスターノード)には「apiserver」や「controller-manager」、「scheduler」といったKubernetesクラスタの管理用コンポーネントやetcdといった設定管理用のデータベースをインストールする必要がある。kubeadmではこれらの作業を簡単なオプション指定のみで実行でき、さらに各種設定も自動で実行できる。, Kubernetesクラスタを構築する際の各クラスタノードのハードウェアおよびOS要件として、ドキュメントでは次が挙げられている。, ドキュメントではMACアドレスや「product_uuid」(カーネルによって生成されるシステム固有のID)、ホスト名が各ホストで重複せずユニークであるという条件も記載されているが、一般的な環境ではこれらが重複することはないのであまり気にしなくても良いだろう。なお、これらは以下のようにして確認できる。, ホスト名については、そのホスト名から対応するIPアドレスを取得できるよう設定されている必要がある。DNSサーバーで適切な設定を行っておくか、もしくは/etc/hostsファイルにホスト名と割り当てているIPアドレスの組を追加しておこう。, これに加えて、swapを無効にしておく必要もある。swapを無効にするにはいくつかのやり方があるが、/etc/fstabファイルを編集してtypeが「swap」になっている行をコメントアウトし再起動するのが確実だ。, たとえば次の例では、「UUID=36f795f8-cb44-49c2-8e05-95c306653c28」で始まる行がswapに関する設定なので、この行の先頭に「#」を入れてコメントアウトしている。, 「swapoff -a」コマンドでもswapを無効化できるが、この場合システムを再起動すると再度swapが有効になってしまうので注意したい。, ネットワークブリッジを通過するパケットに対しiptablesルールを適用するかどうかを指定するカーネルパラメータ「net.bridge.bridge-nf-call-iptables」も次のように確認しておこう。, Kubernetesでは複数のコンテナ技術がサポートされており、別途使用するコンテナソフトウェアやランライムインターフェイス(CRI)を用意する必要がある。Dockerのほか「containerd」や「cri-o」、「frakti」といったコンテナ技術がサポートされているが、今回はKubernetesがデフォルトで対応しているDockerを利用することにする。Kubernetesのインストール前に、クラスタの各ノードにDockerをインストールしておこう。たとえばDebianやUbuntuでは、次のようにしてDockerをインストールできる。, なお、Debianでは安定版パッケージとして提供されているDockerのバージョンがやや古いため、テスト版(testing)のパッケージを導入すると良いだろう。テスト版のDockerを導入するには、デフォルトでは安定版のパッケージを使用するよう設定ファイルを作成したうえで、テスト版を利用するための設定ファイルを追加する。, この状態で「apt-get update」コマンドを実行後、「docker.io/testing」のようにパッケージ名を指定して「apt-get install」コマンドを実行することで、テスト版のDockerをインストールできる。, また、記事執筆時点ではCentOS 7で提供されているDockerの最新版には不具合があり、Kubernetesと組み合わせた際に正常に動作しない問題があるようだ(KubernetesのIssueトラッカー)。次のように「docker -v」コマンドを実行した場合に「build 07f3374/1.13.1」と表示された場合、問題が発生する可能性がある。, この問題は、次のように「yum downgrade」コマンドを実行して古いバージョンのものに入れ替えることで対処できる。, Kubernetesでは独自の仮想ネットワークが使用されるが、この仮想ネットワークで使用されるIPアドレスがほかのネットワークとは重複しないよう、クラスタ構築時に適切な設定を行っておく必要がある。重複の可能性があるネットワークとしては、各クラスタノードが物理的に接続しているネットワークや、Dockerが使用する仮想ネットワークがある。, 物理的に接続しているネットワークについては分かりやすいが、見落としやすいのがDockerが使用する仮想ネットワークだ。Dockerではデフォルトで仮想ネットワークに接続するためのネットワークブリッジを作成する。このネットワークブリッジの情報は、次のようにして確認できる。, この例では、使用する仮想ネットワークとして「172.17.0.0/16」が設定されている。この場合、Kubernetesで「172.17.0.0/16」に含まれるIPアドレスを使用しようとすると問題が発生することがある。そのため、後述するように別のIPアドレス範囲を使用するよう明示的に設定することをおすすめする。, kubeadmでKubernetesクラスタを構築するには、まずクラスタを構成するすべてのノードにkubeadmをインストールする必要がある。kubeadmは、Googleが提供しているパッケージリポジトリ経由でインストールできる。, DebianやUbuntuなどdeb形式のパッケージを利用する場合、次のようにしてGPG鍵のダウンロードと設定ファイルの追加を行えば良い。, CentOS 7やFedoraの場合、まず「/etc/yum.repos.d/kubernetes.repo」として次のような設定ファイルを作成する。, 続いてyumコマンド(Fedoraの場合はdnfコマンド)でkubeadmパッケージをインストールする。, なお、このリポジトリではKubernetesを操作するためのコマンドラインインターフェイスである「kubectl」が同名のパッケージで提供されている。マスターノードにはこちらもインストールをしておこう。, クラスタの設定を行う前に、各クラスタノードのファイアウォール設定を変更し適切にKubernetesが使用するパケットを許可するよう設定しておこう。Kubernetesがどのポートを使用するかはドキュメントに記載されているが、クラスタ内から表2、3のポートへのアクセスを許可しておけば良い。, なお、もしクラスタ内でプライベートなネットワークを利用できる場合、そのプライベートネットワークからのパケットをすべて許可するよう設定しても良いだろう。その場合、Kubernetesでは実際にそのプライベートなネットワークに割り当てられているIPアドレスに加えて、Kubernetesが使用する仮想ネットワークのIPアドレスも許可する発信元として指定しておく必要がある。, たとえばファイアウォールの設定をfirewalldで行っており、クラスタノードとなる各ホストが「192.168.1.0/24」というネットワークに接続されており、Kubernetesが使用する仮想ネットワークが「10.128.0.0/16」の場合、次のようにこれらを「trusted」ゾーンとして指定すれば良い。, kubeadmのインストールが完了したら、続いてマスターノードで「kubeadm init」コマンドを実行しセットアップを行っていく。kubeadm initコマンドでは、以下のような処理を自動的に実行できる。, なお、これらの詳細や指定できるコマンドラインオプションは「kubeadm init --help」コマンドを実行することで確認できる。, 「kubeadm init」コマンドではいくつかのオプションが用意されている(表4)。ホストに複数のネットワークインターフェイスが接続されており、片方のネットワークインターフェイス経由でしかほかのクラスタノードと通信できない場合は「--apiserver-advertise-address」オプションで他ノードと接続できるネットワークインターフェイスに割り当てられているIPアドレスを指定する。また、KubernetesのPod(コンテナ)に割り当てるIPアドレス範囲は「--pod-network-cidr」オプションで指定できる。前述のとおり、これはほかの既存ネットワークで使用されるIPアドレスとは重複しないものを設定しておこう。, たとえばほかのクラスタノードと接続されているネットワークインターフェイスに「192.168.1.100」というIPアドレスが割り当てられており、またPodに割り当てるIPアドレス範囲を「10.128.0.0/16」とする場合、次のように実行する。, さて、kubeadm initコマンドを実行すると、そのホストの環境がKubernetesの動作に必要な条件を満たしているかがチェックされ、もし問題が見つかった場合はその旨が表示される。その場合、その指示に従って必要な対処を行い、その後「kubeadm reset」コマンドを実行して設定をリセットしてから再度kubeadm initコマンドを実行する。, ここで、最後に「kubeadm join 192.168.1.100:6443 --token 4f2l52.00o3b9d3tw7i4wgv --discovery-token-ca-cert-hash sha256:bc993e1898329a4a5ebd2c4a9b0f6d8766bce00ac850f439ca7cc8cb6c3e9897」と表示されているが、これが非マスタノードをクラスタに参加させる際に実行するコマンドとなる。引数の「--token」および「--discoverty-token-ca-cert-hash」以下の部分は環境によって変わるので注意したい。, また、Kubernetesの設定フロントエンドであるkubectl向けの設定ファイルが/etc/kubernetes/admin.confとして作成されているので、これを次のようにしてKubernetesの管理に使用するユーザーのホームディレクトリにコピーする。, これで、指定したユーザーでkubectlコマンドを使ってクラスタにアクセスできるようになる。たとえば「kubectl get node」コマンドを実行すると、ノードの状態を確認できるはずだ。, なお、この時点ではまだネットワーク関連の設定が完了していないため、マスターノードは利用できない(NotReady)状態となっている。, 続いて、コンテナ間の通信を行うための仮想ネットワークに関する設定を行っていく。仮想ネットワークとしてはいくつかのものが利用できるが、今回は一般的に利用されているflannelを利用することにする。flannelを利用するための設定ファイルはGitHub上で公開されているので、次のようにしてまずこれをダウンロードする。, 続いてこのファイルをエディタで開き、「net-conf.json: |」以下の「”Network”」の値を、kubeadm initコマンド実行時に「--pod-network-cidr」オプションで指定したものに変更する。先の例では「10.128.0.0/16」と指定していたので、次のようになる。, 変更の保存後に次のように実行することでコンテナ内でflannelサービスが実行され、仮想ネットワークが利用できるようになる。, この状態で「kubectl get node」コマンドを実行すると、「STATUS」が「Ready」となり、ノードが利用できる状態になっていることが確認できる。, なお、このネットワーク設定を行った後にkubeadm resetコマンドを実行してクラスタを作り直す場合、以下のようにして作成された「flannel.1」や「cni0」という仮想ネットワークインターフェイスを先に削除しておく必要がある。, マスターノードのセットアップが完了したら、続いてほかのクラスタ参加ノードの設定もおこなっていこう。クラスタに参加させたいノードで、次のように「kubeadm join」コマンドを実行する。, ここで使用するトークンや証明書ハッシュはマスターノードでのkubeadm initコマンド実行時に表示されたものを指定すれば良い。また、この作業はクラスタに参加させるすべてのノードで実行する必要がある。, なお、トークンには有効期限があり、通常は24時間で利用できなくなる。もしトークンが失効した場合や分からなくなった場合、マスターノードで「kubeadm token create --print-join-command」コマンドを実行するとトークンが再生成されて表示される。, 最後にマスターノードで次のように「kubectl get node」コマンドを実行し、ノードがクラスタに参加したことを確認しておこう。, このように、kubeadmでは各ノード「kubeadm init」や「kubeadm join」といったコマンドを実行するだけでクラスタの構築が行える。ただし、これらは各Linuxディストリビューションが公式にサポートしているわけではないため、不具合等が発生する可能性がある点には注意したい。また、Kubernetesでは複雑なルーティングを行うため、ファイアウォール関連の設定も難しい。もしネットワーク関連で問題が発生したら、一度ファイアウォールを無効にして試すと行った問題の切り分けを行うことをおすすめする。, Podに割り当てるIPアドレスの範囲を指定する。任意のものが指定できるが、既存のネットワークとは重複しない必要がある, Serviceで使用するIPアドレス範囲を指定する(デフォルトは「10.96.0.0/12」), DNSで使用するドメイン名を指定する(デフォルトは「cluster.local」), IPVS(IP Virtual Server)によるネットワークルーティング(バージョン1.11), Linuxディストリビューションで提供されているKubernetes関連パッケージを使用, Ubuntu 16.04以降/Debian 9/CentOS 7/Red Hat Enterprise Linux 7/Fedora 25および26/HypriotOS v1.0.1以降/Container Linux, Kubernetesの各種コンポーネントを実行するのに必要な条件を満たしているかのチェック, etcd、apiserver、controller-manager、schedulerといったコンポーネントをコンテナ上で起動.

バスケットボール 略 英語 10, 多肉 ダニ ベニカ 10, ドイツ 名前 順番 34, 広末涼子息子 バスケ 写真 4, ミッシェル バンドリ イラスト 6, Daas 個人向け 比較 17, Fifa20 能力値 日本人 31, シーモア 3倍 いつ 7, 体調 良好 対義語 22, ロボット じゃ ない ~君に夢中 Bs 4, 内定辞退 メール 電話 両方 5, News Every 陣内貴美子 休み 12, 広瀬すず 最新 写真 4, アルタン エタノール製剤 78 6, Pixiv 漫画 ダウンロード 5, 星野源 日村 バースデーソング Sun 15, ラチェット音 爆音 ホイール 13, ブラマヨ小杉 消え た 14, フジテレビ 山崎アナ 旦那 4, ポケモンgo Scp アプリ 16, 村井 慎一郎 解任 50, クロバット 技 ソウルシルバー 17, ひかりtv Iphone ミラーリング 4, 長野 テント メーカー 9, Iggy Pop The Passenger 和訳 6, スズキ Cm 2019 9, キバナ 夢小説 浮気 11, ハローワーク 京都 シニア 求人 5, Teamviewer Quicksupport 操作できない 26, " />

kubernetes pod node 指定 4

By

Thanks for the feedback. requiredDuringSchedulingIgnoredDuringExecution は、”インテルCPUを供えたNode上でPodを稼働させる”、 Affinity/Anti-Affinityでは、より柔軟な指定方法が提供されています。 Open an issue in the GitHub repo if you want to ソースコードを表示してみましょう。, Managing Compute Resources for Containers, コンテナイメージのバージョンや利用ポートといった、それぞれのコンテナがどう動作するかという情報, kubelet: MasterとNode間の通信を行うプロセス。マシン上で実行されるコンテナとPodの管理, コンテナランタイム(Dockerやrkt): レジストリからのコンテナイメージの取得、コンテナの展開、アプリケーションの実行. ローカルマシンからアクセスするためにはローカルマシンとKubernetesクラスタ間のプロキシを作成する必要があります。, proxyコマンドはフォアグラウンドで起動します。 k8s-node:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 575ffdf9c5d3 3a093384ac30 "sleep 3600" 32 minutes ago Up 32 minutes k8s_busybox-02_sample-pod_default_8e79fad5-17c7-11e9-87b0-000c29cd2791_7 31381a2cd6a7 3a093384ac30 "sleep 3600" 32 minutes ago Up 32 minutes k8s_busybox-01_sample-pod…

改善を提案. Node. Podが稼働するNodeを特定のものに指定したり、優先条件を指定して制限することができます。 以下のようなラベルが該当します。, Nodeにラベルを付与することで、Podは特定のNodeやNodeグループにスケジュールされます。 問題を報告する

Stack Overflow. 言い換えると、AffinityはPodをスケジュールする際にのみ考慮されます。, preferredDuringSchedulingIgnoredDuringExecution内のweightフィールドは、1から100の範囲で指定します。 前述のNode Affinityのセクションを参照してください。

インストールするKubernetesのバージョンを指定する--node-name: ノード名を指定する--pod-network-cidr: Podに割り当てるIPアドレスの範囲を指定する。任意のものが指定できるが、既存のネットワー … Masterの自動スケジューリングはそれぞれのノードの利用可能なりソースを考慮します。, 2章でkubectlのCLIを使いました。 Inter-Pod Affinity/Anti-Affinity 共有するリソースは以下です。, Podはアプリケーション特有の"論理ホスト"を形成しており、密結合された異なるアプリケーションコンテナを含むことができます。 Deploymentには、1つのNodeにレプリカを共存させないためにPodAntiAffinityを付与しています。, ウェブサーバーのDeploymentを記載した以下のyamlファイルには、podAntiAffinity とpodAffinityが設定されています。 拡張機能は以下の通りです。, Affinityは”Node Affinity”と”Inter-Pod Affinity/Anti-Affinity”の2種類から成ります。 Node Affinityでは、In、NotIn、Exists、DoesNotExist、Gt、Ltのオペレーターが使用できます。 nodeNameはPodSpecのフィールドです。

Pod Affinityは、「キーが”security”、値が”S1”のラベルが付与されたPodが少なくとも1つは稼働しているNodeが同じゾーンにあれば、PodはそのNodeにスケジュールされる」という条件を指定しています(より正確には、キーが”security”、値が”S1”のラベルが付与されたPodが稼働しており、キーがfailure-domain.beta.kubernetes.io/zone、値がVであるNodeが少なくとも1つはある状態で、 Pod AffinityとPod Anti-Affinityや、requiredDuringSchedulingIgnoredDuringExecutionとpreferredDuringSchedulingIgnoredDuringExecutionに関する他の使用例はデザインドックを参照してください。, Pod AffinityとPod Anti-Affinityで使用できるオペレーターは、In、NotIn、 Exists、 DoesNotExistです。.

この例では、KubernetesのPod に ... RESTARTS AGE IP NODE redis-cache-1450370735-6dzlj 1/1 Running 0 8m 10.192.4.2 kube-node-3 redis-cache-1450370735-j2j96 1/1 Running 0 8m 10.192.2.2 kube-node-1 redis-cache-1450370735-z73mh 1/1 Running 0 8m 10.192.3.1 kube-node-2 web-server-1287567482-5d4dz 1/1 Running 0 7m 10.192.2.3 kube-node-1 web-server-1287567482-6f7v5 1/1 Running 0 7m 10.192.4… Podのコンテナ群はひとつのIPアドレスとポート空間を共有し、いつも一緒にスケジュールされ配置され、同じNode上で起動します。, PodはKubernetesにおける最小の単位です。

labels にKey/Valueの形で指定する。. 全てのレプリカがapp=storeのラベルが付与されたPodと同じゾーンで稼働するよう、スケジューラーに設定されます。 ここに値が設定されると、schedulerはそのPodを考慮しなくなり、その名前が付与されているNodeのkubeletはPodを稼働させようとします。

Node Nがキーfailure-domain.beta.kubernetes.io/zone、値Vのラベルを持つ場合に、PodはNode Nで稼働させることができます)。 Configuring your kubernetes cluster to self-host the control plane, kubesprayを使ったオンプレミス/クラウドプロバイダへのKubernetesのインストール, IBM Cloud Privateを使ってマルチクラウドでKubernetesを動かす, Guide for adding Windows Nodes in Kubernetes, 終了したリソースのためのTTLコントローラー(TTL Controller for Finished Resources), HostAliasesを使用してPodの/etc/hostsにエントリーを追加する, ボリュームの動的プロビジョニング(Dynamic Volume Provisioning), Organizing Cluster Access Using kubeconfig Files, Resource Bin Packing for Extended Resources, Compute, Storage, and Networking Extensions, Configure GMSA for Windows Pods and containers, Configure RunAsUserName for Windows pods and containers, Configure a Pod to Use a PersistentVolume for Storage, Configure a Security Context for a Pod or Container, Liveness Probe、Readiness ProbeおよびStartup Probeを使用する, Translate a Docker Compose File to Kubernetes Resources, Configure Default Memory Requests and Limits for a Namespace, Configure Default CPU Requests and Limits for a Namespace, Configure Minimum and Maximum Memory Constraints for a Namespace, Configure Minimum and Maximum CPU Constraints for a Namespace, Configure Memory and CPU Quotas for a Namespace, Change the Reclaim Policy of a PersistentVolume, Control CPU Management Policies on the Node, Control Topology Management Policies on a node, Guaranteed Scheduling For Critical Add-On Pods, Reconfigure a Node's Kubelet in a Live Cluster, Reserve Compute Resources for System Daemons, Safely Drain a Node while Respecting the PodDisruptionBudget, Set up High-Availability Kubernetes Masters, Declarative Management of Kubernetes Objects Using Configuration Files, Declarative Management of Kubernetes Objects Using Kustomize, Managing Kubernetes Objects Using Imperative Commands, Imperative Management of Kubernetes Objects Using Configuration Files, Update API Objects in Place Using kubectl patch, Define a Command and Arguments for a Container, Expose Pod Information to Containers Through Files, Distribute Credentials Securely Using Secrets, Inject Information into Pods Using a PodPreset, Specifying a Disruption Budget for your Application, Coarse Parallel Processing Using a Work Queue, Fine Parallel Processing Using a Work Queue, Use Port Forwarding to Access Applications in a Cluster, Minikube上でNGINX Ingressコントローラーを使用してIngressをセットアップする, Developing and debugging services locally, Extend the Kubernetes API with CustomResourceDefinitions, Use an HTTP Proxy to Access the Kubernetes API, Externalizing config using MicroProfile, ConfigMaps and Secrets, Interactive Tutorial - Configuring a Java Microservice, 例: PHP / Redisを使用したゲストブックの例にロギングとメトリクスを追加する, 例: Persistent Volumeを使用したWordpressとMySQLをデプロイする, Running ZooKeeper, A Distributed System Coordinator, Restrict a Container's Access to Resources with AppArmor, Restrict a Container's Syscalls with Seccomp, Kubernetes Security and Disclosure Information, Well-Known Labels, Annotations and Taints, Contributing to the Upstream Kubernetes Code, Generating Reference Documentation for the Kubernetes API, Generating Reference Documentation for kubectl Commands, Generating Reference Pages for Kubernetes Components and Tools, Update content/ja/docs/tasks/configure-pod-container/assign-pods-nodes.md (0de2cecac). Node障害の場合は、同一のPod(群)がクラスタ内の他の利用可能なNodeにスケジュールされます。, Podは必ずNode上で実行されます。 Yはnamespaceのリストで指定したLabelSelectorで表されます。

この記事は Kubernetes道場 Advent Calendar 2018 17日目の記事です。, 今回はLabel / NodeSelector / Annotationについて。, Labelはkey/valueの組み合わせKubernetesオブジェクトに指定することができる。, システムに直結する意味合いを持つ設定ではなく、 LabelSelectorなどで使ってきたが、オブジェクトの選択やサブセットの指定などで使用される。, LabelのKeyは/ を使って2つのセグメントに分割して表現することができる。/ より前をPrefix、後をNameと呼ぶ。, PrefixはDNS_LABELに従った253文字以下の文字列である。Prefixを省略すると、ユーザー固有のものとして扱われる。, 要は最初と最後はアルファベットか数字、間の文字ではそれらに加えて - / _ / .

For example, a Pod might include both the container with your Node.js app as well as a different container that feeds the data to be published by the Node.js webserver.

スケジューラーが最適な配置を選択するため、一般的にはこのような制限は不要です(例えば、複数のPodを別々のNodeへデプロイしたり、Podを配置する際にリソースが不十分なNodeにはデプロイされないことが挙げられます)が、 or

将来的には、requiredDuringSchedulingIgnoredDuringExecutionに、PodのNode Affinityに記された必須要件を満たさなくなったNodeからそのPodを退避させることができる機能を備えたrequiredDuringSchedulingRequiredDuringExecutionが提供される予定です。, それぞれの使用例として、 これは、安全性が損なわれたNodeがkubeletの認証情報をNodeのオブジェクトに設定したり、スケジューラーがそのようなNodeにデプロイすることを防ぎます。, NodeRestrictionプラグインは、kubeletがnode-restriction.kubernetes.io/プレフィックスを有するラベルの設定や上書きを防ぎます。 「Kubernetes」は2014年の登場以来順調に利用者を増やしており、現在ではコンテナ管理ツールのデファクトスタンダードとなっている。新機能や関連ツールなどの開発も活発だ。そこで本記事では、ここ最新導入されたKubernetesの新機能や特徴を紹介するとともに、導入ツール「kubeadm」による最新版Kubernetesの環境構築方法を紹介する。, Kubernetesについては以前にも紹介しているが、ここで改めてその概要や背景にある技術について簡単ではあるが紹介しておこう。, Kubernetesは、複数台のコンピュータをネットワークで接続した「クラスタ環境」を使い、「ノード」と呼ばれるクラスタ内のコンピュータ上で実行されるサーバーソフトウェアを管理するソフトウェアシステムだ(図1)。, 最近ではコンピュータの低価格化により、少数の超高性能なコンピュータでシステムを構築するよりも、低価格でそれなりの性能のコンピュータを多数組み合わせてシステムを構築するほうがコストパフォーマンス的に優位なことが多い。また、冗長にシステムを構築することで、一部のコンピュータが故障した場合でもほかのコンピュータがその役割を肩代わりしてシステム全体では正常動作を続けられるような構成が現実的に可能だということが証明されている。Kubernetesはこうした構成のクラスタを構築するのに向いており、特に最近注目されているマイクロサービスアーキテクチャとの相性も良いため、採用例が増えている。, なお、Kubernetesは、基本的には複数台のコンピュータを組み合わせて構築したクラスタ環境で利用する。テストや実験のために1台のみでクラスタを構築することも可能ではあるものの、この場合Kubernetesクラスタを構築するメリットはほぼない。, さて、このように多数のコンピュータを組み合わせてシステムを構築する場合、使用するすべてのコンピュータをすべて完全に同一のハードウェアでそろえようとすると、運用コストが高くなることが見込まれる。運用開始時にすべて同一のハードウェアでそろえることは難しくないが、たとえば一定期間の経過後に故障したハードウェアを取り替えたり、追加でハードウェアを投入したりするといったことはよくある話だ。その場合、完全に同一のハードウェアを入手することが難しくなっている可能性がある。また、より高性能なコンピュータを追加したいといったケースもあるだろう。さらに、ハードウェアだけでなくOS/カーネルのバージョンについても、異なるものが混在できるほうが好ましい。そこでKubernetesでは、「コンテナ」という技術を使い、ソフトウェアの実行環境をハードウェアやOSに依存しないようにしている。, コンテナというと一般的には物を入れる箱のようなイメージだが、ここではあらかじめ指定された以外のリソースにアクセスできないように制限をかけてアプリケーションを実行する仕組みをコンテナ技術と呼び、閉じ込めたリソースをコンテナと呼ぶ(図2)。, 箱(コンテナ)の中にアプリケーションの実行に必要なすべてのプログラムやライブラリ、設定ファイル、各種リソースなどを閉じ込めて、プログラムからはコンテナ内にあるものしか利用できない、といったものをイメージしてもらうと分かりやすいだろう。また、コンテナ技術ではコンテナで使用するプログラムや各種設定ファイル、依存ライブラリなどを「イメージファイル」として管理することで、容易に必要なリソースを配布する仕組みも用意されている。, コンテナを使ってアプリケーションを実行させる場合、そのアプリケーションは基本的にコンテナ外のリソースにアクセスすることができない。つまりコンテナを利用することでハードウェアやOSのバージョン、インストールされているライブラリといったコンテナ外の環境に影響されずにアプリケーションを実行できるようになり、結果的にアプリケーションのハードウェアやOSへの依存性を減らすことができる。, こういったコンテナ技術は複数が開発されており、Kubernetesも特定のコンテナ技術に依存しないように開発されているが、多くのKubernetes環境では現在主流となっているコンテナ技術である「Docker」と組み合わせて運用されている。, Dockerではイメージファイルを共有・公開する「DockerHub」というサービスも提供されている。ここではApache HTTP ServerやNGINX、MySQLといったよく使われるアプリケーションのイメージファイルが公開されており、これらを利用することで簡単にコンテナを用意できる。, なお、コンテナではOSのカーネルだけは共有するため、カーネルのバージョンやカーネルビルド時の設定などの影響は受けるものの、多くの場合でこの影響は小さい。, Kubernetesでは、実行するアプリケーションや各種設定などは「リソースオブジェクト(resource object)」(単に「リソース」などとも呼ばれる)という単位で定義・管理する。主なリソースとしては表1のものがあり、たとえば使用するコンテナや実行するプログラムは「Pod」というリソースで定義・管理する。, Kubernetesが標準で提供するリソースの一覧はAPIドキュメントで確認できる。また、独自のリソースを定義して利用することもできる。, Kubernetesでは、「マニフェスト(manifest)」と呼ばれる形式で各種リソースを定義する。マニフェストは木(ツリー)構造で表現できるデータであり、たとえばコマンドラインツール「kubectl」ではYAML形式で記述されたマニフェストを元にリソースの作成や削除、変更といった操作を行える。, kubectlの使い方についてはドキュメントを参照して欲しいが、たとえば、DockerHubで公開されている「httpd」コンテナイメージを利用してApache HTTP Serverを実行させるには、まず次のようなマニフェストファイルを用意する。, このファイルを指定して「kubectl apply -f <マニフェストファイル>」コマンドを実行することでPodリソースが作成され、その内容に応じて以下のような処理が実行される。, また、作成したコンテナを削除するには「kubectl delete -f <マニフェストファイル>」コマンドを実行すれば良い。, この一連の作業はすべてKubernetesによって自動的に行われるため、明示的にマニフェストで指定しない限りはどのノード上でプログラムが動作するのか、またIPアドレスなどのリソースがどのように割り当てられるかといった情報を事前に知ることはできない。そのため、コンテナ間の通信や外部からのコンテナへの通信は「Service」と呼ばれる、ネットワークルーティングを管理するためのリソースを使って制御することになる。, Kubernetesで2015年7月にバージョン1.0がリリースされ、基本的な機能がほぼ完成した。その後性能向上や管理機能の強化などが続けられているが、ここ最近で安定扱いとなった大きな新機能としては次が挙げられる。, 今回はこの中でも、Kubernetesクラスタを構築するためのツールである「kubeadm」について紹介していく。, 昨今では設定済みのKubernetesクラスタを提供するクラウドサービスも多くあるが、いっぽうで自ら管理しているサーバーでアプリケーションを実行したいという需要もあるだろう。その場合、自前でKubernetesクラスタを構築する必要がある。Kubernetesクラスタの環境構築についてはいくつかの方法があり、Kubernetes公式ドキュメントでは構築方法を選ぶためのガイドページも用意されているが、自ら管理しているサーバーで構築するための代表的な方法としては以下が挙げられる。, Linuxディストリビューションで提供されているKubernetes関連パッケージを使う例については以前の記事で紹介している。こちらはやや古い情報となるが、現在でもおおむね同じ手順で作業が可能だ。ただし、Linuxディストリビューションによっては提供されているKubernetes関連パッケージのバージョンが古い場合がある点には注意が必要だ。たとえば記事執筆時のKubernetesの最新バージョンは1.13系だが、CentOS 7で提供されているパッケージは2016年にリリースされたバージョン1.5系をベースとしたものでかなり古い。Debian Linuxでは開発版(unstable)でのみの提供となっており、2017年リリースのバージョン1.7系がベースだ。Fedoraでは比較的新しいバージョンのパッケージが提供されているが、それでもFedora 29(2018年11月リリース)で提供されているのはv1.10ベースのパッケージとなっている。, 「Minikube」を利用する方法は、以前『簡単にローカルKubernetes環境を構築できるツール「Minikube」』という記事で紹介したが、こちらはVirtualBoxなどの仮想化ソフトウェアを使ってローカルマシン上にテスト用にKubernetes環境を作るもので、複数台構成のクラスタを作るのには適していない。, 「conjure-up」はUbuntuなどで推奨されている方法で(Ubuntuのドキュメント)、conjure-upという環境構築ツールを使ってKubernetesのインストール作業を自動で行うというものだ。, また、「Tectonic」はCoreOSが提供しているKubernetesディストリビューションで、10ノードまでのクラスタであれば無料で利用できる。商用ソリューションということで独自の管理機能なども提供されている。, 最後の「kubeadm」は、Kubernetesが提供しているKubernetes環境構築ツールだ(公式ドキュメント)。対応するOSがUbuntu 16.04以上、Debian 9(Stretch)、CentOS 7、Red Hat Enterprise Linux 7、Fedora 25/26などと幅広く、また公式ツールということで、最新バージョンのKubernetes環境のインストールが可能という特徴がある。「kubeadm」というコマンドラインツールで操作を行う点と、多数のインストールオプションがあるためにやや難しい印象もあるが、ポイントさえ押さえてしまえば比較的容易にクラスタを構築できる。, ということで、以下ではこのkubeadmを使ったKubernetesクラスタ構築の流れを紹介していく。, kubeadmは2016年9月にリリースされたKubernetes 1.4から導入されたツールで、2017年3月にリリースされたKubernetes 1.6でベータ扱いに、2018年12月にリリースされたKubernetes 1.13で主要機能がGA(General Availability、一般利用可能)というステータスとなっている。, Kubernetes環境を構築する際には、クラスタを構成する各ノードに「kubelet」や「flanneld」といったノード管理用コンポーネントをインストールし、さらにクラスタ管理用のノード(マスターノード)には「apiserver」や「controller-manager」、「scheduler」といったKubernetesクラスタの管理用コンポーネントやetcdといった設定管理用のデータベースをインストールする必要がある。kubeadmではこれらの作業を簡単なオプション指定のみで実行でき、さらに各種設定も自動で実行できる。, Kubernetesクラスタを構築する際の各クラスタノードのハードウェアおよびOS要件として、ドキュメントでは次が挙げられている。, ドキュメントではMACアドレスや「product_uuid」(カーネルによって生成されるシステム固有のID)、ホスト名が各ホストで重複せずユニークであるという条件も記載されているが、一般的な環境ではこれらが重複することはないのであまり気にしなくても良いだろう。なお、これらは以下のようにして確認できる。, ホスト名については、そのホスト名から対応するIPアドレスを取得できるよう設定されている必要がある。DNSサーバーで適切な設定を行っておくか、もしくは/etc/hostsファイルにホスト名と割り当てているIPアドレスの組を追加しておこう。, これに加えて、swapを無効にしておく必要もある。swapを無効にするにはいくつかのやり方があるが、/etc/fstabファイルを編集してtypeが「swap」になっている行をコメントアウトし再起動するのが確実だ。, たとえば次の例では、「UUID=36f795f8-cb44-49c2-8e05-95c306653c28」で始まる行がswapに関する設定なので、この行の先頭に「#」を入れてコメントアウトしている。, 「swapoff -a」コマンドでもswapを無効化できるが、この場合システムを再起動すると再度swapが有効になってしまうので注意したい。, ネットワークブリッジを通過するパケットに対しiptablesルールを適用するかどうかを指定するカーネルパラメータ「net.bridge.bridge-nf-call-iptables」も次のように確認しておこう。, Kubernetesでは複数のコンテナ技術がサポートされており、別途使用するコンテナソフトウェアやランライムインターフェイス(CRI)を用意する必要がある。Dockerのほか「containerd」や「cri-o」、「frakti」といったコンテナ技術がサポートされているが、今回はKubernetesがデフォルトで対応しているDockerを利用することにする。Kubernetesのインストール前に、クラスタの各ノードにDockerをインストールしておこう。たとえばDebianやUbuntuでは、次のようにしてDockerをインストールできる。, なお、Debianでは安定版パッケージとして提供されているDockerのバージョンがやや古いため、テスト版(testing)のパッケージを導入すると良いだろう。テスト版のDockerを導入するには、デフォルトでは安定版のパッケージを使用するよう設定ファイルを作成したうえで、テスト版を利用するための設定ファイルを追加する。, この状態で「apt-get update」コマンドを実行後、「docker.io/testing」のようにパッケージ名を指定して「apt-get install」コマンドを実行することで、テスト版のDockerをインストールできる。, また、記事執筆時点ではCentOS 7で提供されているDockerの最新版には不具合があり、Kubernetesと組み合わせた際に正常に動作しない問題があるようだ(KubernetesのIssueトラッカー)。次のように「docker -v」コマンドを実行した場合に「build 07f3374/1.13.1」と表示された場合、問題が発生する可能性がある。, この問題は、次のように「yum downgrade」コマンドを実行して古いバージョンのものに入れ替えることで対処できる。, Kubernetesでは独自の仮想ネットワークが使用されるが、この仮想ネットワークで使用されるIPアドレスがほかのネットワークとは重複しないよう、クラスタ構築時に適切な設定を行っておく必要がある。重複の可能性があるネットワークとしては、各クラスタノードが物理的に接続しているネットワークや、Dockerが使用する仮想ネットワークがある。, 物理的に接続しているネットワークについては分かりやすいが、見落としやすいのがDockerが使用する仮想ネットワークだ。Dockerではデフォルトで仮想ネットワークに接続するためのネットワークブリッジを作成する。このネットワークブリッジの情報は、次のようにして確認できる。, この例では、使用する仮想ネットワークとして「172.17.0.0/16」が設定されている。この場合、Kubernetesで「172.17.0.0/16」に含まれるIPアドレスを使用しようとすると問題が発生することがある。そのため、後述するように別のIPアドレス範囲を使用するよう明示的に設定することをおすすめする。, kubeadmでKubernetesクラスタを構築するには、まずクラスタを構成するすべてのノードにkubeadmをインストールする必要がある。kubeadmは、Googleが提供しているパッケージリポジトリ経由でインストールできる。, DebianやUbuntuなどdeb形式のパッケージを利用する場合、次のようにしてGPG鍵のダウンロードと設定ファイルの追加を行えば良い。, CentOS 7やFedoraの場合、まず「/etc/yum.repos.d/kubernetes.repo」として次のような設定ファイルを作成する。, 続いてyumコマンド(Fedoraの場合はdnfコマンド)でkubeadmパッケージをインストールする。, なお、このリポジトリではKubernetesを操作するためのコマンドラインインターフェイスである「kubectl」が同名のパッケージで提供されている。マスターノードにはこちらもインストールをしておこう。, クラスタの設定を行う前に、各クラスタノードのファイアウォール設定を変更し適切にKubernetesが使用するパケットを許可するよう設定しておこう。Kubernetesがどのポートを使用するかはドキュメントに記載されているが、クラスタ内から表2、3のポートへのアクセスを許可しておけば良い。, なお、もしクラスタ内でプライベートなネットワークを利用できる場合、そのプライベートネットワークからのパケットをすべて許可するよう設定しても良いだろう。その場合、Kubernetesでは実際にそのプライベートなネットワークに割り当てられているIPアドレスに加えて、Kubernetesが使用する仮想ネットワークのIPアドレスも許可する発信元として指定しておく必要がある。, たとえばファイアウォールの設定をfirewalldで行っており、クラスタノードとなる各ホストが「192.168.1.0/24」というネットワークに接続されており、Kubernetesが使用する仮想ネットワークが「10.128.0.0/16」の場合、次のようにこれらを「trusted」ゾーンとして指定すれば良い。, kubeadmのインストールが完了したら、続いてマスターノードで「kubeadm init」コマンドを実行しセットアップを行っていく。kubeadm initコマンドでは、以下のような処理を自動的に実行できる。, なお、これらの詳細や指定できるコマンドラインオプションは「kubeadm init --help」コマンドを実行することで確認できる。, 「kubeadm init」コマンドではいくつかのオプションが用意されている(表4)。ホストに複数のネットワークインターフェイスが接続されており、片方のネットワークインターフェイス経由でしかほかのクラスタノードと通信できない場合は「--apiserver-advertise-address」オプションで他ノードと接続できるネットワークインターフェイスに割り当てられているIPアドレスを指定する。また、KubernetesのPod(コンテナ)に割り当てるIPアドレス範囲は「--pod-network-cidr」オプションで指定できる。前述のとおり、これはほかの既存ネットワークで使用されるIPアドレスとは重複しないものを設定しておこう。, たとえばほかのクラスタノードと接続されているネットワークインターフェイスに「192.168.1.100」というIPアドレスが割り当てられており、またPodに割り当てるIPアドレス範囲を「10.128.0.0/16」とする場合、次のように実行する。, さて、kubeadm initコマンドを実行すると、そのホストの環境がKubernetesの動作に必要な条件を満たしているかがチェックされ、もし問題が見つかった場合はその旨が表示される。その場合、その指示に従って必要な対処を行い、その後「kubeadm reset」コマンドを実行して設定をリセットしてから再度kubeadm initコマンドを実行する。, ここで、最後に「kubeadm join 192.168.1.100:6443 --token 4f2l52.00o3b9d3tw7i4wgv --discovery-token-ca-cert-hash sha256:bc993e1898329a4a5ebd2c4a9b0f6d8766bce00ac850f439ca7cc8cb6c3e9897」と表示されているが、これが非マスタノードをクラスタに参加させる際に実行するコマンドとなる。引数の「--token」および「--discoverty-token-ca-cert-hash」以下の部分は環境によって変わるので注意したい。, また、Kubernetesの設定フロントエンドであるkubectl向けの設定ファイルが/etc/kubernetes/admin.confとして作成されているので、これを次のようにしてKubernetesの管理に使用するユーザーのホームディレクトリにコピーする。, これで、指定したユーザーでkubectlコマンドを使ってクラスタにアクセスできるようになる。たとえば「kubectl get node」コマンドを実行すると、ノードの状態を確認できるはずだ。, なお、この時点ではまだネットワーク関連の設定が完了していないため、マスターノードは利用できない(NotReady)状態となっている。, 続いて、コンテナ間の通信を行うための仮想ネットワークに関する設定を行っていく。仮想ネットワークとしてはいくつかのものが利用できるが、今回は一般的に利用されているflannelを利用することにする。flannelを利用するための設定ファイルはGitHub上で公開されているので、次のようにしてまずこれをダウンロードする。, 続いてこのファイルをエディタで開き、「net-conf.json: |」以下の「”Network”」の値を、kubeadm initコマンド実行時に「--pod-network-cidr」オプションで指定したものに変更する。先の例では「10.128.0.0/16」と指定していたので、次のようになる。, 変更の保存後に次のように実行することでコンテナ内でflannelサービスが実行され、仮想ネットワークが利用できるようになる。, この状態で「kubectl get node」コマンドを実行すると、「STATUS」が「Ready」となり、ノードが利用できる状態になっていることが確認できる。, なお、このネットワーク設定を行った後にkubeadm resetコマンドを実行してクラスタを作り直す場合、以下のようにして作成された「flannel.1」や「cni0」という仮想ネットワークインターフェイスを先に削除しておく必要がある。, マスターノードのセットアップが完了したら、続いてほかのクラスタ参加ノードの設定もおこなっていこう。クラスタに参加させたいノードで、次のように「kubeadm join」コマンドを実行する。, ここで使用するトークンや証明書ハッシュはマスターノードでのkubeadm initコマンド実行時に表示されたものを指定すれば良い。また、この作業はクラスタに参加させるすべてのノードで実行する必要がある。, なお、トークンには有効期限があり、通常は24時間で利用できなくなる。もしトークンが失効した場合や分からなくなった場合、マスターノードで「kubeadm token create --print-join-command」コマンドを実行するとトークンが再生成されて表示される。, 最後にマスターノードで次のように「kubectl get node」コマンドを実行し、ノードがクラスタに参加したことを確認しておこう。, このように、kubeadmでは各ノード「kubeadm init」や「kubeadm join」といったコマンドを実行するだけでクラスタの構築が行える。ただし、これらは各Linuxディストリビューションが公式にサポートしているわけではないため、不具合等が発生する可能性がある点には注意したい。また、Kubernetesでは複雑なルーティングを行うため、ファイアウォール関連の設定も難しい。もしネットワーク関連で問題が発生したら、一度ファイアウォールを無効にして試すと行った問題の切り分けを行うことをおすすめする。, Podに割り当てるIPアドレスの範囲を指定する。任意のものが指定できるが、既存のネットワークとは重複しない必要がある, Serviceで使用するIPアドレス範囲を指定する(デフォルトは「10.96.0.0/12」), DNSで使用するドメイン名を指定する(デフォルトは「cluster.local」), IPVS(IP Virtual Server)によるネットワークルーティング(バージョン1.11), Linuxディストリビューションで提供されているKubernetes関連パッケージを使用, Ubuntu 16.04以降/Debian 9/CentOS 7/Red Hat Enterprise Linux 7/Fedora 25および26/HypriotOS v1.0.1以降/Container Linux, Kubernetesの各種コンポーネントを実行するのに必要な条件を満たしているかのチェック, etcd、apiserver、controller-manager、schedulerといったコンポーネントをコンテナ上で起動.

バスケットボール 略 英語 10, 多肉 ダニ ベニカ 10, ドイツ 名前 順番 34, 広末涼子息子 バスケ 写真 4, ミッシェル バンドリ イラスト 6, Daas 個人向け 比較 17, Fifa20 能力値 日本人 31, シーモア 3倍 いつ 7, 体調 良好 対義語 22, ロボット じゃ ない ~君に夢中 Bs 4, 内定辞退 メール 電話 両方 5, News Every 陣内貴美子 休み 12, 広瀬すず 最新 写真 4, アルタン エタノール製剤 78 6, Pixiv 漫画 ダウンロード 5, 星野源 日村 バースデーソング Sun 15, ラチェット音 爆音 ホイール 13, ブラマヨ小杉 消え た 14, フジテレビ 山崎アナ 旦那 4, ポケモンgo Scp アプリ 16, 村井 慎一郎 解任 50, クロバット 技 ソウルシルバー 17, ひかりtv Iphone ミラーリング 4, 長野 テント メーカー 9, Iggy Pop The Passenger 和訳 6, スズキ Cm 2019 9, キバナ 夢小説 浮気 11, ハローワーク 京都 シニア 求人 5, Teamviewer Quicksupport 操作できない 26,

Leave a Comment

What Payment Processing Hardware do you Need?