LoginSignup
6
10

More than 5 years have passed since last update.

KubernetesをCentOS7 複数台(AWS EC2)へインストール

Last updated at Posted at 2016-02-14

kubernetesをAWS EC2のCentOS7にインストールしてみた。

Master1台、Worker(Minion)2台の計3台構成パターン。

※AWS用のセットアップスクリプトが提供されている(http://kubernetes.io/v1.1/docs/getting-started-guides/aws.html) が、ここでは手動でトライ。

※1台のみにインストールする方法は以下参照
http://qiita.com/suzukihi724/items/4e120fdc66b014cfa972

参考
http://qiita.com/HommaHomma/items/3b83c6cc5a09980e0d85

1.AWS EC2でCentOS7インスタンス起動

CentOS7インスタンスは、AWS Marketplaceから指定する
https://www.youtube.com/watch?v=_tWa5cIhO-k

CentOS7インスタンスは、ユーザ名がec2-userではなくcentosになっているので注意。
t2-micro1の場合メモリ不足の可能性があるため、t2-largeにしてみた。

2.kubernetes/docker/etcd/flannelをインストール

sudo yum update -y

sudo yum install -y docker

dockerを起動

sudo systemctl start docker

以下のようなエラーが出た場合は、libdevmapperをインストール後再実行

Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

sudo yum -y install libdevmapper.so.1.02

次にkubernetesなどをインストール

sudo yum install -y kubernetes etcd flannel

※etcdはmaster nodeのみでOK

3.hostsファイル修正(全クラスタ共通)

sudo vi /etc/hosts

172.31.25.XX master
172.31.25.XX minion1
172.31.25.XX minion2

※IPアドレスは適宜変更。今回はMaster1台、Minion2台の計3台構成パターン

4.Master Nodeの設定

(1)/etc/kubernetes/configの編集

sudo vi /etc/kubernetes/config

KUBE_MASTER=に、hostsファイルで定義したmaster nodeのホスト名を記載

KUBE_MASTER="--master=http://master:8080"

(2)kube-apiserver設定(/etc/kubernetes/apiserverの編集)

sudo vi /etc/kubernetes/apiserver

KUBE_API_ADDRESS="--address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBE_ETCD_SERVERS="--etcd_servers=http://master:2379"

※KUBE_ETCD_SERVERS=に、hostsファイルで定義したmaster nodeのホスト名を記載

※KUBE_ADMISSION_CONTROL=のServiceAccountを削除

###
# kubernetes system config
#
# The following values are used to configure the kube-apiserver
#

# The address on the local server to listen to.
KUBE_API_ADDRESS="--address=0.0.0.0"

# The port on the local server to listen on.
KUBE_API_PORT="--port=8080"

# Port minions listen on
# KUBELET_PORT="--kubelet_port=10250"

# Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd_servers=http://master:2379"

# Address range to use for services
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"

# default admission control policies
KUBE_ADMISSION_CONTROL="--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

# Add your own!
KUBE_API_ARGS=""

(3)controller-manager設定(/etc/kubernetes/controller-manager を編集)
sudo vi /etc/kubernetes/controller-manager

以下を追記
KUBELET_ADDRESSES="--machines=master,minion1,minion2"
※machine名はhostsファイルで規定したホスト名

(4)ETCD設定(/etc/etcd/etcd.conf を編集)

sudo vi /etc/etcd/etcd.conf

ETCD_LISTEN_PEER_URLS="http://localhost:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"

(5)Flannel設定
Flannelは、ホストを跨いでのコンテナ間通信を可能にする仮想ネットワーク(サブネット)を形成する。単一ホスト上でのクラスタ形成では不要。
Config情報の格納場所としてetcdを利用する。
https://github.com/coreos/flannel/blob/master/README.md

①/etc/sysconfig/flanneldを編集

sudo vi /etc/sysconfig/flanneld

# Flanneld configuration options

# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD="http://master:2379"

# etcd config key.  This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_KEY="/flannel/network"

# Any additional options that you want to pass
FLANNEL_OPTIONS="eth0"

②configファイルを作成

sudo vi /root/flannel-config.json

{
 "Network": "10.100.0.0/16",
 "SubnetLen": 24,
 "SubnetMin": "10.100.50.0",
 "SubnetMax": "10.100.199.0",
 "Backend": {
 "Type": "vxlan",
 "VNI": 1
 }
}

etcdにflannel設定(jsonファイル)を反映する(etcdのapiで)
まずはetcdを起動
sudo systemctl start etcd

sudo curl -L http://master:2379/v2/keys/flannel/network/config -XPUT --data-urlencode value@/root/flannel-config.json

etcd apiで設定が反映されていることを確認できる

http://<etcdノードIP:port>/v2/keys/<key名>

例)
curl -L http://master:2379/v2/keys/flannel/network

(6) 各種サービスの起動

#!/sh/bin

for SERVICES in docker etcd kube-apiserver kube-controller-manager kube-scheduler flanneld; do  
    systemctl restart $SERVICES
    systemctl enable $SERVICES
    systemctl status $SERVICES 
done

5.Minion Nodeの設定

(1) docker kubernetes flannelをインストール

sudo yum update -y

sudo yum -y install docker kubernetes flannel

(2) /etc/hostsファイルを編集
※全ノード共通

(3) flannelファイルを編集

sudo vi /etc/sysconfig/flanneld

Master設定 4(5)と同じ

# Flanneld configuration options

# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD="http://master:2379"

# etcd config key.  This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_KEY="/flannel/network"

# Any additional options that you want to pass
FLANNEL_OPTIONS="eth0"

(4) kubelet設定

sudo vi /etc/kubernetes/kubelet

###
# kubernetes kubelet (minion) config

# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=0.0.0.0"

# The port for the info server to serve on
KUBELET_PORT="--port=10250"

# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME=""

# location of the api-server
KUBELET_API_SERVER="--api_servers=http://master:8080"

# Add your own!
KUBELET_ARGS=""

(5) 各種サービス起動

#!/sh/bin

for SERVICES in kube-proxy kubelet docker flanneld; do 
    systemctl restart $SERVICES
    systemctl enable $SERVICES
    systemctl status $SERVICES 
done

(6) Minion Nodeを増やす
この設定をしたNodeを作成して各サービスを実行すると、ETCDを通じてMasterノード側でMinionを検知してくれる。

1台Minionの設置アップをしたらAMIイメージを作成しておき、そのAMIを元にインスタンスを作成すると、Minionの量産が容易。

①全ノードのhostsファイルの更新
②Masterノードでcontroller-manager設定(新minion追加)
③新規追加したノードで各サービスを起動

6.動作確認

正常にkuberクラスタが起動され、ホスト間の連携ができていれば、masterにて以下のコマンドを実行すると、minionノードを認識できる。
何も表示されない場合は、上記設定を再度見直すか、AWSのEC2のセキュリティポリシー等の設定を確認する。

$ kubectl get nodes
NAME              LABELS                                   STATUS    AGE
ip-172-31-28-50   kubernetes.io/hostname=ip-172-31-28-50   Ready     30s

(1)masterノードでサンプルpodを作成する

$kubectl create -f sample.yaml

サンプルpod(sample.yaml)

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
    - name: nginx-container
      image: nginx
      ports:
      - containerPort: 80

(2)podの稼働状況確認

$ kubectl get pod
NAME        READY     STATUS    RESTARTS   AGE
nginx-pod   1/1       Running   0          3h

podの稼働ノードを調べる
※get podの引数にpod NAMEと-oを指定。出力形式はyamlかjsonで指定可能

$ kubectl get pod nginx-pod -o yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: 2016-02-15T07:32:25Z
  name: nginx-pod
  namespace: default
  resourceVersion: "7101"
  selfLink: /api/v1/namespaces/default/pods/nginx-pod
  uid: 426e8595-d3b6-11e5-a2a4-066cb91d9daf

 (省略)

    lastState: {}
    name: nginx-container
    ready: true
    restartCount: 0
    state:
      running:
        startedAt: 2016-02-15T07:32:45Z
  hostIP: 172.31.31.79
  phase: Running
  podIP: 172.17.0.1
  startTime: 2016-02-15T07:32:25Z

podIPのIPアドレスと、pod作成時のyamlで指定したポート(80)で稼働している。
上記では、hostIP172.31.31.79のminion上で、
curl http://172.17.0.1:80/
を実行すると、レスポンスが返ってくる。

別なpodを新たに作成すると、複数のMinionノードが有る場合、1Podづつ分散実行される。

6
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
10