Kubernetesクラスタ用の仮想マシンの準備

説明目的のため、これらの手順はOracle Linux 8用です。Linuxの異なるフレーバを使用している場合は、それに応じてステップを調整する必要があります。

ノート:

このステップは、特に指定しないかぎり、rootユーザーで実行する必要があります。コマンドにYOUR_USERIDとある場合は、実際のuseridに置き換える必要があります。

  1. 前提条件
    1. Kubernetesファイルを格納するディレクトリを選択します。Kubernetesディレクトリは、/var/lib/kubeletファイル・システムおよび永続ボリューム・ストレージに使用されます。
      export kubelet_dir=/u01/kubelet
      mkdir -p $kubelet_dir
      ln -s $kubelet_dir /var/lib/kubelet
      
    2. ホストでIPv4転送が有効になっていることを確認します。

      ノート:

      eth0は、コンピュート・リソースのイーサネット・インタフェース名(異なる場合)に置き換えます。
      /sbin/sysctl -a 2>&1|grep -s 'net.ipv4.conf.eth0.forwarding'
      /sbin/sysctl -a 2>&1|grep -s 'net.ipv4.conf.lo.forwarding'
      /sbin/sysctl -a 2>&1|grep -s 'net.ipv4.ip_nonlocal_bind'
      

      例: すべてが1に設定されていることを確認します:

      net.ipv4.conf.eth0.forwarding = 1
      net.ipv4.conf.lo.forwarding = 1
      net.ipv4.ip_nonlocal_bind = 1
      

      解決策: すべての値を即座に1に設定します:

      /sbin/sysctl net.ipv4.conf.eth0.forwarding=1
      /sbin/sysctl net.ipv4.conf.lo.forwarding=1
      /sbin/sysctl net.ipv4.ip_nonlocal_bind=1
      
    3. 設定を永続的に保持するには: /usr/lib/sysctl.d/、/run/sysctl.d/および/etc/sysctl.d/のファイルで前述の値を1に更新します。
    4. 転送用のiptablesルールを確認します。Kubernetesは、iptablesを使用して多くのネットワーキングおよびポート転送ルールを処理します。標準のコンテナ・インストールでは、転送を妨げるファイアウォール・ルールが作成されることがあります。転送トラフィックを受け入れるiptablesルールが設定されているかどうかを確認します:
      /sbin/iptables -L -n | awk '/Chain FORWARD / {print $4}' | tr -d ")"
      

      出力が"DROP"の場合は、次のコマンドを実行します:

      /sbin/iptables -P FORWARD ACCEPT
      

      iptablesルールが"ACCEPT"に正しく設定されているかどうかを確認します:

      /sbin/iptables -L -n | awk '/Chain FORWARD / {print $4}' | tr -d ")"
      
    5. firewalldを無効化および停止します:
      systemctl disable firewalld
      systemctl stop firewalld
      
  2. CRI-OおよびPodmanのインストール

    ノート:

    CRI-OおよびPodmanをすでに構成している場合は、Kubernetesのインストールおよび構成に進みます。
    1. オペレーティング・システムのバージョンが適切であることを確認します:
      uname -a
      more /etc/oracle-release
      

      出力例:

      Linux xxxxxx 5.15.0-100.96.32.el8uek.x86_64 #2 SMP Tue Feb 27 18:08:15 PDT 2024 x86_64 x86_64 x86_64 GNU/Linux
      Oracle Linux Server release 8.6
      
    2. CRI-Oのインストール:

      dnf config-managerにOLCNE (Oracle Cloud Native Environment)リポジトリを追加します。これにより、dnfはCRI-Oインストールに必要な追加パッケージをインストールできます。

      Oracle Linux 8の場合:

      dnf config-manager --add-repo https://yum.oracle.com/repo/OracleLinux/OL8/olcne18/x86_64
      

      Oracle Linux 9の場合:

      dnf config-manager --add-repo https://yum.oracle.com/repo/OracleLinux/OL9/olcne18/x86_64
      

      cri-oをインストールします:

      dnf install -y cri-o
      

      ノート:

      ノート: 別のバージョンのCRI-Oをインストールするか、別のオペレーティング・システムにインストールするには、CRI-Oのインストール手順を参照してください。
    3. CRI-Oサービスを起動します:

      カーネル・モジュールおよびプロキシの設定

      ### Enable kernel modules overlay and br_netfilter which are required for Kubernetes Container Network Interface (CNI) plugins
      modprobe overlay
      modprobe br_netfilter
      
      ### To automatically load these modules at system start up create config as below
      cat <<EOF > /etc/modules-load.d/crio.conf
      overlay
      br_netfilter
      EOF
      sysctl --system
      
      ### Set the environmental variable CONTAINER_RUNTIME_ENDPOINT to crio.sock to use crio as the container runtime
      export CONTAINER_RUNTIME_ENDPOINT=unix:///var/run/crio/crio.sock
      
      ### Setup Proxy for CRIO service
      cat <<EOF > /etc/sysconfig/crio
      http_proxy=http://REPLACE-WITH-YOUR-COMPANY-PROXY-HOST:PORT
      https_proxy=http://REPLACE-WITH-YOUR-COMPANY-PROXY-HOST:PORT
      HTTPS_PROXY=http://REPLACE-WITH-YOUR-COMPANY-PROXY-HOST:PORT
      HTTP_PROXY=http://REPLACE-WITH-YOUR-COMPANY-PROXY-HOST:PORT
      no_proxy=localhost,127.0.0.0/8,ADD-YOUR-INTERNAL-NO-PROXY-LIST,/var/run/crio/crio.sock
      NO_PROXY=localhost,127.0.0.0/8,ADD-YOUR-INTERNAL-NO-PROXY-LIST,/var/run/crio/crio.sock
      EOF
      

      CRI-Oのランタイムの設定

      ### Setting the runtime for crio
      ## Update crio.conf
      vi /etc/crio/crio.conf
      ## Append following under [crio.runtime]
      conmon_cgroup = "kubepods.slice"
      cgroup_manager = "systemd"
      ## Uncomment following under [crio.network]
      network_dir="/etc/cni/net.d"
      plugin_dirs=[
          "/opt/cni/bin",
          "/usr/libexec/cni",
      ]
      

      CRI-Oサービスの起動

      ## Restart crio service
      systemctl restart crio.service
      systemctl enable --now crio
      
    4. Podmanをインストールします:

      Oracle Linux 8で、podmanが使用できない場合は、次のコマンド構文を使用してPodmanおよび関連ツールをインストールします:

      shell$ sudo dnf module install container-tools:ol8

      Oracle Linux 9で、podmanが使用できない場合は、次のコマンド構文を使用してPodmanおよび関連ツールをインストールします:

      $ sudo dnf install container-tools

      設定ではdocker CLIコマンドが使用されるため、Oracle Linux 8/9では、次のコマンド構文を使用してpodman-dockerパッケージをインストールします(使用できない場合)。これにより、dockerコマンドが効果的にpodmanに別名設定されます:

      $ sudo dnf install podman-docker
    5. Podmanをルートレスで構成します:

      ユーザーIDでpodmanを使用する場合(ルートレス環境)、Podmanでは、それを実行しているユーザーに、ファイル/etc/subuidおよび/etc/subgidにリストされているUIDの範囲が必要です。ファイルを直接更新するのではなく、usermodプログラムを使用して、次のコマンドでUIDとGIDをユーザーに割り当てることができます:

      $ sudo /sbin/usermod --add-subuids 100000-165535 --add-subgids 100000-165535
                    <REPLACE_USER_ID>
                  $ podman system migrate

      ノート:

      前述のpodman system migrateは、rootではなくユーザーIDで実行する必要があります。

      user-id追加の検証

      cat /etc/subuid
      cat /etc/subgid
      

      予想される同様の出力

      opc:100000:65536
      <user-id>:100000:65536
      
  3. Kubernetesのインストールおよび構成
    1. 外部Kubernetesリポジトリを追加します:
      cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
      [kubernetes]
      name=Kubernetes
      baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/
      enabled=1
      gpgcheck=1
      gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key
      exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
      EOF
      
    2. SELinuxを許可モードに設定します(実質的に無効化します):
      export PATH=/sbin:$PATH setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
    3. プロキシをエクスポートし、kubeletを有効化します:
      ### Get the nslookup IP address of the master node to use with apiserver-advertise-address during setting up Kubernetes master
      ### as the host may have different internal ip (hostname -i) and nslookup $HOSTNAME
      ip_addr=`nslookup $(hostname -f) | grep -m2 Address | tail -n1| awk -F: '{print $2}'| tr -d " "`
      echo $ip_addr
      
      ### Set the proxies
      export NO_PROXY=localhost,127.0.0.0/8,ADD-YOUR-INTERNAL-NO-PROXY-LIST,/var/run/crio/crio.sock,$ip_addr,.svc
      export no_proxy=localhost,127.0.0.0/8,ADD-YOUR-INTERNAL-NO-PROXY-LIST,/var/run/crio/crio.sock,$ip_addr,.svc
      export http_proxy=http://REPLACE-WITH-YOUR-COMPANY-PROXY-HOST:PORT
      export https_proxy=http://REPLACE-WITH-YOUR-COMPANY-PROXY-HOST:PORT
      export HTTPS_PROXY=http://REPLACE-WITH-YOUR-COMPANY-PROXY-HOST:PORT
      export HTTP_PROXY=http://REPLACE-WITH-YOUR-COMPANY-PROXY-HOST:PORT
      
      ### Install the kubernetes components and enable the kubelet service so that it automatically restarts on reboot
      dnf install -y kubeadm kubelet kubectl
      systemctl enable --now kubelet
      
    4. トラフィック・ルーティングの問題を回避するために、sysctlでnet.bridge.bridge-nf-call-iptablesが1に設定されていることを確認します:
      cat <<EOF >  /etc/sysctl.d/k8s.conf
      net.bridge.bridge-nf-call-ip6tables = 1
      net.bridge.bridge-nf-call-iptables = 1
      net.ipv4.ip_forward = 1
      EOF
      sysctl --system
      
    5. スワップ・チェックを無効化します:
      sed -i 's/KUBELET_EXTRA_ARGS=/KUBELET_EXTRA_ARGS="--fail-swap-on=false"/' /etc/sysconfig/kubelet
      cat /etc/sysconfig/kubelet
      ### Reload and restart kubelet
      systemctl daemon-reload
      systemctl restart kubelet
      
    6. crioを使用してイメージをプルします:
      kubeadm config images pull --cri-socket unix:///var/run/crio/crio.sock
      
  4. Helmの設定
    1. Helm v3.10.2+をインストールします。

      1. a.https://github.com/helm/helm/releasesからHelmをダウンロードします。

      たとえば、Helm v3.10.2をダウンロードするには:

      wget https://get.helm.sh/helm-v3.10.2-linux-amd64.tar.gz
      

      2. tar.gzを解凍します:

      tar -zxvf helm-v3.10.2-linux-amd64.tar.gz
      

      解凍したディレクトリでHelmバイナリを検索し、目的の宛先に移動します:

      mv linux-amd64/helm /usr/bin/helm
      
    2. helm versionを実行して、インストールを検証します:
      helm version
        version.BuildInfo{Version:"v3.10.2", GitCommit:"50f003e5ee8704ec937a756c646870227d7c8b58", GitTreeState:"clean", GoVersion:"go1.18.8"}