Kubernetes

Kubernetes(K8s):部署和管理多个主机上的容器化应用(开源)

1)抽象了数据中心的硬件基础设施,使得对外暴露的仅是一个资源池;

2)由多个组件组成,组件之间可相互察觉(实现相互通信)


Kubernetes整个系统由一个Master节点和若干个Node节点组成

1)管理员将应用列表提交至Master节点;

2)Kubernetes会自动将应用部署到对于的Node节点


如:Kubernetes系统工作简化流程
在这里插入图片描述

1)应用描述:应用程序的容器基于的镜像和如何相互关联等信息


Master节点相关端口:

端口范围协议方向作用使用者
6443TCP入站Kubernetes API服务器所有组件
2379~2380TCP入站Etcd服务器客户端APIkube-apiserver、 Etcd
10250TCP入站KubeletAPIkubelet、 Master节点组件
10251TCP入站kube-schedulerkube-scheduler
10252TCP入站kube-controller-managerkube-controller-manager

Node节点相关端口:

端口范围协议方向作用使用者
10250TCP入站Kubelet Apikubelet、 Master节点组件
30000~32767TCP入站Node节点的服务Node节点组件

概念

应用区分

单体应用:把一个系统所涉及的各个组件都打包成一个一体化结构

1)改动其中一个组件,其他所有组件均需做出变动


单体应用的服务器扩展的两种方式:

1)垂直扩展:增加硬件资源或提高硬件性能(CPU、内存和磁盘等);

缺点:成本越来越高,且硬件具有性能瓶颈


2)水平扩展:添加应用运行的数量(负载均衡)

缺点:需对代码做较大的改动


微服务:将单体应用分解成小的、可独立运行的组件

1)微服务彼此之间解耦,可被独立开发、部署、升级和伸缩

2)每个微服务以独立的进程运行,通过API与其他服务器进行通信

3)扩展方式:针对运行单个微服务的服务器进行资源升级或服务扩容


如:单个微服务可在多个主机上进行扩容
在这里插入图片描述


如:单体应用和微服务化应用的比较
在这里插入图片描述
//金丝雀发布:先只让一小部分用户体验新版本,以观察新版本的表现,随后再向所有用户发布新版本,防止有问题的版本暴露给太多用户

容器技术

容器技术:将单个操作系统的资源划分到各个孤立组中,隔离孤立组之间的资源

1)实现同一台机器上运行多个服务,且服务的资源相互隔离;

2)容器内运行的进程实际上运行在宿主机的系统上(与其他进程隔离);


如:虚拟机和容器隔离应用程序的比较
在这里插入图片描述
1)虚拟机中的应用程序通过内核调用虚拟CPU,虚拟CPU通过管理程序再调用宿主机的CPU执行对应的指令;

2)容器中的应用程序直接通过宿主机的内容调用CPU执行指令;


容器技术实现隔离所依赖的2个机制:

(1)Linux命名空间(namespace):每个进程仅能看到自己的系统视图;

1)系统视图如:文件、进程、网络接口和主机名等;

2)Linux系统默认仅有一个命名空间,且所有系统资源均属于该命名空间;

3)可自定义命名空间,并指定该命名空间的系统资源;

4)单个进程可属于多个命名空间(属于每个类型的命令空间)

//有以下6种类型的命名空间:Mount(mnt)、Process IP(pid)、Network(net)、

Inter-process communication(ipc)、UTS、User ID(user)


(2)Linux控制组(cgroups):限制进程能使用的资源量

1)资源量如:CPU、内存和网络带宽等

2)cgroups属于Linux内核功能


镜像:包含了应用程序和其所依赖的环境的文件;

镜像仓库:存储镜像的服务器

容器:根据镜像格式进行标准操作后的一个运行环境


如:从构建镜像到服务器根据镜像运行容器的流程
在这里插入图片描述

Kubernetes集群

Kubernetes集群都多个节点组成,分为以下两种:

1)Master节点(主节点):承载Kubernetes控制和管理集群系统的控制面板;

2)Node节点(工作节点):运行管理员实际部署的应用;

//Master节点不会运行部署的应用


如:Kubernetes集群的组成
在这里插入图片描述


(1)Master节点可理解为集群的控制面板,由多个组件组成

//组件可运行在单个Master节点上或通过副本部署多个Master节点(高可用性);

1)API Server:通过该组件和其他组件通信;

2)Etcd:可靠的分布式数据存储(持久化存储集群配置)

3)Scheduler:调度应用(分配到指定的Node节点);

4)Controller Manager:执行集群级别的功能(复制组件和跟踪Node节点等)


(2)Node节点可理解为运行容器化应用的机器;

1)运行的容器:可为Docker、rtk或其他容器类型;

2)Kubelet:通过该组件和API服务器通信,管理所在节点的容器;

3)kube-proxy:负责组件之间的负载均衡网络流量


Kubernetes集群中部署应用的流程:

1)将应用打包成1个或多个容器镜像;

2)将镜像推送至镜像仓库;

3)将应用的描述发至Kubernetes API服务器;

4)API服务器根据应用的描述和Scheduler配置分配应用到适应的Node节点;

5)再由Node节点的Kubelet控制每个应用的副本数量


如:应用程序部署流程
在这里插入图片描述


Kubernetes集群的优点:

1)简化应用程序的部署流程:指定应用程序需在的特定的节点才可部署;

2)更好地利用硬件:不同应用程序组件可被混合,且紧密的打包到集群节点;

3)健康检查和自修复;Kubernetes会监控应用程序组件和运行其的节点,在出现故障时,自动将其重新调度到其他正常节点;

4)自动扩缩容;不断调整每个应用程序的运行数,以达到期望数;

5)简化应用部署;应用程序可通过API服务器以获取环境变量和其他信息;

Kubernetes集群的应用

每个节点均运行Docker、Kubelet和kube-proxy,所以管理员可通过kubectl命令和Master节点上的Kubernetes API服务器通信


如:管理员通过kubectl命令和API服务器通信
在这里插入图片描述

查看资源

cluster-info命令:列出Kubernetes集群的信息

指令格式:kubectl cluster-info


如:列出集群信息
在这里插入图片描述


get命令:列出集群中所含有的资源

指令格式:kubectl get 资源类型 选项

资源类型说明
node列出所有节点
po列出所有Pod资源
ns列出所有NameSpace资源
rc列出所有ReplicationController资源
rs列出所有ReplicaSet资源
ds列出所有DaemonSet资源
job列出所有Job资源
cronjob列出所有CronJob资源
svc列出所有Service资源
endpoints列出所有endpoint资源
ingress列出所有Ingress资源
pv列出所有PersistentVolume资源
pvc列出所有PersistenVolumeClaim资源
sc列出所有StoreageClass资源
cm列出所有ConfigMap资源
secret列出所有Secret资源
deployment列出所有Deployment资源
statefulset列出所有StatefulSet资源
sa列出所有ServiceAccount资源
role列出所有Role资源
rolebinding列出所有RoleBinding资源
clusterrole列出所有ClusterRole资源
clusterrolebinding列出所有ClusterRoleBinding资源

//若不指定命名空间,默认列出当前命名空间下的指定资源


选项含义
-o wide列出资源的更多信息列,如: IP、NODE、NOMINATED NODE、READINESS GATES
-o yaml以YAML形式列出资源的定义文件
–show-labels列出资源的标签 若没有任何标签,则显示“<none>”
–show-all列出指定资源类型的所有资源(不论什么状态)
–sort-by 字段根据指定字段对显示结果进行排序
-L 标签名仅列出包含指定标签的资源,并列出标签
-l 条件方式指定被列出资源的标签条件
-n 命名空间列出指定命名空间下的资源
–all-namespaces列出指定资源类型在所有命名空间下的资源
–watch占用终端以显示最新的资源变更

如:列出Kubernetes集群中的所有节点
在这里插入图片描述


describe命令:列出指定资源的详细信息

指令格式:kubectl describe 资源类型 资源名

1)若不指定类型名,则默认显示该资源类型下的所有资源信息


如:列出master节点的详细信息
在这里插入图片描述


如:查询指定Pod的详细信息
在这里插入图片描述


top命令:列出指定资源类型的CPU和内存使用信息

指令格式:kubectl top 资源类型 选项

资源类型说明
nodes列出节点的相关信息
pods列出Pod的相关信息

选项含义
-n 命名空间列出指定命名空间的
–all-namespaces列出所有命名空间的

//该命令需Kubernetes集群中配置Metrics Server组件

控制容器

run命令:指定一个容器进行创建

指令格式:kubectl run 容器名 选项

选项含义
–image=镜像名指定创建容器的基础镜像
–port=暴露端口指定容器暴露端口
–generator=控制器指定Pod的控制器类型
–restart=策略重启策略
–rm容器在退出后自动删除
-l 标签名=值指定Pod的标签

1)同时会创建一个Pod(Kubernetes不会单独创建和管理容器)

2)直接在容器中执行命令格式:-- sh -c “命令”


如:run命令流程
在这里插入图片描述


如:创建一个容器

1)创建kubia容器,并指定Pod控制器为ReplicationController和相关配置;
在这里插入图片描述
//成功创建前的提示:ReplicationController未来将会被删除,可使用其他代替

2)列出承载该容器的Pod的状态;
在这里插入图片描述
//在Node节点正在创建容器时,为未就绪状态

3)通过describe命令查看Pod内创建容器的详细信息
在这里插入图片描述
//指明了该Pod被分配到node2主机上(Node节点)


expose命令:创建服务,实现外部可访问集群Pod

指令格式:kubectl expose 资源类型 资源名 选项

选项含义
–type=服务类型指定服务类型
–name 服务名指定服务名
–prot=端口指定节点端口
–target-port=端口指定容器端口

1)默认情况下,仅集群内部可访问Pod的IP地址;


如:续上,创建服务实现外部可访问

1)创建LoadBalancer类型的服务,服务名为kubia-http
在这里插入图片描述
2)验证
在这里插入图片描述


scale命令:指定控制器的Pod进行扩缩容

指令格式:kubectl scale 控制器类型 控制器名 --replicas=期望值


如:续上,kubia所管理的Pod扩容至3个,并验证

1)指定期望值进行扩容
在这里插入图片描述
2)查询各个Pod的IP,进行验证
在这里插入图片描述


logs命令:列出Pod内的容器日志数据

指令格式:kubectl logs Pod名称 选项

选项含义
-c 容器名列出指定容器的日志
–previous列出上一个同名容器的日志 默认列出当前同名容器的日志

1)若无选项,则默认列出Pod中所有容器的日志数据;

2)每天或每次日志文件达到10MB时,容器日志会自动轮替;

3)当Pod被删除时,其日志自动也被删除;


exec命令:调用指定Pod内的容器执行命令(重启一个进程)

指令格式:kubectl exec 选项 Pod名 – 命令

选项含义
-i以Stdin打开
-t分配一个为输入端

//-i和-t一起使用才具有意义(分配进入容器的一个终端)


attach命令:调用指定Pod内的容器执行命令(附属在主进程)

指令格式:kubectl attach 选项 Pod名 – 命令

选项含义
-i以Stdin打开
-t分配一个为输入端

//-i和-t一起使用才具有意义(分配进入容器的一个终端)

控制资源

create命令:创建Kubernetes集群的资源

指令格式:kubectl create 选项

选项含义
-f 文件路径指定YAML或JSON文件路径
-n 命名空间名称指定该资源所属的命名空间
namespace 名称创建指定名称的命名空间
–record记录历史版本号
–user 用户名指定执行该命令的用户

Kubernetes资源创建流程:

1)向Kuberntes REST API服务器提供JSON或YAML描述文件;

2)通过create命令创建yaml定义的资源


delete命令:删除Kubernetes集群的指定资源

指令格式:kubectl delete 资源类型 选项

选项含义
资源名删除指定资源类型的单个资源
-l 条件方式删除指定资源类型满足条件方式的资源
–all删除该资源类型的所有资源
–force强制删除
–grace-period 数值删除时的等待时间

1)资源类型若为“all”,则代表所有资源类型


explain命令:列出创建指定资源类型的YAML文件的帮助文档

指令格式:kubectl explain 资源类型

1)“资源类型.字段名”可查看指定资源类型的字段帮助文档


如:列出创建Pod的YAML帮助文档

1)列出创建Pod的YAML文件中所需的字段;
在这里插入图片描述
2)列出指定字段的详细信息
在这里插入图片描述


edit命令:编辑已生成资源的配置文件(操作方式等同Vim)

指令格式:kubectl edit 资源类型 资源名

1)不可修改Role、RoleBinding、ClusterRole和ClusterRoleBinding

//防止权限扩散


apply命令:通过YAML或JSON文件,更新指定文件

指令格式:kubectl apply -f 文件路径

1)若指定的文件不存在,则建立该文件


replace命令:通过YAML或JSON文件,替换指定文件

指令格式:kubectl replace -f 文件路径


set image命令:修改Pod模板中的镜像

指令格式:kubectl set image 资源类型 资源名 容器名=镜像


cordon命令:将节点标记为不可调度(保留该节点的Pod)

指令格式:kubectl cordon 节点名


drain命令:将节点标记为不可调度(并驱逐该节点的Pod)

指令格式:kubectl drain 节点名


uncordon命令:将节点标记为可调度

指令格式:kubectl uncordon 节点名

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐