在多主模式下运行Kubernetes

在多主模式下运行Kubernetes,kubernetes,kubelet,Kubernetes,Kubelet,我在控制平面中设置了一个kubernetes(版本1.6.1)集群,其中有三台服务器。 Apiserver正在使用以下配置运行: /usr/bin/kube-apiserver \ --admission-control=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota \ --advertise-address=x.x.x.x \ --allow-privileged=tr

我在控制平面中设置了一个kubernetes(版本1.6.1)集群,其中有三台服务器。 Apiserver正在使用以下配置运行:

/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
/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
现在,我使用以下配置运行kubelet:

/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
/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出现故障,正确的故障切换方法是什么?

不推荐使用
--api servers
标志。它已经不在房间里了。kubeconfig是将kubelet指向kube apiserver的全新方式

如今,犹太教的做法是在每个工作节点(即运行kubelet的节点)上部署一个带有nginx的Pod,以在3台kube APIS服务器之间实现负载平衡。nginx将知道一个主机何时停机,而不会将流量路由到它;那是它的工作。kubespray项目使用这种方法

第二个不是很好的方法是使用DNS RR。为3个主机的IP创建DNS“a”记录。将kubelet指向此RR主机名,而不是3x IP。每次kubelet联系主机时,它都会被路由到RR列表中的IP。这种技术并不健壮,因为流量仍将路由到停机节点,因此集群将经历间歇性停机

第三种,也是更复杂的方法imho,是使用keepalive。KeepAlive使用VRRP确保至少有一个节点拥有虚拟IP(VIP)。如果一个主人倒下,另一个主人将劫持VIP以确保连续性。这种方法的缺点是负载平衡不是默认的。所有流量将路由至1个主节点(即主VRRP节点),直到其停止。然后,辅助VRRP节点将接管。您可以看到:)


有关kube apiserver HA的更多详细信息。祝你好运

目前,在1.8之前,最好的解决方案似乎是使用负载平衡器,正如已经建议的那样


请参阅。

kube apiserver的命令行是什么??Hi@JanosLenart。我已使用apiserver标志更新了问题。您需要
--apiserver count=3
tooth此选项适用于apiserver,所有实例即使使用
--apiserver count
,也不起作用。当我在关闭第一台apiserver后尝试调度一个新的pod时,我在描述pod
没有节点可用于调度pod时出错。我用Nginx使它工作。除非有人提出更好的解决方案,否则我会接受你的答案。干杯:)很高兴它对你有用。在我看来,“Nginx”方式是最常见的负载平衡方式。