バグレポート
kubeadmバージョン( kubeadm version
):
[root@k8s-211 ~]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.0", GitCommit:"ddf47ac13c1a9483ea035a79cd7c10005ff21a6d", GitTreeState:"clean", BuildDate:"2018-12-03T21:02:01Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"linux/amd64"}
環境:
kubectl version
):[root@k8s-211 ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.0", GitCommit:"ddf47ac13c1a9483ea035a79cd7c10005ff21a6d", GitTreeState:"clean", BuildDate:"2018-12-03T21:04:45Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.0", GitCommit:"ddf47ac13c1a9483ea035a79cd7c10005ff21a6d", GitTreeState:"clean", BuildDate:"2018-12-03T20:56:12Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"linux/amd64"}
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
uname -a
):Linux k8s-lixin-211 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
kubeadm reset -f
を使用してこのコントロールプレーンノードをリセットすると、コマンドの実行が成功します。 しかし、 kubeadm-config
ConfigMapを見ると、ClusterStatusにこのノードIPがすでにあります。
まだ質問があります。なぜkubeadm reset
はこのノードをクラスターから直接削除しないのですか? 代わりに、 kubectl delete node <node name>
手動で実行してください。
kubeadm-config
ConfigMapはこのノードIPを削除します。
kubeadm init --config=kubeadm.yml
。kubeadm join --experimental-control-plane --config=kubeadm.yml
。kubeadm reset -f
。kubectl -n kube-system get cm kubeadm-config -oyaml
は、すでにClusterStatusにある2番目のノードIPを検索します。kubeadm-config configMap yaml:
apiVersion: v1
data:
ClusterConfiguration: |
apiServer:
extraArgs:
authorization-mode: Node,RBAC
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta1
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.46.117:6443
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
extraArgs:
cipher-suites: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
serverCertSANs:
- 192.168.46.117
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.13.0
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
scheduler: {}
ClusterStatus: |
apiEndpoints:
k8s-211:
advertiseAddress: 192.168.46.211
bindPort: 6443
k8s-212:
advertiseAddress: 192.168.46.212
bindPort: 6443
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterStatus
kind: ConfigMap
metadata:
creationTimestamp: "2018-12-04T14:17:38Z"
name: kubeadm-config
namespace: kube-system
resourceVersion: "103402"
selfLink: /api/v1/namespaces/kube-system/configmaps/kubeadm-config
uid: 5a9320c1-f7cf-11e8-868d-0050568863b3
cc @fabriziopandini
理想的には、ClusterStatusを「更新」する方法があります。 カオステストを使用してクラスターを実行します。コントロールプレーンノードが警告なしに、またkubeadm reset
を実行する機会なしに終了する可能性は完全にあります。 理想的には、ClusterStatusを明示的に更新して、クラスター内に存在しないことがわかっているコントロールプレーンノードを削除するクリーンな方法があります。 これはkubeadm join --control-plane ...
実行する前に行われることですか、それとも組み込みですか?
ここにいくつかのコメント:
kubeadm-configConfigMapはこのノードのIPを削除します。
@pytimerノードAPIアドレスをクラスターステータスのままにしておくのは理想的ではないことは知っていますが、この「クリーンアップの欠如」によって問題が発生するかどうかを理解したいと思います。 同じコントロールプレーンに再度参加しようとしましたか? 別のコントロールプレーンに参加しようとしましたか? 問題はないと思いますが、この点を確認していただければ幸いです。
私はまだ質問があります、なぜkubeadm resetはこのノードをクラスターから直接削除しないのですか? 代わりに、kubectl deletenodeを実行します
手動で。
@luxasは、少し歴史的な文脈がここで役立つかもしれません。
私の推測では、ノードには自分自身を削除する権限がありませんでした(ただし、これはワーカーノードに適用され、コントロールプレーンノードには適用されません...)
理想的には、ClusterStatusを「更新」する方法があります/ ClusterStatusを明示的に更新するクリーンな方法があります
@danbeaulieuそれは良い点です。 クラスタステータスを同期したり、kubeadmの実行時に自動同期を強制したりするための明示的なコマンドを用意することをお勧めします。
ただし、制御ループを継続的に実行することなくkubeadmであるため、ClusterStatusが同期していない可能性は常にあると思います。
これは問題ではないはずです。具体的には、存在しないノードのノードIP(クリーンアップの欠如)が問題になることはありません。
代わりに、ノードが存在し、対応するノードIPがClusterStatusにない(初期化が間違っている)場合、更新などの問題が発生する可能性があります。
上記の仮定がカオステストによって確認された場合、親切に報告していただけますか? どんなフィードバックも本当に感謝されます。
@fabriziopandini同じコントロールプレーンノードに参加しましたが、失敗しました。
私の参加手順:
2番目のコントロールプレーンノードのIPは192.168.46.212
です。
kubectl delete node k8s-212
kubeadm reset -f
。kubeadm join --experimental-control-plane --config kubeadm.yaml -v 5
もう一度実行します。kubeadm参加ログ:
...
[etcd] Checking Etcd cluster health
I1207 17:57:18.109993 8541 local.go:66] creating etcd client that connects to etcd pods
I1207 17:57:18.110000 8541 etcd.go:134] checking etcd manifest
I1207 17:57:18.119797 8541 etcd.go:181] etcd endpoints read from pods: https://192.168.46.211:2379,https://192.168.46.212:2379
I1207 17:57:18.131111 8541 etcd.go:221] etcd endpoints read from etcd: https://192.168.46.211:2379
etcd cluster is not healthy: context deadline exceeded
kubeadmコードが表示されますが、この問題はkubeadm-config
ConfigMapに残っている192.168.46.212が原因である可能性があります。
Kubeadmは、コントロールプレーンノードに参加するときにkubeadm-config
ConfigMapからapiエンドポイントを取得し、etcdエンドポイントはapiエンドポイントと同じです。 ただし、 912.168.46.212
コントロールプレーンノードは削除されており、まだ参加していないため、etcdクラスターの状態を確認してください。
kubeadm-config
ConfigMapから192.168.46.212
apiエンドポイントを削除し、このコントロールプレーンノードに再度参加すると、成功に参加します。
@pytimerありがとう!
これは調査する必要があります。 etcdエンドポイントの想定リストを実際のetcdリストエンドポイントと同期しようとするロジックはすでに存在しますが、何かが正しく機能していないようです
はい、これはバグのようです。 3ノードのコントロールプレーンASGがあります。 インスタンスを終了すると、ASGルールに従って新しいインスタンスが作成されます。 この間、終了したノードはetcdのメンバーリストに異常としてリストされます。 新しいインスタンスが起動すると、 kubeadm join...
実行する前に、異常なメンバーがetcdから削除されます。 kubeadm join...
を実行するまでに、etcdクラスターはetcdによると2つのノードで正常です。 ただし、kubeadmは、信頼できる唯一の情報源としてClusterStatusを使用しますが、これにはまだ古いインスタンスがリストされています。
etcdメンバーシップ管理を実行した直後の回避策は、クラスターの真偽でkubeadm-config ConfigMapを更新してから、 kubeadm join...
です。
理想的には、 kubeadm join...
はetcdを真実のソースとして使用し、それに応じてkubeadm-configConfigMapを更新します。
@fabianofranz私はおそらくこの問題の原因を見つけました。
etcdエンドポイントを実際のetcdエンドポイントリストと同期すると、同期は成功します。 ただし、実際のetcdエンドポイントをetcdクライアントEndpoints
に割り当てます。このクライアント変数はポインターではないため、他のコードがクライアントを使用する場合、このクライアントエンドポイントは、同期後の実際のエンドポイントではなく、古いエンドポイントのままです。
フォークリポジトリでこの問題を修正しました。このPRhttps ます。 そして、私はjoin the same control-plane node
ユーザーケースをテストしました、それは成功に加わります。
@pytimerよさそうだ! よく発見されました!
PRを送っていただけませんか。 IMOこれはチェリーピッキングの対象になります。
@ neolit123 @timothysc ^^^
@fabianofranz最初のPRが間違っている、CLAの確認を忘れた。
このPRhttps ://github.com/kubernetes/kubernetes/pull/71945を確認できます。 何か問題があれば、指摘してください。
@fabriziopandini同じコントロールプレーンノードに参加しましたが、失敗しました。
私の参加手順:
2番目のコントロールプレーンノードのIPは
192.168.46.212
です。
- etcdクラスターから192.168.46.212ノードetcdメンバーを削除します。
kubectl delete node k8s-212
- このコントロールプレーンノードの
kubeadm reset -f
。kubeadm join --experimental-control-plane --config kubeadm.yaml -v 5
もう一度実行します。kubeadm参加ログ:
... [etcd] Checking Etcd cluster health I1207 17:57:18.109993 8541 local.go:66] creating etcd client that connects to etcd pods I1207 17:57:18.110000 8541 etcd.go:134] checking etcd manifest I1207 17:57:18.119797 8541 etcd.go:181] etcd endpoints read from pods: https://192.168.46.211:2379,https://192.168.46.212:2379 I1207 17:57:18.131111 8541 etcd.go:221] etcd endpoints read from etcd: https://192.168.46.211:2379 etcd cluster is not healthy: context deadline exceeded
kubeadmコードが表示されますが、この問題は
kubeadm-config
ConfigMapに残っている192.168.46.212が原因である可能性があります。Kubeadmは、コントロールプレーンノードに参加するときに
kubeadm-config
ConfigMapからapiエンドポイントを取得し、etcdエンドポイントはapiエンドポイントと同じです。 ただし、912.168.46.212
コントロールプレーンノードは削除されており、まだ参加していないため、etcdクラスターの状態を確認してください。
kubeadm-config
ConfigMapから192.168.46.212
apiエンドポイントを削除し、このコントロールプレーンノードに再度参加すると、成功に参加します。
kubeadmバージョン1.13.2で同じエラーが発生しました。ノードを手動で削除して、kubeadm-configを更新しようとしましたが、機能しません。残りのetcdノードは、削除されたノードに接続しようとします。
kubeadm-config
ConfigMapから192.168.46.212
apiエンドポイントを削除し、このコントロールプレーンノードに再度参加すると、成功に参加します。
@pytimer古いAPIサーバーを手動で削除した方法について詳しく教えてください。
私は1.13.3を実行しています。 次の方法で古いサーバーを手動で削除します。
1. kubectl -n kube-system get cm kubeadm-config -o yaml > /tmp/conf.yml
2. manually edit /tmp/conf.yml to remove the old server
3. kubectl -n kube-system apply -f /tmp/conf.yml
次のエラーのため、まだクラスターに参加できません。
[etcd] Checking etcd cluster health
etcd cluster is not healthy: context deadline exceeded
次に、apiポッドとetcdポッド(それぞれ2つ)を強制終了しました。
それらは再作成されますが、追加のノードに接続しようとすると同じエラーが発生します。
1.13.3でも同じ問題が発生しました(HAクラスターのセットアップ:3つのマスターノード+ 3つのワーカー)。 次の手順の後でのみ、マスターノードを正常に置き換えました。
クラスターからノードを削除します
kubectl delete node master03
etcdctlをダウンロードします(たとえば、master01で)
mkdir /opt/tools && cd /opt/tools
wget https://github.com/etcd-io/etcd/releases/download/v3.3.12/etcd-v3.3.12-linux-arm64.tar.gz
tar xfz etcd-v3.3.12-linux-arm64.tar.gz
etcdからマスターノードを削除します
cd /opt/tools/etcd-v3.3.12-linux-arm64
./etcdctl --endpoints https://192.168.0.11:2379 --ca-file /etc/kubernetes/pki/etcd/ca.crt --cert-file /etc/kubernetes/pki/etcd/server.crt --key-file /etc/kubernetes/pki/etcd/server.key member list
./etcdctl --endpoints https://192.168.0.11:2379 --ca-file /etc/kubernetes/pki/etcd/ca.crt --cert-file /etc/kubernetes/pki/etcd/server.crt --key-file /etc/kubernetes/pki/etcd/server.key member remove 28a9dabfcfbca673
kubeadm-configから削除します
kubectl -n kube-system get cm kubeadm-config -o yaml > /tmp/conf.yml
manually edit /tmp/conf.yml to remove the old server
kubectl -n kube-system apply -f /tmp/conf.yml
@zhangyelong kubeadm resetはetcdメンバーを削除できないため、etcdクラスターは削除されたetcdノードに接続していることがわかりました。 ここで、etcdctlを使用してetcdメンバーを手動で削除する必要があります。
リセット時にetcdノードを削除するように実装するPRを送信します。 https://github.com/kubernetes/kubernetes/pull/74112
@ lvangool @ Halytskyiの手順に従うことができます。 PR: https :
リセット時にetcdクラスターからetcdメンバーを削除すると、kubernetes / kubernetes#74112が表示されます。
これは1.13.4のバグのようです。
kubeadm config map alahttps : //github.com/kubernetes/kubeadm/issues/1300#issuecomment-463374200を手動で更新する必要があり
の修正はそうではありませんか
kubernetes / kubernetes#71945は、etcdクラスターメンバーシップをクラスターメンバーの真実のソースとして使用しますか? そうでない場合、そのPRは正確に何を修正しましたか?
興味深いことに、 ClusterStatusのようなマップ上のgolang範囲では非決定論的であるため、散発的に機能します。 したがって、最初に検出されたエンドポイントが、存在しなくなった古いエンドポイントからのものである場合、問題は発生します。 正常なエンドポイントが見つかると、etcdSyncからClusterStatusを更新します。
これの根本的な原因は、etcd clientv3のバグであり、最初のエンドポイントが失敗した場合にクライアントが他のエンドポイントを再試行しない原因になると思いますhttps://github.com/etcd-io/etcd/issues/9949。
リセットの改善を追跡するには、次の問題を使用してください
@fabriziopandiniここには、 kubeadm reset
とは関係のない問題が少なくとも1つあります。
kubeadmリセットを実行する機会なしにノードに障害が発生した場合(インスタンスの終了、ハードウェア障害など)
クラスターは、ClusterStatus.apiEndpointsに、クラスター内に存在しなくなったノードがまだリストされている状態のままになります。 これには、 kubeadm join
実行する前に、構成マップの読み取り、編集、および更新の回避策が必要です。 Kubeadmにはおそらく2つのオプションがあります。
1)ダイヤルが失敗した場合、etcdクライアントがそれ自体を再試行するように実装します
2)go-grpcバグが修正されるのを待ってから、修正がetcdクライアントに届くのを待ちます
この問題は、これらのオプションのいずれかを追跡するために使用するのに適した問題である可能性があります。
kubeadmリセットを実行する機会なしにノードに障害が発生した場合(インスタンスの終了、ハードウェア障害など)
クラスターは、ClusterStatus.apiEndpointsに、クラスター内に存在しなくなったノードがまだリストされている状態のままになります。 これには、kubeadm join
実行する前に、構成マップの読み取り、編集、および更新の回避策が必要です。
つまり、resetを呼び出さずに、ClusterStatusを手動で更新する必要があります。
それを行うコマンドはありません。 kubeadmがサポートすべき機能であると思われる場合は、別のチケットを提出してください。
今日1.14.1でこれを体験しました
マスターノードの1つを実行しているインスタンスに障害が発生したため、正常に削除できませんでした。 新しいノードが入ろうとしたとき、このチケットに記載されているエラーのために参加できませんでした。
etcdctlを使用してetcdメンバーを手動で削除する必要がありました。その後、新しいノードに参加できました。 また、kubeadm-config ConfigMapからノードを手動で削除しましたが、それが必要かどうかはわかりません。
@Halytskyiありがとうetcdctlセクションは私を助けてくれました.....
今日1.15.5でこれを経験しました
私の場合、クラスターに参加しましたが、バージョンは1.16です。 次に、このノードkubectl delete node
を削除し、15.5.5にダウングレードして、再参加(同じIP、同じホスト名、異なるバージョン)を試みたところ、etcdの異常エラーが発生しました。
解決策( etcdctlが更新されている):
>: kubectl edit configmap kubeadm-config -n kube-system
configmap/kubeadm-config edited
問題のあるノードのkubeadmreset -f && iptables -t -f-Xなど。
etcdメンバーを削除します(これがキーです):
root@k8s-nebula-m-115-2:wget https://github.com/etcd-io/etcd/releases/download/v3.4.3/etcd-v3.4.3-linux-amd64.tar.gz
root@k8s-nebula-m-115-2:tar xfz etcd-v3.4.3-linux-amd64.tar.gz
`` `シェル
root @ k8s-nebula-m-115-2 :〜/ etcdctl / etcd-v3.4.3-linux-amd64#。/ etcdctl --endpoints https://127.0.0.1:2379 --cacert / etc / kubernetes / pki /etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key / etc / kubernetes / pki / etcd / server.keyメンバーリスト
289ed62da3c6e9e5、開始、k8s-nebula-m-115-1、 https ://10.205.30.2:2380、 https ://10.205.30.2:2379、false
917e16b9e790c427、開始、k8s-nebula-m-115-0、 https ://10.205.30.1:2380、 https ://10.205.30.1:2379、false
ad6b76d968b18085、開始、k8s-nebula-m-115-2、 https ://10.205.30.0:2380、 https ://10.205.30.0:2379、false
```shell
root@k8s-nebula-m-115-2:~/etcdctl/etcd-v3.4.3-linux-amd64# ./etcdctl --endpoints https://127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key member remove 289ed62da3c6e9e5
Member 289ed62da3c6e9e5 removed from cluster d4913a539ea2384e
そして、作品に再び参加します。
これは、 kubeadm reset
が中断され、kubeadmCMからノードを削除できなかった場合に発生する可能性があります。
このような場合は、kubeadmCMから手動で削除する必要があります。
したがって、 kubectl delete node foobar
でノードを削除しても、削除されません
etcdメンバーから削除しますか? しかし、必要なノードでkubeadm reset
すると、
削除するには、それを行いますか? 🙄
2019年10月30日水曜日、13:27 Lubomir I. Ivanov、 notifications @ github.com
書きました:
これは、kubeadmのリセットが中断され、削除できなかった場合に発生する可能性があります
kubeadmCMからのノード。
このような場合は、kubeadmCMから手動で削除する必要があります。—
あなたがコメントしたのであなたはこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/kubernetes/kubeadm/issues/1300?email_source=notifications&email_token=AF7BZL3Q4E2FMPZYKYNOV53QRF4SXA5CNFSM4GIIZTPKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKT
または購読を解除する
https://github.com/notifications/unsubscribe-auth/AF7BZL4EOZV7GQYNQOM3773QRF4SXANCNFSM4GIIZTPA
。
「kubeadmreset」はそれをkubeadmCMから削除する必要がありますが、「kubectldeletenode」を呼び出すことも必要です。これによりノードAPIオブジェクトが削除されます。
私の場合、de configmapからノードを削除しても、ノードは削除されませんでした。
etcdクラスター私は手動でetcdctl delete member
必要がありました。
木には、16時28分に2019年10月31日、ルボミールI.イワノフ[email protected]
書きました:
「kubeadmreset」はkubeadmCMから削除する必要がありますが、「kubectl
NodeAPIオブジェクトを削除する「deletenode」も必要です。—
あなたがコメントしたのであなたはこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/kubernetes/kubeadm/issues/1300?email_source=notifications&email_token=AF7BZLZVF7FFVA3LWINJZW3QRL2TLA5CNFSM4GIIZTPKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKT
または購読を解除する
https://github.com/notifications/unsubscribe-auth/AF7BZL2KB3GVLTFKQTJTYXLQRL2TLANCNFSM4GIIZTPA
。
kubeadm resetは、etcdクラスターからetcdメンバーも削除する必要があります。
たとえば--v = 5で実行してみて、何が行われるかを確認してください。
ただし、kubeadm resetはベストエフォートコマンドであるため、何らかの理由で失敗した場合は、警告のみが出力される可能性があることに注意してください。
したがって、 kubectl delete node
はetcdから削除しません。 代わりに、ノードkubeadm reset
で実行すると実行されます。
私には壊れているように聞こえますが、 kubectl delete node
はetcdからも削除する必要があると思います。 または、明らかなユースケースがありませんか?
多分それもそこから削除されるべきかどうか尋ねますか?
とにかく@ neolit123の説明に感謝します。最初にコントロールプレーンから削除してからリセットしました。etcdから自分自身を削除するには遅すぎたと思います。
したがって、さまざまな責任があります。
kubectl delete node、Node APIオブジェクトを削除します-ノードが不要であることが本当に確実な場合は、これを行う必要があります。
その前に、そのノードでkubeadmresetを呼び出す必要があります。 私がしていることは、ディスク上の状態をクリーンアップし、etcdメンバーも削除することです(これがコントロールプレーンノードであり、etcdインスタンスがコントロールプレーンノードごとに実行されているデフォルトオプションを使用している場合)
kubeadm resetはノードをリセットしますが、いくつかの理由でNodeオブジェクトを削除しません。
kubeadmresetはベストエフォートコマンドです
これに関して: kubeadm reset
が何らかの理由で完了しなかった場合(最初からkubeadmリセットが実行されないようにするための基盤となるサーバーのハード障害を含む)、手動編集以外に状態を手動で調整するオプションがありますkubeadm-config configmapオブジェクトとノードの削除?
ノードにハード障害が発生し、ノードでkubeadm resetを呼び出すことができない場合は、手動の手順が必要です。 あなたがしなければならないだろう:
1)コントロールプレーンIPをkubeadm-config CMClusterStatusから削除します
2)etcdctlを使用してetcdメンバーを削除します
3)kubectlを使用してNodeオブジェクトを削除します(Nodeが不要になった場合)
1と2は、コントロールプレーンノードにのみ適用されます。
kubeadm resetを実行できない場合、このフェイルオーバーを自動化する方法はありますか?
1.9でも同じ問題。 解決策をありがとう。
最も参考になるコメント
1.13.3でも同じ問題が発生しました(HAクラスターのセットアップ:3つのマスターノード+ 3つのワーカー)。 次の手順の後でのみ、マスターノードを正常に置き換えました。
クラスターからノードを削除します
etcdctlをダウンロードします(たとえば、master01で)
etcdからマスターノードを削除します
kubeadm-configから削除します