2017-07-26 13 views
1

kubernetes(バージョン1.6.1)クラスターをコントロールプレーン内に3つのサーバーで設定しました。 Apiserverは、以下の設定で実行されている:マルチマスターモードでKubernetesを実行しています

/usr/bin/kube-apiserver \ 
    --admission-control=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota \ 
    --advertise-address=x.x.x.x \ 
    --allow-privileged=true \ 
    --audit-log-path=/var/lib/k8saudit.log \ 
    --authorization-mode=ABAC \ 
    --authorization-policy-file=/var/lib/kubernetes/authorization-policy.jsonl \ 
    --bind-address=0.0.0.0 \ 
    --etcd-servers=https://kube1:2379,https://kube2:2379,https://kube3:2379 \ 
    --etcd-cafile=/etc/etcd/ca.pem \ 
    --event-ttl=1h \ 
    --insecure-bind-address=0.0.0.0 \ 
    --kubelet-certificate-authority=/var/lib/kubernetes/ca.pem \ 
    --kubelet-client-certificate=/var/lib/kubernetes/kubernetes.pem \ 
    --kubelet-client-key=/var/lib/kubernetes/kubernetes-key.pem \ 
    --kubelet-https=true \ 
    --service-account-key-file=/var/lib/kubernetes/ca-key.pem \ 
    --service-cluster-ip-range=10.32.0.0/24 \ 
    --service-node-port-range=30000-32767 \ 
    --tls-cert-file=/var/lib/kubernetes/kubernetes.pem \ 
    --tls-private-key-file=/var/lib/kubernetes/kubernetes-key.pem \ 
    --token-auth-file=/var/lib/kubernetes/token.csv \ 
    --v=2 \ 
    --apiserver-count=3 \ 
    --storage-backend=etcd2 

は、今私は、次の設定でkubeletを実行している:これは限りkube1が実行されている素晴らしい作品

/usr/bin/kubelet \ 
    --api-servers=https://kube1:6443,https://kube2:6443,https://kube3:6443 \ 
    --allow-privileged=true \ 
    --cluster-dns=10.32.0.10 \ 
    --cluster-domain=cluster.local \ 
    --container-runtime=docker \ 
    --network-plugin=kubenet \ 
    --kubeconfig=/var/lib/kubelet/kubeconfig \ 
    --serialize-image-pulls=false \ 
    --register-node=true \ 
    --cert-dir=/var/lib/kubelet \ 
    --tls-cert-file=/var/lib/kubernetes/kubelet.pem \ 
    --tls-private-key-file=/var/lib/kubernetes/kubelet-key.pem \ 
    --hostname-override=node1 \ 
    --v=2 

。 kube1をダウンさせると、ノードはkube2またはkube3と通信しません。 --api-serversフラグに渡された最初のapiserverを常に使用し、最初のapiserverがクラッシュした場合にフェイルオーバーしません。 apiserverのいずれかが失敗した場合にフェールオーバーを実行する正しい方法は何ですか?

+0

'kube-apiserver'のコマンドラインは何ですか? –

+0

こんにちは@JanosLenart。私はapiserverフラグで質問を更新しました。 –

+1

'--apiserver-count = 3'も必要です –

答えて

0

--api-serversフラグは推奨されていません。それはもはやdocumentationにはありません。 kubeconfigは、kubeletをkube-apiserverに向ける新しい方法です。

今日、これを行うには、3つのkube-apiserver間の負荷分散を行う各ワーカーノード(つまり、kubeletを実行するノード)にnginxを持つPodを配備することが大切です。 nginxは、あるマスターがダウンしてトラフィックをルーティングしないことを知ります。それはその仕事です。 kubesprayプロジェクトはこの方法を使用します。

2番目の方法は、DNS RRを使用することです。 3つのマスターのIPのDNS "A"レコードを作成します。ポイントkubeletを3x IPではなく、このRRホスト名に変更します。 kubeletがマスターに連絡するたびに、RRリストのIPにルーティングされます。トラフィックが引き続きダウンしたノードにルーティングされるため、クラスタが間欠的な停止を経験するため、この手法は堅牢ではありません。

第3のより複雑なメソッドimhoはキープアライブを使用することです。キープアライブはVRRPを使用して、少なくとも1つのノードが仮想IP(VIP)を所有していることを確認します。マスターがダウンすると、別のマスターがVIPを乗っ取って連続性を確保します。この方法の悪い点は、負荷分散がデフォルトとして行われないことです。すべてのトラフィックは、ダウンするまで1つのマスタ(つまり、プライマリVRRPノード)にルーティングされます。次に、セカンダリVRRPノードが引き継ぎます。 nice write-up I contributed at this pageをご覧ください:)

kube-apiserver HA hereについてさらに詳しくがんばろう!

+0

Alright。私はそれを動作させるためにNginxを使いました。他の誰かがより良い解決策を思い出さなければ、私はあなたの答えを受け入れるでしょう。 –

+0

乾杯:それはあなたのためにうまくいった。 「Nginx」の方法はロードバランスの最も一般的な方法です。 –

関連する問題