あくまでも試みレベルですが、「Kubernetes勉強記事」の連載を始めてみようと思います。
はじめに
ラボの構築について、以下のリンクの記事を参考にさせていただきました。決して全ての手順が私の独自アイデアで完成できた訳ではありません。
>>CentOS7にKubernetes1.9をインストール
>>KubernetesにDashboardをインストールして、認証なしでアクセスする
>>オンプレK8sで使えるGoogle製External Load Balancer: MetalLB
感謝してもしきれないほど、お世話になりました。上記の記事がなければ、私の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に基本依存しません。
全ての4VMのCentos7を入れて初期設定する
VNCの記事のときと同様に、今回もCentos7を使用します。4VM全てにCentos7を入れてください。
初期設定:
- 使用するCentOS7は「CentOS-7-x86_64-Minimal-1804.iso」
- IPアドレス・Gateway・DNSの設定をする
- つまり、CentOS7からインターネットへのアクセスができることとする
また、あくまでもセキュリティを意識しないで良い環境を前提に考えているので、セキュリティの設定は一切していません。なので、その辺はしっかり念頭にいれて必要に応じてハードニングしてください。責任は負えません。
ネットワークの初期設定
上に書いたとおりIPアドレス・Gateway・DNSの初期設定をしてインターネットに繋がる状態にしてください。
私の環境は以下のとおりです。ネットワーク構成は合わせてもらったほうが連載でのイメージがしやすいかもしれません。
ネットワーク設定:
Master | Node1 | Node2 | LB | |
ホスト名 | master | node1 | node2 | nodelb |
IPアドレス | 192.168.1.80/24 | 192.168.1.81/24 | 192.168.1.82/24 | 192.168.1.83/24 |
Gateway | 192.168.1.1 | 192.168.1.1 | 192.168.1.1 | 192.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ノードの構築です。
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
この必要性は以下の記事を参照してください。
これで準備が整いました。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サービスとか、自作アプリとか)」。この辺は詳しく解説するので、とりあえず「へぇ〜」と思っておいてください。
手順は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」の設定です。
この時点では「何のロードバランサだよ!」と疑問に思ってるでしょう。色々あるんです。
これについては次回解説します。
(一つの記事として既に長くなりすぎているので・・・)
とりあえず、ここまで来たら「かなり大丈夫」だと思ってもらって結構です。
コメント