さくらとコンテナの夕べ(第2回) Rancher/Kubernetes入門ハンズオン資料

# 概要

Rancher のセットアップと基本操作を学びます。それから Rancher を通した Kubernetes クラスタの構築と、基本概念・操作方法を学びます。

* イベント情報　https://sakura-kanto.doorkeeper.jp/events/53172
* スライドURL http://bit.ly/sakura20161108s

以下ハンズオンでは「さくらのクラウド」を利用していますが、CentOS 7 をご利用可能な環境であれば、どこでもお試しいただけます。


# 1. さくらのクラウドにログイン

## 1.1. ブラウザでコントロールパネルを表示

https://secure.sakura.ad.jp/cloud/  


## 1.2  接続情報を確認

配付資料に含まれるログイン情報を入力し、ログインします。

# 2. 仮想サーバの起動と接続

## 2.1 さくらのクラウドで仮想サーバを起動

　1. 【 さくらのクラウド(IaaS 】をクリックします。
　2. メニュー【 サーバ 】から【 追加 】をクリックします。
　3. ディスクイメージは【 CentOS 7.2 64bit 】を使います。
　4. 「サーバプラン」を【4GB / 2 仮想コア】に変更し、「ディスクプラン」はそのままとします。
　5. 【 管理ユーザのパスワード 】で root パスワードを設定します。８文字以上の「アルファベット」「数字」「記号」の組み合わせが必要です。
　6. ホスト名を【 rancher 】、作成数を【3 】として【 作成 】ボタンをクリックします。
　7. 確認画面では【 作成 】をクリックします。
　8. サーバ追加作業が完了するまで待ちます。起動後は【 閉じる 】をクリックします。
　9. メニューの【 サーバ 】をクリックし、作成したサーバ「 docker 」を確認します。

## 2.2. 仮想サーバへ接続

　1. IP アドレスを確認します。インターフェースを右クリックし【 IP アドレスをコピー 】を選びます。
　2. Tera Term やターミナルなどを開き、３台のサーバに SSH でログインします。
 - ログイン時のIDは「root」、パスワードは作成時に入力したもの
 - ターミナルでは「ssh -l root <IPアドレス>」か「ssh root@<IPアドレス>」
```
ssh -l root <IP_addr>
```

# 3. Docker Engine のセットアップ

## 3.1 安定版(stable)の最新バイナリをセットアップ

　1. パッケージ情報を最新に更新します。

```
yum -y update
```

　2. `docker-engine` パッケージをセットアップします。

```
curl -fsSL https://get.docker.com/ | sh
```

## 3.2. docker サービスの有効化とデーモン起動。

　1. サービスを有効化します。

```
systemctl enable docker.service
```

　2. docker デーモンを起動します。

```
systemctl start docker.service
```

　3. バージョン番号を確認します。

```
docker version
```

## 3.3 firewalld の設定変更

　1. firewalld の設定で、外部との通信を許可します。

```
firewall-cmd --add-port=8080/tcp --permanent　　　←ポート 8080 は rancher-01 のみ
firewall-cmd --add-port=3000/tcp --permanent
firewall-cmd --add-port=500/udp --permanent
firewall-cmd --add-port=4500/udp --permanent
firewall-cmd --reload
```

## 補足情報

Docker を削除するには：

```
yum -y remove docker-engine
rm -rf /var/lib/docker
```

# 4. docker コマンドの基本操作

## 4.1. hello-world コンテナの実行とイメージ確認

　1. `docker run` コマンドでコンテナを実行します。

```
docker run hello-world
```

　2. `docker ps` コマンドで、コンテナの状態を確認します。

```
docker ps -a
```

　3. `docker images` で、ローカル上のイメージを一覧表示します。

```
docker images
```

## 4.2. Ubuntu コンテナの実行

　1. `docker pull` コマンドで ubuntu 公式イメージを取得します。
　2. ダウンロードしたイメージを `docker images` で確認します。

```
docker images
```

　3. `ubuntu` コンテナを実行します。

```
docker run -i -t ubuntu:latest /bin/bash
```

　4. Ubuntu のバージョンを確認します。

```
cat /etc/issue
```

　5. `ps` コマンドを実行します。コンテナ実行時の「/bin/bash」のPIDが「１」なのを確認します。

```
ps -ef
```

　6. コンテナを終了します。

```
exit
```

# 5. Rancher のセットアップ

## 5.1 Rancher サーバ用コンテナの起動

　1. `rancher-01` 上で Rancher サーバを起動します。 `rancher/server` コンテナを起動します。

```
docker run -d --restart=unless-stopped -p 8080:8080 rancher/server
```

　2.  `rancher/server` コンテナの起動状態を確認します。

```
docker logs -f $(docker ps -lq)
```

起動すると、ログに以下のような文字列が現れします。

```
10:06:51.173 [main] INFO  ConsoleStatus - [DONE ] [47710ms] Startup Succeeded, Listening on port 8081
time="2016-11-07T10:06:51Z" level=info msg="Starting websocket proxy. Listening on [:8080], Proxying to cattle API at [localhost:8081], Monitoring parent pid [7]."
```

　3. ブラウザから `rancher-01` のポート `8080` を開きます。

```
http://<rancher-01>:8080/
```

## 5.2 Rancher のセキュリティ設定

初回設定時は管理画面にパスワードが施されていません。GitHub やユーザ情報を使った認証設定を行う必要があります。ここではユーザのパスワードを設定します。

　1. メニューの 【 ADMIN 】 から 【 Access Control 】 を選びます。

　2. Access Control の認証方式 【 LOCAL 】をクリックします。

　3. `Setup an Admin user` （管理ユーザのセットアップ）の各フォームを入力します。

* `Login Username` （必須） … ログイン用のユーザ名です。
* `Full Name` … 管理画面上で確認できる名前です。
* `Password` （必須）… パスワードです。
* `Confirm Password` （必須） … 確認用のパスワードです。

　4. 制限を有効にするため 【 Enable Local Auth 】（ローカル認証の有効化）をクリックします。

## 5.3 Rancher ホストの登録（追加）

Rancher サーバに Rancher の管理対象ホストを追加します。ここでは `rancher-01` 自身を登録しますが、同様の手順で `rancher-02` `rancher-03` を追加できます。

　1. メニューの【 Default 】から【 Default 】をクリックします。

　2. 【 Add Host 】をクリックします。

　3. `This site's address` （このサイトのアドレス）が選択された状態のまま、【 Save 】（保存）をクリックします。

　4. 次のホスト追加画面では `Custom`（カスタム）が選択されたままの状態を確認します。

　5. 「4」の入力フォームに【 rancher-01 】の IP アドレスを追加します。

　6. 「5」にエージェント起動用スクリプトが表示されますので、【 Copy 】ボタンをクリックします。コピーしたコマンドはテキスト・エディタに貼り付けます。

　7. 画面上の 【 Close 】 をクリックします。

　8. `rancher-01` に SSH ログインした画面を開きます。

　9. コピーしたホスト追加用コマンドを実行します。

```実行例
sudo docker run -e CATTLE_AGENT_IP="<IP>"  -d --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher rancher/agent:v1.0.2 http://<ip>:8080/v1/scripts/<文字列>
```

　10. メニューの【 INFRASTRUCTURE 】から【 HOSTS 】を選択し、画面上に `rancher-01` が見えるのを確認します（ACTIVE になるまで1分ほどかかります）。ホスト名をクリックすると、詳細なリソースを表示します。

# 6. Rancher でコンテナ実行

## 6.1 手動で Nginx コンテナを起動

　1. メニューの【 STACKS 】から【 User 】をクリックします。
　2. `Default` スタックの【 Add Service 】をクリックします。
　3. Nginx のサービス情報を登録します。

* `Name` … 【mynginx】 と入力します。
* `Select Image` … 【nginx:latest】 と実行するイメージを指定します。
* `Port Map` … クリックした後、
 * `Public Host [IP:]Port` … 【8081】にします。
 * `Private Container Port` … 【80】にします。
 
　4. ページ下方の【 Create 】をクリックします。
　5. 画面が切り替わり `Activating` から `Active` になるのを待ちます。
　6. 【 mynginx 】をクリックし、詳細画面を開きます。
　7. 【 Ports 】タブをクリックします。
　8. 【 IP アドレス 】をクリックすると、ブラウザが 【 http://<rancher-01>:8081/ 】にアクセスし、Nginx の初期画面を表示するのを確認します。

## 6.2 カタログで複数コンテナの自動実行

　1. メニューの【 CATALOG 】をクリックします。
　2. 検索フォームに【 rocket 】と入力するか、画面上で【 RocketChat 】を探し、【 View Detials 】をクリックします。
　3. ページ下方の【 Launch 】をクリックします。
　4. 全てのコンテナが Active になるまで待ちます。この間、リンク・グラフボタンをクリックすると、コンテナ間の接続状態を確認できます。
　5. 画面上の【 rocketchat 】をクリックし、詳細画面を開きます。
　6. 「Ports」に表示されている【 IP アドレス:3000 】をクリックします。
　7. Rocket.Chat が利用可能になります。


# 7. Rancher ホスト情報の削除

## 7.1 ユーザ・スタックの削除

　1. メニューの【 STACKS 】から【 User 】を選びます。
　2. 不要なサービスを削除するため、右端のメニューから【 DELETE 】を選択します。
　3. 確認画面で【 DELETE 】をクリックします。

## 7.2 ホストの削除

　1. 【 INFRASTRUCTURE 】から【 Hosts 】をクリックします。
　2. メニューから【 DEACTIVATE 】を選びます。
　3. メニューから【 DELETE 】を選びます。
　4. 確認画面で【 DELETE 】をクリックします。

## 7.3 エージェントの停止

　1. ホスト「rancher-01」上で【 docker ps 】コマンドを実行します。

```
docker ps
```

　2. 「rancher/agent」は不要なので停止します。

```
# docker stop $(docker ps -q --filter name=rancher)
e2cbcfde443e
```

# 8. Kubernetes クラスタの作成準備

## 8.1. Kubernetes 環境の追加

　1. メニューの【 Default 】から【 Manage Environments 】をクリックします。
　2. 【 Add Environment 】をクリックします。
　3. `Container Orchestration` の【 Kubernetes 】をクリックします。
　4. `Name` に【 k8s 】を入力します。
　5. 【 Create 】ボタンを押し、環境を追加します。
　6. 環境一覧に【 Kubernetes 】があるのを確認します。

## 8.2. Kubernetes クラスタにホストを追加

　1. メニューの【 Default 】から【 k8s 】をクリックします。
　2. 【 Add Host 】をクリックします。
　3. ステップ「4」のフォームに、【 rancher-01 】の IP アドレスを入力します。
　4. ステップ「5」の内容をコピーし、サーバ rancher-01 の SSH 端末上で実行します。
　5. 約1分ほど待つとか、【 Close 】をクリックします。画面が `Setting up Kubernetes...` と変わり、セットアップが進行します。
　6. 画面に「kubernetes」サービスが見えます。
　7. メニューの【 INFRASTRUCTURE 】から【 Host 】をクリックします。
　8. 【 Add Host 】をクリックします。
　9. 【rancher-02】と【 rancher-03】に対しても、手順「2～5」の登録作業を繰り返します。
　10. 【 Close 】をクリックして、しばらく待ちます。各サーバでエージェントのログを表示するには、次のコマンドを実行します。

```
docker logs -f $(docker ps -ql)
```

　11. ログに `Successfully registered node rancher-xx` が出て、【 INFRASTRUCTURE 】から【 Host 】をクリックし、各ノードの「etcd」が有効になるまで待ちます。

　12. これで、３つの Kubernetes ノードは同一ネットワークにつながりました。各ノードの「etcd」の IP アドレスに対して、相互に `ping` が通るのを確認しましょう。

```例：
[root@rancher-03 ~]# ping 10.42.140.18
PING 10.42.140.18 (10.42.140.18) 56(84) bytes of data.
64 bytes from 10.42.140.18: icmp_seq=1 ttl=62 time=0.930 ms
64 bytes from 10.42.140.18: icmp_seq=2 ttl=62 time=0.562 ms
64 bytes from 10.42.140.18: icmp_seq=3 ttl=62 time=0.602 ms
```

# 9. Kubernetes を使う

## 9.1 カタログでゲストブックを動かす

　1. メニュー【 CATALOG 】をクリックします。
　2. 【 K8s Example Geustbook 】の【 View Details 】をクリックします。
　3. ページ下方の【 Launch 】をクリックします。
　4. メニュー【 KUBERNETES 】から【 Services 】をクリックします。
　5. 【 frontend 】をクリックし、「Pods」が順次作成されるのを確認します。
　6. 同様に【 KUBERNETES 】から【 Replication Controller 】と【 Pods 】を確認します。
　7. メニューの【 KUBERNETES】から【 System 】をクリックします。
　8. 【 kubernetees-loadbalancers 】をクリックします。
　9. リンク・グラフボタンをクリックします。
　10. 【 lb- 】で始まるアイコンをクリックすると、ゲストブックのポートを確認できます。
　11. ゲストブックを確認します。
　12. あとは、色々さわってみましょう！

* スケールアウト、スケールイン
* コンテナの停止
* 手動でコンテナ（サービスの追加）
* ロードバランサ(HAproxy)を試す
* Ingress ロードバランサを試す

## 9.2 環境の削除

　1. メニュー【 KUBERNETES 】から【 Replication Controllers 】をクリックします。
　2. それぞれの右メニューから【 DELETE 】を選択します。
　3. メニュー【 KUBERNETES 】から【 Services 】をクリックします。
　4. 「kubernetes」を除く各メニューから【 DELETE 】を選択します。
　5. メニュー【 KUBERNETES 】から【 Pod 】をクリックします。
　6. それぞれの右メニューから【 DELETE 】を選択します。

## おまけ： Ingress lbs の追加例

　1. メニュー【 KUBERNETES 】から【 Services 】をクリックします。
　2. 【 Add Service 】をクリックします。
　3. フォームに以下の YAML を入力し、【 Create 】をクリックします。

```
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    k8s-app: nginx-service
spec:
  ports:
  - port: 90
    targetPort: 80
    protocol: TCP
    name: http
  selector:
    k8s-app: nginx-service
---
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx-service
spec:
  replicas: 1
  selector:
    k8s-app: nginx-service
  template:
    metadata:
      labels:
        k8s-app: nginx-service
    spec:
      terminationGracePeriodSeconds: 60
      containers:
      - name: nginx-service
        image: zembutsu/docker-sample-nginx:latest
        ports:
        - containerPort: 80
```

　4. 「Ready」になるまで待ちます。
　5. 再び【 Add Service 】をクリックし、Ingress-LB を追加します。

```
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: simplelb
spec:
  backend:
    serviceName: nginx-service
    servicePort: 90
```

　6. メニュー【 KUBERNETES 】から【 System 】をクリックします。
　7. 【 kubernetes-ingress-lbs 】をクリックします。

# 参考

* Installing Rancher Server (Single Node)
  * https://docs.rancher.com/rancher/v1.2/en/installing-rancher/installing-server/