Kubernetes框架概览

Kubernetes是什么

Kubernetes是互联网巨头Google推出的一款开源的容器集群管理工具。下面分别对这里面提到的概念做点解释:

  • 容器 容器技术类似于虚拟机但又不同于虚拟机。容器可以提供近似于虚拟机的功能,但是又没有虚拟机那么大的资源占用。容器与虚拟机底层的实现也是不同的。 虚拟机是在宿主机上完全通过虚拟化技术来创建一个无异于真实物理环境的运行环境。而容器技术是通过使用例如Linux Namespace 和 Cgroup技术来创建一个与其它进程运行环境高度隔离的环境。这样在这里面运行的进程就具有轻量、易用、高效的特性,环境本身也如“沙箱”一样安全。
  • 集群 一些计算机在一起同时同时完成一项任务,就说这些计算机构成了一个集群。咬文嚼字来说,集群跟分布式环境还是有些差别的,主要表现在:集群的每个节 点完成的任务都是类似的,某个节点挂了其它的节点还可以顶上来继续工作,而分布式则不同。集群是通过提高单位时间内任务数来提高效率,而分布式是通过缩短 单个任务的执行时间来提高效率的。集群一般具有高可用性和可扩展性。 戳这里

关于Kubernetes,这里及下文提到的容器都是Docker容器。Docker容器集群管理工具除了Kubernetes以外还有Swarm等。

Kubernetes的几个特性

上图给出了Kubernetes的结构简化示意图。从中可以看到:

首先,Kubernetes集群是一个主从(Master-Slave)结构,每个集群拥有一个Master节点和多个Minion节点。管理员通过将控制命令发给Master来对集群进行操作。而用户通过Internet访问到的是多个Minion提供的服务。

其次,每个Minion部署在一个物理机上。换句话说,Minion是一个抽象概念,并不是说要在物理机上安装一个叫做Minion的软件等等。每 一个Minion上可以运行多个Pod,至于到底是多少个取决于Minion的性能。Minion上面除了运行Pod之外,还有两个关键组件,一个叫 Kubelet,一个叫Proxy。

  • Pod 是Kubernetes集群部署、调度和管理的基本单位。每个Pod里面包含多个容器。对于规模比较小的服务,将它的依赖都配置在Pod里面的容器上,一个Pod就足够负载,而另外一些规模大一点的服务,可能要使用多个Pod,甚至是跨Minion的Pod。
  • Kubelet 是用来监管Pod里面容器运行情况的。一旦某个Pod里面的容器发生意外挂掉了,就由Kubelet来完成对其的重建。
  • Proxy 是代理,简单来说,就是通过它提供一个统一的访问地址。

Kubernetes的一些概念

  • Clusters 这个内容在Kubernetes的官方文档里面主要列出了Kubernetes支持的操作系统环境和对应的IaaS平台,常见的列出如下图:
  • Pods 前面也介绍过Pod的作用。Pod是由Linux的一些基本的命名空间组合而成。这里的命名空间有: 同一个Pod里面的容器是共享这些命名空间的(目前使用了Docker容器的Pod没有实现对Pid命名空间的共享)。 引入Pod的动机是: 优点:实现了Pod和Controller的解耦、软件依赖解耦和Controller Service的解耦。
    • 资源共享和通信,Pod里面的容器共享这些命名空间为资源共享和通信提供了便利。
    • 简化管理,使用Pod简化了应用部署的过程
    • 集成, Pods帮助主机垂直集成了应用栈,应用的各个依赖可以分别位于不同的容器。
    • Pid Namespace
    • UTS Namespace
    • networkd Namespace
    • IPC Namespace
  • Replication Controller Replication Controller的作用是保证某时刻的Pods数量与期望一致,多了就删除Pod,少了就添加。 工作方式是: 作用:
    • 重调度(Rescheduling):不管是有1个还是多个Pod,都必须有对应数量的replicas. Replication Controller来保证这个确定的数量
    • 伸缩(scaling): 通过更新replicas域或者手动增加、减少replicas的数量来实现伸缩性。
    • 更新(Rolling Update):通过一个接一个的方式来实现滚动更新。
    • 多版本跟踪(Multi Realease Tracks)
    • 使用Pod 模板(template)来创建Pod, 并且它认为这样创建出来的Pod是独立的,且可以相互替换的。
    • 使用Label来管理Pods,Label Selector来定义Label。
    • 删除一个Pod第一步就是改变其Label
  • Services Services是从逻辑上抽象了一组Pods集合的概念。访问这些Pods的策略称作是微服务。 通俗来说,就是对于一群Pods,给每个Pod打上标签,同一个标签的Pods属于同一个服务,也由它们来提供同一个服务。 例如,一个应用它拥有某个pod作为后端,那么就是由services来确定是哪一个pod来提供服务。 Services标定的Pods集合也是被Label Selector来决定的。 每一个services都被做成是RESTful API。 必须保证没有哪两个services的端口号会碰撞,所以采用的方法是给每个services分配独立的虚拟IP-Portal IP。对于构成一个services的Pods,它们每个也都是具有自己的IP地址的,用户不需要记住这些Pod的地址,所以引入了前面提到的 Proxy,用户访问一个地址及端口,而由Proxy来将访问流量转发到各个Pod。
  • Label labels是键值对,它附着到类似于pods的对象上。它用来指定对于相关用户具有特殊意义的特殊属性。但是不给核心系统表明语义。 这样做的好处是:使用户可以映射他们自己的组织结构到系统对象。 有效的label key包含两段:可选的前缀和名字,使用/分割。name不能超过63字符。[a-z0-9A-Z]或-或_或.来起始和终止。prefix必须是一个DNS subdomain。 Label Selector: 多个对象可能拥有同样的label。通过Label selector,客户可以区分一组对象。 API现在支持两种类型的selector,equality-based 和 set-based。

最后再通过下图对Kubernetes的构成及功能有一个一目了然的认识:

搭建Kubernetes

几经折腾,总算配置好了一个简单的kubernetes集群。在实验的时候,我总共实验了两种环境,一种是etcd与master 安装到同一台机器,一种是分开安装。这两种本质和方法都一样。主要参考资料是kubernetes的官方文档。下面简单介绍一下环境的搭建过程。

实验环境是一台ubuntu 14.04 64位的laptop。kubernetes搭建在虚拟机上,虚拟机使用的是cetnos7,virtualbox,使用vagrant来配置虚拟机。 Vagrantfile的书写就暂时不提了。后面会上传相关文件到github。

正题开始:

  • 配置计划: 节点 | ip | 依赖 master | 10.100.199.165 | kubernetesminion1 | 10.100.199.201 | kubernetes dockeretcd | 10.100.199.10 | etcd 在每个机器上修改其 1 在master上,添加: ```c 10.100.199.10 etcdSer 10.100.199.201 minion1在minion1上,添加: 1 210.100.199.10 etcdSer 10.100.199.165 master在etcdSer上,添加: 1 210.100.199.165 master 10.100.199.201 minion1虚拟机建立好后,首先要保证三台机器能够互相连同,使用 1 * master节点配置: 在 ```etc/yum.repo.d/``` 路径下新建仓库文件,文件名为```virt7-testing```,内容如下: ```c [virt7-testing] name=virt7-testing baseurl=http://cbs.centos.org/repos/virt7-testing/x86_64/os/ enable=1 gpgcheck=0保存文件后,就可以安装kubernetes 了,命令如下:

1

yum -y install kubernetes

安装成功后,进行命令:

1

kubectl version

会得到如下图的提示:

遇到这个呢,说明还没配置完全,接下来对master节点的关键组件进行配置。

master节点执行的服务是apiserver、scheduler 和 controller manager。当然,首先要对config进行配置。

1

```c # Comma separated list of nodes in the etcd cluser KUBE_ETCD_SERVICES="--etcd_servers=http://etcdSer:4001"

接着是apiserver

12345678

# The address on the local server to listen toKUBE_API_ADDRESS="--address=0.0.0.0"# How the replication controller and the scheduler find the kube-apiserverKUBE_MASTER="--master=http://master:8080"# Comma separated list of nodes in the etcd clusterKUBE_ETCD_SERVERS="--etcd_servers=http://etcdSer:4001"

然后是controller-manager

12

# Comma separated list of minionsKUBELET_ADDRESSES="--machines=minion1"

最后是scheduler, 就目前这个是不需要配置的。

在开启服务之前,最好先将所有的防火墙都关闭,如下:

12

systemctl disable iptables-services firewalldsystemctl stop iptables-servcies firewalld

然后开启服务:

1234

for SERVICES in kube-apiserver kube-controller-manager kube-scheduler;do systemctl restart $SERVICES systemctl enable $SERVICES systemctl status $SERVICSE

  • minion1节点配置: 跟前面类似,也是先添加virt7-testing仓库并安装kubernetes,注意这个时候docker已经自动安装了,无需另外安装。 对于minion1节点,只需要配置相关组件kubelet,同样在 1 ```c # The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces) KUBELET_ADDRESS="--address=0.0.0.0" # You may leave this blank to use the actual hostname KUBELET_HOSTNAME="--hostname_override=minion1"接着也是关闭所有的防火墙如上,然后开启服务:

1234

for SERVICES in kubelet kube-proxy docker;do systemctl restart $SERVICES systemctl enable $SERVICES systemctl status $SERVICSE

  • etcdSer节点配置: 要给该节点安装etcd,在上面的仓库安装高版本的是可以的,但是后面要修改监听IP,这里使用的是另一个仓库的etcd 0.4.6版本。

1

yum -y install http://cbs.centos.org/kojifiles/packages/etcd/0.4.6/7.el7.centos/x86_64/etcd-0.4.6-7.el7.centos.x86_64.rpm

然后同样关闭防火墙。

至此,三台机器基本配置完毕,接下来在master主机上进行测试,如下

1

kubectl version

提示下图:

然后:

1

kubectl get minions

提示下图:

表示环境配置成功。

原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2015-09-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏沈唁志

在Debian 7上安装和配置OSSEC

OSSEC是一个开源的,基于主机的入侵检测系统(HIDS),可执行日志分析,完整性检查,rootkit检测,基于时间的警报和主动响应,使其成为服务器监控的理想选...

2542
来自专栏惨绿少年

KVM 虚拟化技术

在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等...

5302
来自专栏张善友的专栏

IIS 7.0的六大安全新特性为你的Web服务器保驾护航

文章来自:WindowsITPro  2009年2月期 当你启用一台Web服务器的时候,你就把你公司的一部分完全展现给了公众,任凭他人摆布。Web服务器上的那些...

23710
来自专栏Kubernetes

原 荐 基于Kubernetes的ESaaS

概述 ESaaS(ElasticSearch as a Service)是ElasticSearch on Kubernetes的产品实现,是利用Docker和...

3346
来自专栏惨绿少年

KVM 虚拟化技术

在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等...

7693
来自专栏绿巨人专栏

Linux 技巧

当运行tmux时,实际上会运行一个tmux service,保持session的运行。

1682
来自专栏张戈的专栏

Nexus3最佳实践系列:搭建Docker私有仓库

容器仓库是容器化管理中非常重要的一环,相当于 SVN 在程序研发、运维发布中的地位。因此,一个稳定、可靠的容器仓库尤为重要。

7783
来自专栏Linux启动过程

基于Linux的pc启动过程

作为一个Android开发者,了解整个系统架构是必须的,所以这篇就总结一下Android手机从按下开机键到启动这一过程发生了什么。

2060
来自专栏bboysoul

vmware workstation 安装macos 10.13

说实在的,如果我有钱,早就换苹果了,macos真的是一个好系统,但是没钱,实话没钱只能使用linux。windows?windows是什么东西?我没有听说过。今...

1382
来自专栏张善友的专栏

Advanced Logging For IIS

Advanced Logging 是一个挂在 IIS 核心功能中的模块,它可以接收来自于服务器(server)以及网站(site)中各式各样的记录,并且再经过由...

2116

扫码关注云+社区

领取腾讯云代金券