kubernetesを使ってみる。
mysql clusterをdockerで構築できるvitessというプロダクトがあるらしい。
youtubeがオープンソースで公開している、mysqlをスケールアウトさせるためのデータベースツール。 kubernetesで簡単にスケールアウトができるらしい。
vitessはdockerを使って簡単に試すこともできるが、クラスターはkubernetesを利用して作成する。
ということで、ローカルな環境にkubernetesをデプロイするところから始める。
kubernetesはkubeadmを使用すればかなり簡単にデプロイすることができる。
とりあえず今回はCentOSでkubernetesクラスターを作成する。
準備
今回の構成はmaster1台とslave node2台で構築する。
すべてのノードに対して以下の操作を行う。
必要な資材はyumでインストールできるのだが、新し目のkubernetesをインストールするためにリポジトリを更新しておく。
/etc/yum.repos.d/kubernetes.repo
を以下のようにして作成。
[kubernetes] name=Kubernetes baseurl=http://yum.kubernetes.io/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
したらkubeadmをインストール
$ yum -y update $ yum install -y docker-registry docker kubeadm
あとからいろいろと怒られないようにネットワークのフォアディングとブリッチを許可しておく。
$ sysctl -w net.ipv4.ip_forward=1 $ sysctl -w net.bridge.bridge-nf-call-iptables=1
ひとまず準備はこれで終了
kubeadmの実行
masterノード
masterノードで以下のコマンドを実行
[root@master ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.56.201 [kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters. [init] Using Kubernetes version: v1.7.7 [init] Using Authorization modes: [Node RBAC] ...(中略)... mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: http://kubernetes.io/docs/admin/addons/ You can now join any number of machines by running the following on each node as root: kubeadm join --token 8a2d44.2cc20d08cf7967f3 192.168.56.201:6443
これでマスターノードが起動し、コマンド実行結果の最後に表示されているkubeadm join --token ....
を外のノードで実行すれば完了
slaveノード
[root@node01 ~]# kubeadm join --token 8a2d44.2cc20d08cf7967f3 192.168.56.201:6443
これを全ノードで実行
masterノードで確認
[root@master ~]# kubectl get node NAME STATUS AGE VERSION master.atomichost NotReady 8m v1.7.5 node01.atomichost NotReady 3m v1.7.5 node02.atomichost NotReady 1m v1.7.5
kubeadmにより立ち上がっているPodを確認
[root@master ~]# kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system etcd-master.atomichost 1/1 Running 0 8m kube-system kube-apiserver-master.atomichost 1/1 Running 0 8m kube-system kube-controller-manager-master.atomichost 1/1 Running 0 8m kube-system kube-dns-2425271678-ch19z 0/3 Pending 0 9m kube-system kube-proxy-0msfg 1/1 Running 0 1m kube-system kube-proxy-b8pkz 1/1 Running 0 3m kube-system kube-proxy-c9rrc 1/1 Running 0 9m kube-system kube-scheduler-master.atomichost 1/1 Running 0 8m
WARNING: Running with swap on is not supported. Please disable swap or set kubelet's --fail-swap-on flag to false.
こんなエラーが出てきたら/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
の最後の起動コマンドに--fail-swap-on=false
と付け加えて再実行する。 手順はこんな感じ。
[root@master ~]# kubeadm reset [root@master ~]# cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf [Service] ...(中略)... Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true" ExecStart= ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_CADVISOR_ARGS $KUBELET_CGROUP_ARGS $KUBELET_CERTIFICATE_ARGS $KUBELET_EXTRA_ARGS --fail-swap-on=false [root@master ~]# systemctl daemon-reload [root@master ~]# kubeadm join --token 8a2d44.2cc20d08cf7967f3 192.168.56.201:6443
ネットワーク設定
今回はflannelでkubernetesクラスター間のネットワークを構築する。
公式サイトにはcoreosが提供しているkube-flannel.ymlでサービスを起動すればOKって書いてある。今回は適当にgithubにあがってたflannelのymlファイルを持ってきた。
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml wget https://raw.githubusercontent.com/coreos/flannel/317b7d199e3fe937f04ecb39beed025e47316430/Documentation/k8s-manifests/kube-flannel-rbac.yml
たしかにこれでOKなのだが、各ノードの接続に使用しているネットワーク・インターフェース(kubeadmでadvertise設定したip)がeth0とかデバイスの先頭のものでないときはymlファイルを弄る必要がある。
このため、kube-flannel.ymlを以下のように変更した。
--- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: ...(中略)... containers: - name: kube-flannel image: quay.io/coreos/flannel:v0.9.0-amd64 command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr", "--iface=eth1" ] ...(後略)...
あとは立ち上げるだけ。
[root@master ~]# kubectl apply -f kube-flannel-rbac.yml [root@master ~]# kubectl apply -f kube-flannel.yml
これでネットワークが設定されると、無事にkune-dnsも立ち上がる。
[root@master ~]# kubectl get pod --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system etcd-master.atomichost 1/1 Running 0 4h kube-system kube-apiserver-master.atomichost 1/1 Running 0 4h kube-system kube-controller-manager-master.atomichost 1/1 Running 0 4h kube-system kube-dns-545bc4bfd4-zmgg8 3/3 Running 0 4h kube-system kube-flannel-ds-4tshg 1/1 Running 0 1h kube-system kube-flannel-ds-crpt7 1/1 Running 0 1h kube-system kube-flannel-ds-fkd6b 1/1 Running 0 1h kube-system kube-flannel-ds-n6jhv 1/1 Running 0 1h kube-system kube-proxy-c6px7 1/1 Running 0 4h kube-system kube-proxy-r7ppv 1/1 Running 0 1h kube-system kube-proxy-w6m84 1/1 Running 0 1h kube-system kube-proxy-zv42h 1/1 Running 0 1h kube-system kube-scheduler-master.atomichost 1/1 Running 0 4h