2017-07-26 63 views
1

我已經在控制平面中設置了三個服務器的kubernetes(版本1.6.1)集羣。 API服務器與以下配置運行:在多主模式下運行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具有以下配置:

/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正在運行的偉大工程。如果我將kube1放下,節點不會與kube2或kube3通信。它始終佔用傳遞給--api-servers標誌的第一個apiserver,並且在第一個apiserver崩潰的情況下不會進行故障切換。 如果某個apiserver失敗,執行故障切換的正確方法是什麼?

+0

「kube-apiserver」的命令行是什麼? –

+0

Hi @JanosLenart。我用apiserver標誌更新了這個問題。 –

+1

您還需要'--apiserver-count = 3' –

回答

0

--api-servers標誌已棄用。它已不在documentation中。 kubeconfig是將kubelet指向kube-apiserver的全新方式。

今天這樣做的猶太人的方式是在每個工人節點(即運行kubelet的)上部署一個帶有nginx的Pod,以便在3個kube-apiservers之間進行負載平衡。 nginx會知道一個主服務器何時關閉而不會將流量路由到它;這是它的工作。 kubespray項目使用這種方法。

第二種不太好的方式是使用DNS RR。爲3位主人的IP創建DNS「A」記錄。將kubelet指向此RR主機名而不是3x IP。每當kubelet聯繫主設備時,它將被路由到RR列表中的IP。這種技術並不健壯,因爲流量仍然會被路由到關閉的節點,所以集羣會經歷間歇性停機。

第三種更復雜的方法是使用keepalived。 keepalived使用VRRP來確保至少有一個節點擁有虛擬IP(VIP)。如果主人失敗,另一位主人會劫持VIP以確保連續性。這種方法的壞處是負載均衡不會成爲默認值。所有流量將被路由到1個主設備(即主VRRP節點),直到它斷開。然後,輔助VRRP節點將接管。你可以看到nice write-up I contributed at this page :)

更多關於kube-apiserver HA here的細節。祝你好運!

+0

好吧。我使用Nginx來使它工作。除非有人提出更好的解決方案,否則我會接受你的答案。 –

+0

乾杯:)很高興爲你工作。在我看來,「Nginx」方式是最常見的負載平衡方式。 –