今までminikubeを使ってKubernetes環境を手軽に構築をしてきたが、とうとう本家Kubernetesの構築を行うことにした。
Kubernetes構築は数回に分けて説明する。
- Kubernetes構築手順① (cri-dockerdを使ってコントロールプレーンを構築) ★本記事
- Kubernetes構築手順② (ワーカーノードを追加)
- Kubernetes構築手順③ (マニフェストファイルを使ってDockerコンテナをデプロイ)
- Kubernetes構築手順④ (コントロールプレーンを冗長構成にする)
本記事では、Kubernetesの管理機能であるコントールプレーンの構築手順を記載する。
なお、Kubernetesを利用する際は、CRI (Container Runtime Interface)と呼ばれるコンテナを操作するためのインタフェースを指定する必要がある。CRIにはcontainerd、CRI-O、Dockerなど選択できるが、今回はDocker用のCRIである「cri-dockerd」を利用する。
環境
以下に今回構築する各種ソフトウェアのバージョンを記載する。
- ホストOS : AlmaLinux 8.6
- Docker : 23.0.1
- cri-dockerd: 0.3.1-dev
- Kubernetes: v1.26.2
なお、私の環境ではインターネット接続時にプロキシ接続が必要となるため、プロキシ経由で接続するための設定も併せて行っている。
今回の構成の概要図を以下に記載する。
Dockerインストール
1. プロキシ設定 (必要な場合のみ)
私の環境ではプロキシ経由でなければインターネット接続ができないため、以下の通り環境変数を設定する。プロキシの環境変数について小文字と大文字の両方を設定している理由は、本環境変数はソフトウェアによっては小文字と大文字の区別をすることがあるため、念のため両方を設定している。
また、no_proxy
の設定は、コントロールプレーンとなるホストのIPアドレスも指定している(今回であれば、192.168.11.51)。
export http_proxy=http://192.168.33.23:8080
export https_proxy=http://192.168.33.23:8080
export no_proxy=localhost,127.0.0.1,192.168.11.51,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
export HTTP_PROXY=http://192.168.33.23:8080
export HTTPS_PROXY=http://192.168.33.23:8080
export NO_PROXY=localhost,127.0.0.1,192.168.11.51,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
2. Dockerインストール前の競合パッケージの削除
Kubernetesが利用するコンテナエンジンはDockerを用いることにする。まずは、Dockerをインストールする。
ただし、GUI環境をインストールしたAlmaLinuxの場合、以下の通りpodmanとcontainers-commonのパッケージが競合する旨のエラーでインストールに失敗する。
# dnf install docker-ce docker-ce-cli containerd.io -y
メタデータの期限切れの最終確認: 0:05:01 時間前の 2022年11月26日 12時46分04秒 に 実施しました。
エラー:
問題 1: インストール済パッケージの問題 podman-2:4.0.2-6.module_el8.6.0+2878+e681bc44.x86_64
- パッケージ podman-2:4.0.2-6.module_el8.6.0+2878+e681bc44.x86_64 には runc >= 1.0.0-57 が必要ですが、どのプロバイダーからもインストールできません
- パッケージ podman-3:4.2.0-4.module_el8.7.0+3344+484dae7b.x86_64 には runc >= 1.0.0-57 が必要ですが、どのプロバイダーからもインストールできません
~(中略)~
問題 2: インストール済パッケージの問題 containers-common-2:1-27.module_el8.6.0+2878+e681bc44.x86_64
- パッケージ containers-common-2:1-27.module_el8.6.0+2878+e681bc44.x86_64 には runc が必要ですが、どのプロバイダーからもインストールできません
- パッケージ containers-common-2:1-43.module_el8.7.0+3344+484dae7b.x86_64 には runc が必要ですが、どのプロバイダーからもインストールできません
~(中略)~
このような場合は、一度podmanとcontainers-commonのパッケージを削除したうえで、Dockerをインストールしよう。
# dnf remove podman containers-common
3. Dockerをインストール
Dockerのインストールは以下の通りコマンドを実行すればよい。
# dnf install yum-utils -y
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# dnf install docker-ce docker-ce-cli containerd.io -y
4. Docker起動時の設定
プロキシ環境の場合は、外部からコンテナのダウンロードができるよう、systemctlの起動設定に環境変数の設定をしておくこと。
# sed -ie '/\[Service\]/a Environment="http_proxy=http://192.168.33.23:8080" "https_proxy=http://192.168.33.23:8080" "no_proxy=localhost,127.0.0.1,192.168.11.51,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"' /usr/lib/systemd/system/docker.service
また、Dockerのサービス起動時の設定ファイルであるdaemon.json
を以下の通り作成する。Kubernetesを利用する場合は、以下2点を設定する必要がある。
cgroupdriver
にcgroupfs
をsystemd
に変更insecure-registries
に必要に応じてプライベートのDockerコンテナレジストリを設定
# cat << EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"insecure-registries": [
"192.168.11.54"
]
}
EOF
5. Dockerサービスを起動
最後に、Dockerのサービスを起動しておく。
# systemctl daemon-reload
# systemctl start docker
# systemctl enable docker
Kubernetesインストール
1. Kubernetesパッケージのリポジトリ設定
Kubernetesのリポジトリとして、以下の通りファイルを作成する。
# cat <<EOF > /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
EOF
2. Kubernetesパッケージインストール
Kubernetesのインストールに必要なパッケージとして、kubelet
、kubeadm
、kubectl
をインストールする。また、関連して必要なパッケージであるiproute-tc
も併せてインストールする。
パッケージ | 説明 |
---|---|
kubelet |
Kubernetesの各ノードにインストールされるエージェントとなり、Podの起動などを制御するサービス。 |
kubeadm |
Kubernetesの構築を行うためのツール。コントロールプレーンの構築や、 |
kubectl |
Kubernetesの管理を行うためのツール。 |
iproute-tc |
Linux Traffic Control utilityのパッケージ。 |
# dnf install kubelet kubeadm kubectl --disableexcludes=kubernetes -y
# dnf install iproute-tc -y
3. kubelet起動
インストールしたkubeletのサービスを起動させておく。
# systemctl start kubelet
# systemctl enable kubelet
4. swapの無効化
Kubernetesでは前提としてswapの無効化が必要となるため、無効化のコマンドを実行し、/etc/fstab
にてswap領域をマウントしないよう設定する。
# swapoff -a
# sed -ie 's|\(^/dev/.* swap .*\)|#\1|' /etc/fstab
cri-dockerdインストール
1. 前提パッケージインストール
cri-dockerdは、GitHubに公開されているソースを用いてビルドしインストールする。そのため、git
、wget
のパッケージをインストールする。
# dnf install git wget -y
2. cri-dockrdをビルド及び配置
cri-dockerdはgo言語を用いているため、go
コマンドをインストールする。
go
コマンドをインストールするためのツールが用意されているので、ダウンロードしてインストールする。rootでコマンドを実行した場合は、/root/.go/bin/go
にインストールされ、~/.bash_profile
にもパスが追記される。
# mkdir /tmp/cri-dockerd
# cd /tmp/cri-dockerd
# wget https://storage.googleapis.com/golang/getgo/installer_linux
# chmod +x ./installer_linux
# ./installer_linux
# source ~/.bash_profile
次に、cri-dockerdのソースをgit clone
しダウンロードする。
# git clone https://github.com/Mirantis/cri-dockerd.git
ダウンロードしたソースをビルドし、systemdのディレクトリに配置する。
# cd cri-dockerd
# mkdir -p bin
# go build -o bin/cri-dockerd
# install -o root -g root -m 0755 bin/cri-dockerd /usr/local/bin/cri-dockerd
# cp -a packaging/systemd/* /etc/systemd/system
# sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
3. cri-dockrdを起動
cri-dockerdをサービスとして起動する。
# systemctl daemon-reload
# systemctl enable cri-docker.service
# systemctl enable --now cri-docker.socket
kubeadmコマンドを用いてKubernetesクラスター作成
1. kubeadmコマンド実行
kubeadm
コマンドを用いて、Kubernetesクラスターの作成を行う。クラスターの作成はkubeadm init
コマンドにて実施する。「Your Kubernetes control-plane has initialized successfully!」が表示されれば成功となる。
オプションの説明を以下に記載する。
オプション | 説明 |
---|---|
--pod-network-cidr=10.244.0.0/16 |
ネットワークアドオンとしてflannelを追加する際に必要となる設定となる。Pod用のクラスターネットワークのネットワークアドレスを指定する。 |
--cri-socket=unix:///var/run/cri-dockerd.sock |
CRIとしてcri-dockerdを使うことを明示的に指定するために指定する。指定しない場合、containerdとcri-dockerdの2つがインストールされていることにより、「Found multiple CRI endpoints on the host」のエラーにてクラスターの作成に失敗するので注意しよう。 |
# kubeadm init --pod-network-cidr=10.244.0.0/16 --cri-socket=unix:///var/run/cri-dockerd.sock
[init] Using Kubernetes version: v1.26.2
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
~(中略)~
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.11.51:6443 --token bexxee.xx866gxx91sxxa69 \
--discovery-token-ca-cert-hash sha256:06d8e3077c71a3f7af2xx8d6b389d43673xx9a8axxa5d003ed8dccb356a42f80
2. Kubernetesクラスター状態確認
Kubernetesの管理はkubectl
コマンドを使って実施するが、そのままでは使用できないので、環境変数で設定ファイルのパスを指定しておく。
# export KUBECONFIG=/etc/kubernetes/admin.conf
それでは、kubectl
コマンドを使って、PodとNodeの状態を確認してみよう。以下の通り、各種コントロールプレーン用のPodと1台のNodeが表示される。
# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-787d4945fb-cf2sf 0/1 Pending 0 45s
kube-system coredns-787d4945fb-wkp86 0/1 Pending 0 45s
kube-system etcd-t1051kube 1/1 Running 0 59s
kube-system kube-apiserver-t1051kube 1/1 Running 0 60s
kube-system kube-controller-manager-t1051kube 1/1 Running 0 60s
kube-system kube-proxy-lscpc 1/1 Running 0 46s
kube-system kube-scheduler-t1051kube 1/1 Running 0 60s
# kubectl get node
NAME STATUS ROLES AGE VERSION
t1051kube NotReady control-plane 83s v1.26.2
上記を見ると、corednsがPendingのステータスとなっており、NodeのステータスもNotReadyとなっている。これはPod用のネットワークアドオンがインストールされていないために発生しており、後続の手順にてflannelをインストールするとステータスがRunningになるため、現時点では気にしなくて問題ない。
ネットワークアドオンインストール (flannelインストール)
1. flannelインストール
Kubernetesのネットワークアドオンはいくつか選択肢があるようだが、今回はflannnelを利用する。flannelはインストール用のマニフェストファイルが公開されており、Kubernetes環境に適用するだけでインストールできる。
# cd ~
# curl -LO https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
# kubectl apply -f kube-flannel.yml
namespace/kube-flannel created
serviceaccount/flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
2. インストール後のPodとNodeの状態確認
インストール後、1分ほど待ってから再度PodとNodeの状態を確認してみよう。PendingステータスだったcorednsがRunningになり、NodeのステータスもReadyになっているはずだ。
# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-8s4cq 1/1 Running 0 41s
kube-system coredns-787d4945fb-cf2sf 1/1 Running 0 2m43s
kube-system coredns-787d4945fb-wkp86 1/1 Running 0 2m43s
kube-system etcd-t1051kube 1/1 Running 0 2m57s
kube-system kube-apiserver-t1051kube 1/1 Running 0 2m58s
kube-system kube-controller-manager-t1051kube 1/1 Running 0 2m58s
kube-system kube-proxy-lscpc 1/1 Running 0 2m44s
kube-system kube-scheduler-t1051kube 1/1 Running 0 2m58s
# kubectl get node
NAME STATUS ROLES AGE VERSION
t1051kube Ready control-plane 3m17s v1.26.2
以上で、Kubernetesの管理機能であるコントールプレーンの構築手順は完了となる。とはいえ、これだけでは実際にコンテナを起動させることもできないため、次回以降でワーカーノードを追加していく。
更新履歴
- 2023/3/11 新規作成
- 2024/2/19 リポジトリのURLを最新情報に更新
0 件のコメント:
コメントを投稿