10. Kubanetes

_images/kubanetes.png

-意味:ギリシャ語で 船の舵取り

-読み方:クゥーバネィテス (koo-ber-nay’-tace)

http://www.school.ctc-g.co.jp/columns/nakai/nakai55.html

10.1 概要

Google製のDockerコンテナ管理ツーで多数のコンテナをつかう大規模システムの管理を簡単に行える。

主な機能)

  • 複数ホストにコンテナを展開
  • 関連コンテナをグループ化
  • コンテナの死活管理
  • コンテナ間ネットワーク
  • 負荷分散

概念

主に以下の3つの要素を操作して管理を行います。

  • Pod

    スケジューリングの単位で同じホストで動作する、1つまたは複数のコンテナからなります。

  • Replication Controler

    Podを複製する機能. あるPodをどのような条件で10個生成する、などの定義ファイルを作成して管理します。

  • Service

    ロードバランサとIP単位ごとのサービスを定義します。 ルーティング、ロードバランスなどの定義、管理をします。

様々なcloudサービスで利用可能で、自分のサーバーにインストールして使うことも可能です。 以下は Google Cloud Platform を利用するときの例です。


10.2 インストール

**Googleのチュートリアルがわかりやすいのでこの商は飛ばしてください。 **

↓でジャンプ

10.3.0 setup



1.Download and install Google Cloud SDK by running the following command in your shell or Terminal:

(Or, you can download google-cloud-sdk.zip or google-cloud-sdk.tar.gz, unpack it, and launch the ./google-cloud-sdk/install.sh script.)

2.Restart your shell:

$ exec -l $SHELL

3.Authenticate to Google Cloud Platform by running gcloud auth login.

$ gcloud auth login

Note: You can use export CLOUDSDK_CORE_DISABLE_PROMPTS=1 to perform a silent installation.

  1. Kubernetes を clone Kubernetes cluster is running. Access the master at:

    $ git clone https://github.com/GoogleCloudPlatform/kubernetes.git

    $ cd kubernetes

    $ hack/dev-build-and-up.sh

 =>
Kubernetes cluster is running. Access the master at:

と出れば成功

Kubernetes master is running at https://146.148.45.42
KubeDNS is running at https://146.148.45.42/api/v1/proxy/namespaces/kube-system/services/kube-dns
KubeRegistry is running at https://146.148.45.42/api/v1/proxy/namespaces/kube-system/services/kube-registry
KubeUI is running at https://146.148.45.42/api/v1/proxy/namespaces/kube-system/services/kube-ui
Grafana is running at https://146.148.45.42/api/v1/proxy/namespaces/kube-system/services/monitoring-grafana
Heapster is running at https://146.148.45.42/api/v1/proxy/namespaces/kube-system/services/monitoring-heapster
InfluxDB is running at https://146.148.45.42/api/v1/proxy/namespaces/kube-system/services/monitoring-influxdb

## kubectl の install

Google Cloud SDK をインストールしても kubectl が無い、というときは

$ gcloud components list

┌────────────────────────────────────────────────────────────────────────────────────────────┐
│                                         Components                                         │
├───────────────┬─────────────────────────────────────────────┬───────────────────┬──────────┤
│     Status    │                     Name                    │         ID        │   Size   │
├───────────────┼─────────────────────────────────────────────┼───────────────────┼──────────┤
│ Not Installed │ App Engine Command Line Interface (Preview) │ app               │  < 1 MiB │
│ Not Installed │ gcloud Beta Commands                        │ beta              │  < 1 MiB │
│ Not Installed │ gcloud app Java Extensions                  │ app-engine-java   │ 96.0 MiB │
│ Not Installed │ gcloud app Python Extensions                │ app-engine-python │  7.1 MiB │
│ Not Installed │ kubectl                                     │ kubectl           │          │
│ Installed     │ BigQuery Command Line Tool                  │ bq                │  < 1 MiB │
│ Installed     │ Cloud SDK Core Libraries                    │ core              │  2.1 MiB │
│ Installed     │ Cloud Storage Command Line Tool             │ gsutil            │  2.7 MiB │
│ Installed     │ Default set of gcloud commands              │ gcloud            │  < 1 MiB │
│ Installed     │ Developer Preview gcloud Commands           │ preview           │  < 1 MiB │
│ Installed     │ gcloud Alpha Commands                       │ alpha             │  < 1 MiB │
└───────────────┴─────────────────────────────────────────────┴───────────────────┴──────────┘

でまずは確認します。 この場合、インストールされていない様子なので

$ gcloud components update kubectl

┌─────────────────────────────────────────────┐
│     These components will be installed.     │
├─────────────────────────┬─────────┬──engine───────┤
│           Name          │ Version │   Size  │
├─────────────────────────┼─────────┼─────────┤
│ kubectl                 │         │         │
│ kubectl (Linux, x86_64) │   1.0.3 │ 4.5 MiB │
└─────────────────────────┴─────────┴─────────┘

でインストールします。

## ローカルで使う裏ワザ

ツールをつかってkebernetes を簡単にローカルで動作させる方法。 ot2kubenetes というツールを使うと簡単に実行できます。

1コマンドでkubernetesを立ち上げるboot2kubernetes
<http://deeeet.com/writing/2015/08/17/boot2kubernetes-jp/>

※注意

~/.docker フォルダに cert.pem, key.pem が必要です。

作り方

参考:<http://blog.jameskyle.org/2014/04/coreos-docker-remote-api-tls/>

#!/bin/bash
set -ex
mkdir certs && cd certs
echo "Creating server keys..."
echo 01 > ca.srl
openssl genrsa -des3 -out ca-key.pem
openssl req -new -x509 -days 3650 -key ca-key.pem -out ca.pem$ gcloud components update kubectl
openssl genrsa -des3 -out server-key.pem
openssl req -new -key server-key.pem -out server.csr
openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem -out server-cert.pem

echo "Creating client keys..."
openssl genrsa -des3 -out client-key.pem
openssl req -new -key client-key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile.cnf
openssl x509 -req -days 365 -in client.csr -CA ca.pem -CAkey ca-key.pem -out client-cert.pem -extfile extfile.cnf

echo "Stripping passwords from keys..."
openssl rsa -in server-key.pem -out server-key.pem
openssl rsa -in client-key.pem -out client-key.pem

mkdir ~/.docker
cp ca.pem ~/.docker
cp client-cert.pem ~/.docker/cert.pem
cp client-key.pem ~/.docker/key.pem
$ gcloud auth login

$ gcloud compute ssh kubernetes-master <instance name> --zone <zome-name>

$ gcloud config set project <project-id>

公開鍵の作成とSSHアクセス

$ ssh-keygen -t rsa -C “ユーザー名”

$ ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyGROMaW4hatAblZpz4sC0VWKCg3rNFNz8B3ZTPqPpxZsZgzSdscIFnlPqSqspAacSOpLgeqMtM80yYB6unlSk9XAsa6woR4kQyIYB765ISo4nhJmfMYrYl3VJ0/HxlkbUez2WQnE6UJ1i4N6Er8wObvgUI0exaH+t+58B4eyrpOToYz7fd4ZqM3TLFpPKYAFyB8mLl1sPKkM1gijbRkiYx06h1tJRqPr5qEVV6BWYg37VLiU8HN7png50E+nB1D+T839h8dkVR6gEaw2UIT8GjWqebIDHFSov/ZtoxbH1pOIsPUm4/V8/uUVEiKmUlKv3M0zvZ+uClQS797Qjdt1V someuser@domain ( ssh-rsa <key-string> <user-name>

$ ssh someuser@<インスタンスのIP>


↑ 10.2 の方法はうまく行かなかったので保留。 下の 10.3でまず離れてみてください。



10.3 Google Container Engine 使い方

10.3.0 setup

このページに詳しく書かれています。

https://cloud.google.com/container-engine/docs/before-you-begin#set_your_gcloud_defaults

  1. Sign up for a Google Account

    Googleのアカウントがない人はこちらで作成 https://accounts.google.com/SignUp

  2. Enable billing

    支払い方法の設定 (2015.8.1現在、お試し無料サービス(300$分無料,60日)が使えます

  3. Enable the Container Engine API

    Container Engine API を利用できるように設定

  4. Install the gcloud command line interface

    $ curl https://sdk.cloud.google.com | bash
    $ exec -l $SHELL
    $ gcloud auth login
    
  5. Install kubectl

    $ gcloud components update kubectl
    
  6. Set your gcloud defaults

    $ gcloud config set project PROJECT
    $ gcloud config set compute/zone ZONE
    $ gcloud config set container/cluster CLUSTER_NAME
    
    (for test)
    $ gcloud config list
    

10.3.1 Google Container Engine で Docker & Kubernetes

Google のチュートリアル https://cloud.google.com/container-engine/docs/getting-started

WordPressの例

以下のような順序でサービスのデプロイを行います。 実際に何度かやるとなんとなく実感がつかめるのでまずは以下のStep1 からサービスの削除までをやってみることをおすすめします。

  • Step 1: Create your cluster
  • Step 2: Create your pod
  • Step 3: Allow external traffic

Step 1: Create your cluster

$ gcloud container clusters create hello-world --num-nodes 1 --machine-type g1-small

$ gcloud compute instances list

Step 2: Create your pod

docker image でpod と呼ばれるコンテナをインストールした何かをセットアップします。 docker run と同じような感じ。

Step 3: Allow external traffic

サービス(ロードバランサーなどの機能)に接続します

$ kubectl expose rc wordpress --create-external-load-balancer=true

動作確認

$ gcloud compute instances list
NAME                               ZONE          MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP    EXTERNAL_IP     STATUS
gke-cluster-1-367b3bd4-node-mlgh   asia-east1-a  n1-standard-1             10.240.60.204  130.211.254.64  RUNNING
gke-hello-world-ce977848-node-2704 asia-east1-a  g1-small                  10.240.78.212  107.167.189.136 RUNNING
kubernetes-minion-1edu             us-central1-b n1-standard-1             10.240.79.228  130.211.145.218 RUNNING
kubernetes-minion-2320             us-central1-b n1-standard-1             10.240.221.228 130.211.177.125 RUNNING
kubernetes-minion-9yw9             us-central1-b n1-standard-1             10.240.233.176 104.197.17.40   RUNNING
kubernetes-minion-d6z0             us-central1-b n1-standard-1             10.240.56.241  104.197.132.247 RUNNING

$ kubectl get pods
NAME              READY     STATUS    RESTARTS   AGE
wordpress-bc363   1/1       Running   0          36s

$ kubectl get rc
CONTROLLER   CONTAINER(S)   IMAGE(S)          SELECTOR        REPLICAS
wordpress    wordpress      tutum/wordpress   run=wordpress   1

$ kubectl get services wordpress
NAME        LABELS          SELECTOR        IP(S)             PORT(S)
wordpress   run=wordpress   run=wordpress   10.191.254.84     80/TCP
                                        123.45.678.9

最後に出てきた 123.45.678.9 に相当するIPにアクセスするとwordpress の画面が表示されます。

サービスとコンテナの削除

先ほど作った wordpress のサービス、コンテナを削除します。

$ kubectl delete services wordpress
$ kubectl stop rc wordpress
$ gcloud container clusters delete hello-world

Note

WEBの管理画面で消したつもりでも残ってしまうので上記の方法で消しましょう。