物理机上运行kubernetes

简介: 本文讲的是物理机上运行kubernetes【编者的话】本文介绍了作者在物理机上部署kubernetes时,对其各个组件的功能的深刻理解。作者认为虽然目前Google自动化了kubernetes部署,但如果想了解更多底层细节,最好还是自己在物理机上部署。
本文讲的是物理机上运行kubernetes【编者的话】本文介绍了作者在物理机上部署kubernetes时,对其各个组件的功能的深刻理解。作者认为虽然目前Google自动化了kubernetes部署,但如果想了解更多底层细节,最好还是自己在物理机上部署。

什么是kubernetes

kubernetes是谷歌开发的开源容器集群管理系统,它使容器集群应用的管理高度简单、自动化。Kubernetes(简称为k8s)与底层设施无关,可以运行在任何主流的云主机上,也可以是物理机。在Google Cloud上运行kubernetes非常方便,因为Google会为您管理k8s。我一直在Google容器引擎上试用Kubernetes,但为了更好地理解k8s架构,我决定在物理机上部署。

kubernetes Master 架构

kubernetes集群由一个管理节点和多个工作节点组成。管理节点是外部可以直接访问的,可以通过它在工作节点上执行命令。下面列出的是运行在管理节点上的组件。

ETCD

Etcd是一个开源的分布式键值对存储系统,是由CoreOS团队负责开发的。kubernetes使用 etcd 来存储配置数据,集群里面的所有节点均可访问这些数据。配置数据包括服务发现相关的数据和集群状态相关的数据,这些数据在节点配置或者重新配置的时候会用到。 etcd 的主要特点之一是数据在分布式系统中被复制。用户可以停掉kubernetes集群中除了主节点(译者注:这个主节点不是k8s的主节点,而是etcd的主节点)之外的所有etcd。这种情况下,所有的数据请求都将由etcd主节点负责处理。这种情形也是可以接受的,因为只要保证etcd主节点可用,kubernetes就可以正常工作。

API Server

为了确保从外部可以访问集群,主节点上运行了API Server组件,这是整个集群的管理入口。同时,还负责维护etcd中的数据与集群状态的一致性。API Server的组件实现了RESTful接口,使得与其通信更加简单方便。

Controller Manager

Controller Manager负责处理针对集群的管理请求,比如副本控制。当用户希望给集群设置某个状态,api server将这个期望的状态写入etcd,然后controller manager会获取到这个状态数据,最终执行一系列动作,将集群设置到用户所期望的状态。

Scheduler

调度器负责将任务调度到合适的节点。调度器的目标就是依据某些规则,为待调度的Pod找到合适的节点,这些规则主要是根据Pod的资源请求和节点的资源进行匹配。

Kubernetes Worker 架构

无论是kubernetes管理节点还是工作节点都有一个基本的要求-Docker。Docker负责拉取镜像和运行应用。为了让kubernetes能工作,每个worker节点必须属于某个专属子网。使用 flannel (CoreOS团队开发)就能够满足子网的要求。与此同时,为了使用 flannel 并且暴露合适的端口,必须修改一下Docker的配置。flannel需要部署在kubernetes所有woker节点上。

kubelet

Kubelet通过与API Server通信,感知(译者注:通过etcd的list-watch机制) etcd 中的配置数据的变化,来负责维护所在节点的Pod,容器,镜像,存储等对象。

kube-proxy

集群中的每个节点运行一个网络代理和一个负载均衡器。这个代理负责用户请求的负载均衡,并且将请求准确地转发到节点上的容器中。

在Ubuntu上运行Kubernetes

为了在Ubuntu系统组成的集群上部署kubernetes,我重度依赖Docker的使用。 etcd flannel 运行在主机上的容器中,而不是直接运行在主机上。kubernetes集群必须的管理组件和工作组件也以容器形式运行在主机上。这使得安装是与平台无关的,并且拉起集群更加简单快捷。我通常使用 GitHub 上社区开发的脚本来部署,而不是自己开发。为了让集群拉起更加简单,我自己开发了一个 Ansible  role,在 GitHub 上可以获取。

在物理机上部署kubernetes促使我更加深入地了解了更多底层细节,比如管理节点和工作节点之间的通信。Google容器引擎通过使用一个托管的kubernetes管理节点和屏蔽底层复杂细节,使得kubernetes的使用非常便捷,这确实是一个了不起的创举。

下一步

通过Ansible,我已经可以在物理机上部署kubernetes。下一步,我将部署一个公网IP的负载均衡器,这样从外部就可以访问到kubernetes了。一旦负载均衡器部署成功,我将更新我的ansible脚本。欢迎来这 Twitter 或者 GitHub 与我交流。

原文链接:Kubernetes on Bare Metal(翻译:付辉)

原文发布时间为:2017-03-10

本文作者:付辉

本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:物理机上运行kubernetes

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6月前
|
Kubernetes Java 容器
如何获取k8s容器里运行的jar包
如何获取k8s容器里运行的jar包
173 0
|
7月前
|
Kubernetes 流计算 容器
Flink on k8s的话,怎么在容器运行前初始化一些脚本?
Flink on k8s的话,怎么在容器运行前初始化一些脚本?
49 1
|
6月前
|
JSON Kubernetes Docker
k8s 集群中运行 docker registry 镜像仓库
k8s 集群中运行 docker registry 镜像仓库
684 0
|
2月前
|
Kubernetes 网络协议 Java
在Kubernetes上运行Flink应用程序时
【2月更文挑战第27天】在Kubernetes上运行Flink应用程序时
38 10
|
7月前
|
Kubernetes 监控 Docker
深入解析 Kubernetes 架构:掌握主节点、工作节点和容器运行时
深入解析 Kubernetes 架构:掌握主节点、工作节点和容器运行时
121 0
|
7月前
|
Kubernetes jenkins 持续交付
jenkins结合k8s构建流水线如何提升运行性能和构建效率
jenkins结合k8s构建流水线如何提升运行性能和构建效率
|
5月前
|
Kubernetes Java 流计算
在Kubernetes上运行Flink应用程序时,你可以使用Flink Kubernetes Client提供的命令来提交作业
在Kubernetes上运行Flink应用程序时,你可以使用Flink Kubernetes Client提供的命令来提交作业
46 6
|
5月前
|
Kubernetes Cloud Native 网络协议
云原生|kubernetes部署和运行维护中的错误汇总(不定时更新)
云原生|kubernetes部署和运行维护中的错误汇总(不定时更新)
303 0
|
6月前
|
Kubernetes 应用服务中间件 nginx
解释一下Kubernetes Minikube是什么,以及如何在本地运行一个Minikube集群
步骤1:准备环境 在开始之前,您需要确保本地环境已经具备以下几个关键的工具和组件:
181 1
|
6月前
|
Kubernetes 应用服务中间件 nginx
如何在本地使用Docker搭建和运行Kubernetes集群
获取Service的访问地址 运行以下命令来获取Service的访问地址:
204 0