togatttiのエンジニアメモ

過度な期待はしないでください.

Container Linuxにkubeadmを入れて、k8sクラスタを構築する

はじめに、Container Linuxを3台用意しておく。

  • k8s01(192.168.0.2/24)
  • k8s02(192.168.0.3/24)
  • k8s03(192.168.0.4/24)

バージョンは、こちら。

$ grep VERSION= /etc/os-release
VERSION=2023.5.0

Container Linuxの初期設定

各ホストで、パスワード、ホスト、固定IPアドレスの設定を済ませる。

パスワードの設定
$ sudo passwd core
ホストの名前設定
$ sudo hostnamectl set-hostname k8s01
$ sudo vi /etc/hosts
$ grep k8s01 /etc/hosts
127.0.0.1       localhost k8s01
固定IPアドレスの設定
### k8s01の設定
$ sudo vi /etc/systemd/network/static.network
$ sudo cat /etc/systemd/network/static.network
[Match]
Name=eth0

[Network]
Address=192.168.0.2/24
Gateway=192.168.0.1
DNS=8.8.8.8

### ネットワークの再起動
$ sudo systemctl restart systemd-networkd

kubeadmのインストール

kubeadmのインストール - Kubernetes

にあるContainer Linuxのインストール手順をrootで実行する。

$ cat install.sh
### CNIをインストール
CNI_VERSION="v0.6.0"
mkdir -p /opt/cni/bin
curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-amd64-${CNI_VERSION}.tgz" | tar -C /opt/cni/bin -xz
### CRICTLをインストール
CRICTL_VERSION="v1.11.1"
mkdir -p /opt/bin
curl -L "https://github.com/kubernetes-incubator/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-amd64.tar.gz" | tar -C /opt/bin -xz
### kubeadm, kubelet, kubectlをインストール
RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)"
mkdir -p /opt/bin
cd /opt/bin
curl -L --remote-name-all https://storage.googleapis.com/kubernetes-release/release/${RELEASE}/bin/linux/amd64/{kubeadm,kubelet,kubectl}
chmod +x {kubeadm,kubelet,kubectl}
curl -sSL "https://raw.githubusercontent.com/kubernetes/kubernetes/${RELEASE}/build/debs/kubelet.service" | sed "s:/usr/bin:/opt/bin:g" > /etc/systemd/system/kubelet.service
mkdir -p /etc/systemd/system/kubelet.service.d
curl -sSL "https://raw.githubusercontent.com/kubernetes/kubernetes/${RELEASE}/build/debs/10-kubeadm.conf" | sed "s:/usr/bin:/opt/bin:g" > /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
### kubeletを有効にする。
systemctl enable kubelet && systemctl start kubelet
$ sudo sh install.sh

k8sクラスタ構築

マスターノード構築
### k8s01側
### クラスタの初期化
$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16
### ブリッジのパケットをiptablesで処理できるようにする設定
$ sudo sysctl net.bridge.bridge-nf-call-iptables=1
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
### masterとして稼働していることを確認
$ kubectl cluster-info
Kubernetes master is running at https://10.200.8.117:6443
KubeDNS is running at https://10.200.8.117:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
### クラスタに参加するためのkubeadm join コマンドが発行されるので、控えておく。
ノード追加
### k8s02とk8s03側
$ sudo kubeadm join 192.168.0.2:6443 --token pu2npf.e42wltclx0f64bdc --discovery-token-ca-cert-hash sha256:9eb6af07398ebf79ef0acb0b70e18fca5f26c00912c2e132bbe634568316c347
クラスタ確認
### k8s01側
$ kubectl get nodes
NAME    STATUS     ROLES    AGE   VERSION
k8s01   NotReady   master   1m   v1.13.4
k8s02   NotReady   <none>   3s   v1.13.4
k8s03   NotReady   <none>   3s    v1.13.4
Flannel設定

クラスタが構築できたが、STATUSがNotReadyになっている。

ノードをまたいで、Pod同士が通信できるように、Flannelで、オーバレイネットワークを設定する。

### k8s01側
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
$ kubectl get nodes
NAME    STATUS   ROLES    AGE     VERSION
k8s01   Ready    master   5m28s   v1.13.4
k8s02   Ready    <none>   3m49s   v1.13.4
k8s03   Ready    <none>   2m23s   v1.13.4

以上で、kubeadmを用いてk8sクラスタを構築することができた。

参考

https://coreos.com/flannel/docs/latest/kubernetes.html

kubeadmを使用したシングルマスタークラスターの作成 - Kubernetes

http://sysy.livedoor.biz/archives/9791596.html