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