2017-07-26 77 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”方式是最常见的负载平衡方式。 –

相关问题