Kubernetesのラボ、初期構築(前編)

この記事は約34分で読めます。
スポンサーリンク

あくまでも試みレベルですが、「Kubernetes勉強記事」の連載を始めてみようと思います。

はじめに

ラボの構築について、以下のリンクの記事を参考にさせていただきました。決して全ての手順が私の独自アイデアで完成できた訳ではありません。

>>CentOS7にKubernetes1.9をインストール

>>KubernetesにDashboardをインストールして、認証なしでアクセスする

>>オンプレK8sで使えるGoogle製External Load Balancer: MetalLB

>>Kubernetes on CentOS7

感謝してもしきれないほど、お世話になりました。上記の記事がなければ、私のKubernetesスキルは上達しなかったと言っても良いくらいです。

ただ、前回の記事の通り、書くコンポーネントのバージョンが変わったことで、一部導入がうまく行かなかったりしました。なので、今回の記事でサマライズしようと考えました。

はじめに(その2)

Kubernetesを一度も触ったことがない人でも大丈夫です。まずはコピペで初期構築ができるようにしています。

敢えて「Kuberenetesの解説の前にラボ環境」という順番にしています。

この記事でできること

今回のラボ環境は「自宅でESXi環境で作った4つのVM」にKubernetesを導入していきます。

この記事に従って構築すれば

  • 4ノード構成のKubernetes環境が出来上がる
  • ゆえに、Dockerの検証環境も出来上がる
  • type LoadBalancerのService構築も出来る

ようになります。つまりKubernetesの一連の機能を確認できる環境ができるはずです。

今後の連載では同じ環境でKubernetesを解説していく予定です。

なぜ、Minikubeやクラウド環境を使用しないか?

簡単な学習でしたらMinikubeで十分ですし、クラウド環境(GKEなど)を使用したほうが手っ取り早く検証環境が手に入ります。

しかし、ノード間の通信の確認には複数ノードがあったほうが直感的に学べますし、自宅で構築したほうが内部の動きがわかりやすく、コストも気にせずすみます。

せっかくですから「ランニングコストも気にする必要がなく、自分で勝手にできる環境」を作ってしまったほうが後々ラクだと思います。

あと、MinikubeのダッシュボードはMinikubeのホスト以外からアクセスさせるのが大変です。通常環境のダッシュボードを把握することが後々良いと感じました。

なぜ、Kubernetesの解説の前に、ラボ構築か?

まずは触ってもらいたいからです。論より証拠、触ったほうが「なんとなく」Kubernetesがつかめるはずです。

Kubernetesは「言葉で説明するより、実際に見たほうが理解できる」と感じてます。

対象読者

先日の記事で書いたとおり、Kubernetesは難しい。色んなコンポーネントが絡み合って、色んな製品の知識があった方が理解が深まりやすい。

だからこそ、まずは触ってほしい。

この連載では、全ての手順をできるだけ平易な用語で説明していく予定ですが、やはり最低限以下の知識があったほうが良いかと。

  • ESXiでCentOS7を導入できること
    →事前準備で必須です
  • Linuxの基本的なコマンドが使えること
    →ls/vi/cp/yumなどのレベルでOK。基本的にコピペで大丈夫にしています
  • Linux(Centos7)のネットワーク設定ができること
    →この辺はググったらすぐに出てきます

事前準備(全ての4VMで行う)

ESXiで4つのVMを準備する

まずは自宅のパソコンにESXiで4つのCentos7のVMを構築してください。

私は去年構築した64GBメモリのvCenterマシンに構築しましたが、そんなにリソースはいりません。

  • 1台目(Master):4GBメモリ、10GBデータストア
  • 2台目(Node1):1GBメモリ、10GBデータストア
  • 3台目(Node2):1GBメモリ、10GBデータストア
  • 4台目(LB):1GBメモリ、10GBデータストア

これで動作確認ができています。このレベルだったら意外と準備できるのではないでしょうか。

参考までに、私の家でのvCenter構築記事を記します。何度も言いますが、これと同じ構成は不要です。

ESXiの上のVMはH/Wに基本依存しません。

H170-PROとi7-6700KでのESXiサーバ構築手順!
ASUSのH170-PROマザーボードとSkylake i7-6700Kの組み合わせで無事にESXiの構築に成功しました。 ESXiは6.0U2です。オンボードNICも問題なく使用できています。 ESXiは詳しいけど、PC自作は...

全ての4VMのCentos7を入れて初期設定する

VNCの記事のときと同様に、今回もCentos7を使用します。4VM全てにCentos7を入れてください。

初期設定:

  • 使用するCentOS7は「CentOS-7-x86_64-Minimal-1804.iso」
  • IPアドレス・Gateway・DNSの設定をする
  • つまり、CentOS7からインターネットへのアクセスができることとする

また、あくまでもセキュリティを意識しないで良い環境を前提に考えているので、セキュリティの設定は一切していません。なので、その辺はしっかり念頭にいれて必要に応じてハードニングしてください。責任は負えません。

ネットワークの初期設定

上に書いたとおりIPアドレス・Gateway・DNSの初期設定をしてインターネットに繋がる状態にしてください。

私の環境は以下のとおりです。ネットワーク構成は合わせてもらったほうが連載でのイメージがしやすいかもしれません。

topology1

ネットワーク設定:

MasterNode1Node2LB
ホスト名masternode1node2nodelb
IPアドレス192.168.1.80/24192.168.1.81/24192.168.1.82/24192.168.1.83/24
Gateway192.168.1.1192.168.1.1192.168.1.1192.168.1.1

ちなみに、以降はできるだけ図とコマンドを多用していきます。

時には冗長に感じる人も出てくるでしょう。「こんなの常識だよ」と思う人もいるかも知れません。

でも、その人にとって常識でも、他の人にとって常識じゃないことも沢山あるんです。IT業界の中では、特にです。

CCIE/CISSPを取得している今でも、入社1年目の方に教えてもらうことも沢山あります。IT業界なんてそんなものです。

なので、出来るだけ沢山の人がついて行けるようにしてると思ってください。

sshでアクセスできるようにする

まずは操作しやすいようにSSHでrootログインができるようにします。つまり、この作業はコンソール上から行うことになります。

sshd_configを修正します。

#vi /etc/ssh/sshd_config

以下の箇所のコメントアウトを外します。

#PermitRootLogin yes

こんな感じです。

PermitRootLogin yes

面倒なので、再起動して反映させます。

#reload

これで「root@IPアドレス」でログインできるようになります。

以降は全てSSHでの作業を想定しています。

SELinuxをOFFにする

/etc/selinux/confiを修正します

SELINUX=enforcing

これを

SELINUX=disabled

このように変更し、rebootします。

4VM全てで行ってください。(rebootを忘れないでください)

Hostsファイルを追記する

4VM全てでホスト名を登録してください。ホスト名でお互いにpingが通ることを確認してください。

一旦、スナップショットを取っておく

ここから先はDockerやKubernetesのインストール、初期設定などを行っていきます。

必ず外部、VM同士が通信できるかをPingで確認しましょう。

この時点で4VMのスナップショットを取得することをオススメします。そうすることで、この時点に簡単に戻れるので。

 

この時点までは、KubernetesやDockerの作業にはまだ行き着いていない状態です。この時点で「pingが通らない」とか「sshでログインできない」人は、ググって環境を整えてください。

これが成立していない状態で以降に進んでも絶対にうまくいきません。

Masterノードの設定(前半)

では、いよいよです。まずはMasterノードの構築です。

topology2

Masterノードにログインしてください。

Kubenetes Repositoryの設定

/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

KubeadmとDockerの導入

以下をコピペしてください。

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast -y
yum remove docker docker-common docker-selinux docker-engine -y
yum install docker-ce-17.06.0.ce-1.el7.centos -y
yum install kubectl-1.12.3-0.x86_64 -y
yum install kubelet-1.12.3-0.x86_64 -y
yum install kubeadm-1.12.3-0.x86_64 -y

docker-ceとkubeadmのインストールにバージョンを指定しているのがミソです。現時点でバージョンを指定しなければ、Dockerのバージョンが新しくて、以降のKubernetes init時にエラーが発生します。

とりあえずコピペしてください。

Serviceの初期設定

インストールしたDockerとKubeadmをsystemctlに登録&起動します。firewalldは停止します。ついでにswapをoffします。

systemctl restart docker && systemctl enable docker
systemctl restart kubelet && systemctl enable kubelet
systemctl stop firewalld && systemctl disable firewalld
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

結果はこんな感じ。

[root@master ~]# systemctl restart docker && systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@master ~]# systemctl restart kubelet && systemctl enable kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /etc/systemd/system/kubelet.service.
[root@master ~]# systemctl stop firewalld && systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@master ~]# swapoff -a
[root@master ~]# sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

参考まで。Centos7はsystemctlという機能でマシンを起動したときに動かすサービスを設定できます。上の設定で、システムが再起動した時もDockerとKubernetesサービスが起動するようにします。

MasterNodeの作成

ここが肝心です。とは言ってもコマンド一つですが。Masterの初期設定を行います。

kubeadm init --apiserver-advertise-address=192.168.1.80 --pod-network-cidr=10.244.0.0/16

「–apiserver-advertise-address」はMasterのIPを設定してください。「–pod-network-cidr」はFlannelの使用可能IPレンジを指定します。

「なんじゃそりゃ!」と思われるかもしれませんが、とりあえずコピペしてください。私の環境と同じIPの設定にしていたらうまくいくはずです。

実行して2分ほどかかると思います(環境依存)。

終わったら以下のメッセージが表示されます。

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 192.168.1.80:6443 --token ef3cdn.70o8xcpksoech0eo --discovery-token-ca-cert-hash sha256:15c8eb4774268670a344c8b4d2b2fc891b0527e1049f5ef5e482b68d67d79e9e

最後の「kubeadm join …..」の行は必ずメモ帳にコピペして保管してください。後ほど使います。

ここでエラーが出た場合(良く出る)、上に記載した何かが漏れてる可能性があります。

よくあるのが。

  • インターネットに通信できていない。(ping www.google.comなどが上手くいくか?)
  • ホストファイルの記載に誤りがある
  • Dockerが最新のバージョンになってしまっている
  • swapがonの状態

などです。

ここでエラーがでて、原因がわかった場合は、大人しくSnapshotを戻して再チャレンジしたほうが早いです。

ここまで問題ない場合、上のメッセージの通り大人しく以下を実行します。

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

ネットワークの設定

当環境はKubernetesネットワークとしてFlannelを採用しました。これには色々な理由があり(VXLANを採用しており、勉強にもってこい、パフォーマンスが良いらしい、後述のmetallbに対応してるなど、本当に色々あるんです)、この辺は連載の中で取り上げますが、とりあえず「へぇ〜」と思ってるレベルで大丈夫です。

Flannel導入用のyamlを取得します。

wget https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

wgetというコマンドで、インターネットからファイルをダウンロードできます。ノートパソコンでリンクをクリックしてファイルをダウンロードするのと似てますね。

結果はこんな感じ。

[root@master ~]# wget https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
--2018-12-01 12:06:06-- https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
raw.githubusercontent.com (raw.githubusercontent.com) をDNSに問いあわせています... 151.101.72.133
raw.githubusercontent.com (raw.githubusercontent.com)|151.101.72.133|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 2801 (2.7K) [text/plain]
`kube-flannel.yml' に保存中

100%[====================================================================================================================>] 2,801 --.-K/s 時間 0s

2018-12-01 12:06:07 (45.0 MB/s) - `kube-flannel.yml' へ保存完了 [2801/2801]

[root@master ~]#

ここからが一番難しいところ。kube-flannel.ymlを修正します。

command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr" ]

ここにMasterのネットワークインターフェースを追加します。こんな感じになります。

command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr", "--iface=ens160" ]

Masterのインターフェースは「ip a」で見つけてください。

[root@master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:91:94:d4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.80/24 brd 192.168.1.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 240f:3e:382b:1:250:56ff:fe91:94d4/64 scope global noprefixroute dynamic
       valid_lft 270sec preferred_lft 270sec
    inet6 fe80::250:56ff:fe91:94d4/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:3b:b2:42:fb brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever

上の例だと2番目の「ens160」です。

次に、Tolerationを修正します。

      tolerations:
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule

ここにもう一つKeyを追加します。

      tolerations:
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      - key: node.kubernetes.io/not-ready
        operator: Exists
        effect: NoSchedule

この必要性は以下の記事を参照してください。

Kubernetes1.12でFlannelと連携できなかった時の対処法
これまでの流れをぶった切って、いきなりKubernetesネタです。 Kubernetes1.12でFlannelがデプロイできないと悩んでる人は読んでください。 Kubernetes+Flannelで問題発生 最近のIT...

これで準備が整いました。yamlを適用してFlannelの設定を行います。

kubectl apply -f /root/kube-flannel.yml

結果はこんな感じ。

[root@master ~]# kubectl apply -f /root/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

これでMasterがReadyになるはずです。

[root@master ~]# kubectl get node
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   21m   v1.12.3

ちなみに、めちゃんこネットワークインターフェースも増えてるはずです。

[root@master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:91:94:d4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.80/24 brd 192.168.1.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 240f:3e:382b:1:250:56ff:fe91:94d4/64 scope global noprefixroute dynamic
       valid_lft 283sec preferred_lft 283sec
    inet6 fe80::250:56ff:fe91:94d4/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:3b:b2:42:fb brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
    link/ether 12:71:5c:cc:4a:9d brd ff:ff:ff:ff:ff:ff
    inet 10.244.0.0/32 scope global flannel.1
       valid_lft forever preferred_lft forever
    inet6 fe80::1071:5cff:fecc:4a9d/64 scope link
       valid_lft forever preferred_lft forever
5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
    link/ether 0a:58:0a:f4:00:01 brd ff:ff:ff:ff:ff:ff
    inet 10.244.0.1/24 scope global cni0
       valid_lft forever preferred_lft forever
    inet6 fe80::c030:18ff:fe85:e80f/64 scope link
       valid_lft forever preferred_lft forever
6: vethe97e21fd@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 state UP group default
    link/ether 8a:30:57:b7:c3:0b brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::8830:57ff:feb7:c30b/64 scope link
       valid_lft forever preferred_lft forever
7: vethdba9e4c6@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 state UP group default
    link/ether c2:3f:2e:03:7b:c3 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::c03f:2eff:fe03:7bc3/64 scope link
       valid_lft forever preferred_lft forever

後述しますが[flannel.1]ができており、事前に設定したCIDRレンジの一部になってるはずです。

さらに、FlannelのPodも起動してるはずです。現時点では意味不明だと思いますが、とりあえず以下を起動してみてください。連載の中で解説します。(このコマンドは表示してるだけなので、まぁ入力しなくても後述の作業には影響しません。でも確認してみてください)

[root@master ~]# kubectl get namespace
NAME          STATUS   AGE
default       Active   23m
kube-public   Active   23m
kube-system   Active   23m
[root@master ~]# kubectl get pod -n kube-system
NAME                             READY   STATUS    RESTARTS   AGE
coredns-576cbf47c7-lrcjp         1/1     Running   0          22m
coredns-576cbf47c7-v9flf         1/1     Running   0          22m
etcd-master                      1/1     Running   0          2m37s
kube-apiserver-master            1/1     Running   0          2m49s
kube-controller-manager-master   1/1     Running   0          2m48s
kube-flannel-ds-kcnmz            1/1     Running   0          2m58s
kube-proxy-qlkzr                 1/1     Running   0          22m
kube-scheduler-master            1/1     Running   0          2m40s

ダッシュボード導入

ついでにダッシュボードも導入していきます。

もう、この方の記事をそのまま活用させていただきました。外部からもアクセスできるし、認証も不要。ラボ環境にはもってこいです。

>>KubernetesにDashboardをインストールして、認証なしでアクセスする

念の為「http://MasterのIP」でアクセスできることを確認しましょう。

Worker Node1とWorker Node2の設定

次はWorker Nodeの設定です。LBは最後にします。(というか、次回の記事で紹介します)

「Worker Nodeって何だよ!」と思うかもしれませんが、この上に実際のサービスが起動します(Webサービスとか、自作アプリとか)」。この辺は詳しく解説するので、とりあえず「へぇ〜」と思っておいてください。

topology3

手順はMasterNodeと殆ど同じです。最後が違うだけ。

Kubenetes Repositoryの設定

/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

KubeadmとDockerの導入

以下をコピペしてください。

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast -y
yum remove docker docker-common docker-selinux docker-engine -y
yum install docker-ce-17.06.0.ce-1.el7.centos -y
yum install kubectl-1.12.3-0.x86_64 -y
yum install kubelet-1.12.3-0.x86_64 -y
yum install kubeadm-1.12.3-0.x86_64 -y

docker-ceとkubeadmのインストールにバージョンを指定しているのがミソです。現時点でバージョンを指定しなければ、Dockerのバージョンが新しくて、以降のKubernetes init時にエラーが発生します。

とりあえずコピペしてください。

Serviceの初期設定

インストールしたDockerとKubeadmをsystemctlに登録&起動します。firewalldは停止します。ついでにswapをoffします。

systemctl restart docker && systemctl enable docker
systemctl restart kubelet && systemctl enable kubelet
systemctl stop firewalld && systemctl disable firewalld
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

結果はこんな感じ。

[root@master ~]# systemctl restart docker && systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@master ~]# systemctl restart kubelet && systemctl enable kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /etc/systemd/system/kubelet.service.
[root@master ~]# systemctl stop firewalld && systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@master ~]# swapoff -a
[root@master ~]# sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

以下を実行してiptablesを修正します。これをやらないと後述のjoinでエラーが発生します。

echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables

Masterのinit時に取得したコマンドを実行します(環境によってstringが違います)。このコマンドでMasterに参加します。つまり、初めてMasterと通信してます。

kubeadm join 192.168.1.80:6443 --token ef3cdn.70o8xcpksoech0eo --discovery-token-ca-cert-hash sha256:15c8eb4774268670a344c8b4d2b2fc891b0527e1049f5ef5e482b68d67d79e9e

うまくいけば、こんな感じになります。

[root@node1 ~]# kubeadm join 192.168.1.80:6443 --token ef3cdn.70o8xcpksoech0eo --discovery-token-ca-cert-hash sha256:15c8eb4774268670a344c8b4d2b2fc891b0527e1049f5ef5e482b68d67d79e9e
[preflight] running pre-flight checks
	[WARNING RequiredIPVSKernelModulesAvailable]: the IPVS proxier will not be used, because the following required kernel modules are not loaded: [ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack_ipv4] or no builtin kernel ipvs support: map[ip_vs:{} ip_vs_rr:{} ip_vs_wrr:{} ip_vs_sh:{} nf_conntrack_ipv4:{}]
you can solve this problem with following methods:
 1. Run 'modprobe -- ' to load missing kernel modules;
2. Provide the missing builtin kernel ipvs support

[discovery] Trying to connect to API Server "192.168.1.80:6443"
[discovery] Created cluster-info discovery client, requesting info from "https://192.168.1.80:6443"
[discovery] Requesting info from "https://192.168.1.80:6443" again to validate TLS against the pinned public key
[discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server "192.168.1.80:6443"
[discovery] Successfully established connection with API Server "192.168.1.80:6443"
[kubelet] Downloading configuration for the kubelet from the "kubelet-config-1.12" ConfigMap in the kube-system namespace
[kubelet] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[preflight] Activating the kubelet service
[tlsbootstrap] Waiting for the kubelet to perform the TLS Bootstrap...
[patchnode] Uploading the CRI Socket information "/var/run/dockershim.sock" to the Node API object "node1" as an annotation

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the master to see this node join the cluster.

MasterでNodeの登録を確認

以下のコマンドでNodeの登録を確認します。

kubectl get node

この「kubectl」というのがkubernetesのcliです。これから多用します。

パラメーターについては以後の連載で「何度も何度も」説明しますので、今は「こんなもんかぁ〜」と思っておいてください。

結果は以下の出力になるはずです。

[root@master ~]# kubectl get node
NAME     STATUS   ROLES    AGE     VERSION
master   Ready    master   49m     v1.12.3
node1    Ready    <none>   3m11s   v1.12.3
node2    Ready    <none>   2m45s   v1.12.3

重要なのは「master/node1/node2」の全てが「Ready」になってることです。

Nodeを参加させて「Ready」になるのに、およそ30秒ほどかかるはずです。

5分待っても「Ready」にならなければ、なんか変です。(少なくともこの手順の流れでReadyにならなければ変です)

可能性として大いに考えられるのは

  • ネットワーク設定で失敗している
  • initの時点で失敗している

ですね。

この時点で3ノードとも「Ready」になっていたら、基本的なKubernetes/Dockerの演習が出来る状態です。

 

おめでとうございます!

 

この時点で全ノードのスナップショットを取得することをオススメします。

 

しかし、もう一つ残ってる作業があります。

「LoadBalancer」の設定です。

この時点では「何のロードバランサだよ!」と疑問に思ってるでしょう。色々あるんです。

これについては次回解説します。

(一つの記事として既に長くなりすぎているので・・・)

 

とりあえず、ここまで来たら「かなり大丈夫」だと思ってもらって結構です。

コメント

タイトルとURLをコピーしました