0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

EC2(Amazon Linux 2023)にkubeadmでkubernetesクラスターを構築してみる(worker node編)

Posted at

EC2(Amazon Linux 2023)にkubeadmでkubernetesクラスターを構築してみる(master node編)でcontrol planeが稼働するmaster nodeを作成したので、今回はアプリケーションを稼働させるworker nodeを作成しkubernetesクラスターに追加させ、nginxのpodをdeployして動作確認までしていきます。

※ master node編と重複する工程がありますが、この記事だけ閲覧した方向けにコマンドを再度記載させていただきます。(各工程の詳細説明は省略させてもらいますが。)

構築手順

  1. containerdのインストール
  2. runCの設定
  3. CNIの設定
  4. cgroupの設定
  5. カーネルパラメータの設定(br_netfilterの有効化・iptablesの設定変更)
  6. swapの無効化
  7. kubelet/kubeadm/kubectlのインストール
  8. tcコマンドのインストール
  9. kubernetesクラスタへのWorker Nodeの追加
  10. nginx podのdeploy

1. containerdのインストール

$ CONTAINERD_VERSION=1.7.11
$ wget -P /usr/local/src https://github.com/containerd/containerd/releases/download/v${CONTAINERD_VERSION}/containerd-${CONTAINERD_VERSION}-linux-amd64.tar.gz
$ tar -C /usr/local -xf /usr/local/src/containerd-${CONTAINERD_VERSION}-linux-amd64.tar.gz
$ wget -P /etc/systemd/system https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
$ systemctl daemon-reload
$ systemctl enable --now containerd

2. runCの設定

$ RUNC_VERSION=1.1.10
$ wget -O /usr/local/sbin/runc https://github.com/opencontainers/runc/releases/download/v${RUNC_VERSION}/runc.amd64
$ chmod +x /usr/local/sbin/runc

3. CNIの設定

$ CNI_VERSION=1.4.0
$ wget -P /usr/local/src https://github.com/containernetworking/plugins/releases/download/v${CNI_VERSION}/cni-plugins-linux-amd64-v${CNI_VERSION}.tgz
$ mkdir -p /opt/cni/bin
$ tar -C /opt/cni/bin -xf /usr/local/src/cni-plugins-linux-amd64-v${CNI_VERSION}.tgz

4. cgroupの設定

$ mkdir /etc/containerd
$ containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
$ cp -p /etc/containerd/config.toml /etc/containerd/config.toml_`date +%Y%m%d`
$ sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
$ diff /etc/containerd/config.toml /etc/containerd/config.toml_`date +%Y%m%d`
$ systemctl restart containerd

5. カーネルパラメータの設定(br_netfilterの有効化・iptablesの設定変更)

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF

sysctl --system

6. swapの無効化

公式ドキュメントに以下のように記載されている為OFFにします

kubeletが正常に動作するためにはswapは必ずオフでなければなりません。

# スワップの使用状況をデバイスごとに表示する
$ swapon -s
# スワップを無効にする
$ swapoff -a

7. kubelet/kubeadm/kubectlのインストール

$ cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF

$ yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
$ systemctl enable --now kubelet

8. tcコマンドのインストール

dnf provides tc
dnf install iproute-tc

9. kubernetesクラスタへのWorker Nodeの追加

master node編でkubeadm initをした際にメモした情報を使います。

$ kubeadm join <master nodeのIPアドレス>:6443 --token xxxxxx.xxxxxxxxxxxxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# This node has joined the cluster:と表示されら成功です
  • master nodeからkubectl get nodesを実行してworker nodeが存在するかを確認
$ kubectl get nodes
NAME            STATUS   ROLES           AGE   VERSION
master-node     Ready    control-plane   46m   v1.27.8
worker-node01   Ready    <none>          20s   v1.27.8

10. nginx podのdeploy

以下の内容をnginx.yamlを作成し記載します。

apiVersion: v1
kind: Namespace
metadata:
  name: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploymenti
  namespace: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-servicei
  namespace: nginx
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 80
    nodePort: 30080
    protocol: TCP
  selector:
    app: nginx

※ deplymentとserviceのapi versionはkubectl api-resources | grep Service, kubectl api-resources | grep Deploymentで適時確認して下さい。

  • マニフェストをApplyする
$ kubectl apply -f nginx.yaml
  • podがworker nodeで稼働しているのを確認する
$ kubectl get pods -o wide -n nginx
NAME                                READY   STATUS    RESTARTS   AGE     IP           NODE            NOMINATED NODE   READINESS GATES
nginx-deploymenti-cbdccf466-4fwb4   1/1     Running   0          4m54s   10.244.1.3   worker-node01   <none>           <none>
nginx-deploymenti-cbdccf466-5pxrw   1/1     Running   0          4m54s   10.244.1.2   worker-node01   <none>           <none>

ALBを作成してnginxの動作を確認する

worker nodeはprivate-subnetに構築したのでALBを構築してインターネットからアクセスします。

  • target groupの作成
    serviceでnodePortは30080を指定しているのでTarget-groupのプロトコルポートは30080を指定します。
    Screen Shot 2023-12-15 at 22.05.46.png

  • ALBの作成
    検証なのでHTTPのみで作成したTarget-Groupにルーティングします。

Screen Shot 2023-12-15 at 22.16.04.png

  • ブラウザーからアクセスしてnginxの画面が表示されるかを確認
    ALBの詳細TabにあるDNS名をブラウザーに貼り付けて以下の画面が表示されたら成功です。

Screen Shot 2023-12-15 at 22.04.57.png

終わりに

master node編とworker node編の2回に分けてkubeadmでkubernetesクラスターを作成していきました。
次回はクラスターversion upを記事にできたらと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?