
Kubernetesは、オープンソースのコンテナーオーケストレーションフレームワークです。 コンテナ管理環境の作成分野でのGoogleの豊富な経験を考慮して作成されており、産業運用に対応したクラスタでコンテナ化されたアプリケーションを実行できます。 Kubernetesエンジンには、アプリケーションやワークロードはもちろんのこと、さまざまなシステムコンポーネント、ネットワークトランスポートドライバー、コマンドラインユーティリティなど、多くの可動部分とその構成方法があります。
この記事では、Ubuntu 16.04を実行している実際の(非仮想)マシンに約10分でKubernetes 1.6をインストールします。 その結果、kubectl
CLIを介してKubernetesと対話する方法を学習する機会があります。
Kubernetesレビュー:

ジュリアエヴァンスによるKubernetesのコンポーネント
何が必要ですか
クラスターを展開するには、Packetサービスの物理マシンを使用することをお勧めします。 Ubuntu 16.04がオペレーティングシステムとしてインストールされている場合、仮想マシンまたはホームコンピューターで説明した手順に従うこともできます。
Packet.netに移動して、新しいプロジェクトを作成します。 この記事の目的には、タイプ0ホストで十分です(4個のAtomコアと8GBのRAM、1時間あたり0.05ドル)。
ホストをセットアップするときは、OSとしてUbuntu 16.04を選択してください。 Dockerとは異なり、Swarm Kubernetesは実績のあるDockerリリースでより適切に動作します。 さいわい、Ubuntu aptリポジトリにはDocker 1.12.6が含まれています。
- Dockerをインストールします。
$ apt-get update && apt-get install -qy docker.io
このホストでDockerを更新しないでください。 CIツールキットまたはラップトップでイメージを組み立てるために、より新しいバージョンを使用できます。
設置
- Kubernetes aptリポジトリをインストールします。
$ apt-get update && apt-get install -y apt-transport-https $ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - OK $ cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF
次に、 apt-get update
コマンドを使用してパッケージのリストを更新します。
-
kubelet
、kubeadm
およびkubernetes-cni
をインストールします。
kubelet
は、クラスターホストでコンテナーを実行する役割をkubelet
ます。 kubeadm
は、クラスターを構成するさまざまなコンポーネントを構成するための便利なユーティリティであり、ネットワークコンポーネントをkubernetes-cni
必要です。
CNIはContainer Networking Interfaceの略で、ネットワークドライバーがKubernetesと通信する方法を定義する仕様です。
$ apt-get update $ apt-get install -y kubelet kubeadm kubernetes-cni
-
kubeadm
てクラスターを初期化します。
ドキュメントから:
kubeadmは、RBACなどのメカニズムを使用して、すぐに安全なクラスターを作成するように設計されています。
Docker Swarmにはデフォルトでオーバーレイネットワークドライバーがありますが、 kubeadm
ソリューションが私たちのものです。 チームはまだ指示の更新に取り組んでいるので、ドッカーの1つであるCoreOSフランネルに最も類似したドライバーの使用方法を示します。
フランネル
Flannelでは、Linuxカーネルモジュールoverlay
とipvlan
を使用して、ソフトウェア定義ネットワーク(SDN)を編成できます。
Packetでは、マシンは2つのネットワークに接続します。1つは特定の地域とプロジェクトに属するホストを接続するデータセンターネットワークで、2つ目はインターネットへのアクセスです。 ファイアウォールはデフォルトでは設定されていないため、ネットワークアクティビティを制限する場合は、 iptables
またはufw
手動で設定する必要があります。
内部IPアドレスはifconfig
を使用しifconfig
決定できます。
root@kubeadm:~# ifconfig bond0:0 bond0:0 Link encap:Ethernet HWaddr 0c:c4:7a:e5:48:d4 inet addr:10.80.75.9 Bcast:255.255.255.255 Mask:255.255.255.254 UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
この内部IPアドレスを使用して、Kubernetes APIを変換します。
$ kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=10.80.75.9 --skip-preflight-checks --kubernetes-version stable-1.6
-
--pod-network-cidr
、--pod-network-cidr
ドライバーに必要であり、コンテナーのアドレス空間を定義します。 -
--apiserver-advertise-address
は、KubernetesがAPIサーバーとしてアドバタイズするIPアドレスを指定します。 -
--skip-preflight-checks
kubeadm
--skip-preflight-checks
使用すると、kubeadm
は必要な機能についてホストカーネルをチェックしません。 これは、Packetホストにカーネルメタデータがないためです。 -
--kubernetes-version stable-1.6
は、クラスターバージョン(この場合は1.6)を厳密に決定します。 たとえば、Kubernetes 1.7を使用する場合は、このフラグをスキップします。
出力で得られるものは次のとおりです。
[init] Using Kubernetes version: v1.6.6 [init] Using Authorization mode: RBAC [preflight] Skipping pre-flight checks [certificates] Generated CA certificate and key. [certificates] Generated API server certificate and key. [certificates] API Server serving cert is signed for DNS names [kubeadm kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.80.75.9] [certificates] Generated API server kubelet client certificate and key. [certificates] Generated service account token signing key and public key. [certificates] Generated front-proxy CA certificate and key. [certificates] Generated front-proxy client certificate and key. [certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki" [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf" [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/controller-manager.conf" [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/scheduler.conf" [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf" [apiclient] Created API client, waiting for the control plane to become ready [apiclient] All control plane components are healthy after 36.795038 seconds [apiclient] Waiting for at least one node to register [apiclient] First node has registered after 3.508700 seconds [token] Using token: 02d204.3998037a42ac8108 [apiconfig] Created RBAC rules [addons] Created essential addon: kube-proxy [addons] Created essential addon: kube-dns Your Kubernetes master has initialized successfully! To start using your cluster, you need to run (as a regular user): sudo cp /etc/kubernetes/admin.conf $HOME/ sudo chown $(id -u):$(id -g) $HOME/admin.conf export KUBECONFIG=$HOME/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: http://kubernetes.io/docs/admin/addons/ You can now join any number of machines by running the following on each node as root: kubeadm join --token 02d204.3998037a42ac8108 10.80.75.9:6443
- 非特権ユーザーを作成します。
Packet Ubuntuをインストールする一般ユーザーはいないので、作成してみましょう。
# useradd packet -G sudo -m -s /bin/bash # passwd packet
- 新しいユーザーの環境変数を設定します。
ここで、クラスターの作成に関する上記のメッセージを使用して、環境変数を設定できます。
新しいユーザーとしてログインします: sudo su packet
$ cd $HOME $ sudo whoami $ sudo cp /etc/kubernetes/admin.conf $HOME/ $ sudo chown $(id -u):$(id -g) $HOME/admin.conf $ export KUBECONFIG=$HOME/admin.conf $ echo "export KUBECONFIG=$HOME/admin.conf" | tee -a ~/.bashrc
- 囲炉裏(フランネル)のネットワーク構成を適用します。
次に、 kubectl
とフランネルのドキュメントからの2つのエントリを使用して、クラスターにネットワーク構成を適用します。
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel-rbac.yml clusterrole "flannel" created clusterrolebinding "flannel" created $ kubectl create -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml serviceaccount "flannel" created configmap "kube-flannel-cfg" created daemonset "kube-flannel-ds" created
囲炉裏ネットワークが構成されます。
- 単一ホストクラスターの使用を許可します。
通常、Kubernetesクラスターには複数のホストが含まれるため、デフォルトでは、ウィザードでコンテナーを起動できません。 ただし、ノードは1つしかないので、 taint
操作を使用して、その上でコンテナーを起動できるようにします。
$ kubectl taint nodes --all node-role.kubernetes.io/master-
または、kubeadm
の出力からのjoin token
を使用して、クラスターに2番目のマシンを追加できます。
- クラスターが機能していることを確認します。
多くのKubernetesコンポーネントは、非表示のkube-system
名前空間でクラスターコンテナーとして実行されます。 それらに関する情報は、次のように表示できます。
$ kubectl get all --namespace=kube-system NAME READY STATUS RESTARTS AGE po/etcd-kubeadm 1/1 Running 0 12m po/kube-apiserver-kubeadm 1/1 Running 0 12m po/kube-controller-manager-kubeadm 1/1 Running 0 13m po/kube-dns-692378583-kqvdd 3/3 Running 0 13m po/kube-flannel-ds-w9xvp 2/2 Running 0 1m po/kube-proxy-4vgwp 1/1 Running 0 13m po/kube-scheduler-kubeadm 1/1 Running 0 13m NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/kube-dns 10.96.0.10 <none> 53/UDP,53/TCP 14m NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deploy/kube-dns 1 1 1 1 14m NAME DESIRED CURRENT READY AGE rs/kube-dns-692378583 1 1 1 13m
リストからわかるように、すべてのサービスはRunning
状態にあります。つまり、すべてがクラスターで正常に機能しています。 これらのコンポーネントがインターネットからのダウンロード状態にある場合、まだ実行されていない可能性があります。
コンテナを実行
これで、クラスターでコンテナーを開始できます。 Kubernetesでは、コンテナは共有IPアドレスを使用するポッドに編成され、同じノード(ホスト)にバインドされ、共有ボリュームを使用できます。
実行中の炉(コンテナ)がないことを確認します。
$ kubectl get pods
ここで、 kubectl run
を使用してコンテナを起動します。 HTTP GUIDを生成するNode.jsおよびExpress.jsマイクロサービスをデプロイします。
このコードは、もともとDocker Swarmチュートリアル用に作成されました。 対応するソースはこのリンクで見つけることができます: Docker 1.12 Swarmモードで実際のマイクロサービスをスケーリングします
$ kubectl run guids --image=alexellis2/guid-service:latest --port 9000 deployment "guids" created
これで、[ Name
列で、新しい囲炉裏に割り当てられた名前と、いつ起動されたかを確認できます。
$ kubectl get pods NAME READY STATUS RESTARTS AGE guids-2617315942-lzwdh 0/1 Pending 0 11s
Name
を使用して、囲炉裏の状態を確認します。
$ kubectl describe pod guids-2617315942-lzwdh ... Pulling pulling image "alexellis2/guid-service:latest" ...
動作するコンテナができたら、IPアドレスを取得し、 curl
を使用して生成された識別子を取得できます。
$ kubectl describe pod guids-2617315942-lzwdh | grep IP: IP: 10.244.0.3 $ curl http://10.244.0.3:9000/guid ; echo {"guid":"4659819e-cf00-4b45-99d1a9f81bdcf6ae","container":"guids-2617315942-lzwdh"} $ curl http://10.244.0.3:9000/guid ; echo {"guid":"1604b4cb-88d2-49e2-bd38-73b589da0469","container":"guids-2617315942-lzwdh"}
囲炉裏のログを表示するには、次のコマンドを使用できます。
$ kubectl logs guids-2617315942-lzwdh listening on port 9000
コンテナをデバッグするための非常に便利な機能は、コンソールに接続し、そこでさまざまなコマンドを実行する機能です。
$ kubectl exec -t -i guids-2617315942-lzwdh sh / # head -n3 /etc/os-release NAME="Alpine Linux" ID=alpine VERSION_ID=3.5.2 / # exit
- ツールバー(ダッシュボード)。
Kubernetesツールバーも囲炉裏としてインストールされ、ローカルマシンでアクセスできます。 Kubernetesインターネットアクセスを開かなかったため、SSHトンネルを使用してツールバーにアクセスします。
$ kubectl create -f https://git.io/kube-dashboard $ kubectl proxy Starting to serve on 127.0.0.1:8001
次に、Packetホストへのトンネルを作成し、Webブラウザーでhttp:// localhost:8001 / ui /ページを開きます。
$ ssh -L 8001:127.0.0.1:8001 -N

詳細については、ここをクリックしてください: ダッシュボードGithubで確認してください 。
まとめると
Kubernetesクラスターを作成し、最初のマイクロサービスを起動しました。 これで、作業でkubectl
コマンドラインインターフェイスを使用して、クラスターのコンポーネントの調査を開始できます。
- 例から学ぶ。
Michael Hausenblasが作成したKubernetes by Exampleマニュアルは、詳細でアクセスしやすいように思えました。
- さらにノードを追加します。
これで、1つのノードで構成されるクラスターができましたkubeadm
から受け取ったjoin token
を使用して、 Type 0
ノードをさらに追加し始めることができjoin token
。
- Docker Swarmと比較してください。
Docker Swarmは、Docker CEおよびEEに組み込まれた統合オーケストレーションツールです。 Docker Swarmクラスターは、1つのコマンドで起動できます。 詳細については、Docker Swarmチュートリアルを参照してください 。
謝辞:
Kubernetesクラスターのセットアップに関するフィードバックとヒントを提供してくれた@mhausenblas 、 @ _errm 、 @kubernetesonarmに感謝します。
参照:
- オリジナル: 10分でベアメタルのKubernetes 。