(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes】kubeadmを利用して1マスター1ノードを構築する流れ

スポンサーリンク

はじめに

下記の公式サイトを参考に2つのUbuntuサーバをMasterNodeとWorkerNodeとして構築しました。

kubeadm以下必要ツールをインストールする

kubectl , kubelet , kubeadm , dockerが必要です。
それぞれapt-get installでインストールしますが

# apt-get install -y kubelet kubeadm kubectl docker.io

kubeadmなどは以下記事のようにリポジトリとapt-keyを新規追加する必要があります。

ちなみに執筆時のapt-keyは以下でした。

apt-key list
/etc/apt/trusted.gpg
--------------------
pub   rsa2048 2018-04-01 [SCE] [expires: 2021-03-31]
      54A6 47F9 048D 5688 D7DA  2ABE 6A03 0B21 BA07 F4FB
uid           [ unknown] Google Cloud Packages Automatic Signing Key <gc-team@google.com>
/etc/apt/trusted.gpg.d/ubuntu-keyring-2012-archive.gpg
...

kubeadmを実行してみる

コマンドをオプション無しに打てばそこにインストールの流れが記載されています。

$ kubeadm
    ┌──────────────────────────────────────────────────────────┐
    │ KUBEADM                                                  │
    │ Easily bootstrap a secure Kubernetes cluster             │
    │                                                          │
    │ Please give us feedback at:                              │
    │ https://github.com/kubernetes/kubeadm/issues             │
    └──────────────────────────────────────────────────────────┘

Example usage:

    Create a two-machine cluster with one control-plane node
    (which controls the cluster), and one worker node
    (where your workloads, like Pods and Deployments run).

    ┌──────────────────────────────────────────────────────────┐
    │ On the first machine:                                    │
    ├──────────────────────────────────────────────────────────┤
    │ control-plane# kubeadm init                              │
    └──────────────────────────────────────────────────────────┘

    ┌──────────────────────────────────────────────────────────┐
    │ On the second machine:                                   │
    ├──────────────────────────────────────────────────────────┤
    │ worker# kubeadm join <arguments-returned-from-init>      │
    └──────────────────────────────────────────────────────────┘
    You can then repeat the second step on as many other machines as you like

マスター候補及びワーカー候補でkubeadmを打てばインストールが始まりますが、Dockerが起動していないと以下のエラーになります。事前にdocker ps等でコマンドが通るか確認しておきましょい。

 WARNING: Couldn't create the interface used for talking to the container runtime: docker is required for container runtime:cker": executable file not found in $PATH
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables does not exist
        [ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1

MasterNodeを構築する

kubeadm initでマスターノードがセットアップされます。

$ sudo kubeadm init
...
Please fouide at https://kubernetes.io/docs/setup/cri/
[preflight] Pulling images required for setting up a Kubernetes cluster
...
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
...
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [ip kubernetes kubernetes.default kubernetes.default.svc kubernetes.d.cluster.local] and IPs [10.96.0.1 10.0.1.101]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [ip-10-0-1-101 localhost] and IPs [10.0.1.101 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [ip-10-0-1-101 localhost] and IPs [10.0.1.101 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
...
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
...
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
...

そして以下を行えばマスターとしてセットアップができ

# cp -i /etc/kubernetes/admin.conf ~/.kube/config

構築が完了できました。

$ kubectl get node
NAME            STATUS     ROLES    AGE     VERSION
hoge   NotReady   master   4m24s   v1.18.5

WorkerNodeを構築する

kubeadm init の実行結果の下部に以下のようなコマンドが表示されるので

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.1.1.111:6443 --token ... --discovery-token-ca-cert-hash sha256:7ca8...

それをそのまま実行すれば

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 control-plane to see this node join the cluster.

という文言が表示されMaster側でNodeの追加が確認できます。

NAME            STATUS     ROLES    AGE     VERSION
hoge   NotReady   master   7m25s   v1.18.5
hoge2   NotReady   <none>   13s     v1.18.5

ネットワークプラグインをインストールする

最後にStatusが「NotReady」となっている箇所を「Ready」にします。
ネットワークプラグインをインストールしていないのでノードのSTATUSがNotReadyとなっています。

具体的には以下のようにマニフェストを適用すれば

$ kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml
...

STATUSがREADYに変更され、Podが起動できるようになります。

終わりに

実際にLinuxサーバにKubernetesをインストールする流れですが、上記手順は数分あれば可能です。また、kubeadm resetを利用すれば何度でも入れなおすことができるので途中で失敗した場合も一からやり直せます。
クラウド上のPaaSとして利用することが一般的とは思いますが、実際に自前で作成することも簡単にできるのでぜひ参考にしてください。