自己構築 Kubernetes クラスターを Container Service for Kubernetes に移行する場合、デフォルトのシステムイメージとサービスを使用して Container Service for Kubernetes クラスターを作成することを推奨します。 カスタムイメージを使用して、ビジネス要件に基づいて Container Service for Kubernetesクラスターを作成することもできます。 本ページでは、カスタムイメージを使用して Container Service for Kubernetes クラスターを作成する方法について説明します。
このタスクについて
自己構築 Kubernetes クラスターを Container Service for Kubernetes に移行する場合、CentOS 7.6 または Aliyun Linux 2.1903 のデフォルトシステムイメージ、およびオペレーティングシステムカーネル、ドメインネームシステム (DNS) サービスなどのデフォルトシステムサービスと Yum リポジトリを使用することを推奨します。 Container Service for Kubernetes は、特別なビジネス要件を満たすためにカスタムイメージもサポートしています。 Alibaba Cloud では、オープンソースのツールの『 ack-image-builder』を提供し、Container Service for Kubernetes の要件を満たすカスタムイメージをすばやく作成できます。
Container Service for Kubernetes クラスターを作成
最初に、ワーカーノードなしの専用 Kubernetes クラスター、または 2 つのワーカーノードを持つ管理対象の Kubernetes クラスターを作成してから、カスタムイメージを使用するワーカーノードをクラスターに追加することを推奨します。 これにより、時間が節約され、エラーの確率が減少します。
次のセクションでは、ack-image-builder を使用してカスタムイメージを作成する方法について説明します。
ack-image-builder を使用
ack-image-builder ツールは、オープンソースツール『 HashiCorp Packer』に基づいて開発されています。 ack-image-builder ツールは、カスタムイメージを作成するためのデフォルト設定テンプレートと検証スクリプトを提供しています。
ack-image-builder を使用すると、手動操作によるエラーの確率を減らすことができます。 さらに、ack-image-builder ツールはトラブルシューティングを支援するためにイメージの変更を記録します。 ack-image-builder ツールを使用して、Container Service for Kubernetes クラスターのカスタムイメージを作成するには、次の手順に従います。
カスタムオペレーティングシステムカーネルを使用
Container Service for Kubernetes には、V3.10
以降のカーネルを備えた Linux オペレーティングシステムが必要です。 カスタマイズする RPM パッケージのみを更新することを推奨します。 カーネルのブートパラメーターを設定する必要があります。
$ cat scripts/updateOSKernel.sh
#! /bin/bash
VERSION_KERNEL="3.10.0-1062.4.3.el7"
yum localinstall -y http://xxx.xxx.xxx.xxx/kernel-${VERSION_KERNEL}.x86_64.rpm http://xxx.xxx.xxx.xxx/kernel-devel-${VERSION_KERNEL}.x86_64.rpm http://xxx.xxx.xxx.xxx/kernel-headers-${VERSION_KERNEL}.x86_64.rpm
grub_num=$(cat /etc/grub2.cfg |awk -F\' '$1=="menuentry " {print i++ " : " $2}' |grep $VERSION_KERNEL |awk -F ':' '{print $1}')
grub2-set-default $grub_num
yum update -y
コマンドを実行して、RPM パッケージのすべてを更新することは推奨しません。
オペレーティングシステムカーネルをカスタマイズする
["vm.max_map_count"]="262144"
["kernel.softlockup_panic"]="1"
["kernel.softlockup_all_cpu_backtrace"]="1"
["net.core.somaxconn"]="32768"
["net.core.rmem_max"]="16777216"
["net.core.wmem_max"]="16777216"
["net.ipv4.tcp_wmem"]="4096 12582912 16777216"
["net.ipv4.tcp_rmem"]="4096 12582912 16777216"
["net.ipv4.tcp_max_syn_backlog"]="8096"
["net.ipv4.tcp_slow_start_after_idle"]="0"
["net.core.netdev_max_backlog"]="16384"
["fs.file-max"]="2097152"
["fs.inotify.max_user_instances"]="8192"
["fs.inotify.max_user_watches"]="524288"
["fs.inotify.max_queued_events"]="16384"
["net.ipv4.ip_forward"]="1"
["net.bridge.bridge-nf-call-iptables"]="1"
["fs.may_detach_mounts"]="1"
["net.ipv4.conf.default.rp_filter"]="0"
["net.ipv4.tcp_tw_reuse"]="0"
["net.ipv4.tcp_tw_recycle"]="0"
カスタム DNS サービスを使用
- Alibaba Cloud ネームサーバーをアップストリームネームサーバーに追加します。
cat /etc/resolv.conf options timeout:2 attempts:3 rotate single-request-reopen ; generated by /usr/sbin/dhclient-script nameserver 100.XX.XX.136 nameserver 100.XX.XX.138
- /etc/resolve.conf ファイルを変更後にロックします。 それ以外の場合、cloud-init は ECS インスタンスの再起動後にファイルをデフォルト設定に復元します。 サンプルコードは次のとおりです。
$ cat scripts/updateDNS.sh #! /bin/bash # unlock DNS file in case it was locked chattr -i /etc/resolv.conf # カスタムネームサーバーを使用して xxx.xxx.xxx.xxx を置き換える echo -e "nameserver xxx.xxx.xxx.xxx\nnameserver xxx.xxx.xxx.xxx" > /etc/resolv.conf # cloudinit/NetworkManager による上書きを防ぐために解決をロックしたままにする chattr +i /etc/resolv.conf
- カスタム DNS サービスの適切なパフォーマンスを保証します。
クラスターに多数のノードが含まれる場合、カスタム DNS サービスのパフォーマンスが要件を満たしていることをご確認ください。
カスタム Yum リポジトリを使用する
- すべての RPM パッケージを更新しないでください。
インストールする RPM パッケージのみを更新します。 すべての RPM パッケージを更新する
yum update -y
コマンドを実行しないでください。 - Yum リポジトリの適切なパフォーマンスを保証します。
一度に多数のワーカーノードをクラスターに追加し、Yum リポジトリから RPM パッケージを更新する必要がある場合、Yum リポジトリのパフォーマンスがビジネス要件を満たしていることをご確認ください。 サンプルコードは次のとおりです。
$ cat scripts/add-yum-repo.sh #! /bin/bash cat << EOF > /etc/yum.repos.d/my.repo [base] name=CentOS-\$releasever enabled=1 failovermethod=priority baseurl=http://mirrors.cloud.aliyuncs.com/centos/\$releasever/os/\$basearch/ gpgcheck=1 gpgkey=http://mirrors.cloud.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-7 EOF
DaemonSet コンポーネントのコンテナイメージをプリロード
一度に 1,000 を超えるワーカーノードをクラスターに追加する場合は、カスタムイメージを作成するときに DaemonSet コンポーネントのコンテナイメージをプリロードすることを推奨します。 これにより、ノードの起動時にこれらのコンテナイメージをプルする操作が節約され、クラスタースケールアウトの効率が向上します。
カスタムイメージの設定ファイルを編集
カスタムイメージを作成するために、alicloud.json
ファイルへ provisioners
に関する次の設定を追加します。
"provisioners": [
{
"type": "shell",
"scripts": [
"config/default.sh",
"scripts/updateOSKernel.sh",
"scripts/updateDNS.sh",
"scripts/add-yum-repo.sh",
"scripts/prepare-images.sh",
"scripts/reboot.sh",
"scripts/verify.sh"
],
"expect_disconnect": true
}
]
config/default.sh
、scripts/reboot.sh
、scripts/verify.sh
スクリプトは、実行する必要があるデフォルトのスクリプトです。 その他はユーザー定義のスクリプトです。
config/default.sh
スクリプトはタイムゾーンを設定し、スワップパーティションを無効にします。
scripts/verify.sh
スクリプトは、カスタムイメージが Container Service for Kubernetes の要件を満たしているかどうかを確認します。
カスタムイメージの設定ファイルを編集した後に、カスタムイメージを作成し、それを使用して Container Service for Kubernetes クラスターを作成またはスケールアウトすることができます。