今日は、dockerはサーバ1台で利用するには非常に便利なツールです。しかし、共通でたくさんの人が利用する仕組み(システム)を作るには、もう少し手順が必要です。その一つがGoogleが提供したkubernetes(k8s)です。Redhatが提供するOpenShiftにもコンポーネントとして利用されています。
今日はその構築方法についてまとめました。利用するOSは、CentOS 7になります。
参考ページ
- http://keithtenzer.com/2015/06/01/application-containers-kubernetes-and-docker-from-scratch/
- http://keithtenzer.com/2015/04/15/containers-at-scale-with-kubernetes-on-openstack/
kubernetesのアーキテクチャ
システム構成
kubernetes01 master, node
kubernetes02 node
kubernetes03 node
設定手順
共通の設定
firewalldを止めておきます。
systemctl stop firewalld
systemctl disable firewalld
時刻同期を合わせます
yum install chrony
systemctl start chronyd.service
chronyc sources
サーバ名を登録します
192.168.243.51 kubernetes01
192.168.243.52 kubernetes02
192.168.243.53 kubernetes03
※各環境に合わせてください
Kubernetes Masterの設定
必要なサービス・ツールをインストールし、enableにします。
yum install etcd flannel docker-registry docker kubernetes
for SERVICES in docker.service docker-registry etcd kube-apiserver kube-controller-manager kube-scheduler flanneld
do systemctl enable $SERVICES
done
dockerのREGISTRYにprivate-registryを追加します。
INSECURE_REGISTRY='--insecure-registry kubernetes01:5000'
kubernetesのAPIサーバの設定をします
KUBE_API_ADDRESS="--address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBE_ETCD_SERVERS="--etcd_servers=http://kubernetes01:2379"
外部から参照できるように0.0.0.0にすることを忘れないようにしてください。
kubernetesのmasterの接続先を設定します
KUBE_MASTER="--master=http://kubernetes01:8080"
kubernetesのnodeを設定します
複数のnodeを設定する場合は、複数並べます。
KUBELET_ADDRESSES="--machines=kubernetes01,kubernetes02,kubernetes03"
etcdの設定
ETCD_LISTEN_PEER_URLS="http://localhost:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
外部から参照できるように0.0.0.0にすることを忘れないようにしてください。
flannelの設定
etcdと接続する設定を記入します。上で指定した2379ポートを間違わないように記載します。また、/flannel/networkは後で設定しています。
:/etc/sysconfig/flanneld
FLANNEL_ETCD="http://kubernetes01:2379"
FLANNEL_ETCD_KEY="/flannel/network"
FLANNEL_OPTIONS="eth0"
etcdにアップするflannelの設定ファイルです。
{
"Network": "10.100.0.0/16",
"SubnetLen": 24,
"SubnetMin": "10.100.50.0",
"SubnetMax": "10.100.199.0",
"Backend": {
"Type": "vxlan",
"VNI": 1
}
}
etcdのAPIを使って、前で設定した/flannel/network/configにJSONデータをアップします。
#curl -L http://kubernetes01:2379/v2/keys/flannel/network/config -XPUT --data-urlencode value@/root/flannel-config.json
{"action":"set","node":{"key":"/flannel/network/config","value":"{\n \"Network\": \"10.100.0.0/16\",\n \"SubnetLen\": 24,\n \"SubnetMin\": \"10.100.50.0\",\n \"SubnetMax\": \"10.100.199.0\",\n \"Backend\": {\n \"Type\": \"vxlan\",\n \"VNI\": 1\n }\n}\n","modifiedIndex":6,"createdIndex":6}}
正常に登録できているかは、以下のコマンドで確認できます。
etcdctl -C=http://kubernetes01:2379 ls --recursive
etcdctl -C=http://kubernetes01:2379 get /flannel/network/config
正常に起動することを確認し、念のため再起動しておきます。
systemctl start docker
systemctl start docker-registry
reboot
※再起動する意味は、起動後も正しく動作することを確認するということが大きい理由です。
kubenetes Nodeのインストール
必要なサービスをインストールします。
yum install -y docker kubernetes flannel
for SERVICES in docker.service kubelet kube-proxy flanneld
do systemctl enable $SERVICES
done
kubernetes nodeで動かすのは、kubeletサービスになります。
masterに接続するAPIのURLと自分のアドレスを設定します。
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_PORT="--port=10250"
KUBELET_HOSTNAME=""
KUBELET_API_SERVER="--api_servers=http://kubernetes01:8080"
外部から参照できるように0.0.0.0にすることを忘れないようにしてください。
dockerの設定
ADD_REGISTRY='--add-registry kubernetes01:5000'
flannelの設定
masterと同様に設定します。
FLANNEL_ETCD="http://kubernetes01:4001"
FLANNEL_ETCD_KEY="/flannel/network"
FLANNEL_OPTIONS="eth0"
各サービスの確認
うまく設定できればこのようにすべての接続先ノードが見えるはずです。
# kubectl get nodes
NAME LABELS STATUS
kubernetes01 kubernetes.io/hostname=kubernetes01 Ready
kubernetes02 kubernetes.io/hostname=kubernetes02 Ready
kubernetes03 kubernetes.io/hostname=kubernetes03 Ready
ちなみに、OpenShiftでは、flannelを使用していないそうです。flannelでは、latencyが大きくなる傾向があるそうで、Open vSwitchを利用し、VXLANのoverlayネットワークを構成しているようです。
今日はここまでです。