Kubernetes(简称K8S) 是Google开源的分布式的容器管理平台,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。本文主要介绍Kubernetes(K8s) 入门教程。

1、Kubernetes(K8s)介绍

1)节点 (Master node and Worker node)

节点通常指的就是服务器,在k8s中有两种节点:

管理节点(Master Node)和工作节点(Worker Node),具体如下表:

节点

描述

管理节点(Master Node)

负责管理整个k8s集群,一般由3个管理节点组成HA的架构。

工作节点(Worker Node)

主要负责运行容器。

2)命名空间 (Namespace)

k8s命名空间主要用于隔离集群资源、隔离容器等,为集群提供了一种虚拟隔离的策略;默认存在3个名字空间,分别是默认命名空间 default、系统命名空间 kube-system 和 kube-public。

3)Object

k8s 对象(Object)是一种持久化存储并且用于表示集群状态的实体。k8s 对象其实就是k8s自己的配置协议,总之我们可以通过定义一个object让k8s根据object定义执行一些部署任务、监控任务等等。

4)POD

Pod是 Kubernetes 部署应用或服务的最小的基本单位。一个Pod 封装多个应用容器(也可以只有一个容器)、存储资源、一个独立的网络 IP 以及管理控制容器运行方式的策略选项。

5)副本集 (Replica Set,RS)

副本集 (Replica Set,RS)是一种控制器,负责监控和维护集群中pod的副本(replicas)数,确保pod的副本数是我们期望的样子。

6)部署 (Deployment)

表示对k8s集群的一次更新操作,是k8s集群中最常用的Object,主要用于部署应用。支持滚动升级。

7)服务 (service)

服务 (service)是对应用的抽象,也是k8s中的基本操作单元,一个服务背后由多个pod支持,服务通过负载均衡策略将请求转发到容器中。

8)Ingress

Ingress是一种网关服务,可以将k8s服务通过http协议暴露到外部。

9)无状态应用 & 有状态应用

无状态应用指的是应用在容器中运行时候不会在容器中持久化存储数据,应用容器可以随意创建、销毁;如果一个应用有多个容器实例,对于无状态应用,请求转发给任何一个容器实例都可以正确运行。

例如:web应用

有状态应用指的是应用在容器中运行时候需要稳定的持久化存储、稳定的网络标识、固定的pod启动和停止次序。

例如:mysql数据库。

2、Kubernetes(K8s)架构

Kubernetes(K8s)是多个组件组成,具体如下图,

httpswwwcjavapycom

1)Master组件

API Server

K8S对外的唯一接口,提供HTTP/HTTPS RESTful

API,即kubernetes

API。所有的请求都需要经过这个接口进行通信。

主要负责接收、校验并响应所有的REST请求,

结果状态被持久存储在etcd当中,

所有资源增删改查的唯一入口。

etcd

负责保存k8s

集群的配置信息和各种资源的状态信息,

当数据发生变化时,

etcd会快速地通知k8s相关组件。

etcd是一个独立的服务组件,

并不隶属于K8S集群。

生产环境当中etcd应该以集群方式运行,

以确保服务的可用性。

etcd不仅仅用于提供键值数据存储,

而且还为其提供了监听(watch)机制,

用于监听和推送变更。

在K8S集群系统中,

etcd的键值发生变化会通知倒API

Server,并由其通过watch API向客户端输出。

Controller Manager

负责管理集群各种资源,保证资源处于预期的状态。

Controller Manager由多种controller组成,包括replication

controller、endpoints controller、namespace controller、serviceaccounts

controller等 。

由控制器完成的主要功能主要包括生命周期功能和API业务逻辑,

具体如下:

生命周期功能:包括Namespace创建和生命周期、

Event垃圾回收、Pod终止相关的垃圾回收、

级联垃圾回收及Node垃圾回收等。

API业务逻辑:

例如,

由ReplicaSet执行的Pod扩展等。

调度器(Schedule)

资源调度,负责决定将Pod放到哪个Node上运行。

Scheduler在调度时会对集群的结构进行分析,

当前各个节点的负载,

以及应用对高可用、性能等方面的需求。

2)Node组件

Kubelet

kubelet是node的agent,

当Scheduler确定在某个Node上运行Pod后,

会将Pod的具体配置信息(image、volume等)发送给该节点的kubelet,

kubelet会根据这些信息创建和运行容器,

并向master报告运行状态。



Container Runtime

每个Node都需要提供一个容器运行时(Container

Runtime)环境,它负责下载镜像并运行容器。

目前K8S支持的容器运行环境,至少包括Docker、RKT、cri-o、Fraki等。



Kube-proxy

service在逻辑上代表了后端的多个Pod,

外借通过service访问Pod。

service接收到请求就需要kube-proxy完成转发到Pod的。

每个Node都会运行kube-proxy服务,

负责将访问的service的TCP/UDP数据流转发到后端的容器,

如果有多个副本,

kube-proxy会实现负载均衡,

有2种方式:LVS或者Iptables。

3、Kubernetes(K8s) 安装与节点配置

参考文档:Kubernetes(K8s) 安装与节点配置

4、Kubernetes(K8s) 快速入门

通过上面文档安装配置Kubernetes(K8s),并且配置Master和另个一个Node节点,下面通过一个简单示例快速入门,运行cjavapy/hello-node:v1镜像,执行成功后,通过浏览访问可以输出Hello World!提示,如此来了解整个流程。具体如下:

1)运行hello-node

 kubectl run hello-node --image=cjavapy/hello-node:v1 --port=8089

注意:cjavapy/hello-node:v1 为hub.docker.com上的镜像,供学习使用的,浏览器访问则会输出Hello World!。

2)查看状态

kubectl get pods 

如执行完成,则 hello-node 为READY,STATUS为Running,如下

[root@kube-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-node 1/1 Running 0 27h
[root@kube-master ~]#

3)将pod公开为service

kubectl expose pod hello-node --type=LoadBalancer --name=my-service --external-ip=192.168.31.21

4)浏览器访问查看

httpswwwcjavapycom

注意:如上图一样出现Hello World!提示,则说明所有都运行成功。

推荐文档