Kubernetesを用いる機会が多くなってきたのですが、それをAWS上で構築してみた話。結構はまりますよね。。。
ゴール
以下のゴールを設定します。
- AWS上はCentOSを使う(本当はAmazon Linuxで試したいのですが、色々面倒だったので今回はCentOS7で。)
- 3台のマシンを借りてそれぞれMaster1台、Node2台とする(全てt2.microを選択)
- 上記3台はVPC内で通信させる
- 外部からのアクセスを捌けるところまでを構築する
- 使うKubernetesバージョンは1.2系(こちらもいずれは1.3系を試してみたい)
3台構成にした中で、マイクロサービス的なこともしてみたいのですが、それはまた今度。で、今回は「その1」として、マスタ / ノードをそれぞれ1台ずつで構成し、一旦つなげてみます。
ちなみにKubernetesのバージョン重要です。(バージョンが異なればPod作成の設定、手順などが異なることがままあるため)
AWSインスタンスの準備
2台準備します。とりあえずt2.microで組みます。それからVPCとサブネットも必要ですね。2インスタンスが所属するように設定します。VPCのインターネットゲートウェイアタッチとルートテーブルの設定忘れに注意。また事前に借りたインスタンスのSELinuxをOffにするなど設定しておきましょう。
またセキュリティグループも必要であれば環境に合わせて適宜設定をしてください。
インスタンス準備ができたら、各種インストールが必要です。
マスタ側のインストール
$ sudo yum install kubernetes
$ sudo yum install etcd
$ sudo yum install flannel
続いてファイル編集
$ sudo vi /etc/kubernetes/config
#KUBE_MASTER="--master=http://127.0.0.1:8080"
KUBE_MASTER="--master=http://172.17.0.62:8080"
KUBE_MASTERは自マシンのプライベートIPアドレスになります。
$ sudo vi /etc/kubernetes/apiserver
#KUBE_API_ADDRESS="--insecure-bind-address=127.0.0.1"
KUBE_API_ADDRESS="--insecure-bind-address=172.17.0.62"
#KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
KUBE_ETCD_SERVERS="--etcd-servers=http://172.17.0.62:2379"
KUBE_ETCD_SERVERS(172.17.0.62)は自マシンのプライベートIPアドレスになります。
$ sudo vi /etc/kubernetes/kubelet
#KUBELET_HOSTNAME="--hostname-override=127.0.0.1"
KUBELET_HOSTNAME="--hostname-override=master"
#KUBELET_API_SERVER="--api-servers=http://127.0.0.1:8080"
KUBELET_API_SERVER="--api-servers=http://172.17.0.62:8080"
Kubernetesは/etc/hostsのファイルにある名前からホスト名を理解するので
172.17.0.62 master
を/etc/hostsに追記しておきましょう。(これはノードの設定でも一緒です)
続いてetcdに関連するファイルの変更です。
$ sudo vi /etc/etcd/etcd.conf
#ETCD_LISTEN_CLIENT_URLS="http://localhost:2379"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
#ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"
$ sudo etcdctl mk /atomic.io/network/config '{"Network":"172.16.0.0/16"}'
※172.17.0.0/16はAWS側がプライベートアドレスを割り振ることが多いので(例に漏れず今回もそうです)、今回の設定では172.16系を指定しています。
必要ファイルが編集できたら関連サービスを再起動します。ついでに起動時に動くようにしておきます。
$ sudo systemctl restart etcd
$ sudo systemctl restart kube-apiserver
$ sudo systemctl restart kubelet
$ sudo systemctl restart kube-controller-manager
$ sudo systemctl restart kube-scheduler
$ sudo systemctl restart kube-proxy
$ sudo systemctl restart flanneld
$ sudo systemctl enable etcd
$ sudo systemctl enable kube-apiserver
$ sudo systemctl enable kubelet
$ sudo systemctl enable kube-controller-manager
$ sudo systemctl enable kube-scheduler
$ sudo systemctl enable kube-proxy
$ sudo systemctl enable flanneld
以下のコマンドでmasterが動いているかどうかの確認ができます。
$ kubectl cluster-info
Kubernetes master is running at http://localhost:8080
ノード側の設定
$ sudo yum install kubernetes
$ sudo yum install docker
$ sudo yum install flannel
各種ファイルの設定です。
$ sudo vi /etc/kubernetes/config
#KUBE_MASTER="--master=http://127.0.0.1:8080"
KUBE_MASTER="--master=http://172.17.0.62:8080"
$ sudo vi /etc/kubernetes/kubelet
#KUBELET_ADDRESS="--address=127.0.0.1"
KUBELET_ADDRESS="--address=172.17.0.161"
#KUBELET_HOSTNAME="--hostname-override=127.0.0.1"
KUBELET_HOSTNAME="--hostname-override=node1"
#KUBELET_API_SERVER="--api-servers=http://127.0.0.1:8080"
KUBELET_API_SERVER="--api-servers=http://172.17.0.62:8080"
KUBELET_ADDRESSには自マシンのプライベートアドレスを定義してください。
$ sudo vi /etc/sysconfig/flanneld
#FLANNEL_ETCD="http://127.0.0.1:2379"
FLANNEL_ETCD="http://172.17.0.62:2379"
設定が完了したら以下のコマンドで必要なサービスを起動します。
$ sudo systemctl start docker
$ sudo systemctl start flanneld
$ sudo systemctl start kubelet
$ sudo systemctl start kube-proxy
$ sudo systemctl enable docker
$ sudo systemctl enable flanneld
$ sudo systemctl enable kubelet
$ sudo systemctl enable kube-proxy
マスタとノードの設定の確認
一通り設定が終わったらマスタがノードを認識しているかを確かめましょう。
[マスタ]
$ kubectl get nodes
NAME STATUS AGE
master Ready 25m
node1 Ready 24s
同じ設定をすれば2台目のノードを構築することも可能です。まずはこれでKubernetesクラスタを利用するための準備が整いました。これからはこの環境にDashBoardをインストールし、各ノードやPodの状態を確認しつつ、各ノードでのアプリ起動、運用を目指します。