サービスの継続性を確保し、証明書の漏洩やキーのクラッキングによる潜在的なセキュリティリスクを軽減するために、システム通知を受け取ったら、ACK 専用クラスター内のマスターノードの etcd 証明書を速やかに更新することをお勧めします。このトピックでは、ACK 専用クラスター内のマスターノードの etcd 証明書を更新する方法について説明します。
背景情報
ACK 専用クラスターから ACK マネージド Pro クラスターにワークロードを移行できます。クラスターを ACK マネージド Pro クラスターに移行することを選択できます。ACK マネージド Pro クラスターの etcd および Kubernetes コントロールプレーン証明書は Alibaba Cloud によって管理されます。ACK 専用クラスターを移行した後は、以下の更新操作を実行する必要はありません。移行の実行方法の詳細については、「ACK 専用クラスターを ACK マネージド Pro クラスターにホットマイグレーションする」をご参照ください。
使用上の注意
Container Service for Kubernetes (ACK) は、etcd 証明書の有効期限が切れる 2 か月前に内部メッセージとショートメッセージでリマインダーを送信し、[クラスター] ページに [Etcd 証明書の更新] ボタンを表示します。
更新プロセス中、クラスターのマスターノード上の API Server、etcd、kube-controller-manager、kubelet などのコントロールプレーンコンポーネントが 1 つずつ再起動されます。この期間中、API Server への永続的な接続は中断されます。この操作はオフピーク時に実行することをお勧めします。更新プロセスが完了するまでに約 30 分かかります。
ACK 専用クラスターで etcd または Kubernetes のデフォルトの構成ファイルディレクトリを変更した場合は、証明書を更新する前に元のディレクトリへのシンボリックリンクを作成する必要があります。そうしないと、更新は失敗します。
証明書を手動で更新しても、ACK コンソールに [ETCD 証明書の更新] の有効期限リマインダーがまだ表示されている場合は、して、チケットを送信してリマインダーを削除できます。
更新プロセスが失敗した場合は、して、チケットを送信してサポートを依頼してください。
シナリオ 1: 有効期限が切れていない etcd 証明書を更新する
etcd 証明書の有効期限が近づいており、リマインダーが表示された場合は、次のいずれかの方法で証明書を更新できます。
コンソールを使用して etcd 証明書を自動的に更新する
ACK コンソール。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
etcd 証明書の有効期限が近づいているクラスターの横にある [ETCD 証明書の更新] をクリックします。[証明書の更新] ページで、[証明書の更新] をクリックします。
説明クラスターの etcd 証明書が 2 か月以内に有効期限切れになる場合、クラスターの横に [ETCD 証明書の更新] ボタンが表示されます。

[注意] ダイアログボックスで、[OK] をクリックします。
証明書が更新されると、次の変更が発生します。
[証明書の更新] ページに、[正常に更新されました] というメッセージが表示されます。
[クラスター] ページでは、クラスターの横にある [ETCD 証明書の更新] ボタンが表示されなくなります。
etcd 証明書を手動で更新する
シナリオ
ACK 専用クラスターの etcd 証明書の有効期限が近づいています。
テンプレートをデプロイして etcd 証明書を自動的に更新することはできません。
コンソールで etcd 証明書を更新することはできません。
これらのシナリオでは、クラスター管理者は任意のマスターノードにログインし、次のスクリプトを実行して etcd 証明書を手動で更新できます。
次のスクリプトは root ユーザーとして実行する必要があります。
マスターノード間で root ユーザーのパスワードなしのログインが設定されていることを確認します。
Secure Shell (SSH) を使用して、あるマスターノードから別のマスターノードにログインします。パスワードの入力を求められた場合は、マスターノード間でパスワードなしのログインを設定する必要があります。
# 1. キーを生成します。ノードにログオンキーが既に存在する場合は、このステップをスキップできます。 ssh-keygen -t rsa # 2. ssh-copy-id ツールを使用して、公開鍵を他のすべてのマスターノードに転送します。$(internal-ip) は、別のマスターノードの内部 IP アドレスです。 ssh-copy-id -i ~/.ssh/id_rsa.pub $(internal-ip)説明パスワードなしのログインを設定しない場合は、スクリプトの実行時に root パスワードを入力する必要があります。
次のスクリプトをコピーし、restart-apiserver.sh および rotate-etcd.sh として保存し、2 つのファイルを同じフォルダーに保存します。
説明rotate-etcd.sh スクリプトは、ノードのメタデータサービスにアクセスしてリージョン情報を取得し、そのリージョンの最も近い場所からローテーションイメージをプルしようとします。
--region xxxxパラメーターを指定してスクリプトを実行し、リージョンを指定することもできます。任意のマスターノードで、
bash rotate-etcd.shを実行します。コマンドの出力が
etcd CA and certs have successfully rotated!の場合、すべてのマスターノードの証明書と Kubernetes 証明書は正常に更新されます。証明書が更新されたことを確認します。
cd /var/lib/etcd/cert for i in `ls | grep pem| grep -v key`;do openssl x509 -noout -text -in $i | grep -i after && echo "$i" ;done cd /etc/kubernetes/pki/etcd for i in `ls | grep pem| grep -v key`;do openssl x509 -noout -text -in $i | grep -i after && echo "$i" ;done cd /etc/kubernetes/pki/ for i in `ls | grep crt| grep -v key`;do openssl x509 -noout -text -in $i | grep -i after && echo "$i" ;done説明上記のスクリプトの出力の有効期限が 50 年後の場合、更新は完了です。
証明書を手動で更新した後も、ACK コンソールが更新結果を取得できないため、コンソールでクラスターの更新ボタンが表示され続ける場合があります。ボタンを削除するには、して、チケットを送信してください。
シナリオ 2: 有効期限が切れた etcd 証明書を更新する
シナリオ
etcd 証明書の有効期限が切れています。
API Server にアクセスできない場合は、etcd 証明書をローテーションできます。
テンプレートをデプロイして etcd 証明書を自動的に更新することはできません。
コンソールで etcd 証明書を更新することはできません。
これらのシナリオでは、クラスター管理者は任意のマスターノードにログインし、次のスクリプトを実行して etcd 証明書を手動で更新できます。
次のスクリプトは root ユーザーとして実行する必要があります。
マスターノード間で root ユーザーのパスワードなしのログインが設定されていることを確認します。
Secure Shell (SSH) を使用して、あるマスターノードから別のマスターノードにログインします。パスワードの入力を求められた場合は、マスターノード間でパスワードなしのログインを設定する必要があります。
# 1. キーを生成します。ノードにログオンキーが既に存在する場合は、このステップをスキップできます。 ssh-keygen -t rsa # 2. ssh-copy-id ツールを使用して、公開鍵を他のすべてのマスターノードに転送します。$(internal-ip) は、別のマスターノードの内部 IP アドレスです。 ssh-copy-id -i ~/.ssh/id_rsa.pub $(internal-ip)説明パスワードなしのログインを設定しない場合は、スクリプトの実行時に root パスワードを入力する必要があります。
次のスクリプトをコピーし、restart-apiserver.sh および rotate-etcd.sh として保存し、2 つのファイルを同じフォルダーに保存します。
説明rotate-etcd.sh スクリプトは、ノードのメタデータサービスにアクセスしてリージョン情報を取得し、そのリージョンの最も近い場所からローテーションイメージをプルしようとします。
--region xxxxパラメーターを指定してスクリプトを実行し、リージョンを指定することもできます。
証明書が更新されたことを確認します。
cd /var/lib/etcd/cert
for i in `ls | grep pem| grep -v key`;do openssl x509 -noout -text -in $i | grep -i after && echo "$i" ;done
cd /etc/kubernetes/pki/etcd
for i in `ls | grep pem| grep -v key`;do openssl x509 -noout -text -in $i | grep -i after && echo "$i" ;done
cd /etc/kubernetes/pki/
for i in `ls | grep crt| grep -v key`;do openssl x509 -noout -text -in $i | grep -i after && echo "$i" ;done上記のスクリプトの出力の有効期限が 50 年後の場合、更新は完了です。
証明書を手動で更新した後も、ACK コンソールが更新結果を取得できないため、コンソールでクラスターの期限切れステータスが表示され続ける場合があります。ステータスを削除するには、して、チケットを送信してください。
証明書の更新が失敗した場合のロールバック
シナリオ
コンソールからの証明書の更新が失敗しました。
コマンドラインからの証明書の更新が失敗しました。
これらのシナリオでは、クラスター管理者は任意のマスターノードにログインし、次のスクリプトを実行して変更をロールバックできます。この操作は、新しい etcd 証明書のセットを生成し、etcd サーバー証明書と kube-apiserver クライアント証明書を更新することで、クラスターを機能する状態に復元します。
次のスクリプトは root ユーザーとして実行する必要があります。
マスターノード間で root ユーザーのパスワードなしのログインが設定されていることを確認します。
Secure Shell (SSH) を使用して、あるマスターノードから別のマスターノードにログインします。パスワードの入力を求められた場合は、マスターノード間でパスワードなしのログインを設定する必要があります。
# 1. キーを生成します。ノードにログオンキーが既に存在する場合は、このステップをスキップできます。 ssh-keygen -t rsa # 2. ssh-copy-id ツールを使用して、公開鍵を他のすべてのマスターノードに転送します。$(internal-ip) は、別のマスターノードの内部 IP アドレスです。 ssh-copy-id -i ~/.ssh/id_rsa.pub $(internal-ip)説明パスワードなしのログインを設定しない場合は、スクリプトの実行時に root パスワードを入力する必要があります。
次のスクリプトをコピーし、restart-apiserver.sh および rollback-etcd.sh として保存し、2 つのファイルを同じフォルダーに保存します
説明rollback-etcd.sh スクリプトは、ノードのメタデータサービスにアクセスしてリージョン情報を取得し、そのリージョンの最も近い場所からローテーションイメージをプルしようとします。
--region xxxxパラメーターを指定してスクリプトを実行し、リージョンを指定することもできます。任意のマスターノードで、
bash rollback-etcd.shを実行します。コマンドの出力が
etcd CA and certs have successfully rotated!の場合、すべてのマスターノードの証明書と Kubernetes 証明書は正常に更新されます。証明書が更新されたことを確認します。
cd /var/lib/etcd/cert
for i in `ls | grep pem| grep -v key`;do openssl x509 -noout -text -in $i | grep -i after && echo "$i" ;done
cd /etc/kubernetes/pki/etcd
for i in `ls | grep pem| grep -v key`;do openssl x509 -noout -text -in $i | grep -i after && echo "$i" ;done
cd /etc/kubernetes/pki/
for i in `ls | grep crt| grep -v key`;do openssl x509 -noout -text -in $i | grep -i after && echo "$i" ;done上記のスクリプトによって返される時刻が 50 年以上先の場合、ローテーションは完了です。