Kubernetesクラスタの構築手順

公式のCentOS7イメージを使用し、仮想マシン環境でKubernetesクラスタを構築します。

1. 初期設定

ネットワークインターフェースの設定:

公式イメージではデフォルトでネットワークインターフェースが有効になっていないため、まずネットワーク設定を構成する必要があります。

sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33
# ONBOOT=noをONBOOT=yesに変更
# wqで保存して終了
# ネットワークサービスを再起動
service network restart
systemctl restart network

ネットワークツールのインストール

公式イメージは非常にクリーンなため、ネットワーク状態を確認するifconfigコマンドもインストールされていません。後でyumリポジトリを切り替える際にwgetコマンドが必要になるため、事前にインストールしておきます。

# 新しいyumリポジトリをインストールする前に、yumリポジトリ設定ファイルをバックアップする必要があります。後でwgetを使用したところ、wgetコマンドが見つからないことに気づきました。また、yum install wgetを実行したところ、基本的なyumファイルがないためネットワークにアクセスできないことが判明したため、事前にインストールするのが最善です。
yum install net-tools wget -y

ファイアウォールの無効化

# ファイアウォールを停止
systemctl stop firewalld
# 自動起動を無効化し、永続的に停止
systemctl disable firewalld

SELinuxの無効化

# SELinuxを一時的に無効化
setenforce 0

# SELinuxを永続的に無効化
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

スワップ領域の無効化

swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab

アリババクラウドのyumリポジトリへの切り替え

# 公式のyumリポジトリ設定ファイルをバックアップ
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# CentOS-7.repoファイルをダウンロード
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

アリババクラウドのDocker-ceリポジトリの追加:

# yum管理ツールをインストール
yum install -y yum-utils
# アリババクラウドのdockerリポジトリを設定
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

Kubernetesリポジトリの追加

このコマンドは直接コピーする必要があり、ターミナルがサポートしている必要があります。PowerShellでは直接コピーして貼り付けが可能です。

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

2. 基本インストール

共通インストールパッケージ

yum install vim bash-completion net-tools gcc -y

Dockerのインストール

yum install docker-ce
# Dockerを起動
systemctl start docker 
# 自動起動を設定
systemctl enable docker 

Kubernetesのインストール

コントロールプレーン(マスター)へのインストール:
# kubeadm、kubectl、kubeletをインストール
yum install -y kubectl kubeadm kubelet
# kubeletサービスを起動
systemctl enable kubelet && systemctl start kubelet
ワーカーノードへのインストール:
# kubeadm、kubeletをインストール
yum install -y kubeadm kubelet
# kubeletサービスを起動
systemctl enable kubelet && systemctl start kubelet

3. Kubernetesクラスタの初期化

準備作業

仮想マシンをインストール後、各マシンの名前はすべてlocalhost.localdomainです。不必要な問題を避けるため、各マシンで異なる名前に変更する必要があります:

hostnamectl --static set-hostname control-node # コントロールプレーンノード
hostname $hostname # 即時反映
hostnamectl --static set-hostname worker-node1 # ワーカーノード
hostname $hostname # 即時反映

マスターノードの初期化

kubeadm initコマンドを実行します:

kubeadm init --image-repository registry.aliyuncs.com/google_containers --apiserver-advertise-address 192.168.147.33 --pod-network-cidr=10.122.0.0/16 --token-ttl 0

エラー処理

初期化プロセス中、問題がなければエラーが発生します:

  1. "container runtime is not running:"というエラーが表示された場合、以下のコマンドを実行する必要があります:
    rm -rf /etc/containerd/config.toml
    systemctl restart containerd
  1. "Initial timeout of 40s passed"という4分間のタイムアウトエラーが発生した場合:
    ctr -n k8s.io images pull -k registry.aliyuncs.com/google_containers/pause:3.6
    ctr -n k8s.io images tag registry.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6
    # 鏡像registry.aliyuncs.com/google_containers/pause:3.6のタグをregistry.k8s.io/pause:3.6に変更
    kubeadm reset -f

その後、上記のkubeadm initコマンドを再実行します。問題なく完了した場合:

Your Kubernetes control-plane 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

Alternatively, if you are the root user, you can run:

export KUBECONFIG=/etc/kubernetes/admin.conf

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/

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

kubeadm join 192.168.147.133:6443 --token v2nbj9.n96aegm563ub38zt  --discovery-token-ca-cert-hash sha256:1a6b394358789c92e09a55eb0ae8279d5054c89aef867d4dca9dae1cf4ccf859

指示に従って実行します:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

マスターノードの状態を確認:

kubectl get nodes

この時点では未準備状態です。

ネットワークプラグイン(Calico)のインストール

# コマンドを実行
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/tigera-operator.yaml

その後、実行します:

# 任意のフォルダにダウンロード:
wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/custom-resources.yaml
vim custom-resources.yaml

これはcustom-resourcesファイルの内容で、cidrネットワークセグメントの内容をクラスタ初期化時のパラメータ--pod-network-cidrと一致させる必要があります。

# このセクションにはCalicoの基本インストール設定が含まれています。
# 詳細については、https://projectcalico.docs.tigera.io/master/reference/installation/api#operator.tigera.io/v1.Installation を参照してください。
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  # Calicoネットワークを設定します。
  calicoNetwork:
    # 注意: ipPoolsセクションはインストール後は変更できません。
    ipPools:
    - blockSize: 26
    #   cidr: 192.168.0.0/16
      cidr: 10.122.0.0/16
      encapsulation: VXLANCrossSubnet
      natOutgoing: Enabled
      nodeSelector: all()

---

# このセクションはCalico APIサーバーを設定します。
# 詳細については、https://projectcalico.docs.tigera.io/master/reference/installation/api#operator.tigera.io/v1.APIServer を参照してください。
apiVersion: operator.tigera.io/v1
kind: APIServer
metadata:
  name: default
spec: {}

実行します:

kubectl create -f custom-resources.yaml

数分待つと(約4分)、マスターノードが準備完了状態になります。

ノードの参加

ホスト名を変更していない場合は、まず変更してください:

hostnamectl --static set-hostname worker-node1 # ノード1
hostname $hostname # 即時反映

その後、上記のコマンドを実行します:

kubeadm join 192.168.147.133:6443 --token v2nbj9.n96aegm563ub38zt  --discovery-token-ca-cert-hash sha256:1a6b394358789c92e09a55eb0ae8279d5054c89aef867d4dca9dae1cf4ccf859

以前保存していない場合は、マスターノードで以下のコマンドを実行できます:

kubeadm token create --print-join-command

以下の内容が表示されれば、Kubernetesクラスタに正常に参加したことを示しますが、マスターノードで現在のノードの状態を確認するとnotReadyになっています。

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.

エラー処理

"container runtime is not running:"というエラーが表示された場合、以下のコマンドを実行する必要があります:

rm -rf /etc/containerd/config.toml
systemctl restart containerd
# 再度joinコマンドを実行

ノードが常にnot Readyの場合: ログを確認します:

journalctl -f -u kubelet.service 

コマンドを実行:k8s.io images pull

ctr -n k8s.io images pull -k registry.aliyuncs.com/google_containers/pause:3.6 
ctr -n k8s.io images tag registry.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6 

数分待つと、クラスタが正常に稼働していることがわかります:

[root@control-node yum.repos.d]# kubectl get nodes
NAME           STATUS   ROLES           AGE   VERSION
control-node   Ready    control-plane   17h   v1.28.2
worker-node1   Ready    <none>          17h   v1.28.2
worker-node2   Ready    <none>          16h   v1.28.2

4. Kubernetesクラスタのリセット

仮想ネットワークの設定が変更された後、クラスタ全体が使用不可能になったことが判明しました。Kubernetesクラスタはネットワーク通信に高度に依存しているためです。学習環境ではクラスタをリセットできます。kubeadmツールを使用してクラスタをリセットする基本的な手順:

コントロールプレーン(マスター)ノードとワーカーノード(Worker Nodes)で実行:

  1. kubeletサービスを停止
sudo systemctl stop kubelet
  1. kubeadmを使用してリセット
sudo kubeadm reset

このコマンドはkubeletの設定をクリアし、Kubernetes関連のコンテナを削除し、いくつかのクリーンアップ操作を実行します。 3. iptablesのクリーンアップ: 残っている可能性のあるiptablesルールをクリーンアップし、これらのルールがクラスタの再初期化を妨げないようにします。

sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
sudo iptables -P FORWARD ACCEPT

(コントロールノード)クラスタの再初期化:

コントロールプレーンノードで、kubeadm initコマンドを使用してクラスタを再初期化できます。このコマンドを実行する際に、APIサーバーのアドレスとして新しいIPアドレスを指定できます。

新しいIPアドレスは192.168.147.137です。コマンドを実行します:

kubeadm init --image-repository registry.aliyuncs.com/google_containers --apiserver-advertise-address 192.168.147.137 --pod-network-cidr=10.122.0.0/16 --token-ttl 0

初期化が完了したら、kubectlツールの使用環境を設定します。

(コントロールノード)ネットワークの再初期化

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/tigera-operator.yaml

kubectl create -f custom-resources.yaml

ワーカーノードをクラスタに参加させる:

コマンドを使用します:

kubeadm join 192.168.147.137:6443 --token 0c4gsd.ack5w3mvuyuauivl  --discovery-token-ca-cert-hash sha256:0ebb75771d6616cca43750771263760f28f31044da103de93ac6a010fc5afff9

専門用語の説明

kubeadm init:

これはKubernetesクラスタを初期化するためのkubeadmコマンドです。

1. `kubeadm init`
- これは`kubeadm`ツールのサブコマンドで、Kubernetesコントロールプレーンノードを初期化するために使用されます。

2. `--image-repository registry.aliyuncs.com/google_containers`
- Kubernetesイメージをプルするためのリポジトリアドレスを指定します。ここではアリババクラウドのイメージリポジトリを使用しています。国内ではGoogleのリポジトリに直接アクセスできないためです。

3. `--apiserver-advertise-address 192.168.147.33`
- Kubernetes APIサーバーが外部に公開するIPアドレスを設定します。他のノードはこのアドレスを使用してAPIサーバーと通信します。

4. `--pod-network-cidr=10.122.0.0/16`
- KubernetesクラスタにPodネットワークのIPアドレス範囲を指定します。このCIDRは10.122.0.0/16ネットワークセグメントをPodネットワークとして使用することを示します。

5. `--token-ttl 0`
- トークンのタイムアウト時間を0に設定し、トークンが期限切れにならないことを意味します。通常はテスト環境で使用され、本番環境では適切な有効期限を設定する必要があります。

このコマンドを実行すると、現在のノードにkube-apiserver、kube-controller-manager、kube-schedulerなどの必要なコンポーネントをデプロイし、Kubernetesコントロールプレーンを初期化します。

後続のステップでは、Flannel、CalicoなどのネットワークプラグインをデプロイしてクラスタにPodネットワークの相互接続を提供し、その後kubeadm joinコマンドを使用して他のノードをクラスタに参加させ、完全なKubernetesクラスタを構築します。

ctr

これらのコマンドはすべてコンテナイメージのプルとタグ付けに関連しており、Kubernetes環境を設定する際に使用される可能性があります。

  1. ctr -n k8s.io images pull -k registry.aliyuncs.com/google_containers/pause:3.6
  • ctrはcontainerdのコマンドラインツールです
  • -n k8s.iok8s.ioという名前空間を使用することを指定します
  • images pullはイメージをプルすることを意味します
  • -kオプションは信頼できないイメージリポジトリからイメージをプルすることを許可します
  • registry.aliyuncs.com/google_containers/pause:3.6はプルするpauseイメージのアドレスとタグです

このコマンドの目的は、アリババクラウドのイメージリポジトリからKubernetesが使用するpauseコンテナイメージの3.6バージョンをプルすることです。

  1. ctr -n k8s.io images tag registry.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6
  • images tagサブコマンドはイメージにタグを付けるために使用されます
  • registry.aliyuncs.com/google_containers/pause:3.6は最初にプルしたイメージです
  • registry.k8s.io/pause:3.6は標準的なKubernetes pauseイメージの名前とタグです

このコマンドの目的は、アリババクラウドからプルしたpauseイメージをKubernetesの標準的なイメージ名とタグに再タグ付けすることです。

pauseコンテナイメージはKubernetesクラスタにおいて非常に重要な基礎コンポーネントの一つであり、各Pod内で唯一の無限に実行される"pause"プロセスとして機能し、他のコンテナはPID名前空間などのリソースを共有するためにこのプロセスと連携します。Googleのイメージリポジトリから直接プルできないため、他のイメージソースからプルしてから再タグ付けする必要があります。

これらのコマンドは通常、Kubernetesクラスタのkubeadm init段階で実行され、必要なpauseイメージが利用可能であることを保証します。

selinux

SELinuxはSecurity-Enhanced Linuxの略称で、プログラムが許可されたファイルのみにアクセスできるように制限する強制アクセス制御セキュリティメカニズムです。

`setenforce 0`というコマンドはSELinuxを一時的にpermissiveモード(許可モード)に設定する効果があります。このモードでは、SELinuxはアクセス違反を記録するだけで強制実行しません。

次の2つのコマンド:

sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config


これらのコマンドはSELinuxを永続的に無効化します。

最初のコマンド:
- `sed`はストリームエディタで、ファイルの変更を許可します
- `-i`パラメータはsedにファイル内容を直接変更させる効果があります
- シングルクォート内は置換コマンド` s/検索文字列/置換文字列/`です
- /etc/sysconfig/selinuxファイル内のSELINUX=permissiveをSELINUX=disabledに置き換えます

2つ目のコマンド:
- 同じくsedを使用します
- ダブルクォートはsedが/を認識できるようにします
- `g`はグローバル置換を意味し、ファイル内のすべてのSELINUX=enforcingをSELINUX=disabledに変更します

これらのコマンドを実行すると、SELinuxが永続的に無効化されます。SELinuxを無効化するとシステムのセキュリティが低下しますが、プログラムの互換性問題を解消する効果もあります。本番環境ではSELinuxを有効にし、正しく設定することが推奨されます。

スワップ領域

これらのコマンドはLinuxシステムのスワップ領域(swap)を永続的に無効化するために使用されます。

1. `swapoff -a`
- `swapoff`はスワップ領域を閉じるコマンドです
- `-a`オプションはすべてのスワップ領域を閉じることを意味します

このコマンドは現在アクティブなすべてのスワップ領域を即時に閉じます。

2. `sed -i 's/.*swap.*/#&/' /etc/fstab`
- `sed`はストリームエディタで、テキストの置換によく使用されます
- `-i`オプションはsedにファイル内容を直接変更させる効果があります
- `'s/.*swap.*/#&/'`は置換コマンドです
    - `.*swap.*`は"swap"を含む行に一致する正規表現です
    - `#&`は置換コードで、`#`記号はその行をコメントアウトし、`&`は元の内容を保持することを意味します
- `/etc/fstab`はシステム起動時にパーティションと仮想ファイルシステムを自動マウントする設定ファイルです

このコマンドの目的は、`/etc/fstab`ファイル内の"swap"という文字列を含む行を`#`記号でコメントアウトし、システム起動時にスワップ領域が自動的にマウントされないようにすることです。

これらのコマンドの効果をまとめると:
1) 現在のスワップ領域を即時に閉じる
2) システム再起動後にスワップ領域が自動的に有効になるのを防ぐ

スワップ領域を無効化する主な目的は、システムの物理メモリを完全に利用し、メモリとスワップ領域間のデータ交換を避け、より良いパフォーマンスを得るためです。特に大容量メモリが必要なタスクにとって非常に有益です。しかし、メモリ不足によるシステムクラッシュを避けるためにも、メモリ使用量を適切に管理する必要があります。

kubectl create

このコマンドはKubernetesクラスタでCalicoネットワークプラグインに必要なTigera Operatorを作成します。

コマンドの各部分を分解してみましょう:

1. `kubectl create`
- `kubectl`はKubernetesのコマンドラインツールです
- `create`はそのサブコマンドで、ファイルまたはURLからKubernetesリソースを作成するために使用されます

2. `-f` 
- このフラグは作成するリソースのファイルソースを指定します

3. `https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/tigera-operator.yaml`
- これはTigera Operatorインストールファイルの生のURLです
- Calicoは広く使用されているオープンソースのコンテナネットワークプラグインです
- Tigera OperatorはCalicoをデプロイおよび管理するKubernetesオペレータです

このコマンドを実行すると、指定されたURLからYAMLファイルをダウンロードし、その定義に基づいてクラスタ内に必要なリソースを作成します。

Tigera Operatorには主に以下の重要なリソースが含まれています:

1. Namespace: Calicoコンポーネント用の専用名前空間を作成します
2. RBACリソース: Operatorに必要な権限を割り当てます
3. Deployment: Operator自体をデプロイします
4. CustomResourceDefinitions: Calicoのカスタムリソースを定義します

Tigera Operatorを作成することは、Calicoをインストールする最初のステップです。次に、Calicoカスタムリソースを作成してネットワークプラグインを有効化および設定する必要があります。Calicoはクラスタ内に必要なコンポーネントを自動的にデプロイし、コンテナにネットワーク接続とネットワークポリシーの実施を提供します。

総じて、このコマンドは人気のあるCalico CNIプラグインをKubernetesクラスタにデプロイするプロセスを開始します。

参考資料:https://zhuanlan.zhihu.com/p/439991250

メモの更新:https://github.com/jiangteng2019/code-notes/blob/main/k8s/k8s%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA.md

タグ: Kubernetes kubeadm Docker calico CentOS

7月27日 23:43 投稿