Docker集群管理系统Kubernetes

简介:

一、Kubernetes简介

Kubernetes 是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度、均衡容灾、服务注册、动态扩缩容等功能套件,利用Kubernetes能方便地管理跨机器运行容器化的应用。而且Kubernetes支持GCE、vShpere、CoreOS、OpenShift、Azure等平台上运行,也可以直接部署在物理主机上。


二、Kubernetes架构

wKiom1a0gdKQtCxOAAGeTsSoD0A101.jpg

1. Pod

在Kubernetes系统中,调度的最小颗粒不是单纯的容器,而是抽象成一个Pod,Pod是一个可以被建、销毁、调度、管理的最小的部署单元;

Pod是kubernetes的最小操作单元,一个Pod可以由一个或多个容器组成; 

同一个Pod只能运行在同一个主机上;

同一个Pod共享着相同的volumes,network命名空间。


2. ReplicationController(RC)

RC是用来管理Pod的,每个RC可以由一个或多个的Pod组成,在RC被创建后,系统将会保持RC中的可用Pod的个数与创建RC时定义的Pod个数一致,如果Pod个数小于定义的个数,RC会启动新的Pod,反之则会杀死多余的Pod;

RC通过定义的Pod模板被创建,创建后对象叫做Pods(也可以理解为RC),可以在线的修改Pods的属性,以实现动态缩减/扩展Pods的规模或属性; 

RC通过label关联对应的Pods,通过修改Pods的label可以删除对应的Pods 

在需要对Pods中的容器进行更新时,RC采用一个一个的替换原则来更新整个Pods中的Pod.


3、Service

Services是Kubernetes最外围的单元,通过虚拟一个访问IP及服务端口,可以访问我们定义好的Pod资源;

Service也是Kubernetes的最小操作单元,是真实应用服务的抽象; 

Service通常用来将浮动的资源与后端真实提供服务的容器进行关联; 

Service对外表现为一个单一的访问接口,外部不需要了解后端的规模与机制。 

Service其实是定义在集群中一组运行Pod集合的抽象资源,它提供所有相同的功能。当一个Service资源被创建后,将会分配一个唯一的IP(也叫集群IP),这个IP地址将存在于Service的整个生命周期,Service一旦被创建,整个IP无法进行修改。Pod可以通过Service进行通信,并且所有的通信将会通过Service自动负载均衡到所有的Pod中的容器。


4、Label

Labels是用于区分Pod、Service、Replication Controller的key/value键值对,仅使用在Pod、Service、 Replication Controller之间的关系识别,但对这些单元本身进行操作时得使用name标签;

Pod、Service、RC可以有多个label,但是每个label的key只能对应一个value;

整个系统都是通过Label进行关联,得到真正需要操作的目标。


5、Proxy

Proxy不但解决了同一主宿机相同服务端口冲突的问题,还提供了Service转发服务端口对外提供服务的能力,Proxy后端使用了随机、轮循负载均衡算法。


三、Kubernetes相关组件

Kubernetes主要包括:kubectl、kube-apiserver、kube-controller-manager、kube-scheduler、kube-proxy、kubelet,当然这些并不能组成一个完整的kubernetes系统,整个系统中的信息还需要一个存储介质Etcd,网络服务Flannel(可选)


1.Kubectl

一个命令行工具,将接收到的命令,格式化后,发送给kube-apiserver,作为对整个平台操作的入口。


2.Kube-apiserver

作为整个系统的控制入口,以RESTAPI的形式公开。它可以横向扩展在高可用架构中。


3.Kube-controller-manager

用来执行整个系统中的后台任务,它其实是多个控制进程的合体。大致包括如下:

Node Controller    ##负责整个系统中node up或down的状态的响应和通知

Replication Controller    ##负责维持Pods中的正常运行的pod的个数

Endpoints Controller       ##负责维持Pods和Service的关联关系

Service Account & Token Controllers     ##负责为新的命名空间创建默认的账号和API访问Token


4.Kube-scheduler              

负责监视新创建的Pods任务,下发至未分配的节点运行该任务


5.Kube-proxy

kube-proxy运行在每个节点上,它负责整个网络规则的连接与转发,使kubernetes中的service更加抽象化


6.Kubelet

kubelet运行在每个节点上,作为整个系统的agent,监视着分配到该节点的Pods任务,(通过apiserver或者本地配置文件),负责挂载Pods所依赖的卷组,下载Pods的秘钥,运行Pods中的容器(通过docker),周期获取所有容器的可用状态,通过导出Pod和节点的状态反馈给REST系统


7.Pod

一组共享上下文的应用程序叫做一个pod,在上下文中,程序也可以应用单独的cgroup隔离。一个pod的模型就是一组运行指定应用的容器环境(逻辑主机),他可以容纳一个或多个应用程序,但是在一个容器世界里,这表现的相对较耦合。它们会运行在相同的物理主机或虚拟主机上


pod中的上下文是结合Linux命令空间来定义的,这里包含:

pod namespace(pod中的应用程序可以看到其他的进程)

network namespace(应用程序获得相同的IP和端口空间)

ipc namespace(pod中应用程序可以使用SystemV IPC或者POSIX消息队列来通信)

uts namespace(pod中的应用程序共享主机名)


资源共享和通信

pod中所有的应用程序使用相同的网络命名空间,应用程序间可以使用localhost来发现其他程序及通信。每一个pod都有一个IP地址,用来和其他物理节点及跨网络的容器进行通信。

pod作为部署的最小单位,支持水平扩展和复制.



四、kubernetes各组件功能介绍

角色             组件                                       功能

Master         apiserver                         提供PESTful接口

Master         scheduler              负责调度,将Pod分配到Slave节点

Master     controller-manager            负责Master的其他功能

Master           etcd                  存储配置信息,节点信息,pod信息等


Slave           kubelet                     负责管理Pod、容器和容器镜像

Slave            proxy      将访问Service的请求转发给对应的Pod,做一些负载均衡


客户端          kubectl              命令行工具,向apiserver发起创建Pod等请求


五、kubernetes安装

1.yum安装

1
# yum -y install etcd kubernetes


2.升级(覆盖bin文件即可)

①升级etcd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# curl -L  https://github.com/coreos/etcd/releases/download/v2.2.3/etcd-v2.2.3-linux-amd64.tar.gz -o etcd-v2.2.3-linux-amd64.tar.gz
# tar -zxvf etcd-v2.2.3-linux-amd64.tar.gz 
# cd etcd-v2.2.3-linux-amd64
# cp etcd* /bin/
# etcd -version
etcd Version: 2.2.3
Git SHA: 05b564a
Go Version: go1.5.2
Go OS /Arch : linux /amd64
# etcd > /var/log/etcd.log 2>&1 &                ##启动etcd
# curl 127.0.0.1:4001/version
{ "etcdserver" : "2.2.3" , "etcdcluster" : "2.2.0" }
#  etcdctl member list                ##查看etcd集群
ce2a822cea30bfca: name=default peerURLs=http: //localhost :2380,http: //localhost :7001 clientURLs=http: //localhost :2379,http: //localhost :4001


②升级kubernetes

1
2
3
4
5
6
# wget https://github.com/GoogleCloudPlatform/kubernetes/releases/download/v1.2.0-alpha.5/kubernetes.tar.gz
# tar -zxvf kubernetes.tar.gz
# cd kubernetes/server
# tar -zxvf kubernetes-server-linux-amd64.tar.gz
# cd kubernetes/server/bin/
# cp -a kubectl kubelet kube-controller-manager kube-scheduler kube-apiserver kube-proxy /usr/bin/


a.运行kube-apiserver[systemctl start kube-apiserver]

1
2
3
4
5
6
7
# kube-apiserver --address=0.0.0.0 --insecure-port=8080 --service-cluster-ip-range='10.254.0.0/16' --kubelet_port=10250 --v=0 --logtostderr=false --log_dir=/var/log/kube --etcd_servers=http://127.0.0.1:4001 --allow_privileged=false &
# kubectl version
Client Version: version.Info{Major: "1" , Minor: "2+" , GitVersion: "v1.2.0-alpha.5" , GitCommit: "9c0e7775672b26ab2005db8651890a60253478e2" , GitTreeState: "clean" }
Server Version: version.Info{Major: "1" , Minor: "2+" , GitVersion: "v1.2.0-alpha.5" , GitCommit: "9c0e7775672b26ab2005db8651890a60253478e2" , GitTreeState: "clean" }
# ss -tlnp|grep apiserver
LISTEN     0      128                      :::6443                    :::*       users :(( "kube-apiserver" ,1811,27))
LISTEN     0      128                      :::8080                    :::*       users :(( "kube-apiserver" ,1811,26))


b.运行kube-scheduler[systemctl start kube-scheduler]

1
2
3
# kube-scheduler --v=0 --logtostderr=false --log_dir=/var/log/kube --master='127.0.0.1:8080' &
# ss -tlnp|grep scheduler
LISTEN     0      128               127.0.0.1:10251                    *:*       users :(( "kube-scheduler" ,1933,9))


c.运行kube-controller-manager[systemctl start kube-controller-manager]

1
2
3
# kube-controller-manager --v=0 --logtostderr=false --log_dir=/var/log/kube  --port=10252 --master=127.0.0.1:8080 &
# ss -tlnp|grep controller
LISTEN     0      128               127.0.0.1:10252                    *:*       users :(( "kube-controller" ,1880,9))


Minion(需先启动docker才能运行kubelet)


a.运行kube-proxy[systemctl start kube-proxy]

1
2
3
4
# kube-proxy --v=0 --logtostderr=false --log_dir=/var/log/kube --master=http://master:8080 &
# ss -tlnp|grep proxy
LISTEN     0      128               127.0.0.1:10249                    *:*       users :(( "kube-proxy" ,1635,3))
LISTEN     0      128                      :::54921                   :::*       users :(( "kube-proxy" ,1635,7))


b.运行kubelet[systemctl start kubelet]

1
2
3
4
5
6
# kubelet --v=0 --logtostderr=false --allow-privileged=false --log_dir=/var/log/kube --address=0.0.0.0 --port=10250 --register-node=true --api_servers=mastr:8080 &
# ss -tlnp|grep kubelet
LISTEN     0      128               127.0.0.1:10248                    *:*       users :(( "kubelet" ,6277,14))
LISTEN     0      128                      :::4194                    :::*       users :(( "kubelet" ,6277,11))
LISTEN     0      128                      :::10250                   :::*       users :(( "kubelet" ,6277,18))
LISTEN     0      128                      :::10255                   :::*       users :(( "kubelet" ,6277,15))


Master

1
2
3
4
5
6
7
8
9
10
11
12
# kubectl get nodes              ##查看node清单
NAME                    LABELS                         STATUS    AGE
127.0.0.1      kubernetes.io /hostname =127.0.0.1       NotReady   23d
localhost.localdomain   kubernetes.io /hostname =localhost.localdomain   NotReady   21d
minion        kubernetes.io /hostname =minion           NotReady   21d
# kubectl get pods                ##查看pods清单
NAME      READY     STATUS    RESTARTS   AGE
# kubectl get services             ##查看service清单
NAME         CLUSTER_IP   EXTERNAL_IP   PORT(S)   SELECTOR   AGE
kubernetes   10.254.0.1   <none>        443 /TCP    <none>     4d
# kubectl get replicationcontrollers   ##查看replicationControllers清单
CONTROLLER   CONTAINER(S)   IMAGE(S)   SELECTOR   REPLICAS





本文转自  结束的伤感  51CTO博客,原文链接:http://blog.51cto.com/wangzhijian/1762632

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
260 77
|
10天前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
9天前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
64 11
|
26天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
127 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
23天前
|
存储 Kubernetes Docker
Kubernetes(k8s)和Docker Compose本质区别
理解它们的区别和各自的优势,有助于选择合适的工具来满足特定的项目需求。
110 19
|
21天前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
86 12
|
23天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
26天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
57 2
|
1月前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
1月前
|
Prometheus 监控 Cloud Native
如何使用Prometheus监控Docker Swarm集群的资源使用情况?
还可以根据实际需求进行进一步的配置和优化,如设置告警规则,当资源使用超出阈值时及时发出警报。通过这些步骤,能够有效地使用 Prometheus 对 Docker Swarm 集群的资源进行监控和管理。
73 8