KubernetesをUbuntuで動かす


#概要
KubernetesをUbuntuで構築したい人向けの記事です。
masterとnode1台ずつ構築するところまでの説明を含んでいます。

#動作環境

ここではmasterとノードの2サーバーを作成します。
以下のIPアドレス・ホスト名で構築しました。

- master サーバー  
    ホスト名 master  
    IPアドレス 192.168.137.20
- node　サーバー   
    ホスト名 node1  
    IPアドレス 192.168.137.21

![図面1.png](https://qiita-image-store.s3.amazonaws.com/0/140084/bcf483c0-35c4-6625-64f3-7e60d8a2567c.png)

###バージョン
 - OS:Ubuntu 14.04.5 LTS Basic Ubuntu Serverのみをインストール
 - Kubernetes:1.3.6
 - etcd:3.0.7
 - flannel:0.6.1

#master側の構築
master側ではkubernetesのapiserverやetcdなどを動作させます。

###関連パッケージのインストール
```
sudo apt-get update
sudo apt-get install build-essential linux-libc-dev bridge-utils git curl ssh unzip golang -y
```
###バイナリの保存先作成
```
sudo mkdir /opt/bin
```
###ホスト名の登録
```
sudo sh -c "echo '192.168.137.20 master' >> /etc/hosts"
sudo sh -c "echo '192.168.137.21  node1' >> /etc/hosts"
```
###etcdのインストールと設定
```
wget https://github.com/coreos/etcd/releases/download/v3.0.7/etcd-v3.0.7-linux-amd64.tar.gz
tar xzvf etcd-v3.0.7-linux-amd64.tar.gz

sudo mv etcd-v3.0.7-linux-amd64/etcd /opt/bin/
sudo mv etcd-v3.0.7-linux-amd64/etcdctl /opt/bin/

sudo ln -s /opt/bin/etcd /usr/local/bin/etcd
sudo ln -s /opt/bin/etcdctl /usr/local/bin/etcdctl

sudo chmod 755 /opt/bin/etcd
sudo chmod 755 /opt/bin/etcdctl
```

/etc/init/etcd.conf（差分のみを示します。）

```
29c29
<       ETCD_OPTS=""
---
>       ETCD_OPTS="--listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://localhost:2379"
```

###flanneldのインストールと設定

```
wget https://github.com/coreos/flannel/releases/download/v0.6.1/flanneld-amd64
sudo mkdir /opt/flanneld
sudo mv flanneld-amd64 /opt/bin/flanneld
sudo ln -s /opt/bin/flanneld /usr/local/bin/flanneld
sudo chmod 755 /opt/bin/flanneld
```

flannelで利用するアドレスの範囲を設定

```
sudo initctl start etcd
etcdctl mk /coreos.com/network/config '{"Network":"172.17.0.0/16"}'
```


### kubernetesのインストールと設定
```
wget https://github.com/kubernetes/kubernetes/releases/download/v1.3.6/kubernetes.tar.gz
tar xzvf kubernetes.tar.gz

#ビルド済みのバイナリはserverフォルダー以下にtarで固められています
cd kubernetes/server

#kubernetesのバイナリ展開（各アーキテクチャにあったファイルを展開してください。)
tar xzvf kubernetes-server-linux-amd64.tar.gz

sudo cp kubernetes/server/bin/kube-apiserver /opt/bin/
sudo cp kubernetes/server/bin/kube-controller-manager /opt/bin/
sudo cp kubernetes/server/bin/kube-scheduler /opt/bin/
sudo cp kubernetes/server/bin/kube-proxy /opt/bin/
sudo cp kubernetes/server/bin/kubectl /opt/bin/

cd ~

sudo ln -s /opt/bin/kube-apiserver /usr/local/bin/
sudo ln -s /opt/bin/kube-controller-manager /usr/local/bin/
sudo ln -s /opt/bin/kube-scheduler  /usr/local/bin/
sudo ln -s /opt/bin/kubectl /usr/local/bin/
sudo ln -s /opt/bin/kube-proxy /usr/local/bin/

sudo cp kubernetes/cluster/ubuntu/master/init_conf/* /etc/init/
sudo cp kubernetes/cluster/ubuntu/master-flannel/init_conf/flanneld.conf /etc/init/
```

/etc/init/kube-scheduler.conf（差分のみを示します。）

```
25c25
<       KUBE_SCHEDULER_OPTS=""
---
>       KUBE_SCHEDULER_OPTS="--master http://master:8080"
```

/etc/init/kube-controller-manager.conf（差分のみを示します。）

```
25c25
<       KUBE_CONTROLLER_MANAGER_OPTS=""
---
>       KUBE_CONTROLLER_MANAGER_OPTS="--address 0.0.0.0  --master http://master:8080"
```

/etc/init/kube-apiserver.conf（差分のみを示します。）

```
25c25
<       KUBE_APISERVER_OPTS=""
---
>       KUBE_APISERVER_OPTS="--address 0.0.0.0 --port 8080 --etcd_servers http://master:2379  --allow_privileged false --service-cluster-ip-range 10.254.0.0/16 --kubelet_port 10250"

```

/etc/init/flanneld.conf（差分のみを示します。）

```
24c24
<       FLANNEL_OPTS=""
---
>       FLANNEL_OPTS="-etcd-endpoints=http://master:2379 -etcd-prefix=/coreos.com/network"
```

#node側の構築
node側ではkubernetesのkubeletを動作させます。

###関連パッケージのインストール

```
sudo apt-get update
sudo apt-get install build-essential linux-libc-dev bridge-utils git curl ssh unzip golang -y
```
###バイナリの保存先作成
```
sudo mkdir /opt/bin
```

###ホスト名の登録
```
sudo sh -c "echo '192.168.137.20 master' >> /etc/hosts"
sudo sh -c "echo '192.168.137.21  node1' >> /etc/hosts"
```
###flanneldのインストールと設定

```
wget https://github.com/coreos/flannel/releases/download/v0.6.1/flanneld-amd64
sudo mkdir /opt/flanneld
sudo mv flanneld-amd64 /opt/bin/flanneld
sudo ln -s /opt/bin/flanneld /usr/local/bin/flanneld
sudo chmod 755 /opt/bin/flanneld
```


###Kubernetesのインストールと設定
```
wget https://github.com/kubernetes/kubernetes/releases/download/v1.3.6/kubernetes.tar.gz
tar xzvf kubernetes.tar.gz

#ビルド済みのバイナリはserverフォルダーにtarで固められています
cd kubernetes/server

#kubernetesのバイナリ展開（各アーキテクチャにあったファイルを展開してください。)
tar xzvf kubernetes-server-linux-amd64.tar.gz

#kubernetesのバイナリをコピー
#ノードにはkubeletとkube-proxyを入れてください
sudo cp kubernetes/server/bin/kubelet /opt/bin/
sudo cp kubernetes/server/bin/kube-proxy /opt/bin/

cd ~

sudo ln -s /opt/bin/kubelet  /usr/local/bin/
sudo ln -s /opt/bin/kube-proxy /usr/local/bin/

#設定ファイルのコピー
sudo cp kubernetes/cluster/ubuntu/minion-flannel/init_conf/flanneld.conf /etc/init/
sudo cp kubernetes/cluster/ubuntu/minion/init_conf/* /etc/init/
```

/etc/init/kube-proxy.conf(差分のみを示します)

```
27c27
<       KUBE_PROXY_OPTS=""
---
>       KUBE_PROXY_OPTS="--master http://master:8080"
```

/etc/init/kubelet.conf(差分のみを示します)

```
25c25
<       KUBELET_OPTS=""
---
>       KUBELET_OPTS="--address=0.0.0.0 --port=10250 --hostname-override node1 --api-servers http://master:8080"
```

/etc/init/flanneld.conf（差分のみを示します。）

```
24c24
<       FLANNEL_OPTS=""
---
>       FLANNEL_OPTS="-etcd-endpoints=http://master:2379 -etcd-prefix=/coreos.com/network"
```

###Dockerのインストールと設定
インストール

```
wget -qO- https://get.docker.com/ | sh
```

flanneldで割り当てられたIPアドレスを適用するために修正します。
参考：http://blog.shippable.com/docker-overlay-network-using-flannel

/etc/init/docker.conf（差分のみを示します。）

```
3,4c3,4
< start on (filesystem and net-device-up IFACE!=lo)
< stop on runlevel [!2345]
---
> start on started flanneld
> stop on stopping flanneld
41a42,51
>       if [ -f /var/run/flannel/subnet.env ]; then
>               ## if flannel subnet env is present, then use it to define
>               ## the subnet and MTU values
>                 . /var/run/flannel/subnet.env
>                 DOCKER_OPTS="$DOCKER_OPTS --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU}"
>         else
>                 echo "Flannel subnet not found, exiting..."
>                 exit 1
>         fi
> 
```

nsenterのインストール

```
sudo docker run --rm -v /usr/local/bin:/target jpetazzo/nsenter
```

##DashBoardの導入
動作テストのため導入します。

```
wget https://rawgit.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml
#apiサーバーのアドレスとポート番号を指定(docker内で利用されるのでIPアドレス直打ちです。)
sed -ie 's/# - --apiserver-host=http:\/\/my-address:port/- --apiserver-host=http:\/\/192.168.137.20:8080/' kubernetes-dashboard.yaml
kubectl create -f kubernetes-dashboard.yaml
```

kubectl get noでノードがReadyになっているか、kubectl --namespace=kube-system get poでpodが起動しているかを確認してください。

http://192.168.137.20:8080/ui でアクセスできます。

##guestbookを立ち上げる

以下の手順でguestbookをデプロイできます。
masterのターミナルで叩いてください。

```
wget https://raw.githubusercontent.com/kubernetes/kubernetes/master/examples/guestbook/all-in-one/guestbook-all-in-one.yaml
```
guestbook-all-in-one.yamlを開きGET_HOSTS_FROMのvalueをenvにしてください。(DNSの設定をしていないため。)

最後にコンテナを配置します。

```
kubectl create -f guestbook-all-in-one.yaml
```

http://192.168.137.20:8080/api/v1/proxy/namespaces/default/services/frontend:80/ でアクセスできます。

#参考
プログラムの引数周りは公式Fedora向けのページを参考にしました。
http://kubernetes.io/docs/getting-started-guides/fedora/fedora_manual_config/