Kubernetes简介

发展经历

IAAS『Infrastructure as a Service,基础设施级服务』

PAAS『Platform as a Service,平台级服务』

SAAS『Software as a Service,软件设施级服务』

Apache MESOS:开源的分布式资源管理框架。2019年5月Twitter停止使用MESOS。

Docker SWARM:专门用于容器化技术Docker的管理。2019年7月阿里云剔除SWARM。

Kubernetes:基于Google统一容器管理系统Borg(闭源)使用Go开发,容器领域标准。

Golang作为一门解释性语言,称为现代C语言,在语言级别可以实现进程管理,不需要人为控制。

作为容器管理引擎,它的日常工作是非常繁忙的,并且会消耗大量的内存,所以运行起来并不轻量。

K8S介绍

Kubernetes是谷歌开源的容器集群管理系统,主要功能:

  • 基于容器的应用部署、维护和滚动升级
  • 负载均衡和服务发现
  • 跨机器和跨地区的集群调度
  • 自动伸缩
  • 无状态服务和有状态服务
  • 广泛的Volume支持
  • 插件机制保证扩展性

核心组件

Kubernetes主要由以下几个核心组件组成:

  • etcd:保存整个集群的状态。
  • apiserver:提供资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制。
  • controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。
  • scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上。
  • kubelet:负责维护容器的生命周期,同时也负责Colume(CVI)和网络(CNI)的管理。
  • Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI)。
  • Kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡。

Kubernetes概念

Container

Container(容器)是一种便携式、轻量级的操作系统虚拟化技术。它使用Namespace隔离不同的软件运行环境,并通过镜像自包含软件的运行环境,从而使得容器很方便的在任何地方运行。

容器体积小且启动快,因此可以在每个容器镜像中打包一个应用程序。使用容器,不需要与外部的基础架构环境绑定,因为每一个应用程序都不需要外部依赖。完美解决了从开发到生产环境的一致性问题。

容器比虚拟机更加透明,这有助于监测和管理。尤其是容器进程的生命周期由基础设施管理,而不是被进程管理器隐藏在容器内部。

Pod

Kubernetes使用Pod来管理容器,每个Pod可以包含一个或多个紧密关联的容器。

Pod是一组紧密关联的容器集合,它们共享PID、IPC、Network和UTS namespace,是Kubetnetes调度的基本单位。Pod内的多个容器共享网络和文件系统,可以通过进程间和通信和文件共享这种简单高效的方式组合完成服务。

Node

Node是Pod真正运行的主机,可以是物理机,也可以是虚拟机。

为了管理Pod,每个Node结点上至少要运行container runtime(比如docker或者rkt)、kubeletkube-proxy服务。


Namespace

Namespace是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的pods,services,replication controllers和的deployments等都是属于某一个Namespace的(默认是default),而node,persistentVolumes等则不属于任何Namespace。

Service

Service是应用服务的抽象,通过labels为应用提供负载均衡和服务发现。匹配labels的Pod IP和端口列表组成endpoints,由kube-proxy负责将服务IP负载均衡到这些endpoints上。

每个Service都会自动分配一个cluster IP(仅在集群内部可访问的虚拟地址)和DNS名,其他容器可以通过该地址或DNS来访问服务,而不需要了解后端容器的运行。


Label

Label是识别Kubernetes对象的标签,以K/V的方式附加到对象上。

Label不提供唯一性,并且实际上经常是很多对象都使用相同的label来标志具体的应用。

Label定义好后其他对象可以使用Label Selector来选择一组相同Label的对象。

Label Selector支持以下几种方式:

  • 等式,如app=nginxenv!=production
  • 集合,如env in (production, qa)
  • 多个label(它们之间是AND关系),如app=nginx,env=test

Annotations

Annotations是KV形式附加于对象的注解。不同于Labels用于标志和选择对象,Annotations则是用来记录一些附加信息,用哪个与辅助应用部署、安全策略以及调度策略等。比如deployment使用annotations来记录rolling update的状态。

Kubernetes体验

Play with Kubernetes提供了一个免费的Kubernetes体验环境。

🌐 传送门:https://labs.play-with-k8s.com

⚡ 网页控制台:

  • 复制:ctrl + insert
  • 粘贴:shift + insert

进入首页,可以选择github或者dockerhub账号进行登录,每次进入拥有4个小时的实践时间。


点击ADD NEW INSTANCE创建三个节点:


(1)初始化node1为master节点:

1
$ kubeadm init --apiserver-advertise-address $(hostname -i)

执行完毕,记录下kubeadm join命令:


(2)在node2和node3上执行上述命令:

1
2
$ kubeadm join 192.168.0.33:6443 --token b8fg2j.yxaqdx2tl3gwxfu2 \
--discovery-token-ca-cert-hash sha256:8d4a8b4c3114931e0724545b101e4e5dfd87eee53faf48fe0604a947132b134a

(3)在master节点上初始化集群网络:

1
$ kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml

查看节点状态:

1
$ kubectl get nodes -o wide

查询集群信息:

1
$ kubectl cluster-info

(5)部署nginx服务,在master节点执行:

1
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/master/content/en/examples/application/nginx-app.yaml