Gentooでkubernetesのトラブルシューティング
トラブルシューティングのログ
machine-idがないエラーが出る
$ sudo journalctl -r --since today | less
8月 02 00:48:56 k3s-prd-agent-g k3s[364]: W0802 00:48:56.104196 364 info.go:53] Couldn't collect info from any of the files in "/etc/machine-id,/var/lib/dbus/machine-id"
8月 02 00:48:56 k3s-prd-agent-g k3s[364]: E0802 00:48:56.103437 364 info.go:119] Failed to get system UUID: open /etc/machine-id: no such file or directory
machine-idのファイルが存在するか確認する。
sudo ls -l /etc/machine-id /var/lib/dbus/machine-id
ls: '/etc/machine-id' にアクセスできません: そのようなファイルやディレクトリはありません
lrwxrwxrwx 1 root root 15 3月 18 21:43 /var/lib/dbus/machine-id -> /etc/machine-id
ファイルが無かったので作成する。
sudo systemd-machine-id-setup
メトリクスサーバが起動していなかった
検証でサーバを増やす際にddコピーでサーバを増やしており、k3sサーバとk3sエージェントの整合性が崩れ、正常に動作していなかったケースを調査して直したのであまり参考にはならない。 一応、記録として残す。
E0706 00:24:50.413023 2860 resource_quota_controller.go:413] unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request
W0706 00:24:50.434573 2860 garbagecollector.go:747] failed to discover some groups: map[metrics.k8s.io/v1beta1:the server is currently unable to handle the request]
E0706 00:25:20.435843 2860 resource_quota_controller.go:413] unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request
W0706 00:25:20.469495 2860 garbagecollector.go:747] failed to discover some groups: map[metrics.k8s.io/v1beta1:the server is currently unable to handle the request]"
れは、kube-systemという名前のネームスペースで動作するPodをリストアップする。 Metrics Serverは通常、このネームスペースで実行される。
kubectl -n kube-system get pods
次の状態だった。 metrics-server-668d979685-mlzxn がメトリクスサーバだが、ステータスが CrashLoopBackOff になっていた。
root@k3s-prd-server /v/log# kubectl -n kube-system get pods
NAME READY STATUS RESTARTS AGE
metrics-server-668d979685-mlzxn 0/1 CrashLoopBackOff 35068 (4d7h ago) 286d
local-path-provisioner-7b7dc8d6f5-bq77w 0/1 CrashLoopBackOff 35915 (4d7h ago) 286d
coredns-b96499967-sqmmb 0/1 Running 41351 (4d7h ago) 286d
podsのログを調べる。
kubectl -n kube-system logs metrics-server-668d979685-mlzxn
どうも別のホストで動かしているが、正常に動作していない
root@k3s-prd-server /v/log# kubectl -n kube-system logs metrics-server-668d979685-mlzxn
Error from server: Get "https://10.10.254.58:10250/containerLogs/kube-system/metrics-server-668d979685-mlzxn/metrics-server": proxy error from 127.0.0.1:6443 while dialing 10.10.254.58:10250, code 503: 503 Service Unavailable
この別のサーバでのメトリクスサーバを動作させる。
本来だとメトリクスサーバが動いている側(k3sではエージェントと呼ぶ側でコンテナが起動している側)でログを確認する
time="2023-07-07T00:07:34+09:00" level=error msg="token CA hash does not match th
e Cluster CA certificate hash:ハッシュ値 != ハッシュ値"
サーバ側とエージェント側で登録しているハッシュ値が異なる。
サーバ側でトークンを確認
cat /var/lib/rancher/k3s/server/node-token
エージェント側で再度k3sをインストール
curl -sfL https://get.k3s.io | K3S_TOKEN=[server_token] K3S_URL=https://[server_external_ip]:6443 sh -
k3sのエージェント側からk3sサーバに通信が走り、k3sサーバ側に登録された。 メトリクスサーバが起動し始めた。
kubectl -n kube-system get pods
NAME READY STATUS RESTARTS AGE
metrics-server-668d979685-mlzxn 0/1 Terminating 35068 (5d7h ago) 287d
local-path-provisioner-7b7dc8d6f5-bq77w 0/1 Terminating 35915 (5d7h ago) 287d
coredns-b96499967-sqmmb 0/1 Terminating 41351 (5d7h ago) 287d
local-path-provisioner-7b7dc8d6f5-xfzpn 1/1 Running 0 112s
coredns-b96499967-nr44p 1/1 Running 0 112s
metrics-server-668d979685-zpkrg 1/1 Running 0 112s
terraformでapply時、途中でキャンセルすると既にリソースがある状態になる
terraformでstateファイルと実際が異なる
リソースを削除して良い状態なら消してしまった方が早い
下記のようなエラーが出た場合
module.resource_pack_server.kubernetes_service_v1.svc: Creating...
module.resource_pack_server.kubernetes_deployment_v1.this: Creating...
╷
│ Error: Failed to create deployment: deployments.apps "common-resource-pack" already exists
│
│ with module.resource_pack_server.kubernetes_deployment_v1.this,
│ on ../../modules/nginx_static/main.tf line 42, in resource "kubernetes_deployment_v1" "this":
│ 42: resource "kubernetes_deployment_v1" "this" {
│
╵
╷
│ Error: services "common-resource-pack" already exists
│
│ with module.resource_pack_server.kubernetes_service_v1.svc,
│ on ../../modules/nginx_static/main.tf line 100, in resource "kubernetes_service_v1" "svc":
│ 100: resource "kubernetes_service_v1" "svc" {
- エラー文の “deployments.apps "common-resource-pack" already exists” から、既に存在している Kubernetes リソースの種類 (Deployment) と名前 (common-resource-pack) を読み取ります。同様に “services "common-resource-pack" already exists” は Service が重複していることを示します。
- Namespace が不明なときは kubectl get deployment common-resource-pack -A や kubectl get service common-resource-pack -A でどこにあるか確認します。Terraform 側で namespace を指定しているな ら、その名前空間を優先的にチェックします。
- 対象が確定したら kubectl delete deployment common-resource-pack -n と kubectl delete service common-resource-pack -n を実行します。ファイル経由で削除したい場合は kubectl delete -f <manifest.yaml> のように -f オプションを使います。
- オプションを詳しく見たいときは kubectl delete –help や kubectl options を参考にし、–grace-period や –wait など必要に応じて追加します。
- 削除後に kubectl get で存在しないことを確認し、再度 terraform apply -var-file=env/common.tfvars を実行して整合性を取ります。