OSS Fan ~OSSでLinuxサーバ構築~

このエントリーをはてなブックマークに追加

Kubernetes 1.10.2をAWS EC2(CentOS 7.5)へインストールしてkubeadmでマスタサーバとして構成

カテゴリ:OSSセットアップ | ソフトウェア:Kubernetes | タグ:
最終更新日:2020/11/18 | 公開日:2018/05/20

目次

概要

 Kubernetesを試すためにCentOS 7.4の環境にYUMでKubernetesをインストールして使っていたのですが、 CentOS 7.4デフォルトのYUMリポジトリでインストール可能なバージョンが1.5とちょっと古く、ネットに載っている 情報が通用しないケースが散見されました。 そこで、2018/05/20時点で最新の1.10をインストールしてみました。 この時点ではまだネットに情報が少なく、バージョン1.5からも変更された点が多いようで、 なかなか正常に稼働しませんでした。最終的に頑張って英語を読んでkubernetes.ioの手順を参考に インストールしてみたところ、なんとか稼働しました。 AWSのEC2にインストールした時の手順を掲載します。

構成

利用環境

 サーバ環境はAWS(Amazon Web Services)のEC2インスタンスを利用しました。 サーバのスペックは以下のとおりです。 Amazonマシンイメージ(AMI)にはAWS Marketplaceで公開されている『CentOS 7 (x86_64) - with Updates HVM』を使用しています。 今回の動作確認ではスペックが低くても問題ないので、インスタンスタイプはt2.microを選択しています。

■サーバスペック
項目内容
AMICentOS 7 (x86_64) - with Updates HVM
インスタンスタイプt2.micro
vCPU1
メモリ1GiB
ディスク汎用SSD(GP2) 8GiB
リージョン日本

サーバ構成

OSバージョン

CentOS 7.5.1804 x86_64

ソフトウェア・パッケージ一覧

  • docker-1.13.1-58.git87f2fab.el7.centos.x86_64.rpm
  • 32e8bd812a3944ccf07750d52088a118fa11493d34e009e2873317e0f0b0dfd2-kubectl-1.10.2-0.x86_64.rpm
  • b754a6990af7d7012189610b0dc69e6e950c13a8c415b9ebea8d56352e9719fd-kubeadm-1.10.2-0.x86_64.rpm
  • bdee083331998c4631bf6653454c584fb796944fe97271906acbaacbf340e1d5-kubelet-1.10.2-0.x86_64.rpm

環境構築

AWSの設定

セキュリティグループの設定

 KubernetesではマスタサーバのAPIサーバ機能に対する通信が多数発生します。 AWSのEC2で以下の通りセキュリティグループの設定を行います。 設定しない場合動作しませんでした。

Kubernetesの動作に必要なのセキュリティグループ設定

SELinuxの無効化

SELinuxの無効化設定

 SELinuxを無効化します。 必須の設定ではありませんが、途中で問題が発生する可能性を下げるために 今回は無効化して作業を進めます。

$ sudo su -
# cd /etc/selinux/
# vi config
ファイル名:/etc/selinux/config
※以下、該当箇所のみ変更※
SELINUX=enforcing
   ↓変更
SELINUX=disabled

Linuxの再起動

 Linuxを再起動してSELinuxの無効化を反映させます。

# shutdown -r 0

Dockerの構築

Dockerのインストール

 今回の手順では、KubernetesのプロセスもPod(Dockerコンテナ)で稼働するため、 Dockerのインストールが必要となります。

$ sudo su -
Last login: Fri May 18 15:20:08 UTC 2018 on pts/0
# yum -y install docker
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
base                                                                                             | 3.6 kB  00:00:00
extras                                                                                           | 3.4 kB  00:00:00
kubernetes/signature                                                                             |  454 B  00:00:00
Retrieving key from https://packages.cloud.google.com/yum/doc/yum-key.gpg
Importing GPG key 0xA7317B0F:
 Userid     : "Google Cloud Packages Automatic Signing Key <gc-team@google.com>"
 Fingerprint: d0bc 747f d8ca f711 7500 d6fa 3746 c208 a731 7b0f
 From       : https://packages.cloud.google.com/yum/doc/yum-key.gpg
Retrieving key from https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
kubernetes/signature                                                                             | 1.4 kB  00:00:00 !!!
updates                                                                                          | 3.4 kB  00:00:00
(1/5): base/7/x86_64/group_gz                                                                    | 166 kB  00:00:00
(2/5): extras/7/x86_64/primary_db                                                                | 125 kB  00:00:00
(3/5): updates/7/x86_64/primary_db                                                               | 1.2 MB  00:00:00
(4/5): base/7/x86_64/primary_db                                                                  | 5.9 MB  00:00:00
(5/5): kubernetes/primary                                                                        |  29 kB  00:00:00
kubernetes                                                                                                      205/205
Resolving Dependencies
--> Running transaction check
---> Package docker.x86_64 2:1.13.1-58.git87f2fab.el7.centos will be installed
--> Processing Dependency: docker-common = 2:1.13.1-58.git87f2fab.el7.centos for package: 2:docker-1.13.1-58.git87f2fab.el7.centos.x86_64
--> Processing Dependency: docker-client = 2:1.13.1-58.git87f2fab.el7.centos for package: 2:docker-1.13.1-58.git87f2fab.el7.centos.x86_64
--> Running transaction check
---> Package docker-client.x86_64 2:1.13.1-58.git87f2fab.el7.centos will be installed
---> Package docker-common.x86_64 2:1.13.1-58.git87f2fab.el7.centos will be installed
--> Processing Dependency: skopeo-containers >= 1:0.1.26-2 for package: 2:docker-common-1.13.1-58.git87f2fab.el7.centos.x86_64
--> Processing Dependency: oci-umount >= 2:2.3.3-3 for package: 2:docker-common-1.13.1-58.git87f2fab.el7.centos.x86_64
--> Processing Dependency: oci-systemd-hook >= 1:0.1.4-9 for package: 2:docker-common-1.13.1-58.git87f2fab.el7.centos.x86_64
--> Processing Dependency: oci-register-machine >= 1:0-5.13 for package: 2:docker-common-1.13.1-58.git87f2fab.el7.centos.x86_64
--> Processing Dependency: lvm2 >= 2.02.112 for package: 2:docker-common-1.13.1-58.git87f2fab.el7.centos.x86_64
--> Processing Dependency: container-storage-setup >= 0.9.0-1 for package: 2:docker-common-1.13.1-58.git87f2fab.el7.centos.x86_64
--> Processing Dependency: container-selinux >= 2:2.51-1 for package: 2:docker-common-1.13.1-58.git87f2fab.el7.centos.x86_64
--> Running transaction check
---> Package container-selinux.noarch 2:2.55-1.el7 will be installed
---> Package container-storage-setup.noarch 0:0.9.0-1.rhel75.gite0997c3.el7 will be installed
---> Package lvm2.x86_64 7:2.02.177-4.el7 will be installed
--> Processing Dependency: lvm2-libs = 7:2.02.177-4.el7 for package: 7:lvm2-2.02.177-4.el7.x86_64
--> Processing Dependency: device-mapper-persistent-data >= 0.7.0-0.1.rc6 for package: 7:lvm2-2.02.177-4.el7.x86_64
--> Processing Dependency: liblvm2app.so.2.2(Base)(64bit) for package: 7:lvm2-2.02.177-4.el7.x86_64
--> Processing Dependency: libdevmapper-event.so.1.02(Base)(64bit) for package: 7:lvm2-2.02.177-4.el7.x86_64
--> Processing Dependency: liblvm2app.so.2.2()(64bit) for package: 7:lvm2-2.02.177-4.el7.x86_64
--> Processing Dependency: libdevmapper-event.so.1.02()(64bit) for package: 7:lvm2-2.02.177-4.el7.x86_64
---> Package oci-register-machine.x86_64 1:0-6.git2b44233.el7 will be installed
---> Package oci-systemd-hook.x86_64 1:0.1.15-2.gitc04483d.el7 will be installed
--> Processing Dependency: libyajl.so.2()(64bit) for package: 1:oci-systemd-hook-0.1.15-2.gitc04483d.el7.x86_64
---> Package oci-umount.x86_64 2:2.3.3-3.gite3c9055.el7 will be installed
---> Package skopeo-containers.x86_64 1:0.1.29-1.dev.gitb08350d.el7 will be installed
--> Running transaction check
---> Package device-mapper-event-libs.x86_64 7:1.02.146-4.el7 will be installed
---> Package device-mapper-persistent-data.x86_64 0:0.7.3-3.el7 will be installed
--> Processing Dependency: libaio.so.1(LIBAIO_0.4)(64bit) for package: device-mapper-persistent-data-0.7.3-3.el7.x86_64
--> Processing Dependency: libaio.so.1(LIBAIO_0.1)(64bit) for package: device-mapper-persistent-data-0.7.3-3.el7.x86_64
--> Processing Dependency: libaio.so.1()(64bit) for package: device-mapper-persistent-data-0.7.3-3.el7.x86_64
---> Package lvm2-libs.x86_64 7:2.02.177-4.el7 will be installed
--> Processing Dependency: device-mapper-event = 7:1.02.146-4.el7 for package: 7:lvm2-libs-2.02.177-4.el7.x86_64
---> Package yajl.x86_64 0:2.0.4-4.el7 will be installed
--> Running transaction check
---> Package device-mapper-event.x86_64 7:1.02.146-4.el7 will be installed
---> Package libaio.x86_64 0:0.3.109-13.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================
 Package                               Arch           Version                                      Repository      Size
========================================================================================================================
Installing:
 docker                                x86_64         2:1.13.1-58.git87f2fab.el7.centos            extras          16 M
Installing for dependencies:
 container-selinux                     noarch         2:2.55-1.el7                                 extras          34 k
 container-storage-setup               noarch         0.9.0-1.rhel75.gite0997c3.el7                extras          33 k
 device-mapper-event                   x86_64         7:1.02.146-4.el7                             base           185 k
 device-mapper-event-libs              x86_64         7:1.02.146-4.el7                             base           184 k
 device-mapper-persistent-data         x86_64         0.7.3-3.el7                                  base           405 k
 docker-client                         x86_64         2:1.13.1-58.git87f2fab.el7.centos            extras         3.8 M
 docker-common                         x86_64         2:1.13.1-58.git87f2fab.el7.centos            extras          87 k
 libaio                                x86_64         0.3.109-13.el7                               base            24 k
 lvm2                                  x86_64         7:2.02.177-4.el7                             base           1.3 M
 lvm2-libs                             x86_64         7:2.02.177-4.el7                             base           1.0 M
 oci-register-machine                  x86_64         1:0-6.git2b44233.el7                         extras         1.1 M
 oci-systemd-hook                      x86_64         1:0.1.15-2.gitc04483d.el7                    extras          33 k
 oci-umount                            x86_64         2:2.3.3-3.gite3c9055.el7                     extras          32 k
 skopeo-containers                     x86_64         1:0.1.29-1.dev.gitb08350d.el7                extras          13 k
 yajl                                  x86_64         2.0.4-4.el7                                  base            39 k

Transaction Summary
========================================================================================================================
Install  1 Package (+15 Dependent packages)

Total download size: 25 M
Installed size: 81 M
Downloading packages:
warning: /var/cache/yum/x86_64/7/base/packages/device-mapper-event-1.02.146-4.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for device-mapper-event-1.02.146-4.el7.x86_64.rpm is not installed
(1/16): device-mapper-event-1.02.146-4.el7.x86_64.rpm                                            | 185 kB  00:00:00
Public key for container-selinux-2.55-1.el7.noarch.rpm is not installed
(2/16): container-selinux-2.55-1.el7.noarch.rpm                                                  |  34 kB  00:00:00
(3/16): container-storage-setup-0.9.0-1.rhel75.gite0997c3.el7.noarch.rpm                         |  33 kB  00:00:00
(4/16): device-mapper-event-libs-1.02.146-4.el7.x86_64.rpm                                       | 184 kB  00:00:00
(5/16): device-mapper-persistent-data-0.7.3-3.el7.x86_64.rpm                                     | 405 kB  00:00:00
(6/16): libaio-0.3.109-13.el7.x86_64.rpm                                                         |  24 kB  00:00:00
(7/16): docker-client-1.13.1-58.git87f2fab.el7.centos.x86_64.rpm                                 | 3.8 MB  00:00:00
(8/16): lvm2-libs-2.02.177-4.el7.x86_64.rpm                                                      | 1.0 MB  00:00:00
(9/16): docker-common-1.13.1-58.git87f2fab.el7.centos.x86_64.rpm                                 |  87 kB  00:00:00
(10/16): lvm2-2.02.177-4.el7.x86_64.rpm                                                          | 1.3 MB  00:00:00
(11/16): oci-systemd-hook-0.1.15-2.gitc04483d.el7.x86_64.rpm                                     |  33 kB  00:00:00
(12/16): oci-umount-2.3.3-3.gite3c9055.el7.x86_64.rpm                                            |  32 kB  00:00:00
(13/16): oci-register-machine-0-6.git2b44233.el7.x86_64.rpm                                      | 1.1 MB  00:00:00
(14/16): skopeo-containers-0.1.29-1.dev.gitb08350d.el7.x86_64.rpm                                |  13 kB  00:00:00
(15/16): yajl-2.0.4-4.el7.x86_64.rpm                                                             |  39 kB  00:00:00
(16/16): docker-1.13.1-58.git87f2fab.el7.centos.x86_64.rpm                                       |  16 MB  00:00:00
------------------------------------------------------------------------------------------------------------------------
Total                                                                                    27 MB/s |  25 MB  00:00:00
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
 Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
 Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
 Package    : centos-release-7-5.1804.el7.centos.x86_64 (installed)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : 7:device-mapper-event-libs-1.02.146-4.el7.x86_64                                                    1/16
  Installing : yajl-2.0.4-4.el7.x86_64                                                                             2/16
  Installing : 2:oci-umount-2.3.3-3.gite3c9055.el7.x86_64                                                          3/16
  Installing : 1:oci-systemd-hook-0.1.15-2.gitc04483d.el7.x86_64                                                   4/16
  Installing : 7:device-mapper-event-1.02.146-4.el7.x86_64                                                         5/16
  Installing : 7:lvm2-libs-2.02.177-4.el7.x86_64                                                                   6/16
  Installing : libaio-0.3.109-13.el7.x86_64                                                                        7/16
  Installing : device-mapper-persistent-data-0.7.3-3.el7.x86_64                                                    8/16
  Installing : 7:lvm2-2.02.177-4.el7.x86_64                                                                        9/16
  Installing : container-storage-setup-0.9.0-1.rhel75.gite0997c3.el7.noarch                                       10/16
  Installing : 1:oci-register-machine-0-6.git2b44233.el7.x86_64                                                   11/16
  Installing : 1:skopeo-containers-0.1.29-1.dev.gitb08350d.el7.x86_64                                             12/16
  Installing : 2:container-selinux-2.55-1.el7.noarch                                                              13/16
setsebool:  SELinux is disabled.
  Installing : 2:docker-common-1.13.1-58.git87f2fab.el7.centos.x86_64                                             14/16
  Installing : 2:docker-client-1.13.1-58.git87f2fab.el7.centos.x86_64                                             15/16
  Installing : 2:docker-1.13.1-58.git87f2fab.el7.centos.x86_64                                                    16/16
  Verifying  : 2:container-selinux-2.55-1.el7.noarch                                                               1/16
  Verifying  : 1:skopeo-containers-0.1.29-1.dev.gitb08350d.el7.x86_64                                              2/16
  Verifying  : 2:docker-client-1.13.1-58.git87f2fab.el7.centos.x86_64                                              3/16
  Verifying  : device-mapper-persistent-data-0.7.3-3.el7.x86_64                                                    4/16
  Verifying  : 7:device-mapper-event-1.02.146-4.el7.x86_64                                                         5/16
  Verifying  : 2:docker-1.13.1-58.git87f2fab.el7.centos.x86_64                                                     6/16
  Verifying  : 2:docker-common-1.13.1-58.git87f2fab.el7.centos.x86_64                                              7/16
  Verifying  : 1:oci-register-machine-0-6.git2b44233.el7.x86_64                                                    8/16
  Verifying  : 2:oci-umount-2.3.3-3.gite3c9055.el7.x86_64                                                          9/16
  Verifying  : 7:device-mapper-event-libs-1.02.146-4.el7.x86_64                                                   10/16
  Verifying  : 1:oci-systemd-hook-0.1.15-2.gitc04483d.el7.x86_64                                                  11/16
  Verifying  : container-storage-setup-0.9.0-1.rhel75.gite0997c3.el7.noarch                                       12/16
  Verifying  : yajl-2.0.4-4.el7.x86_64                                                                            13/16
  Verifying  : libaio-0.3.109-13.el7.x86_64                                                                       14/16
  Verifying  : 7:lvm2-libs-2.02.177-4.el7.x86_64                                                                  15/16
  Verifying  : 7:lvm2-2.02.177-4.el7.x86_64                                                                       16/16

Installed:
  docker.x86_64 2:1.13.1-58.git87f2fab.el7.centos

Dependency Installed:
  container-selinux.noarch 2:2.55-1.el7                  container-storage-setup.noarch 0:0.9.0-1.rhel75.gite0997c3.el7
  device-mapper-event.x86_64 7:1.02.146-4.el7            device-mapper-event-libs.x86_64 7:1.02.146-4.el7
  device-mapper-persistent-data.x86_64 0:0.7.3-3.el7     docker-client.x86_64 2:1.13.1-58.git87f2fab.el7.centos
  docker-common.x86_64 2:1.13.1-58.git87f2fab.el7.centos libaio.x86_64 0:0.3.109-13.el7
  lvm2.x86_64 7:2.02.177-4.el7                           lvm2-libs.x86_64 7:2.02.177-4.el7
  oci-register-machine.x86_64 1:0-6.git2b44233.el7       oci-systemd-hook.x86_64 1:0.1.15-2.gitc04483d.el7
  oci-umount.x86_64 2:2.3.3-3.gite3c9055.el7             skopeo-containers.x86_64 1:0.1.29-1.dev.gitb08350d.el7
  yajl.x86_64 0:2.0.4-4.el7

Complete!

Dockerの自動起動設定とサービスの起動

 初期状態ではDockerの自動起動が無効化されており、サービスも停止しています。 DockerはKubernetesの稼働に必要なのでLinuxの起動に合わせて自動起動するようSystemdの設定を行います。 また、Dockerのサービスを起動します。

# systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) ←自動起動無効
   Active: inactive (dead) ←停止状態
     Docs: http://docs.docker.com
# systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
# systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) ←自動起動有効
   Active: inactive (dead) ←停止状態
     Docs: http://docs.docker.com
# systemctl start docker.service
# 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 Fri 2018-05-18 15:26:55 UTC; 1s ago ←起動状態
     Docs: http://docs.docker.com
 Main PID: 1387 (dockerd-current)
   CGroup: /system.slice/docker.service
           tq1387 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --defaul...
           mq1391 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock -...

May 18 15:26:55 ip-172-31-29-161.ap-northeast-1.compute.internal dockerd-current[1387]: time="2018-05-18T15:26:55.63..."
May 18 15:26:55 ip-172-31-29-161.ap-northeast-1.compute.internal dockerd-current[1387]: time="2018-05-18T15:26:55.66..."
May 18 15:26:55 ip-172-31-29-161.ap-northeast-1.compute.internal dockerd-current[1387]: time="2018-05-18T15:26:55.66..."
May 18 15:26:55 ip-172-31-29-161.ap-northeast-1.compute.internal dockerd-current[1387]: time="2018-05-18T15:26:55.72..."
May 18 15:26:55 ip-172-31-29-161.ap-northeast-1.compute.internal dockerd-current[1387]: time="2018-05-18T15:26:55.79..."
May 18 15:26:55 ip-172-31-29-161.ap-northeast-1.compute.internal dockerd-current[1387]: time="2018-05-18T15:26:55.82..."
May 18 15:26:55 ip-172-31-29-161.ap-northeast-1.compute.internal dockerd-current[1387]: time="2018-05-18T15:26:55.83..."
May 18 15:26:55 ip-172-31-29-161.ap-northeast-1.compute.internal dockerd-current[1387]: time="2018-05-18T15:26:55.83...1
May 18 15:26:55 ip-172-31-29-161.ap-northeast-1.compute.internal systemd[1]: Started Docker Application Container E...e.
May 18 15:26:55 ip-172-31-29-161.ap-northeast-1.compute.internal dockerd-current[1387]: time="2018-05-18T15:26:55.85..."
Hint: Some lines were ellipsized, use -l to show in full.

Kubernetesのマスタサーバ構築

KubernetesのYUMリポジトリを登録

 KubernetesをYUMでインストールするために、YUMのリポジトリを登録します。 設定ファイルとして /etc/yum.repos.d/kubernetes.repo ファイルを生成します。

# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
> [kubernetes]
> name=Kubernetes
> baseurl=https://packages.cloud.google.com/yum/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
> EOF

Kubernetesのインストール

 YUMでKubernetesをインストールします。 必要なものは kubelet と kubeadm と kubectl です。 旧バージョンのKubernetes 1.5をインストールした頃はkubernetesという名前のRPMパッケージでしたが、 1.10に至る過程で構成が変わったようです(もしくはインストール方法が複数あるか?)。

# yum -y install kubelet kubeadm kubectl
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package kubeadm.x86_64 0:1.10.2-0 will be installed
--> Processing Dependency: kubernetes-cni for package: kubeadm-1.10.2-0.x86_64
---> Package kubectl.x86_64 0:1.10.2-0 will be installed
---> Package kubelet.x86_64 0:1.10.2-0 will be installed
--> Processing Dependency: socat for package: kubelet-1.10.2-0.x86_64
--> Processing Dependency: ebtables for package: kubelet-1.10.2-0.x86_64
--> Running transaction check
---> Package ebtables.x86_64 0:2.0.10-16.el7 will be installed
---> Package kubernetes-cni.x86_64 0:0.6.0-0 will be installed
---> Package socat.x86_64 0:1.7.3.2-2.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================
 Package                        Arch                   Version                         Repository                  Size
========================================================================================================================
Installing:
 kubeadm                        x86_64                 1.10.2-0                        kubernetes                  17 M
 kubectl                        x86_64                 1.10.2-0                        kubernetes                 7.6 M
 kubelet                        x86_64                 1.10.2-0                        kubernetes                  17 M
Installing for dependencies:
 ebtables                       x86_64                 2.0.10-16.el7                   base                       123 k
 kubernetes-cni                 x86_64                 0.6.0-0                         kubernetes                 8.6 M
 socat                          x86_64                 1.7.3.2-2.el7                   base                       290 k

Transaction Summary
========================================================================================================================
Install  3 Packages (+3 Dependent packages)

Total download size: 51 M
Installed size: 273 M
Downloading packages:
(1/6): ebtables-2.0.10-16.el7.x86_64.rpm                                                         | 123 kB  00:00:00
warning: /var/cache/yum/x86_64/7/kubernetes/packages/32e8bd812a3944ccf07750d52088a118fa11493d34e009e2873317e0f0b0dfd2-kubectl-1.10.2-0.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID 3e1ba8d5: NOKEY
Public key for 32e8bd812a3944ccf07750d52088a118fa11493d34e009e2873317e0f0b0dfd2-kubectl-1.10.2-0.x86_64.rpm is not installed
(2/6): 32e8bd812a3944ccf07750d52088a118fa11493d34e009e2873317e0f0b0dfd2-kubectl-1.10.2-0.x86_64. | 7.6 MB  00:00:01
(3/6): b754a6990af7d7012189610b0dc69e6e950c13a8c415b9ebea8d56352e9719fd-kubeadm-1.10.2-0.x86_64. |  17 MB  00:00:03
(4/6): socat-1.7.3.2-2.el7.x86_64.rpm                                                            | 290 kB  00:00:00
(5/6): bdee083331998c4631bf6653454c584fb796944fe97271906acbaacbf340e1d5-kubelet-1.10.2-0.x86_64. |  17 MB  00:00:02
(6/6): fe33057ffe95bfae65e2f269e1b05e99308853176e24a4d027bc082b471a07c0-kubernetes-cni-0.6.0-0.x | 8.6 MB  00:00:02
------------------------------------------------------------------------------------------------------------------------
Total                                                                                   7.8 MB/s |  51 MB  00:00:06
Retrieving key from https://packages.cloud.google.com/yum/doc/yum-key.gpg
Importing GPG key 0xA7317B0F:
 Userid     : "Google Cloud Packages Automatic Signing Key <gc-team@google.com>"
 Fingerprint: d0bc 747f d8ca f711 7500 d6fa 3746 c208 a731 7b0f
 From       : https://packages.cloud.google.com/yum/doc/yum-key.gpg
Retrieving key from https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
Importing GPG key 0x3E1BA8D5:
 Userid     : "Google Cloud Packages RPM Signing Key <gc-team@google.com>"
 Fingerprint: 3749 e1ba 95a8 6ce0 5454 6ed2 f09c 394c 3e1b a8d5
 From       : https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : ebtables-2.0.10-16.el7.x86_64                                                                        1/6
  Installing : socat-1.7.3.2-2.el7.x86_64                                                                           2/6
  Installing : kubernetes-cni-0.6.0-0.x86_64                                                                        3/6
  Installing : kubelet-1.10.2-0.x86_64                                                                              4/6
  Installing : kubectl-1.10.2-0.x86_64                                                                              5/6
  Installing : kubeadm-1.10.2-0.x86_64                                                                              6/6
  Verifying  : kubectl-1.10.2-0.x86_64                                                                              1/6
  Verifying  : kubelet-1.10.2-0.x86_64                                                                              2/6
  Verifying  : kubeadm-1.10.2-0.x86_64                                                                              3/6
  Verifying  : socat-1.7.3.2-2.el7.x86_64                                                                           4/6
  Verifying  : kubernetes-cni-0.6.0-0.x86_64                                                                        5/6
  Verifying  : ebtables-2.0.10-16.el7.x86_64                                                                        6/6

Installed:
  kubeadm.x86_64 0:1.10.2-0              kubectl.x86_64 0:1.10.2-0              kubelet.x86_64 0:1.10.2-0

Dependency Installed:
  ebtables.x86_64 0:2.0.10-16.el7         kubernetes-cni.x86_64 0:0.6.0-0         socat.x86_64 0:1.7.3.2-2.el7

Complete!

kubeletの自動起動設定

 kubeletの自動起動設定を行います。 ここでkubeletのサービス起動を行うと、失敗してしまいます。 後続の手順でKubernetesクラスタの構成(kubeadm init)を行いますが、 このタイミングでkubeletが勝手に起動されるので、ここでは起動する必要はありません。

# systemctl status kubelet.service
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/etc/systemd/system/kubelet.service; disabled; vendor preset: disabled) ←自動起動無効
  Drop-In: /etc/systemd/system/kubelet.service.d
           mq10-kubeadm.conf
   Active: inactive (dead) ←停止状態
     Docs: http://kubernetes.io/docs/
# systemctl enable kubelet.service
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /etc/systemd/system/kubelet.service.
# systemctl status kubelet.service
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: disabled) ←自動起動有効
  Drop-In: /etc/systemd/system/kubelet.service.d
           mq10-kubeadm.conf
   Active: inactive (dead) ←停止状態
     Docs: http://kubernetes.io/docs/

カーネルパラメータの設定

 RHELやCentOSのバージョン7ではiptablesがバイパスされているため通信が正しくルーティングされない問題が 報告されているようで、これを回避するための設定を行います。

# cat <<EOF >  /etc/sysctl.d/k8s.conf ←sysctlの設定ファイル作成
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> EOF
# sysctl --system ←sysctlの設定ファイルのロード
* Applying /usr/lib/sysctl.d/00-system.conf ...
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
kernel.yama.ptrace_scope = 0
* Applying /usr/lib/sysctl.d/50-default.conf ...
kernel.sysrq = 16
kernel.core_uses_pid = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.promote_secondaries = 1
net.ipv4.conf.all.promote_secondaries = 1
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
* Applying /usr/lib/sysctl.d/99-docker.conf ...
fs.may_detach_mounts = 1
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.d/k8s.conf ...
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
* Applying /etc/sysctl.conf ...

cgroupドライバの設定確認

 Dockerとkubeletで同じcgroupドライバを使用していることを確認します。 今回の手順ではcgroupドライバにどちらもsystemdが設定されていたので、特に設定変更は必要ありませんでした。 以下、確認手順のみ参考に。

# docker info | grep -i cgroup
  WARNING: You're not using the default seccomp profile
Cgroup Driver: systemd ←systemdが設定されている
# cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true"
Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin"
Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"
Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt"
Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=0"
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd" ←systemdが設定されている
Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki"
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

Kubernetesクラスタの構築

 ここがメインです。Kubernetesクラスタを構築します。 後続の手順でPodネットワーク・アドオンとしてFlannelをインストールしますが、 Flannelの要件として kube init のオプションとして --pod-network-cidr=10.244.0.0/16 を付与する必要があります。 このオプションを付与して kube init を実行します。

# kubeadm init --pod-network-cidr=10.244.0.0/16
[init] Using Kubernetes version: v1.10.2
[init] Using Authorization modes: [Node RBAC]
[preflight] Running pre-flight checks.
        [WARNING FileExisting-crictl]: crictl not found in system path
Suggestion: go get github.com/kubernetes-incubator/cri-tools/cmd/crictl
[preflight] Starting the kubelet service
[certificates] Generated ca certificate and key.
[certificates] Generated apiserver certificate and key.
[certificates] apiserver serving cert is signed for DNS names [ip-172-31-29-161.ap-northeast-1.compute.internal kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 172.31.29.161]
[certificates] Generated apiserver-kubelet-client certificate and key.
[certificates] Generated etcd/ca certificate and key.
[certificates] Generated etcd/server certificate and key.
[certificates] etcd/server serving cert is signed for DNS names [localhost] and IPs [127.0.0.1]
[certificates] Generated etcd/peer certificate and key.
[certificates] etcd/peer serving cert is signed for DNS names [ip-172-31-29-161.ap-northeast-1.compute.internal] and IPs [172.31.29.161]
[certificates] Generated etcd/healthcheck-client certificate and key.
[certificates] Generated apiserver-etcd-client certificate and key.
[certificates] Generated sa key and public key.
[certificates] Generated front-proxy-ca certificate and key.
[certificates] Generated front-proxy-client certificate and key.
[certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/controller-manager.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/scheduler.conf"
[controlplane] Wrote Static Pod manifest for component kube-apiserver to "/etc/kubernetes/manifests/kube-apiserver.yaml"
[controlplane] Wrote Static Pod manifest for component kube-controller-manager to "/etc/kubernetes/manifests/kube-controller-manager.yaml"
[controlplane] Wrote Static Pod manifest for component kube-scheduler to "/etc/kubernetes/manifests/kube-scheduler.yaml"
[etcd] Wrote Static Pod manifest for a local etcd instance to "/etc/kubernetes/manifests/etcd.yaml"
[init] Waiting for the kubelet to boot up the control plane as Static Pods from directory "/etc/kubernetes/manifests".
[init] This might take a minute or longer if the control plane images have to be pulled.
[apiclient] All control plane components are healthy after 38.001683 seconds
[uploadconfig]?Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[markmaster] Will mark node ip-172-31-29-161.ap-northeast-1.compute.internal as master by adding a label and a taint
[markmaster] Master ip-172-31-29-161.ap-northeast-1.compute.internal tainted and labelled with key/value: node-role.kubernetes.io/master=""
[bootstraptoken] Using token: i5yacl.dq5e9blx3wf0j5u7
[bootstraptoken] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstraptoken] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstraptoken] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstraptoken] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[addons] Applied essential addon: kube-dns
[addons] Applied essential addon: kube-proxy

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  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:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join 172.31.29.161:6443 --token i5yacl.dq5e9blx3wf0j5u7 --discovery-token-ca-cert-hash sha256:091f5435dc60028666ce9f8f8541b0709e0b48a20809644dcf2ab3ece5875339

#

kubectlコマンドの実行に必要な設定

 kubectlを実行するユーザのホームディレクトリには設定ファイルが必要となるので、ここで作成します。 公式サイト(kubernetes.io)ではrootではないユーザでkubectlを実行することを推奨していますが、 今回はrootユーザを利用します。また、もしrootユーザでkubectlを実行する場合は環境変数 KUBECONFIG=/etc/kubernetes/admin.conf を設定するよう書かれていますが、こちらも無視して 一般ユーザの場合と同様にホームディレクトリに設定ファイルを作成します。 今回はルートユーザで一通り管理作業ができるようにするために、このような設定にしていますが、 本番環境では公式サイトに従った方がベターと思います。

# mkdir -p $HOME/.kube ←設定ファイル用ディレクトリの作成
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config ←設定ファイルをコピー
# sudo chown $(id -u):$(id -g) $HOME/.kube/config ←設定ファイルのパーミッションを設定

Flannelのインストール

 KubernetesではPodネットワーク・アドオンのインストールが必須となっています。 Flannel以外にもCalicoやKube-routerなど複数の選択肢がありますが、今回はFlannelをインストールします。 正直なところ不勉強でPodネットワーク・アドオンによる違いを把握できていません。 Kubernetes 1.5をインストールした時にFlannelを利用したので、今回も同じものを選択したという理由だけです。

# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml
clusterrole.rbac.authorization.k8s.io "flannel" created
clusterrolebinding.rbac.authorization.k8s.io "flannel" created
serviceaccount "flannel" created
configmap "kube-flannel-cfg" created
daemonset.extensions "kube-flannel-ds" created

 以上でKubernetesのマスタサーバでクラスタを構築する作業は終了です。

動作テスト

Kubernetesのノード確認

 ここまででKubernetesのマスタサーバとしての設定が完了したので、 kubectlコマンドを正常に実行できることを確認するために、ノードの一覧を表示してみます。 まだマスタサーバしか構築していないので、1台だけが表示されます。

# kubectl get nodes
NAME                                               STATUS    ROLES     AGE       VERSION
ip-172-31-29-161.ap-northeast-1.compute.internal   Ready     master    6m        v1.10.2

KubernetesのPod確認

 Kubernetesに必要なサービスはPodとして起動されますので、Podの一覧を表示してすべて起動しているか確認します。 kubectl get pods を実行するだけではKubernetesのシステム系のPodが表示されませんので、 オプションとして --all-namespaces を付与して実行します。 確認の結果、すべてが Running 状態で、必要数のPodが起動していることが分かります。

# kubectl get pods --all-namespaces
NAMESPACE     NAME                                                                       READY     STATUS    RESTARTS   AGE
kube-system   etcd-ip-172-31-29-161.ap-northeast-1.compute.internal                      1/1       Running   0          5m
kube-system   kube-apiserver-ip-172-31-29-161.ap-northeast-1.compute.internal            1/1       Running   0          5m
kube-system   kube-controller-manager-ip-172-31-29-161.ap-northeast-1.compute.internal   1/1       Running   0          5m
kube-system   kube-dns-86f4d74b45-qbx97                                                  3/3       Running   0          5m
kube-system   kube-flannel-ds-45cq9                                                      1/1       Running   0          1m
kube-system   kube-proxy-gvg7v                                                           1/1       Running   0          5m
kube-system   kube-scheduler-ip-172-31-29-161.ap-northeast-1.compute.internal            1/1       Running   0          4m

kubeletの起動確認

 先の手順でkubeletの起動は行いませんでしたが、クラスタの構築の過程で正常に起動していることを念のため確認します。

# systemctl status kubelet.service
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/kubelet.service.d
           mq10-kubeadm.conf
   Active: active (running) since Fri 2018-05-18 15:48:04 UTC; 7min ago ←起動状態
     Docs: http://kubernetes.io/docs/
 Main PID: 1759 (kubelet)
   CGroup: /system.slice/kubelet.service
           mq1759 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/ku...

May 18 15:54:56 ip-172-31-29-161.ap-northeast-1.compute.internal kubelet[1759]: E0518 15:54:56.879608    1759 summary...
May 18 15:54:56 ip-172-31-29-161.ap-northeast-1.compute.internal kubelet[1759]: E0518 15:54:56.879637    1759 summar..."
May 18 15:55:06 ip-172-31-29-161.ap-northeast-1.compute.internal kubelet[1759]: E0518 15:55:06.886602    1759 summary...
May 18 15:55:06 ip-172-31-29-161.ap-northeast-1.compute.internal kubelet[1759]: E0518 15:55:06.886625    1759 summar..."
May 18 15:55:16 ip-172-31-29-161.ap-northeast-1.compute.internal kubelet[1759]: E0518 15:55:16.893903    1759 summary...
May 18 15:55:16 ip-172-31-29-161.ap-northeast-1.compute.internal kubelet[1759]: E0518 15:55:16.893924    1759 summar..."
May 18 15:55:26 ip-172-31-29-161.ap-northeast-1.compute.internal kubelet[1759]: E0518 15:55:26.900513    1759 summary...
May 18 15:55:26 ip-172-31-29-161.ap-northeast-1.compute.internal kubelet[1759]: E0518 15:55:26.900535    1759 summar..."
May 18 15:55:36 ip-172-31-29-161.ap-northeast-1.compute.internal kubelet[1759]: E0518 15:55:36.907372    1759 summary...
May 18 15:55:36 ip-172-31-29-161.ap-northeast-1.compute.internal kubelet[1759]: E0518 15:55:36.907396    1759 summar..."
Hint: Some lines were ellipsized, use -l to show in full.

参考にしたサイト

 Kubernetesの公式サイト kubernetes.io に掲載されている手順を参考にしました。 ほぼこのサイトの手順通りに構築しています。