容器编排是指自动化容器应用的部署、管理、扩展和联网的一系列管控操作,能够控制和自动化许多任务,包括调度和部署容器、在容器之间分配资源、扩缩容器应用规模、在主机不可以或者资源不足时将容器从一台主机迁移到其他主机、负载均衡以及监视容器和主机的运行状况等。
1、组件介绍
● Master组件
Apiserver:集群网关,负责接收、校验并响应所有请求; Etcd:集群状态存储; Controller Manager:控制器管理器,负责生命周期功能、扩缩容; Scheduler:调度器,资源调度;
● Worker组件
Kubelet:工作在集群节点之上的代理组件,通过它使用命令可以跟API Server进行交互; Docker:容器运行时环境 Kube-proxy:按需为service对象生成iptables或ipvs规则,从而将流量转发至正确的pod对象
2、安装
● Kind
特点:简单、容易部署,不适用生产环境
● Minikube
特点:相比Kind更加强大,支持虚拟化的能力,使用简单、容易部署,不适用生产环境
● kubeadmin(v1.13版本之后可用于生产环境)
3、kubectl命令
(1)常用命令:kubectl get pod
● kubectl:可查看对象。
● -o yaml:输出详细信息为yaml格式。
● -o wide:以详细列表的格式查看对象。
(2)展示资源的详细信息和相关Event:kubectl describe
(3)进入容器:kubectl exec
(4)查看日志:kubectl logs
4、第一个容器化应用
Kubernetes 跟 Docker 等很多项目最大的不同,就在于它不推荐使用命令行的方式直接运行容器(虽然 Kubernetes 项目也支持这种方式,比如:kubectl run),而是希望用 YAML 文件的方式,即:把容器的定义、参数、配置,统统记录在一个 YAML 文件中,然后用这样一句指令把它运行起来:
kubectl create -f 配置文件
配置文件如下:
API" target="_blank">apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: #标签选择器 matchLabels: app: nginx replicas: 2 #副本数 template: #pod相关信息 metadata: labels: app: nginx spec: containers: - name: nginx #名称 image: nginx:1.7.9 #容器镜像 ports: - containerPort: 80 #端口
这样做的好处是能够知道我们容器运行的相关信息,配置好相关字段提交到kubernetes后,kubernetes会创建出这些对象所定义的容器或者其他类型的 API 资源。
5、控制器模型
● ReplicaSet控制器
能够保证⼀定数量的pod正常运⾏,它会持续监听这些Pod的运⾏状态,⼀旦Pod发⽣故障,就会重启或重建。同时它还⽀持对pod数量的扩缩容和镜像版本的升降级。
● Deployment控制器
控制器并不直接管理pod,⽽是通过管理ReplicaSet来间接管理Pod,支持RS的基础上还 ⽀持滚动升级和回滚版本。
● StatefulSet控制器
StatefulSet 是为了解决有状态服务的问题而设计的资源控制器,可以通过某种方式记录这些状态,然后在 Pod 被重新创建时,能够为新 Pod 恢复这些状态。
适用场景:
○ 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于 PVC 来实现。
○ 稳定的网络标识符,即 Pod 重新调度后其 PodName 和 HostName 不变。
○ 有序部署,有序扩展,基于 init containers 来实现。
○ 有序收缩。
● DaemonSet控制器
可以保证在集群中的每⼀台(或指定)节点上都运⾏⼀个副本。⼀般适⽤于⽇志收集、 节点监控等场景。
● Job控制器
主要⽤于负责批量处理(⼀次要处理指定数量任务)短暂的⼀次性(每个任务仅运⾏⼀次就结束)任务。
● CronJob控制器
与Job控制器不同的是,CronJob可以在特定的时间点(反复的)去运⾏job任务。
6、存储卷与数据持久化
● emptyDir
生命周期与所属pod对象相同,适用于临时存储、数据缓存系统中;
● gitRepo
能通过挂载目录访问指定代码仓库中的数据,即pod资源创建时,首先创建一个空目录clone指定git仓库的数据到该目录,再创建容器挂载该存储卷;
● hostPath
本地存储卷,其生命周期具体所在工作节点一样的持久性;
● 网络文件系统
支持NFS、CephFS等存储;
● Secret
敏感的配置信息,密钥、证书等;
● ConfigMap
为容器中应用提供配置数据以定制程序的行为,做到应用与配置文件的解耦。
hostPaths存储卷挂载方式如下所示:
存储卷挂载由两部分组成,一是容器内的volumeMounts(表示容器内挂载的目录);二是spec.volunes (表示本机上的文件系统)。
7、Service
Service简介:
在kubernetes中,pod是应⽤程序的载体,我们可以通过pod的ip来访问应⽤程序,但是pod的ip地址不是固定的,这也就意味着不⽅便直接采⽤pod的ip对服务进⾏访问。
为了解决这个问题,kubernetes提供了Service资源,Service会对提供同⼀个服务的多个pod进⾏聚合,并且提供 ⼀个统⼀的⼊⼝地址。通过访问Service的⼊⼝地址就能访问到后⾯的pod服务。
Service类型:
● ClusterIP:默认值,它是Kubernetes系统⾃动分配的虚拟IP,只能在集群内部访问。
● Nodeport: 建立在ClusterIP基础上,在集群每个节点的某静态端口暴露服务(30000-32767),集群外可通过nodeip:nodeport访问。
● LoadBalancer:建立在Nodeport基础上,直接调度云厂商的负载均衡将服务暴露到集群外。
● ExternalName:将service映射至由ExternalName字段的内容指定的主机名来暴露服务,通过 externalName 属性指定外部⼀个服务的地址,然后在集群内部访问此service就可以访问到外部的服务了。