このドキュメントでは、Anthos clusters on VMware(GKE On-Prem)バージョン 1.13 に関する既知の問題について説明します。
/var/log/audit/ ディスク容量不足
Category
OS
識別されたバージョン
1.8.0+, 1.9.0+, 1.10.0+, 1.11.0+, 1.12.0+, 1.13.0+
現象
/var/log/audit/
が監査ログでいっぱいになっています。ディスク使用量を確認するには、sudo du -h -d 1 /var/log/audit
を実行します。
原因
Anthos v1.8 以降では、Ubuntu イメージが CIS レベル 2 のベンチマークで強化されています。また、コンプライアンス ルールの一つである 4.1.2.2 Ensure audit logs are not automatically deleted
によって、auditd 設定 max_log_file_action = keep_logs
が保証されています。これにより、すべての監査ルールがディスクに保持されます。
回避策
管理ワークステーション
管理ワークステーションの場合、auditd の設定を手動で変更してログを自動的にローテーションしてから、auditd サービスを再起動できます。
sed -i 's/max_log_file_action = keep_logs/max_log_file_action = rotate/g' /etc/audit/auditd.conf
sed -i 's/num_logs = .*/num_logs = 250/g' /etc/audit/auditd.conf
systemctl restart auditd
前述の設定では、監査ログが 250 個を超えるファイル(それぞれ 8M サイズ)を生成すると、auditd が自動的にログをローテーションします。
クラスタノード
クラスタノードの場合は、潜在的な問題を回避するために、次の DaemonSet をクラスタに適用します。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: change-auditd-log-action
namespace: kube-system
spec:
selector:
matchLabels:
app: change-auditd-log-action
template:
metadata:
labels:
app: change-auditd-log-action
spec:
hostIPC: true
hostPID: true
containers:
- name: update-audit-rule
image: ubuntu
command: ["chroot", "/host", "bash", "-c"]
args:
- |
while true; do
if $(grep -q "max_log_file_action = keep_logs" /etc/audit/auditd.conf); then
echo "updating auditd max_log_file_action to rotate with a max of 250 files"
sed -i 's/max_log_file_action = keep_logs/max_log_file_action = rotate/g' /etc/audit/auditd.conf
sed -i 's/num_logs = .*/num_logs = 250/g' /etc/audit/auditd.conf
echo "restarting auditd"
systemctl restart auditd
else
echo "auditd setting is expected, skip update"
fi
sleep 600
done
volumeMounts:
- name: host
mountPath: /host
securityContext:
privileged: true
volumes:
- name: host
hostPath:
path: /
この auditd 構成を変更すると、CIS レベル 2 のルール 4.1.2.2 Ensure audit logs are not automatically deleted
に違反しますので、注意してください。
NetworkGatewayGroup
フローティング IP がノードアドレスと競合する
Category
ネットワーキング
識別されたバージョン
1.10.x、1.11.0-1.11.3、1.12.0-1.12.2、1.13.0
現象
次の検証 Webhook エラーのため、ユーザーは NetworkGatewayGroup
オブジェクトを作成または更新できません。
[1] admission webhook "vnetworkgatewaygroup.kb.io" denied the request:
NetworkGatewayGroup.networking.gke.io "default" is invalid:
[Spec.FloatingIPs: Invalid value: "10.0.0.100": IP address conflicts with
node address with name: "my-node-name"
原因
影響を受けるバージョンでは、kubelet がノードに割り当てられたフローティング IP アドレスに誤ってバインドし、node.status.address 内のノードアドレスとして報告できます。検証 Webhook は、NetworkGatewayGroup
フローティング IP アドレスをクラスタ内のすべての node.status.address に照らしてチェックし、競合とみなします。
回避策
NetworkGatewayGroup
オブジェクトの作成または更新が失敗しているのと同じクラスタで、ANG 検証 Webhook を一時的に無効にして変更内容を送信します。
Webhook 構成を保存して、最後に復元できるようにします。
kubectl -n kube-system get validatingwebhookconfiguration ang-validating-webhook-configuration -o yaml > webhook-config.yaml
Webhook 構成を編集します。
kubectl -n kube-system edit validatingwebhookconfiguration ang-validating-webhook-configuration
Webhook 構成リストから
vnetworkgatewaygroup.kb.io
項目を削除し、変更を適用するために閉じます。NetworkGatewayGroup
オブジェクトを作成または編集します。元の Webhook 構成を再適用します。
kubectl -n kube-system apply -f webhook-config.yaml`
同時ステータス更新の競合状態から NetworkGatewayNode が異常とマークされる
Category
ネットワーキング
識別されたバージョン
1.10.0+、1.11.0-1.11.3、1.12.0-1.12.2、1.13.0
現象
networkgatewaygroups.status.nodes
で、一部のノードが NotHealthy
と Up
で切り替わります。
そのノードで実行されている ang-daemon
Pod のログに、次のようなエラーが繰り返し表示されます。
2022-09-16T21:50:59.696Z ERROR ANGd Failed to report status {"angNode":
"kube-system/my-node", "error": "updating Node CR status: sending Node CR
update: Operation cannot be fulfilled on networkgatewaynodes.networking.gke.io
\"my-node\": the object has been modified; please apply your changes to the
latest version and try again"}
NotHealthy
ステータスにより、コントローラで追加のフローティング IP がノードに割り当てられなくなります。これにより、他のノードへの負荷が増加したり、高可用性の冗長性が失われる可能性があります。
それ以外の場合、データプレーンのアクティビティは影響を受けません。
原因
networkgatewaygroup
オブジェクトで競合が発生すると、再試行処理の不具合により、一部のステータス更新が失敗します。ステータス更新の失敗が多すぎると、ang-controller-manager
はノードがそのハートビート時間の上限を超えたとみなし、ノードを NotHealthy
としてマークします。
再試行処理の不具合は、以降のバージョンで修正されています。
回避策
該当する場合は、固定バージョンにアップグレードします。
競合状態では、更新やアップグレード中にマシン オブジェクトの削除がブロックされる
Category
アップグレード/更新
識別されたバージョン
1.12.0、1.12.1、1.12.2、1.13.0
現象
上述のバージョンには、古いマシン オブジェクトが削除されるのを待機するために、クラスタのアップグレードや更新が停止する可能性があるという既知の問題があります。これは、ファイナライザがマシン オブジェクトから削除できないためです。これは、ノードプールのローリング アップデート オペレーションに影響します。
具体的には、gkectl
コマンドがタイムアウトし、次のエラー メッセージが表示されます。
E0821 18:28:02.546121 61942 console.go:87] Exit with error:
E0821 18:28:02.546184 61942 console.go:87] error: timed out waiting for the condition, message: Node pool "pool-1" is not ready: ready condition is not true: CreateOrUpdateNodePool: 1/3 replicas are updated
Check the status of OnPremUserCluster 'cluster-1-gke-onprem-mgmt/cluster-1' and the logs of pod 'kube-system/onprem-user-cluster-controller' for more detailed debugging information.
clusterapi-controller
Pod ログでは、エラーは次のようになります。
$ kubectl logs clusterapi-controllers-[POD_NAME_SUFFIX] -n cluster-1 -c vsphere-controller-manager --kubeconfig [ADMIN_KUBECONFIG] | grep "Error removing finalizer from machine object"
…
E0821 23:19:45.114993 1 machine_controller.go:269] Error removing finalizer from machine object cluster-1-pool-7cbc496597-t5d5p; Operation cannot be fulfilled on machines.cluster.k8s.io "cluster-1-pool-7cbc496597-t5d5p": the object has been modified; please apply your changes to the latest version and try again
このバグがなくても、実行が成功した場合でも、同じマシンでエラーが数分間繰り返されることに注意してください。ほとんどの場合、エラーはすぐに解決しますが、まれに、この競合状態で数時間スタックすることがあります。
原因
基盤となる VM は vCenter ですでに削除されていますが、対応するマシン オブジェクトを削除できません。他のコントローラからの更新が頻繁に発生するため、ファイナライザの削除が停止します。これにより、gkectl
コマンドはタイムアウトしますが、コントローラはクラスタの調整を継続するため、アップグレードまたは更新のプロセスは最終的に完了します。
回避策
Google はこの問題に対して、環境と要件に応じてさまざまな緩和策を用意しています。
オプション 1: アップグレードが最終的に完了するまで待つ
環境内の分析と再現性に基づいて、手動操作を行わずに最終的にアップグレードを完了できます。このオプションの注意点は、各マシン オブジェクトに対してファイナライザの削除に要する時間が不明であることです。この処理は、運が良ければ直ちに行われる可能性があります。また、マシンセット コントローラの調整が過度に高速で処理され、マシン コントローラが調整の間にファイナライザを削除する機会を得られない状況になると、数時間にわたり続行される可能性があります。
この選択肢の優れている点は、お客様側で操作する必要がなく、ワークロードが中断されないことです。アップグレードが完了するまでの時間が長くなるだけです。
オプション 2: 古いマシンのオブジェクトに自動修復のアノテーションを適用する
マシンセット コントローラは、自動修復のアノテーションが付加されており削除タイムスタンプがゼロ以外のマシンを除外し、それらのマシンに対して削除呼び出しを行うことを繰り返しません。これにより、競合状態を回避できます。
デメリットは、マシン上の Pod がエビクションされずに直接削除されることです。つまり、PDB 構成が無視されるため、ワークロードのダウンタイムが発生する可能性があります。
すべてのマシン名を取得するためのコマンド:
kubectl --kubeconfig CLUSTER_KUBECONFIG get machines
各マシンに自動修復アノテーションを適用するコマンド:
kubectl annotate --kubeconfig CLUSTER_KUBECONFIG machine MACHINE_NAME onprem.cluster.gke.io/repair-machine=true
上記の問題が発生した場合に上記の緩和策がお試しになる場合は、サポートチームまでお問い合わせください。
gkectl prepare OS イメージ検証のプリフライトの失敗
Category
インストールとアップグレード / 更新
識別されたバージョン
1.10.2+、1.11、1.12、1.13
現象
gkectl prepare
コマンドが次のエラーで失敗しました。
- Validation Category: OS Images
- [FAILURE] Admin cluster OS images exist: os images
[os_image_name] don't exist, please run `gkectl prepare` to upload os
images.
原因
gkectl prepare
のプリフライト チェックに誤った検証が含まれていました。
回避策
フラグ --skip-validation-os-images
を追加して、同じコマンドを実行します。
https://
接頭辞または http://
接頭辞を持つ vCenter URL はクラスタの起動エラーを引き起こす可能性がある
Category
インストール
識別されたバージョン
1.7.0+
現象
次のエラーで管理クラスタの作成に失敗しました。
Exit with error:
Failed to create root cluster: unable to apply admin base bundle to external cluster: error: timed out waiting for the condition, message: Failed to apply external bundle components: failed to apply bundle objects from admin-vsphere-credentials-secret 1.x.y-gke.z to cluster external: Secret "vsphere-dynamic-credentials" is invalid: [data[https://xxx.xxx.xxx.username]: Invalid value: "https://xxx.xxx.xxx.username": a valid config key must consist of alphanumeric characters, '-', '_' or '.' (e.g. 'key.name', or 'KEY_NAME', or 'key-name', regex used for validation is '[-._a-zA-Z0-9]+'), data[https://xxx.xxx.xxx.password]: Invalid value: "https://xxx.xxx.xxx.password": a valid config key must consist of alphanumeric characters, '-', '_' or '.' (e.g. 'key.name', or 'KEY_NAME', or 'key-name', regex used for validation is '[-._a-zA-Z0-9]+')]
原因
この URL は Secret
キーの一部として使用され、「/」や「:」はサポートされません。
回避策
管理クラスタまたはユーザー クラスタの構成 yaml の vCenter.Address
フィールドから、https://
接頭辞または http://
接頭辞を削除します。
util.CheckFileExists 上の gkectl prepare panic
gkectl prepare
では、次のスタックトレースでパニックが発生します。
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0xde0dfa]
goroutine 1 [running]:
gke-internal.googlesource.com/syllogi/cluster-management/pkg/util.CheckFileExists(0xc001602210, 0x2b, 0xc001602210, 0x2b)
pkg/util/util.go:226 +0x9a
gke-internal.googlesource.com/syllogi/cluster-management/gkectl/pkg/config/util.SetCertsForPrivateRegistry(0xc000053d70, 0x10, 0xc000f06f00, 0x4b4, 0x1, 0xc00015b400)
gkectl/pkg/config/util/utils.go:75 +0x85
...
gkectl prepare
が非公開レジストリ証明書ディレクトリを誤った権限で作成したことが問題でした。
この問題を解決するには、管理ワークステーションで次のコマンドを実行します。
sudo mkdir -p /etc/docker/certs.d/PRIVATE_REGISTRY_ADDRESS
sudo chmod 0755 /etc/docker/certs.d/PRIVATE_REGISTRY_ADDRESS
gkectl repair admin-master と resumable admin upgrade が連携していない
管理クラスタのアップグレードの試行に失敗した場合は、gkectl
repair admin-master
を実行しないでください。これを行うと、以降の管理アップグレードの試行が失敗し、管理マスターの電源障害や VM にアクセスできないなどの問題が発生する可能性があります。すでにこの障害シナリオが発生している場合は、サポートにお問い合わせください。
cgroup v2 がワークロードに影響する可能性がある
バージョン 1.12.0 では、cgroup v2(統合)が Container Optimized OS(COS)ノードでデフォルトで有効になっています。これにより、COS クラスタ内のワークロードが不安定になる可能性があります。バージョン 1.12.1 では、cgroup v1(ハイブリッド)に戻ります。COS ノードを使用している場合は、リリースされたらすぐにバージョン 1.12.1 にアップグレードすることをおすすめします。
ClientConfig のカスタム リソース
gkectl update
は、ClientConfig カスタム リソースに手動で加えた変更を元に戻します。毎回手動で変更した後に ClientConfig リソースをバックアップすることを強くおすすめします。
gkectl check-config 検証が失敗: F5 BIG-IP パーティションが見つからない
- 現象
F5 BIG-IP パーティションが存在している場合でも見つからず、検証で不合格になります。
- 考えられる原因
F5 BIG-IP API に問題があると、検証が失敗することがあります。
- 解決策
もう一度
gkectl check-config
を実行してみてください。
PodDisruptionBudgets を使用するワークロードが中断する
クラスタをアップグレードすると、PodDisruptionBudgets(PDB)を使用するワークロードで中断やダウンタイムが発生することがあります。
ノードがアップグレード プロセスを完了できない
追加の中断を許可できない PodDisruptionBudget
オブジェクトが構成されている場合、ノードのアップグレードを繰り返し試行しても、コントロール プレーン バージョンへのアップグレードが失敗する可能性があります。このエラーを回避するには、Deployment
または HorizontalPodAutoscaler
をスケールアップして、PodDisruptionBudget
構成を維持しながらノードをドレインすることをおすすめします。
中断を許可しないすべての PodDisruptionBudget
オブジェクトを表示するには、次を行います。
kubectl get poddisruptionbudget --all-namespaces -o jsonpath='{range .items[?(@.status.disruptionsAllowed==0)]}{.metadata.name}/{.metadata.namespace}{"\n"}{end}'
cert-manager/ca-injector のリーダー選出の問題により、ユーザー クラスタのインストールが失敗した
apiserver/etcd が低速の場合、クラッシュ ループの cert-manager-cainjector
が原因でインストールが失敗する場合があります。
# These are logs from `cert-manager-cainjector`, from the command
# `kubectl --kubeconfig USER_CLUSTER_KUBECONFIG -n kube-system cert-manager-cainjector-xxx`
I0923 16:19:27.911174 1 leaderelection.go:278] failed to renew lease kube-system/cert-manager-cainjector-leader-election: timed out waiting for the condition
E0923 16:19:27.911110 1 leaderelection.go:321] error retrieving resource lock kube-system/cert-manager-cainjector-leader-election-core: Get "https://10.96.0.1:443/api/v1/namespaces/kube-system/configmaps/cert-manager-cainjector-leader-election-core": context deadline exceeded
I0923 16:19:27.911593 1 leaderelection.go:278] failed to renew lease kube-system/cert-manager-cainjector-leader-election-core: timed out waiting for the condition
E0923 16:19:27.911629 1 start.go:163] cert-manager/ca-injector "msg"="error running core-only manager" "error"="leader election lost"
問題を軽減するために、次のコマンドを実行します。
まず、monitoring-operator
をスケールダウンして、cert-manager
Deployment への変更が元に戻されないようにします。
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG -n kube-system scale deployment monitoring-operator --replicas=0
次に、cert-manager-cainjector
Deployment を編集してリーダー選出を無効にします。これは、レプリカが 1 つしか実行されていないためです。単一レプリカの場合は必要ありません。
# Add a command line flag for cainjector: `--leader-elect=false`
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG edit -n kube-system deployment cert-manager-cainjector
cert-manager-cainjector
デプロイに関連する yaml スニペットは ...
apiVersion: apps/v1
kind: Deployment
metadata:
name: cert-manager-cainjector
namespace: kube-system
...
spec:
...
template:
...
spec:
...
containers:
- name: cert-manager
image: "gcr.io/gke-on-prem-staging/cert-manager-cainjector:v1.0.3-gke.0"
args:
...
- --leader-elect=false
...
のようになります。
インストールが完了するまで、緩和策として monitoring-operator
レプリカを 0 のままにします。それ以外の場合は、変更が元に戻されます。
インストールが完了し、クラスタが稼働したら、2 日目のオペレーションで monitoring-operator
を有効にします。
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG -n kube-system scale deployment monitoring-operator --replicas=1
各アップグレード後に、変更が元に戻されます。この問題が今後のリリースで修正されるまで、同じ手順を繰り返して問題を軽減します。
管理クラスタのアップグレード前に証明書の更新が必要になる場合がある
管理クラスタのアップグレード プロセスを開始する前に、管理クラスタの証明書が現在有効であることを確認し、有効でない場合は更新する必要があります。
管理クラスタの証明書の更新プロセス
開始する前に、管理ワークステーションに OpenSSL がインストールされていることを確認してください。
KUBECONFIG
変数を設定します。KUBECONFIG=ABSOLUTE_PATH_ADMIN_CLUSTER_KUBECONFIG
ABSOLUTE_PATH_ADMIN_CLUSTER_KUBECONFIG は、管理クラスタの kubeconfig ファイルの絶対パスに置き換えます。
管理マスターノードの IP アドレスと SSH 認証鍵を取得します。
kubectl --kubeconfig "${KUBECONFIG}" get secrets -n kube-system sshkeys \ -o jsonpath='{.data.vsphere_tmp}' | base64 -d > \ ~/.ssh/admin-cluster.key && chmod 600 ~/.ssh/admin-cluster.key export MASTER_NODE_IP=$(kubectl --kubeconfig "${KUBECONFIG}" get nodes -o \ jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}' \ --selector='node-role.kubernetes.io/master')
証明書が期限切れでないかを確認します。
ssh -i ~/.ssh/admin-cluster.key ubuntu@"${MASTER_NODE_IP}" \ "sudo kubeadm alpha certs check-expiration"
証明書が期限切れの場合は、管理クラスタをアップグレードする前に証明書を更新する必要があります。
古い証明書をバックアップします。
これは省略可能ですが、推奨される手順です。
# ssh into admin master ssh -i ~/.ssh/admin-cluster.key ubuntu@"${MASTER_NODE_IP}" # on admin master sudo tar -czvf backup.tar.gz /etc/kubernetes logout # on worker node sudo scp -i ~/.ssh/admin-cluster.key \ ubuntu@"${MASTER_NODE_IP}":/home/ubuntu/backup.tar.gz .
kubeadm を使用して証明書を更新します。
# ssh into admin master ssh -i ~/.ssh/admin-cluster.key ubuntu@"${MASTER_NODE_IP}" # on admin master sudo kubeadm alpha certs renew all
管理マスターノードを再起動します。
# on admin master cd /etc/kubernetes sudo mkdir tempdir sudo mv manifests/*.yaml tempdir/ sleep 5 echo "remove pods" # ensure kubelet detect those change remove those pods # wait until the result of this command is empty sudo docker ps | grep kube-apiserver # ensure kubelet start those pods again echo "start pods again" sudo mv tempdir/*.yaml manifests/ sleep 30 # ensure kubelet start those pods again # should show some results sudo docker ps | grep -e kube-apiserver -e kube-controller-manager -e kube-scheduler -e etcd # clean up sudo rm -rf tempdir logout
管理証明書が期限切れになった場合は管理クラスタの kubeconfig ファイルも期限切れになるため、有効期限が切れる前にこのファイルをバックアップする必要があります。
管理クラスタの kubeconfig ファイルをバックアップします。
ssh -i ~/.ssh/admin-cluster.key ubuntu@"${MASTER_NODE_IP}"
"sudo cat /etc/kubernetes/admin.conf" > new_admin.conf vi "${KUBECONFIG}"kubeconfig の
client-certificate-data
とclient-key-data
を作成したnew_admin.conf
ファイルのclient-certificate-data
とclient-key-data
に置き換えます。
更新された証明書を検証し、kube-apiserver の証明書を検証します。
証明書の有効期限を確認します。
ssh -i ~/.ssh/admin-cluster.key ubuntu@"${MASTER_NODE_IP}"
"sudo kubeadm alpha certs check-expiration"kube-apiserver の証明書を確認します。
# Get the IP address of kube-apiserver cat $KUBECONFIG | grep server # Get the current kube-apiserver certificate openssl s_client -showcerts -connect
:
| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
> current-kube-apiserver.crt # check expiration date of this cert openssl x509 -in current-kube-apiserver.crt -noout -enddate
バージョンが7.0U2 より低い場合は vCenter を再起動またはアップグレードする
バージョンが 7.0U2 より低い場合、vCenter がアップグレードなどの後に再起動されると、vCenter の VM 情報にあるネットワーク名が正しくないため、マシンが Unavailable
状態になります。最終的に、そのノードは自動修復されて新しいノードが作成されます。
関連する govmomi のバグ: https://github.com/vmware/govmomi/issues/2552
この回避策は VMware のサポートによって提供されます。
1. The issue is fixed in vCenter versions 7.0U2 and above. 2. For lower versions: Right-click the host, and then select Connection > Disconnect. Next, reconnect, which forces an update of the VM's portgroup.
リモートホストによって切断された SSH 接続
Anthos clusters on VMware バージョン 1.7.2 以降の場合、Ubuntu OS イメージは CIS L1 Server Benchmark で強化されています。CIS ルール「5.2.16 Ensure SSH Idle Timeout Interval is configured」を満たすために、/etc/ssh/sshd_config
には次の設定が行われます。
ClientAliveInterval 300 ClientAliveCountMax 0
これらの設定の目的は、アイドル状態の 5 分後にクライアント セッションを終了することです。ただし、ClientAliveCountMax 0
値により予期しない動作が発生します。管理ワークステーションまたはクラスタノードで SSH セッションを使用すると、時間のかかるコマンドを実行する際など、SSH クライアントがアイドル状態になっていなくても SSH 接続が切断され、次のメッセージが表示されてコマンドが終了する可能性があります。
Connection to [IP] closed by remote host. Connection to [IP] closed.
回避策として、次のいずれかを行います。
SSH の切断時にコマンドが終了しないようにするには、
nohup
を使用します。nohup gkectl upgrade admin --config admin-cluster.yaml --kubeconfig kubeconfig
ゼロ以外の
ClientAliveCountMax
値を使用するようにsshd_config
を更新します。CIS ルールでは、3 未満の値を使用することが推奨されます。sudo sed -i 's/ClientAliveCountMax 0/ClientAliveCountMax 1/g' /etc/ssh/sshd_config sudo systemctl restart sshd
SSH セッションの再接続を確認してください。
cert-manager
のインストールが競合している
1.13 リリースでは、monitoring-operator
によって cert-manager が cert-manager
名前空間にインストールされます。なんらかの理由で独自の cert-manager をインストールする必要がある場合は、次の手順で競合を回避してください。
アップグレード中の競合を回避する
使用しているバージョンの
cert-manager
をアンインストールします。独自のリソースを定義した場合は、バックアップすることをおすすめします。アップグレードを実施します。
独自の
cert-manager
を復元するには、次の手順を行います。
ユーザー クラスタで独自の cert-manager を復元する
monitoring-operator
デプロイを 0 にスケーリングします。kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME scale deployment monitoring-operator --replicas=0
monitoring-operator
によって管理されるcert-manager
デプロイを 0 にスケールします。kubectl --kubeconfig USER_CLUSTER_KUBECONFIG -n cert-manager scale deployment cert-manager --replicas=0 kubectl --kubeconfig USER_CLUSTER_KUBECONFIG -n cert-manager scale deployment cert-manager-cainjector --replicas=0 kubectl --kubeconfig USER_CLUSTER_KUBECONFIG -n cert-manager scale deployment cert-manager-webhook --replicas=0
cert-manager
のバージョンを再インストールします。必要に応じて、カスタマイズしたリソースを復元します。アップストリームのデフォルト cert-manager のインストールを使用している場合、または cert-manager が
cert-manager
名前空間にインストールされている場合は、この手順をスキップできます。それ以外の場合は、metrics-ca
cert-manager.io/v1 証明書とmetrics-pki.cluster.local
Issuer リソースをcert-manager
から、インストールした cert-manager のクラスタ リソース名前空間にコピーします。relevant_fields=' { apiVersion: .apiVersion, kind: .kind, metadata: { name: .metadata.name, namespace: "YOUR_INSTALLED_CERT_MANAGER_NAMESPACE" }, spec: .spec } ' f1=$(mktemp) f2=$(mktemp) kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get issuer -n cert-manager metrics-pki.cluster.local -o json | jq "${relevant_fields}" > $f1 kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get certificate -n cert-manager metrics-ca -o json | jq "${relevant_fields}" > $f2 kubectl apply --kubeconfig USER_CLUSTER_KUBECONFIG -f $f1 kubectl apply --kubeconfig USER_CLUSTER_KUBECONFIG -f $f2
管理クラスタに独自の cert-manager を復元する
一般に、管理クラスタは Anthos clusters on VMware のコントロール プレーン ワークロードのみを実行するため、管理クラスタに cert-manager を再インストールする必要はありません。まれに、独自の cert-manager を管理クラスタにインストールする必要が生じた場合は、競合を回避するために次の手順に沿って操作してください。Apigee をご利用いただいており、Apigee の cert-manager のみを必要とされる場合は、管理クラスタ コマンドを実行する必要はありません。
monitoring-operator
デプロイを 0 にスケーリングします。kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n kube-system scale deployment monitoring-operator --replicas=0
monitoring-operator
によって管理されるcert-manager
デプロイを 0 にスケールします。kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n cert-manager scale deployment cert-manager --replicas=0 kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n cert-manager scale deployment cert-manager-cainjector --replicas=0 kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n cert-manager scale deployment cert-manager-webhook --replicas=0
cert-manager
のバージョンを再インストールします。必要に応じて、カスタマイズしたリソースを復元します。アップストリームのデフォルト cert-manager のインストールを使用している場合、または cert-manager が
cert-manager
名前空間にインストールされている場合は、この手順をスキップできます。それ以外の場合は、metrics-ca
cert-manager.io/v1 証明書とmetrics-pki.cluster.local
Issuer リソースをcert-manager
から、インストールした cert-manager のクラスタ リソース名前空間にコピーします。relevant_fields=' { apiVersion: .apiVersion, kind: .kind, metadata: { name: .metadata.name, namespace: "YOUR_INSTALLED_CERT_MANAGER_NAMESPACE" }, spec: .spec } ' f3=$(mktemp) f4=$(mktemp) kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get issuer -n cert-manager metrics-pki.cluster.local -o json | jq "${relevant_fields}" > $f3 kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get certificate -n cert-manager metrics-ca -o json | jq "${relevant_fields}" > $f4 kubectl apply --kubeconfig ADMIN_CLUSTER_KUBECONFIG -f $f3 kubectl apply --kubeconfig ADMIN_CLUSTER_KUBECONFIG -f $f4
Docker、containerd、runc の脆弱性スキャンにおける誤検出
Anthos clusters on VMware に付属する Ubuntu OS イメージ内の Docker、containerd、runc は、Ubuntu PPA を使用して特別なバージョンに固定されます。これにより、コンテナ ランタイムの変更が各リリース前に Anthos clusters on VMware によって認定されるようになります。
ただし、特殊なバージョンは Ubuntu CVE Tracker に知られていません。これは、さまざまな CVE スキャンツールによって脆弱性フィードとして使用されます。したがって、docker、containerd、runc の脆弱性スキャン結果に誤検出が生じます。
たとえば、CVE のスキャン結果で次の誤検出が発生することがあります。これらの CVE は Anthos clusters on VMware の最新のパッチ バージョンですでに修正されています。
CVE の修正については、リリースノートをご覧ください。
Canonical はこの問題を認識しており、修正は https://github.com/canonical/sec-cvescan/issues/73 で追跡されています。
管理者クラスタとユーザー クラスタの間のネットワーク接続は、非 HA クラスタのアップグレード中に短時間使用できなくなる場合があります
HA 以外のクラスタを 1.9 から 1.10 にアップグレードする場合に、kubectl exec、kubectl のログ、ユーザー クラスタに対する Webhook がしばらく使用できなくなる場合があります。このダウンタイムは最大で 1 分です。これは、受信リクエスト(kubectl exec、kubectl log、Webhook)がユーザー クラスタの kube-apiserver によって処理されるために発生します。ユーザー kube-apiserver は Statefulset です。HA 以外のクラスタでは、Statefulset のレプリカは 1 つだけです。そのため、アップグレード中、新しい kube-apiserver の準備ができるまで古い kube-apiserver が使用できなくなる可能性があります。
このダウンタイムはアップグレード プロセス中にのみ発生します。アップグレード時のダウンタイムを短縮するために、HA クラスタに切り替えることをおすすめします。
クラスタの作成またはアップグレード後の HA クラスタの診断で Konnectivity の準備チェックが失敗した
HA クラスタの作成またはアップグレードを行っているときにクラスタの診断で konnectivity の readiness チェックに失敗した場合、通常、Anthos clusters on VMware(kubectl exec、kubectl log、Webhook)の機能には影響しません。これは、不安定なネットワーキングなどの問題が原因で、1、2 個の konnectivity のレプリカが一定期間読み取り不能になっている可能性があるためです。konnectivity は自己回復します。30 分から 1 時間待ってから、クラスタ診断を再実行してください。
ロードバランサと NSX-T ステートフル分散ファイアウォール ルールが予期しない動作をする。
NSX-T ステートフル分散ファイアウォール ルールを使用する環境に Seesaw がバンドルされたロードバランサがデプロイされている場合、Anthos clusters on VMware バージョン 1.9 以降をデプロイすると、stackdriver-operator
は gke-metrics-agent-conf
ConfigMap の作成に失敗し、gke-connect-agent
Pod がクラッシュ ループに入る。
根本的な問題は、Seesaw が非対称接続フローを使用するため、Seesaw ロードバランサを通るクライアントからユーザー クラスタ API サーバーへの接続がステートフル NSX-T 分散ファイアウォール ルールによって解除されることです。NSX-T 分散ファイアウォール ルールとのインテグレーションの問題は、Seesaw を使用するすべての Anthos clusters on VMware リリースに影響します。独自のアプリケーションで、32K を超えるサイズの大規模な Kubernetes オブジェクトを作成すると、同様の接続の問題が発生することがあります。こちらの手順に沿って NSX-T 分散ファイアウォール ルールを無効にするか、Seesaw VM 用のステートレス分散ファイアウォール ルールを使用します。
クラスタで手動ロードバランサを使用している場合は、こちらの手順に沿って、バックエンド ノードの障害を検出したときにクライアント接続がリセットされるようにロードバランサを構成します。この構成を行わないと、サーバー インスタンスがダウンしたときに Kubernetes API サーバーのクライアントが数分間応答不能になる可能性があります。
ロギングとモニタリング
ダッシュボードでサポートが終了した指標を置き換える
サポートが終了した指標が OOTB ダッシュボードで使用されている場合は、空のグラフがいくつか表示されます。Monitoring ダッシュボードでサポートが終了した指標を見つけるには、次のコマンドを実行します。
gcloud monitoring dashboards list > all-dashboard.json
# find deprecated metrics
cat all-dashboard.json | grep -E 'kube_daemonset_updated_number_scheduled|kube_node_status_allocatable_cpu_cores|kube_node_status_allocatable_pods|kube_node_status_capacity_cpu_cores'
次のサポートが終了した指標を、サポートされている指標に移行する必要があります。
非推奨 | 置換 |
---|---|
kube_daemonset_updated_number_scheduled |
kube_daemonset_status_updated_number_scheduled |
kube_node_status_allocatable_cpu_cores kube_node_status_allocatable_memory_bytes kube_node_status_allocatable_pods |
kube_node_status_allocatable |
kube_node_status_capacity_cpu_cores kube_node_status_capacity_memory_bytes kube_node_status_capacity_pods |
kube_node_status_capacity |
kube_hpa_status_current_replicas |
kube_horizontalpodautoscaler_status_current_replicas |
サポートが終了した指標を置き換えるには:
Google Cloud Monitoring ダッシュボードで 「GKE On-Prem ノードのステータス」を削除します。これらの手順に沿って、「GKE On-Prem ノードのステータス」を再インストールします。
Google Cloud Monitoring ダッシュボードで「GKE On-Prem のノード使用率」を削除します。これらの手順に沿って、「GKE On-Prem ノード使用率」を再インストールします。
Google Cloud Monitoring ダッシュボードで「GKE on-prem vSphere vm health」を削除します。こちらの手順に沿って、「GKE On-Prem vSphere vm health」を再インストールします。
このサポート終了は、Kubernetes 1.22 に必要な kube-state-metrics エージェントを v1.9 から v2.4 にアップグレードしたことによるものです。カスタム ダッシュボードまたはアラート ポリシーで、接頭辞 kube_
を持つサポートが終了した kube-state-metrics
指標をすべて置換できます。
Cloud Monitoring で不明な指標データ
Anthos clusters on VMware バージョン 1.10 以降の場合、Cloud Monitoring のクラスタのデータには、次のような無関係なサマリー指標のエントリが含まれている場合があります。
Unknown metric: kubernetes.io/anthos/go_gc_duration_seconds_summary_percentile
無関係なサマリー指標が含まれている可能性があるその他の指標タイプ:
apiserver_admission_step_admission_duration_seconds_summary
go_gc_duration_seconds
scheduler_scheduling_duration_seconds
gkeconnect_http_request_duration_seconds_summary
alertmanager_nflog_snapshot_duration_seconds_summary
これらのサマリータイプの指標は指標リストに含まれていますが、現時点では gke-metrics-agent
ではサポートされていません。
一部のノードで指標が見つからない
すべてのノードではありませんが、一部のノードでは、次の指標が見つからない場合があります。
kubernetes.io/anthos/container_memory_working_set_bytes
kubernetes.io/anthos/container_cpu_usage_seconds_total
kubernetes.io/anthos/container_network_receive_bytes_total
この問題を解決するには、回避策として次の手順に沿って処理します。
- [バージョン 1.9.5 以降、1.10.2 以降、1.11.0]: 次の手順 1 ~ 4 に従って、gke-metrics-agent の CPU を増やします。
stackdriver
リソースを編集用に開きます。kubectl --kubeconfig USER_CLUSTER_KUBECONFIG --namespace kube-system edit stackdriver stackdriver
gke-metrics-agent
の CPU リクエストを10m
から50m
に引き上げるには、stackdriver
マニフェストに次のresourceAttrOverride
セクションを追加して CPU 上限を「100m」から「200m」に上書きします。spec: resourceAttrOverride: gke-metrics-agent/gke-metrics-agent: limits: cpu: 100m memory: 4608Mi requests: cpu: 10m memory: 200Mi
編集したリソースは、次のようになります。
spec: anthosDistribution: on-prem clusterLocation: us-west1-a clusterName: my-cluster enableStackdriverForApplications: true gcpServiceAccountSecretName: ... optimizedMetrics: true portable: true projectID: my-project-191923 proxyConfigSecretName: ... resourceAttrOverride: gke-metrics-agent/gke-metrics-agent: limits: cpu: 200m memory: 4608Mi requests: cpu: 50m memory: 200Mi
変更を保存し、テキスト エディタを終了します。
変更が有効になっていることを確認するには、次のコマンドを実行します。
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG --namespace kube-system get daemonset gke-metrics-agent -o yaml | grep "cpu: 50m"
変更が有効になっている場合は、このコマンドで
cpu: 50m
が検出されます。
vSphere データディスクの作成時にインストーラが失敗する
カスタムロールが誤った権限レベルでバインドされている場合は、Anthos clusters on VMware インストーラが失敗する可能性があります。
ロール バインディングが間違っていると、vSphere データディスクの作成で govc
がハングし、0 サイズのディスクが作成されます。この問題を解決するには、vSphere vcenter レベル(root)でカスタムロールをバインドします。
DC レベル(またはルートよりも低いレベル)でカスタムロールをバインドする場合は、ルート vCenter レベルで読み取り専用ロールをユーザーにバインドする必要があります。
ロールの作成の詳細については、vCenter ユーザー アカウント権限をご覧ください。
作成時に管理クラスタを登録できない
バージョン 1.9.x または 1.10.0 の管理クラスタを作成するときに、指定された gkeConnect
仕様で管理クラスタを登録できない場合は、次のエラーが発生します。
Failed to create root cluster: failed to register admin cluster: failed to register cluster: failed to apply Hub Membership: Membership API request failed: rpc error: code = PermissionDenied desc = Permission 'gkehub.memberships.get' denied on PROJECT_PATH
この管理クラスタは引き続き使用できますが、後で管理クラスタをバージョン 1.10.y にアップグレードしようとすると、次のエラーが発生します。
failed to migrate to first admin trust chain: failed to parse current version "":
invalid version: "" failed to migrate to first admin trust chain: failed to parse
current version "": invalid version: ""
このエラーが発生した場合は、以下の手順に沿ってクラスタ登録の問題を解決してください。この修正を行うと、管理クラスタをアップグレードできます。
gkectl update admin
を実行して、管理クラスタを正しいサービス アカウント キーに登録します。OnPremAdminCluster
カスタム リソースにパッチを適用するための専用のサービス アカウントを作成します。export KUBECONFIG=ADMIN_CLUSTER_KUBECONFIG # Create Service Account modify-admin kubectl apply -f - <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: modify-admin namespace: kube-system EOF # Create ClusterRole kubectl apply -f - <<EOF apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: creationTimestamp: null name: modify-admin-role rules: - apiGroups: - "onprem.cluster.gke.io" resources: - "onpremadminclusters/status" verbs: - "patch" EOF # Create ClusterRoleBinding for binding the permissions to the modify-admin SA kubectl apply -f - <<EOF apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: creationTimestamp: null name: modify-admin-rolebinding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: modify-admin-role subjects: - kind: ServiceAccount name: modify-admin namespace: kube-system EOF
ADMIN_CLUSTER_KUBECONFIG は、管理クラスタ kubeconfig ファイルのパスに置き換えます。
次のコマンドを実行して、
OnPremAdminCluster
カスタム リソースを更新します。export KUBECONFIG=ADMIN_CLUSTER_KUBECONFIG SERVICE_ACCOUNT=modify-admin SECRET=$(kubectl get serviceaccount ${SERVICE_ACCOUNT} -n kube-system -o json | jq -Mr '.secrets[].name | select(contains("token"))') TOKEN=$(kubectl get secret ${SECRET} -n kube-system -o json | jq -Mr '.data.token' | base64 -d) kubectl get secret ${SECRET} -n kube-system -o json | jq -Mr '.data["ca.crt"]' | base64 -d > /tmp/ca.crt APISERVER=https://$(kubectl -n default get endpoints kubernetes --no-headers | awk '{ print $2 }') # Find out the admin cluster name and gkeOnPremVersion from the OnPremAdminCluster CR ADMIN_CLUSTER_NAME=$(kubectl get onpremadmincluster -n kube-system --no-headers | awk '{ print $1 }') GKE_ON_PREM_VERSION=$(kubectl get onpremadmincluster -n kube-system $ADMIN_CLUSTER_NAME -o=jsonpath='{.spec.gkeOnPremVersion}') # Create the Status field and set the gkeOnPremVersion in OnPremAdminCluster CR curl -H "Accept: application/json" --header "Authorization: Bearer $TOKEN" -XPATCH -H "Content-Type: application/merge-patch+json" --cacert /tmp/ca.crt --data '{"status": {"gkeOnPremVersion": "'$GKE_ON_PREM_VERSION'"}}' $APISERVER/apis/onprem.cluster.gke.io/v1alpha1/namespaces/kube-system/onpremadminclusters/$ADMIN_CLUSTER_NAME/status
--disable-upgrade-from-checkpoint
フラグを使用して管理クラスタのアップグレードを再試行します。gkectl upgrade admin --config ADMIN_CLUSTER_CONFIG --kubeconfig ADMIN_CLUSTER_KUBECONFIG --disable-upgrade-from-checkpoint
ADMIN_CLUSTER_CONFIG は、管理クラスタ構成ファイルのパスに置き換えます。
Anthos Identity Service を使用すると Connect Agent が予期せず再起動する場合がある
Anthos Identity Service 機能を使用して Anthos Identity Service ClientConfig を管理している場合は、Connect Agent が予期せず再起動する可能性があります。
既存のクラスタでこの問題が発生した場合は、次のいずれかを行います。
Anthos Identity Service(AIS)を無効にします。AIS を無効にしても、デプロイされた AIS バイナリや AIS ClientConfig は削除されません。AIS を無効にするには、次のコマンドを実行します。
gcloud beta container hub identity-service disable --project PROJECT_NAME
PROJECT_NAME は、クラスタのフリートホスト プロジェクトの名前に置き換えます。
Connect Agent のバージョンをアップグレードするために、クラスタをバージョン 1.9.3 以降またはバージョン 1.10.1 以降に更新します。
Cisco ACI は Direct Server Return(DSR)と連動しない
Seesaw は DSR モードで動作します。デフォルトでは、データプレーン IP 学習が原因で Cisco ACI では機能しません。この問題を回避するには、Seesaw IP アドレスを Cisco Application Policy Infrastructure Controller(APIC)の L4-L7 仮想 IP として追加して、IP ラーニングを無効にします。
[テナント] > [アプリケーション プロファイル] > [アプリケーション EPG] または [uSeg EPG] に移動すると、L4-L7 仮想 IP オプションを構成できます。IP ラーニングの無効化に失敗すると、Cisco API ファブリック内の異なるロケーション間で IP エンドポイントのフラッピングが発生します。
vSphere 7.0 Update 3 の問題
VMware では最近、次の vSphere 7.0 Update 3 リリースで重大な問題を特定しました。
- vSphere ESXi 7.0 Update 3 (build 18644231)
- vSphere ESXi 7.0 Update 3a (build 18825058)
- vSphere ESXi 7.0 Update 3b (build 18905247)
- vSphere vCenter 7.0 Update 3b (build 18901211)
VMWare はその後、これらのリリースを削除しました。ESXi と vCenter Server を新しいバージョンにアップグレードする必要があります。
emptyDir ボリュームを、COS ノードで実行されている Pod に exec
としてマウントできない
- この問題が含まれているバージョン
1.10.x (x < 6), 1.11.x (x < 3), 1.12.0
- 説明
Container-Optimized OS(COS)イメージを使用するノードで動作する Pod の場合、emptyDir ボリュームを
exec
としてマウントすることはできません。noexec
としてマウントされ、exec user process caused: permission denied
というエラー メッセージが表示されます。たとえば、次のテスト Pod をデプロイすると、このエラー メッセージが表示されます。 テスト Pod でapiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: test name: test spec: containers: - args: - sleep - "5000" image: gcr.io/google-containers/busybox:latest name: test volumeMounts: - name: test-volume mountPath: /test-volume resources: limits: cpu: 200m memory: 512Mi dnsPolicy: ClusterFirst restartPolicy: Always volumes: - emptyDir: {} name: test-volume
mount | grep test-volume
を実行すると、noexec オプションが表示されます。/dev/sda1 on /test-volume type ext4 (rw,nosuid,nodev,noexec,relatime,commit=30)
- 問題を解決した後の予想される結果
/ # mount | grep test-volume
/dev/sda1 on /test-volume type ext4 (rw,relatime,commit=30)
- 解決策
DaemonSet リソースを適用します。たとえば、以下のようになります。
apiVersion: apps/v1 kind: DaemonSet metadata: name: fix-cos-noexec namespace: kube-system spec: selector: matchLabels: app: fix-cos-noexec template: metadata: labels: app: fix-cos-noexec spec: hostIPC: true hostPID: true containers: - name: fix-cos-noexec image: ubuntu command: ["chroot", "/host", "bash", "-c"] args: - | set -ex while true; do if ! $(nsenter -a -t 1 findmnt -l | grep -qe "^/var/lib/kubelet\s"); then echo "remounting /var/lib/kubelet with exec" nsenter -a -t 1 mount --bind /var/lib/kubelet /var/lib/kubelet nsenter -a -t 1 mount -o remount,exec /var/lib/kubelet fi sleep 3600 done volumeMounts: - name: host mountPath: /host securityContext: privileged: true volumes: - name: host hostPath: path: /
ノードプールで自動スケーリングが無効にした後、クラスタ ノードプールのレプリカの更新が機能しない
ノードプールで自動スケーリングを有効にしてから無効にすると、ノードプールのレプリカは更新されません。この問題は、バージョン 1.12.0、1.11.0-1.11.2、1.10.0-1.10.5 に影響します。
この問題は、回避方法として、対応するノードプールのマシンデプロイから cluster.x-k8s.io/cluster-api-autoscaler-node-group-max-size
アノテーションと cluster.x-k8s.io/cluster-api-autoscaler-node-group-min-size
アノテーションを削除して、修正できます。
Windows モニタリング ダッシュボードに Linux クラスタからのデータが表示される
バージョン 1.11 からは、すぐに使用できるモニタリング ダッシュボードの Windows Pod ステータス ダッシュボードと Windows ノード ステータス ダッシュボードに Linux クラスタからのデータも表示されます。これは、Windows ノードと Pod の指標も Linux クラスタで公開されるためです。
NodeReady 後に Kubelet サービスは一時的に利用できなくなる
バージョン 1.13 以降では、ノードが準備できても kubelet サーバー証明書の準備ができていない期間が少しあります。この 10 秒間は、kubectl exec
と kubectl logs
は使用できません。これは、新しいサーバー証明書の承認者がノードの更新された有効な IP を認識するのに時間がかかるためです。これは kubelet サーバー証明書にのみ影響し、Pod のスケジューリングには影響しません。