扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本篇内容介绍了“如何部署高可用kubernetes集群”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
专注于为中小企业提供成都做网站、成都网站制作、成都外贸网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业福绵免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了千余家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
apiserver 本身是无状态的,可以横向扩展,其借助外部负载均衡软件配置高可用也相对容易,实现方案比较多,但一般会采用外部组件 LVS 或 HAProxy 的方式实现,我们生产环境是通过 LVS 实现的。apiserver 的高可用可以分为集群外高可用和集群内高可用。集群外高可用指对于直接调用 k8s API 的外部用户(例如 kubectl 、kubelet),客户端需要调用 apiserver 的 VIP 以达到高可用,此处 LVS 的部署以及 VIP 的配置不再详细说明。
集群内的高可用配置是指对于部署到集群中的 pod 访问 kubernetes,kubernetes 集群创建完成后默认会启动一个kubernetes
的 service 供集群内的 pod 访问,service 的 ClusterIP 默认值为 172.0.0.1
,每一个 service 对象生成时,都会生成一个用于暴露该对象后端对应 pod 的对象 endpoints,endpoints 中可以看到 apiserver 的实例。访问 kubernetes 的 service,service 会将请求转发到 endpoints 中的 ip 上,此时若 service 中的 endpoints 中没有 IP,则表示 apiserver 无法访问。
$ kubectl get svc kubernetes
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 172.0.0.1 443/TCP 21d
$ kubectl get endpoints kubernetes
NAME ENDPOINTS AGE
kubernetes 10.0.2.15:6443, 10.0.2.16:6443 21d
kubernetes v1.9 之前 kube-apiserver service 的高可用也就是 master ip 要加入到 kubernetes service 的 endpoints 中必须要在参数中指定 --apiserver-count
的值,v1.9 出现了另外一个参数 --endpoint-reconciler-type
要取代以前的 --apiserver-count
,但是此时该参数默认是禁用的(Alpha 版本),v1.10 也是默认禁用的。v1.11 中 --endpoint-reconciler-type
参数默认开启了,默认值是 lease
。--apiserver-count
参数会在 v1.13 中被移除。v1.11 和 v1.12 中还可以使用 --apiserver-count
,但前提是需要设置 --endpoint-reconciler-type=master-count
。也就是说在 v1.11 以及之后的版本中 apiserver 中不需要进行配置了,启用了几个 apiserver 实例默认都会加到 对应的 endpoints 中。
kube-controller-manager 和 kube-scheduler 是由 leader election 实现高可用的,通过向 apiserver 中的 endpoint 加锁的方式来进行 leader election, 启用 leader election 需要在组件的配置中加入以下几个参数:
--leader-elect=true
--leader-elect-lease-duration=15s
--leader-elect-renew-deadline=10s
--leader-elect-resource-lock=endpoints
--leader-elect-retry-period=2s
组件当前的 leader 会写在 endpoints 的 holderIdentity 字段中, 使用以下命令查看组件当前的 leader:
$ kubectl get endpoints kube-controller-manager --namespace=kube-system -o yaml
$ kubectl get endpoints kube-scheduler --namespace=kube-system -o yaml
关于 kube-controller-manager 和 kube-scheduler 高可用的实现细节可以参考之前写的一篇文章:kubernets 中组件高可用的实现方式。
etcd 是一个分布式集群,也是一个有状态的服务,其天生就是高可用的架构。为了防止 etcd 脑裂,其组成 etcd 集群的个数一般为奇数个(3 或 5 个节点) 。若使用物理机搭建 k8s 集群,理论上集群的规模也会比较大,此时 etcd 也应该使用 3 个或者5 个节点部署一套独立运行的集群。若想要对 etcd 做到自动化运维,可以考虑使用 etcd-operator 将 etcd 集群部署在 k8s 中。
kubernetes 中组件高可用部署的一个架构图:
本文主要介绍如何配置一个高可用 kubernetes 集群,kubernetes 新版本已经越来越趋近全面 TLS + RBAC 配置,若 kubernetes 集群还在使用 8080 端口,此时每个 master 节点上的 kube-controller-manager 和 kube-scheduler 都是通过 8080 端口连接 apiserver,若节点上的 apiserver 挂掉,则 kube-controller-manager 和 kube-scheduler 也会随之挂掉。apiserver 作为集群的核心组件,其必须高可用部署,其他组件实现高可用相对容易。
“如何部署高可用kubernetes集群”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流