前回の環境セットアップ編ではKubernetesでWindowsコンテナクラスタを構築するための環境セットアップまで完了させました。今回は、Linux上にKubernetes Master Nodeを手動で構築します。
0. 環境の構成の確認と参考サイト
今回解説する手順は、環境全体のうち次の図にあるMaster Node部分の構築手順です。
以下の手順は、Microsoft Docsにあるこちらのサイトの手順をもとに構築しています。ただし、Kubernetesは新しいバージョンがどんどんリリースされるため、手順が使えなくなる可能性もあるのでご注意ください。また、日本語版のドキュメントも存在していますが、内容のUpdateや間違いの修正が反映されていないため、実行するコマンドや手順自体は上記リンク先の英語版で確認することをお勧めします。
1. Kubernetesのインストール
1-1. 必要なパッケージとセットアップツールを準備
まず、Kubernetesを動かすのに必要なパッケージをインストールします。
$ sudo apt-get install curl git build-essential docker.io conntrack python2.7
次に、Microsoftが用意しているGithub上のリポジトリにある設定Scriptをダウンロードします。
$ mkdir -p ~/kube/bin
$ git clone https://github.com/Microsoft/SDN /tmp/k8s
$ cd /tmp/k8s/Kubernetes/linux
$ chmod -R +x *.sh
$ chmod +x manifest/generate.py
$ mv * ~/kube/
1-2. Kubernetes本体とCNI Pluginの展開
設定Scriptを準備できたら、次はKubernetes本体のバイナリをダウンロードします。以下はv1.9.2をダウンロードしていますが、ダウンロードURLを適宜新しいバージョンに変更可能です。執筆時点ではv1.9.3がリリースされています。
$ wget -O kubernetes.tar.gz https://github.com/kubernetes/kubernetes/releases/download/v1.9.2/kubernetes.tar.gz
$ tar -xzf kubernetes.tar.gz
$ cd kubernetes/cluster
$ ./get-kube-binaries.sh
$ cd ../server
$ tar -xzf kubernetes-server-linux-amd64.tar.gz
$ cd kubernetes/server/bin
$ cp hyperkube kubectl ~/kube/bin/
Kubernetes実行ファイルのためにPATH情報をログインユーザーのプロファイルに追加しておきます。
$ vi ~/.profile
(最終行に以下を追記)
PATH="$HOME/kube/bin:$PATH"
次にCNI Pluginをダウンロードして展開します。下記のコマンドではCNI Pluginの最新リリースのバイナリを取得しています。
$ DOWNLOAD_DIR="${HOME}/kube/cni-plugins"
$ CNI_BIN="/opt/cni/bin/"
$ mkdir ${DOWNLOAD_DIR}
$ cd $DOWNLOAD_DIR
$ curl -L $(curl -s https://api.github.com/repos/containernetworking/plugins/releases/latest | grep browser_download_url | grep 'amd64.*tgz' | head -n 1 | cut -d '"' -f 4) -o cni-plugins-amd64.tgz
$ tar -xzf cni-plugins-amd64.tgz
$ sudo mkdir -p ${CNI_BIN}
$ sudo cp -r !(*.tgz) ${CNI_BIN}
以上の準備ができたら、各種設定の反映のために、一度OSを再起動しておきます。
2. Kubernetesの初期設定と起動
以下ではKubernetesの初期設定を行います。初期設定に用いる各種設定パラメータ名とその値および意味は以下の通りとします。
パラメータ名 | 値 | 意味 |
---|---|---|
MASTER_IP |
192.168.1.20 | Kubernetes Master(Ubuntu)のIPアドレス |
CLUSTER_CIDR |
172.16.0.0/16 | コンテナクラスタ用Networkで使うCIDRで、/16で必ず指定する。ここから各Node用に/24ずつアサインされる。 |
api-version |
1.9.2 | インストールするKubernetesのバージョン |
2-1. Node間通信用証明書の生成
KubernetesのMasterを含めたNode間の管理通信のやり取りには証明書が用いられます。その証明書を以下のScriptで生成します。
$ MASTER_IP=192.168.1.20
$ cd ~/kube/certs
$ chmod u+x generate-certs.sh
$ ./generate-certs.sh $MASTER_IP
2-2. manifestファイルの生成
Kubernetes Master Nodeではmanifestファイルによって様々な設定を行います。手動でmanifestを作るのは手間なので、Pythonのスクリプトを使って生成します。ただ、事前にダウンロードしているScriptはPython 2系対応の内容になっていますがUbuntu 17.10ではデフォルトでPython 3系が使われているため、明示的にPython 2.7を指定して実行します。この点が、Microsoftのドキュメントに明記されていないので注意が必要です。
$ cd ~/kube/manifest
$ python2.7 ./generate.py $MASTER_IP --cluster-cidr 172.16.0.0/16 --api-version=1.9.2
上記のコマンドではAPI Versionとして1.9.2を指定しましたが、実際に利用するバージョンに合わせて設定します。
2-3. 操作用CLI(kubectl)の設定
Kubernetesを操作するコマンドkubectl
でKubernetes MasterのAPIエンドポイントにアクセスできるよう、設定ファイルの生成と適切なディレクトリへの保存を行います。
$ cd ~/kube
$ ./configure-kubectl.sh $MASTER_IP
$ mkdir ~/kube/kubelet
$ sudo cp ~/.kube/config ~/kube/kubelet/
ここで生成した~/.kube/config
ファイルは次回解説するWindowsコンテナNodeにも設置する必要があります。ダウンロードしておくと良いです。
3. Kubernetes Masterの起動と動作確認
3-1. Kubernetes Masterの起動
Kubernetes Masterをフォアグラウンドで起動します。起動するとずっと大量の出力が出続けるので、別Terminalを開き、ログの記録はしないよう注意してから実行します。まず、kubeletプロセスを開始します。
$ cd ~/kube
$ sudo ./start-kubelet.sh
出力結果が似たような内容の繰り返しになってきたら(初回は1~2分後)、別のTerminalでkubeproxyを開始します。この時、前節で指定したCLUSTER_CIDR
の第2オクテットまでを引数に渡します。
$ cd ~/kube
$ sudo ./start-kubeproxy.sh 172.16
以上でKubernetes Masterが起動しました。デーモン化はしていないので、Master NodeのOSを起動するたびに手動でKubernetesを立ち上げる必要があります。
3-2. Master Nodeの起動確認
いくつかの方法でMaster Nodeが起動していることを確認します。まず、Kubernetes Master Nodeでは23個くらいのコンテナが起動します。起動していることを確認します。
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2aec1759b16d gcr.io/google_containers/kubernetes-dashboard-amd64@sha256:2c4421ed80358a0ee97b44357b6cd6dc09be6ccc27dfe9d50c9bfc39a760e5fe "/dashboard --inse..." 12 minutes ago Up 12 minutes k8s_kubernetes-dashboard_kubernetes-dashboard-569d66cbd6-4gdhg_kube-system_dc60508c-033d-11e8-9830-00155d010b0d_2
a3f7cd1288cd gcr.io/google_containers/exechealthz-amd64@sha256:7ecf20f93a631b0ec582214612e1e3e0baac9d024c58ce0a213c9fc26f19686f "/exechealthz '--c..." 13 minutes ago Up 13 minutes k8s_healthz_kube-dns-v20-jh96x_kube-system_dc75ab38-033d-11e8-9830-00155d010b0d_0
66853ac43cc1 gcr.io/google_containers/exechealthz-amd64@sha256:7ecf20f93a631b0ec582214612e1e3e0baac9d024c58ce0a213c9fc26f19686f "/exechealthz '--c..." 13 minutes ago Up 13 minutes k8s_healthz_kube-dns-v20-cgdm7_kube-system_dc6b9ffa-033d-11e8-9830-00155d010b0d_0
dc3b23c1c3db gcrio.azureedge.net/google_containers/kube-dnsmasq-amd64@sha256:33f66d91ca9806dc2f5d630be8818d93455ac855bf27c519ad483fd5972a87b8 "/usr/sbin/dnsmasq..." 13 minutes ago Up 13 minutes k8s_dnsmasq_kube-dns-v20-jh96x_kube-system_dc75ab38-033d-11e8-9830-00155d010b0d_0
814738fbaba0 gcrio.azureedge.net/google_containers/addon-resizer@sha256:ba506f5f21356331d92141ee48fc4945fd467ec6010364ae970342de5477272c "/pod_nanny --cpu=..." 13 minutes ago Up 13 minutes k8s_heapster-nanny_heapster-v1.2.0-69bbc88d85-gxsjf_kube-system_dc9744ae-033d-11e8-9830-00155d010b0d_0
a668698e4deb gcrio.azureedge.net/google_containers/kube-dnsmasq-amd64@sha256:33f66d91ca9806dc2f5d630be8818d93455ac855bf27c519ad483fd5972a87b8 "/usr/sbin/dnsmasq..." 14 minutes ago Up 14 minutes k8s_dnsmasq_kube-dns-v20-cgdm7_kube-system_dc6b9ffa-033d-11e8-9830-00155d010b0d_0
d80c24e20b1e gcrio.azureedge.net/google_containers/kubedns-amd64@sha256:9b811ed606fd0ec2f4a8ec420968621e91ccdfc2143879e5b12a8c8321a81ebb "/kube-dns --domai..." 14 minutes ago Up 14 minutes k8s_kubedns_kube-dns-v20-jh96x_kube-system_dc75ab38-033d-11e8-9830-00155d010b0d_0
9b27ec99f67b gcrio.azureedge.net/google_containers/heapster@sha256:97485e7168ee127c4fd42fc248b56a50dfbd5db878335c0bd190663c0cad16bc "/heapster --sourc..." 14 minutes ago Up 14 minutes k8s_heapster_heapster-v1.2.0-69bbc88d85-gxsjf_kube-system_dc9744ae-033d-11e8-9830-00155d010b0d_0
5cfe07499219 gcrio.azureedge.net/google_containers/kubedns-amd64@sha256:9b811ed606fd0ec2f4a8ec420968621e91ccdfc2143879e5b12a8c8321a81ebb "/kube-dns --domai..." 14 minutes ago Up 14 minutes k8s_kubedns_kube-dns-v20-cgdm7_kube-system_dc6b9ffa-033d-11e8-9830-00155d010b0d_0
5bc7b96b6510 gcrio.azureedge.net/google_containers/pause-amd64:3.0 "/pause" 14 minutes ago Up 14 minutes k8s_POD_heapster-v1.2.0-69bbc88d85-gxsjf_kube-system_dc9744ae-033d-11e8-9830-00155d010b0d_0
61c996d5104d gcrio.azureedge.net/google_containers/pause-amd64:3.0 "/pause" 14 minutes ago Up 14 minutes k8s_POD_kubernetes-dashboard-569d66cbd6-4gdhg_kube-system_dc60508c-033d-11e8-9830-00155d010b0d_0
792f70f7a3e9 gcrio.azureedge.net/google_containers/pause-amd64:3.0 "/pause" 14 minutes ago Up 14 minutes k8s_POD_kube-dns-v20-jh96x_kube-system_dc75ab38-033d-11e8-9830-00155d010b0d_0
382803c7c802 gcrio.azureedge.net/google_containers/pause-amd64:3.0 "/pause" 14 minutes ago Up 14 minutes k8s_POD_kube-dns-v20-cgdm7_kube-system_dc6b9ffa-033d-11e8-9830-00155d010b0d_0
d6af9b72792d gcr.io/google_containers/hyperkube-amd64@sha256:cd3430a6fbbffa6f52f7233c08237477ef374424baf45df8e33c5dc9b1f87177 "/hyperkube apiser..." 15 minutes ago Up 15 minutes k8s_kube-apiserver_kube-apiserver-kube-master_kube-system_42e5f383823c8bb80fce8dc5853b0ea5_0
b9424c962fb1 gcr.io/google_containers/hyperkube-amd64@sha256:69cd6e29c8bd7658e6597cba6aa0110e91c8ef9a993844717e7819cf91d77563 "/hyperkube schedu..." 15 minutes ago Up 15 minutes k8s_kube-scheduler_kube-scheduler-kube-master_kube-system_c16f50e59bcd25ea49353c1d2444e87b_0
2f1e92b84fc4 gcr.io/google_containers/etcd@sha256:d83d3545e06fb035db8512e33bd44afb55dea007a3abd7b17742d3ac6d235940 "/bin/sh -c '/usr/..." 15 minutes ago Up 15 minutes k8s_etcd-container_kube-etcd-kube-master_kube-system_5b10b07f6ba446c63b95480b4035d9f4_0
0dcad326b8d9 gcr.io/google_containers/kube-addon-manager-amd64@sha256:3e6ff32eb762ecf17d817c49372f4fe51052d3406772ddb0a65f89c478070b96 "/opt/kube-addons.sh" 15 minutes ago Up 15 minutes k8s_kube-addon-manager_kube-addon-manager-kube-master_kube-system_352c7581858c47d92ec8a15335eea599_0
35baf72ed26b gcr.io/google_containers/hyperkube-amd64@sha256:69cd6e29c8bd7658e6597cba6aa0110e91c8ef9a993844717e7819cf91d77563 "/hyperkube contro..." 15 minutes ago Up 15 minutes k8s_kube-controller-manager_kube-controller-manager-kube-master_kube-system_db212c4ed6765b078803edf554fa4711_0
4826b64fce5a gcrio.azureedge.net/google_containers/pause-amd64:3.0 "/pause" 15 minutes ago Up 15 minutes k8s_POD_kube-controller-manager-kube-master_kube-system_db212c4ed6765b078803edf554fa4711_0
fcc36dfa1ac4 gcrio.azureedge.net/google_containers/pause-amd64:3.0 "/pause" 15 minutes ago Up 15 minutes k8s_POD_kube-etcd-kube-master_kube-system_5b10b07f6ba446c63b95480b4035d9f4_0
805ff0e6d3e3 gcrio.azureedge.net/google_containers/pause-amd64:3.0 "/pause" 15 minutes ago Up 15 minutes k8s_POD_kube-apiserver-kube-master_kube-system_42e5f383823c8bb80fce8dc5853b0ea5_0
47323c7456f4 gcrio.azureedge.net/google_containers/pause-amd64:3.0 "/pause" 15 minutes ago Up 15 minutes k8s_POD_kube-addon-manager-kube-master_kube-system_352c7581858c47d92ec8a15335eea599_0
ce8c90587bfb gcrio.azureedge.net/google_containers/pause-amd64:3.0 "/pause" 15 minutes ago Up 15 minutes
次に、kubectl
コマンドでKubernetesクラスタのAPIエンドポイント情報などを確認します。
$ kubectl cluster-info
Kubernetes master is running at https://192.168.1.20
Heapster is running at https://192.168.1.20/api/v1/namespaces/kube-system/services/heapster/proxy
KubeDNS is running at https://192.168.1.20/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
また、コンテナ間の通信のためにcbr0
というインターフェースが生成されており、CLUSTER_CIDR
の中のIPが付与されていることを確認します。
$ ifconfig
cbr0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
inet 172.16.0.1 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::1838:a1ff:fe65:68c1 prefixlen 64 scopeid 0x20<link>
ether 0a:58:ac:10:00:01 txqueuelen 1000 (Ethernet)
RX packets 1860 bytes 211478 (211.4 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1816 bytes 1081512 (1.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
(以下略)
以上で、Kubernetes Masterの構築が完了しました。次回はWindows Server version 1709でKubernetes Worker Nodeを構築します。