运行 多主机模式下的 Kubernetes
Running Kubernetes in multimaster mode
我在控制平面中设置了一个包含三台服务器的 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
现在我是 运行 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 发生故障,进行故障转移的正确方法是什么?
--api-servers
标志已弃用。它不再在 documentation 中。 kubeconfig 是将 kubelet 指向 kube-apiserver 的全新方式。
今天的 kosher 方法是在每个工作节点(即 运行 kubelet)上部署一个带有 nginx 的 Pod,在 3 个 kube-apiserver 之间进行负载平衡。 nginx 会知道一个主机何时宕机并且不会将流量路由到它;那是它的工作。 kubespray项目就是采用这种方式。
第二种不太好的方法是使用 DNS RR。为 3 个主机的 IP 创建一个 DNS "A" 记录。将 kubelet 指向这个 RR 主机名而不是 3x IP。 kubelet 每次联系 master 时,都会路由到 RR 列表中的 IP。这种技术并不可靠,因为流量仍会路由到已关闭的节点,因此集群会出现间歇性中断。
恕我直言,第三种也是更复杂的方法是使用 keepalived。 keepalived 使用 VRRP 来确保至少一个节点拥有虚拟 IP (VIP)。如果一个master宕机,另一个master会劫持VIP来保证连续性。这种方法的缺点是负载平衡不是默认设置。所有流量都将路由到 1 个主节点(即主 VRRP 节点),直到它关闭。然后辅助 VRRP 节点将接管。你可以看到 nice write-up I contributed at this page :)
关于 kube-apiserver HA 的更多详细信息here。祝你好运!
目前,在 1.8 之前,最好的解决方案似乎是使用负载均衡器,正如已经建议的那样。
我在控制平面中设置了一个包含三台服务器的 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
现在我是 运行 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 发生故障,进行故障转移的正确方法是什么?
--api-servers
标志已弃用。它不再在 documentation 中。 kubeconfig 是将 kubelet 指向 kube-apiserver 的全新方式。
今天的 kosher 方法是在每个工作节点(即 运行 kubelet)上部署一个带有 nginx 的 Pod,在 3 个 kube-apiserver 之间进行负载平衡。 nginx 会知道一个主机何时宕机并且不会将流量路由到它;那是它的工作。 kubespray项目就是采用这种方式。
第二种不太好的方法是使用 DNS RR。为 3 个主机的 IP 创建一个 DNS "A" 记录。将 kubelet 指向这个 RR 主机名而不是 3x IP。 kubelet 每次联系 master 时,都会路由到 RR 列表中的 IP。这种技术并不可靠,因为流量仍会路由到已关闭的节点,因此集群会出现间歇性中断。
恕我直言,第三种也是更复杂的方法是使用 keepalived。 keepalived 使用 VRRP 来确保至少一个节点拥有虚拟 IP (VIP)。如果一个master宕机,另一个master会劫持VIP来保证连续性。这种方法的缺点是负载平衡不是默认设置。所有流量都将路由到 1 个主节点(即主 VRRP 节点),直到它关闭。然后辅助 VRRP 节点将接管。你可以看到 nice write-up I contributed at this page :)
关于 kube-apiserver HA 的更多详细信息here。祝你好运!
目前,在 1.8 之前,最好的解决方案似乎是使用负载均衡器,正如已经建议的那样。