Kubernetes (K8s) is an open-source system for automating deployment, scaling, and management of containerized applications.
k8s是一个开源的云操作系统,能够用来自动化部署,扩缩容和管理我们的容器应用,简单来说,就是提供了容器编排和管理功能的系统
架构图
Master:
- ApiServer:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
- Scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
- Controller-Manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
- ETCD:保存了整个集群的所有信息;
node:
- Kubelet :负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
- docker:负责镜像管理以及Pod和容器的真正运行(CRI);
- kubeproxy:负责为Service提供cluster内部的服务发现和负载均衡;
核心附件:
- CoreDNS:负责为整个集群提供DNS服务
- Dashboard:提供一个简单的GUI界面来查看集群信息和操作集群
- Ingress:为服务提供外网入口,提供域名访问服务功能
- Flannel:为集群之间提供网络连接服务,分配pod和serviceIP功能
基本概念
容器:一种轻量级、可移植、自包含的软件打包技术
Master:为用户可和服暴露API,以最优方式调度工作负载,编排其他组件
Pod: k8s最小调度单位,封装了一个或者多个容器的资源对象,Pod内所有容器共享命名空间和存储资源,类比豌豆荚
资源标签:一个键值型(key/value)数据,辨别pod的属性,或者帮助Scheduler来进行调度
标签选择器: Lable Selector,根据标签过滤符合条件的资源对象
namespace:资源对象的隔离,Service、Deployment、Pod
Volume:存储卷,独立于容器文件系统的存储空间,为容器提供持久存储能力
Pod控制器:用户不会直接部署管理pod,借助另一个抽象的工具【控制器(control) 】进行管理,保证副本数量达到预期
以下是Control的类型和功能列表
类型 | 功能 | 备注 |
---|---|---|
ReplicationController | 保证Pod的副本数达到预期 | 几乎废弃 |
ReplicaSet | 新一代RC,支持基于集合的标签选择器 | 新一代控制器 |
Deployment | 是最常用的管理无状态的pod,构建于RS之上 | 支持基于集合( set-based )的标签选择器,以及它的滚动更新( Rolling-Update )机制,区别于RS的地方 |
StatefulSet | 有状态的持久化应用,如database,为每个Pod创建独特标识,确保Pod间顺序性 | |
DaemonSet | 用于确保每个节点都运行某Pod的一个副本,新增节点也会被添加此类Pod,用于运行集群存储守护进程,如ceph和glusterd,日志收集进程fluentd、logstash以及监控进程,prometheus的Node Exporter等 | |
Job | 运行完成后可终止的应用,如批处理作业任务 |
- 命名空间
作用:资源配额的隔离:CPU、Memory
1 | kubectl get namespace |
创建一个命名空间
1 | cat namesapce-dev.yaml |
简单命令创建
1 | kubectl create ns dev |
注意:不同命名空间下SvcIP、PodIP是可以访问的,是对名字的隔离
k8s服务、网络、存储概念
Service概念
Service 是建立在一组Pod 对象之上的资源抽象,它通过标签选择器选定一组Pod 对象,并为这组Pod 对象定义一个统一的固定访问入口(通常是一个IP 地址),若K8s 集群存在DNS 附件,它就会在Service 创建时为其自动配置一个DNS 名称以便客户端进行服务发现。到达Service IP 的请求将被负载均衡至其后的端点一一各个Pod 对象之上,Service从本质上来讲是一个四层代理服务。另外,Service 还可以将集群外部流量引入到集群中来。
Service类型
第一种是仅用于集群内部通信的ClusterIP类型;
第二种是接入集群外部请求的NodePort 类型它工作于每个节点的主机IP 之上;
第三种是LoadBalancer 类型,可以把外部请求负载均衡至多个Node 的主机IP 的NodePort 之上
此三种类型中,每一种都以其前一种为基础才能实现,而且第三种类型中的LoadBalancer 需要协同集群外部的组件才能实现,此外部组件并不接受Kubemetes的管理。
第四种是ExternalName,通过将Service映射由ExternalName字段的内容指定的主机名来暴露服务
Service IP 是一种虚拟IP ,也称为Cluster IP ,它专用于集群内通信,通常使用专用的地址段,如“ 10.96.0.0/12 ”网络 PodIP常用: 10.244.0.0/16
Ingress:Pod和service都只能在集群内部通信,Ingress可以实现HTTPS(七层)负载均衡,实现和集群外部通信,本身是一组路由规则的集合,其控制器主要使用Nginx,或者haproxy
HostPort和NodePort的区别:NodetPort是通过所有节点暴露容器服务,而HostPort由Pod对象所在的节点IP地址来暴露
k8s集群的网络
目的:
所有Pod之间不需要经过NAT直接通信,都在一个扁平的网络空间内
所有集群内节点可不经过NAT机制直接和所有容器进行通信
分类:
各主机自身的网络,地址配置于主机网络接口,配置于k8s集群构建之前,不能由k8s管理
k8s集群专用于pod资源对象的虚拟网络,配置在Pod的容器接口上,为Pod设定IP和网络,借助于CNI插件实现,可部署k8s集群之外或者托管在集群上,需要在构建集群有管理员定义
专用于service资源对象的虚拟网络,不配置在任何主机或者容器的网络接口,通过node的kube-proxy配置为iptables或者ipvs规则,网络在集群创建时指定
Kubernetes 资源对象
类型 | 说明 |
---|---|
工作负载( Workload ) | 通常称为pod 控制器,主要分为有状态、无状态 |
发现和负载均衡( Discovery & LB ) | Ingress(七层负载均衡) |
配置和存储( Config & Storage ) | 挂载外部存储卷 |
集群( Cluster )资源 | Node、Role、ClusterRole、RoleBinding、 ClusterRoleBinding |
元数据( Metadata ) | 具有kind 、apiVersion 、metadata 、spec 和status 五个一级宇段 |
资源类型( resource type )是指在URL 中使用的名称,如Pod 、Namespace 和Service等,其URL 格式为“ GROUPNERSION度ESOURCE ”,如apps/v1/deployment 。
apiVersion 版本号,例如 v1
kind 代表着资源对象所属的类 Pod/Deployment/Service/Namespace
metadata 字段为资源提供元数据信息,如名称、隶属的名称空间和标签等;
spec 则用于定义用户期望的状态,不同的资源类型,其状态的意义也各有不同
status 则记录着活动对象的当前状态信息,它由Kubemetes 系统自行维护,对用户来说为只读字段
如果是YAML 格式的清单文件,多个资源彼此之间要使用—
单独的一行进行资源分割,这样,多个资源就将以清单文件中定义的次序被create 、apply等子命令调用
kubectl api-versions 查看现有api的版本
kubectl常用命令
kubectl 的命令分类:
类型 | 命令 |
---|---|
陈述式命令( imperative command ) | run , expose 、delete 和get 等命令 |
陈述式对象配置( imperative object configuration ) | create 、delete 、get 、describe和replace |
声明式对象配置( declarative object config uration ) | apply |
1 | 1、创建一个nginx的deployment |