8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PostgreSQL on KubernetesAdvent Calendar 2018

Day 20

#20 RancherでKubernetesクラスタ構築

Last updated at Posted at 2018-12-20

本記事はPostgreSQL on Kubernetes Advent Calendar 2018の20日目です。

25日間の完走めざして頑張っていますが、先日からの検証に詰まっており、19日目の投稿は後ほどとなります。今日はちょっと目先を変えて、Rancherを利用したKubernetes環境の構築について見ていきたいと思います。

TL;DR

  • Rancherをつかえば複数のKubernetes環境の構築・管理も簡単。
  • Kubernetes Providerの選択には注意、CUSTOMではクラウド関連のAPIは叩けない模様。

※12/20 さっそく追記
同日にこちらが公開されていました。CUSTOMでもEBSを使うことは出来るようです。良く読んで、後ほど当記事も修正します。

Rancherとは

こちらの資料に詳しいですが、Kubernetesのクラスタを簡単に構築できるツールだと言って良いと思います。(私はKubernetesと同時にRancherに入門したため、実はkubeadmとかminikubeを使ったことはありません。)

今回のPostgreSQL on KubernetesではRancherも含め、以下のような準備をしています。

  • Rancherはv.2.0.6
  • ノードとしてAmazon EC2を1クラスタあたり10台程度準備しておく
  • RancherからKubernetesクラスタを作る際にはCUSTOMを選択

Rancherからk8sクラスタの構築

EC2インスタンスの準備

今回の検証ではAmazon EC2上で下記の設定が入った起動テンプレートを事前に準備しました。

  • CentOS Linux release 7.5.1804 ※Marketplaceから
  • docker 17.03.2-ce ※Rancher v2.0.6のインストール要件にあわせて
  • dockerの自動起動を設定済

インスタンスをテンプレートから起動して、dockerのバージョンと自動起動の確認をしておきます。

docker versionとsystemctl status
$ sudo docker version
Client:
 Version:      17.03.2-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   f5ec1e2
 Built:        Tue Jun 27 02:21:36 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.2-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   f5ec1e2
 Built:        Tue Jun 27 02:21:36 2017
 OS/Arch:      linux/amd64
 Experimental: false

$ sudo systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2018-12-20 01:25:29 UTC; 17min ago
     Docs: https://docs.docker.com
 Main PID: 845 (dockerd)
    Tasks: 20
   Memory: 57.3M
   CGroup: /system.slice/docker.service
           tq 845 /usr/bin/dockerd
           mq3020 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd...

CUSTOMでk8sクラスタの構築

今回はRancher自身の構築については解説しません。他の記事等を参考にRancherのUIへアクセス可能な環境を前提としていますのでご了承下さい。

ここまででRancherの環境構築が終わり、Kubernetesクラスタ用のEC2インスタンスの起動が終わったら、クラスタ構築を進めていきます。

Rancherで左上の[Global]のタブをクリックし、下記の画面に来たら[Add Cluster]をクリックします。
image.png

そうすると、以下のようにKubernetes Providerを選択する画面に移りますので、ここで[CUSTOM]を選択します。
image.png

画面下方ではクラスタの名前やKubernetes Version、Network Providerの入力項目があります。ここはお好みで設定して下さい。image.png

また、ここでCloud Providerで選択ができるようになっていますが、これまで確認したところ、Kubernetes ProviderとCloud Providerで整合性のない状態ではKubernetesクラスタが立ち上がりません。

例えば、

  • Kubernetes ProviderはCUSTOMだが、Cloud ProviderはAmazonにしたい

などを試しましたが、そもそも以下のノード追加が上手くいきません。CUSTOMの時にはCloud ProviderはNoneにしましょう。
こちらによれば、IAMの問題のようです。

Masterノードの追加

先ほどのクラスタ作成画面を入力して先に進むと、次にクラスタへノードを追加する画面へ移ります。Kubernetesクラスタでは1台以上のetcd、Control Planeが必要ですので、まずはそれを作成します。

下記の画面で[Node Role]の[etcd]と[Control Plane]のチェックを入れると、各ノードごとのdocker runコマンドが生成されますので、コピーアイコンをクリックして、KubernetesのMasterノードにするインスタンスにコマンドを投入して下さい。

image.png

コマンド実行後にコンテナの起動を確認すると、下記のようになっているはずです。

Masterノードでのコンテナ起動状況
$ sudo docker ps
CONTAINER ID        IMAGE                                                                                                COMMAND                  CREATED              STATUS              PORTS               NAMES
d5f4c3789314        3571bad91a6b                                                                                         "run.sh"                 22 seconds ago       Up 22 seconds                           k8s_agent_cattle-node-agent-rphqh_cattle-system_732d075e-0400-11e9-8caf-023749fae860_0
37ae796e4dfc        rancher/pause-amd64:3.1                                                                              "/pause"                 22 seconds ago       Up 22 seconds                           k8s_POD_cattle-node-agent-rphqh_cattle-system_732d075e-0400-11e9-8caf-023749fae860_0
0a7a434ff732        rancher/coreos-flannel-cni@sha256:3cf93562b936004cbe13ed7d22d1b13a273ac2b5092f87264eb77ac9c009e47f   "/install-cni.sh"        31 seconds ago       Up 31 seconds                           k8s_install-cni_kube-flannel-86ff2_kube-system_6af851d9-0400-11e9-8caf-023749fae860_0
acd57e7fee2a        rancher/coreos-flannel@sha256:93952a105b4576e8f09ab8c4e00483131b862c24180b0b7d342fb360bbe44f3d       "/opt/bin/flanneld..."   34 seconds ago       Up 33 seconds                           k8s_kube-flannel_kube-flannel-86ff2_kube-system_6af851d9-0400-11e9-8caf-023749fae860_0
0e82ab2ae152        rancher/pause-amd64:3.1                                                                              "/pause"                 36 seconds ago       Up 36 seconds                           k8s_POD_kube-flannel-86ff2_kube-system_6af851d9-0400-11e9-8caf-023749fae860_0
5d6c8baef3cc        rancher/hyperkube:v1.10.5-rancher1                                                                   "/opt/rke/entrypoi..."   45 seconds ago       Up 44 seconds                           kube-proxy
f092442d5e7e        rancher/hyperkube:v1.10.5-rancher1                                                                   "/opt/rke/entrypoi..."   50 seconds ago       Up 50 seconds                           kubelet
aac0a75b6c6b        rancher/hyperkube:v1.10.5-rancher1                                                                   "/opt/rke/entrypoi..."   56 seconds ago       Up 55 seconds                           kube-scheduler
e6f32a34cdf3        rancher/hyperkube:v1.10.5-rancher1                                                                   "/opt/rke/entrypoi..."   About a minute ago   Up About a minute                       kube-controller-manager
38d93b42ab62        rancher/hyperkube:v1.10.5-rancher1                                                                   "/opt/rke/entrypoi..."   About a minute ago   Up About a minute                       kube-apiserver
57f70612020f        rancher/coreos-etcd:v3.1.12                                                                          "/usr/local/bin/et..."   About a minute ago   Up About a minute                       etcd

これでetcdとControl Planeは起動しましたが、このままですといずれもシングル構成になります。本来はHA構成でつくったほうが良いですが、今回は割愛します。

Workerノードの追加

次にクラスタへworkerノードを追加します。

Masterノードと同じ画面で、今度は[Node Role]の[Worker]にチェックを入れて、生成されたdocker runコマンドをWorkerノードにするインスタンスに投入して下さい。

image.png

これをworkerノードの台数分繰り返せば、Kubernetesクラスタの構築は完了です。

EBSを使いたいならKubernetes Provider(Amazon EC2)を使おう

ここまで構築した環境で、Rookを利用したPostgreSQL on Kubernetesの検証には問題がありません。しかし、せっかくAmazon EC2を使っているのだから、EBSのボリュームをマウントしたい!となるとこの環境では上手くいきません。

たとえば、以下のようなStorageClassとPersistentVolumeClaimを作ってみます。

EBS利用のStorageClassとPersistentVolumeClaim
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: sc-ebs-001
parameters:
  encrypted: "false"
  type: gp2
provisioner: kubernetes.io/aws-ebs
reclaimPolicy: Delete
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc-pg-ebs-sf
  labels:
    app: pg-ebs-sf
spec:
  storageClassName: sc-ebs-001
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

これをRancher v2.0.6のCUSTOMで作成したクラスタにapplyすると以下のようにPVCがPendingとなります。

$ kubectl describe pvc pvc-pg-ebs-sf
Name:          pvc-pg-ebs-sf
Namespace:     default
StorageClass:  sc-ebs-001
Status:        Pending
Volume:
Labels:        <none>
Annotations:   field.cattle.io/creatorId=user-4h6wp
               volume.beta.kubernetes.io/storage-provisioner=kubernetes.io/aws-ebs
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:
Access Modes:
Events:
  Type     Reason              Age              From                         Message
  ----     ------              ----             ----                         -------
  Warning  ProvisioningFailed  5s (x7 over 1m)  persistentvolume-controller  Failed to provision volume with StorageClass "sc-ebs-001": Failed to get AWS Cloud Provider. GetCloudProvider returned <nil> instead

同じYAMLファイルであっても、Kubernetes ProviderでAmazon EC2、Cloud ProviderでAmazonを選択した環境であれば正常に構築ができます。

おそらくEBSに限りませんが、AWSのリソースをそのまま使いたければクラスタ構築時にCUSTOMを選ばないようにしたほうが良いでしょう。

まとめ

今日はちょっと趣向を変えて、RancherによるKubernetes環境の構築をしてみました。その過程でKubernetes ProviderやCloud Providerも色々と試しましたが、明日以降はこれまでのPostgreSQL on Kubernetes(Rook利用)とEBSを利用した構成を比較してみたいと思っています。

よろしくお願いします。

8
6
1

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
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?