公式の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
エラー処理
初期化プロセス中、問題がなければエラーが発生します:
- "container runtime is not running:"というエラーが表示された場合、以下のコマンドを実行する必要があります:
rm -rf /etc/containerd/config.toml
systemctl restart containerd
- "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)で実行:
- kubeletサービスを停止:
sudo systemctl stop kubelet
- 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環境を設定する際に使用される可能性があります。
ctr -n k8s.io images pull -k registry.aliyuncs.com/google_containers/pause:3.6
ctrはcontainerdのコマンドラインツールです-n k8s.ioはk8s.ioという名前空間を使用することを指定しますimages pullはイメージをプルすることを意味します-kオプションは信頼できないイメージリポジトリからイメージをプルすることを許可しますregistry.aliyuncs.com/google_containers/pause:3.6はプルするpauseイメージのアドレスとタグです
このコマンドの目的は、アリババクラウドのイメージリポジトリからKubernetesが使用するpauseコンテナイメージの3.6バージョンをプルすることです。
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