Kubernetes基础介绍
Kubernetes特性:
自动装箱:构建于容器之上,基于资源依赖和其他约束自动完成容器部署。
自我修复:容器故障后自动重启、节点故障后重新调度容器,以及容器自我修复机制。
水平扩展:通过简单明了实现水平扩展,基于CPU等资源负载率的自动水平扩展。
服务发现和负载均衡:实现内部负载均衡可以实现服务访问负载。
自动发布和回滚:可以自动实现版本的发布和回滚。
秘钥和配置管理:对于密码等信息,专门提供了Secert对象为其解耦。
存储编排:支持多种不同类型的存储,包括本地存储、云存储、网络存储等。 批量处理执行:除服务型应用,还支持批处理作业CI(持续集成),如有需要,一样可以实现容器故障后修复。
Kubernetes特点:
可移植: 支持公有云,私有云,混合云,多重云(multi-cloud) 、
可扩展: 模块化, 插件化, 可挂载, 可组合
自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
Kubernetes架构:
MASTER
Master是集群的控制节点,每个k8s集群中至少需要一个Master节点来维护整个集群的管理和控制,几乎所有的控制命 令都是发给它,它负责执行具体的动作。它很重要,如果它不可用,那么我们所有的控制命令都会失效。Master节点上运行一组关键进程.
kube-apiserver (API Server API服务器):
提供HTTP Rest接口的关键服务,是k8s集群里所有资源的增删查改等操 作的唯一入口,也是集群控制的入口进程。并提供认证、授权、访问控制、API注册和发现等机制
kube-controller-manager( Controller Manager控制管理器):
k8s里所有资源对象的自动化控制中心,可以理解为 资源对象的“大总管”。运行着所有处理集群日常任务的控制器。包括节点控制器、副本控制器、端点控制器及服务账号 和令牌控制器。负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。
kube-scheduler (Scheduler调度器):
负责资源调度(Pod调度)的进程,相当于“调度室”。按照预定的调度策略 将Pod调度到相应的机器上
etcd:
集群的数据存储,他存储着集群中所有的资源对象。数据存储采用的是键值对存储。保存了整个集群的状态。
Node/Worker
Node是集群的工作节点,运行具体的Pod,当某个Node宕机时,其工作负载会被Master自动转移到其他Node节点上。 默认情况下kubelet会向Master注册自己。一旦Node被纳入集群管理,kubelet进程就会定时向Master节点汇报自身的 情况,比如操作系统等信息,这样Master就可以获取每个Node节点的资源使用情况合理的进行调度。如果Node节点在 指定时间不上报,那么Master就会认为它“失联”,标记成“Not Ready”状态。
kubelet
主节点代理,负责Pod对应的容器的创建启停等任务,同时与Master节点密切协作,实现集群管理的基本功能。
kube-proxy
它负责节点的网络,在主机上维护网络规则并执行连接转发。它还负责对正在服务的pods进行负载平衡。 比如一个服务可能会运行多个副本(Pod),由他来控制具体由哪个Pod提供服务。为Service提供cluster内部的服务发 现和负载均衡。
POD
Pod是一组紧密关联的容器集合,它们共享PID、IPC、Network和UTS namespace,是Kubernetes调度的基本单位。
Pod的设计理念是支持多个容器在一个Pod中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式 组合完成服务。 每个Pod都有一个特殊的称之为“根容器”的Pause容器。Pause容器对应的镜像属于k8s平台的一部分,除了Pause容 器外,每个Pod还包含一个或多个紧急相关的用户业务容器。他为每个业务容器提供如下功能:①在pod中担任Linux命 名空间共享的基础。②启用pid命名空间,开启init进程。
Pod 常见状态介绍
1.Pending这个状态意味着,Pod 的 YAML 文件(或通过kubectl命令创建Pod)已经提交给了 Kubernetes,API 对象已 经被创建并保存在 Etcd 当中。但是,这个 Pod 里有些容器因为某种原因而不能被顺利创建。比如,调度不成功。
2.Running。这个状态下,Pod 已经调度成功,跟一个具体的节点绑定。它包含的容器都已经创建成功,并且至少有一个正 在运行中。
3.Succeeded这个状态意味着,Pod 里的所有容器都正常运行完毕,并且已经退出了。这种情况在运行一次性任务时最 为常见。
4.Failed这个状态下,Pod 里至少有一个容器以不正常的状态(非 0 的返回码)退出。这个状态的出现,意味着你得想办 法 Debug 这个容器的应用,比如查看 Pod 的 Events 和日志。
5.Unknown这是一个异常状态,意味着 Pod 的状态不能持续地被 kubelet 汇报给 kube-apiserver,这很有可能是主从 节点(Master 和 Kubelet)间的通信出现了问题。
Kubernetes常用资源项
namespace
命名空间用于实现多租户的资源隔离。Namespace通过将集群内部的资源对象分配到不同的Namespace中,形成逻 辑上分组的不同项目、小组或用户组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。
命名空间为K8s集群提供虚拟的隔离作用,K8s集群初始有两个名字空间,分别是默认名字空间default和系统名字空 间kube-system,除此以外,管理员可以创建新的名字空间满足需要。
Deployment
一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力。你负责描述 Deployment 中的 目标状态,而 Deployment 控制器(Controller) 以受控速率更改实际状态, 使其变为期望状态。你可以定义 Deployment 以创建新的 ReplicaSet,或删除现有 Deployment, 并通过新的 Deployment 收养其资源。
DaemonSet
DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。 当有节点加入集群时, 也会为他们新增一个 Pod 。 当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
StatefulSet
StatefulSet 是用来管理有状态应用的工作负载 API 对象。
ConfigMap
ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。
ConfigMap 将你的环境配置信息和 容器镜像 解耦,便于应用配置的修改。
Volume(存储卷):
K8s集群中的存储卷跟Docker的存储卷有些类似,只不过Docker的存储卷作用范围为一个容器,而K8s的存储卷的生 命周期和作用范围是一个Pod。每个Pod中声明的存储卷由Pod中的所有容器共享。K8s支持非常多的存储卷类型,特别 的,支持多种公有云平台的存储,包括AWS,Google和Azure云;支持多种分布式存储包括GlusterFS和Ceph;也支持 较容易使用的主机本地目录hostPath和NFS。K8s还支持使用Persistent Volume Claim即PVC这种逻辑存储,使用这种 存储,使得存储的使用者可以忽略后台的实际存储技术(例如AWS,Google或GlusterFS和Ceph),而将有关存储实际 技术的配置交给存储管理员通过Persistent Volume来配置。
Service
Kubernetes 中 Service 是 将运行在一个或一组 Pod 上的网络应用程序公开为网络服务的方法。Service也是k8s里核心的资源对象之一,k8s里面的每个Service就是我们提起的“微服务”,之前所介绍的Pod、RC等 资源都是为Service做“嫁衣”的.
Kubernetes常见命令介绍
1、创建资源对象
使用yaml配置文件一次性创建service和rc
kubectl create –f myservice.yaml –f my-rc.yaml
根据目录下所有的.yaml、yml、json文件的定义进行创建
kubectl create –f <directory>
2、查看资源对象
kubectl get pods
kubectl get rc,service,node
3、描述资源对象的详细信息(定位问题时需要用到)
kubectl describe nodes <node-name>
kubectl describe pod <pod-name>
kubectl describe ds <ds-name>
4、删除资源对象
kubectl delete –f pod.yaml (删除pod.yaml定义的名称删除Pod)
kubectl delete pods,services –l name= (删除所有包含某个标签的pod和service)
kubectl delete pods –all (删除所有的Pod)
注意:如果不先删除RC,直接删除Pod,删除之后,RC又自动去创建这个Pod,就相当于重启这个Pod
5、执行容器的命令
kubectl exec <pod-name> date #执行Pod的date命令,默认使用Pod的第一个容器
kubectl exec <pod-name> -c <container-name> date #指定Pod中的某个容器执行date命令
kubectl exec –it <pod-name> -c <container-name> /bin/bash #登录进某个Pod的某个容器
6、查看容器的日志
kubectl logs <pod-name> #查看某个pod的日志
kubectl logs –f <pod-name> -c <container-name> #跟踪容器的日志,相当于tail –f
container-name> /bin/bash #登录进某个Pod的某个容器
### 6、查看容器的日志
kubectl logs #查看某个pod的日志
kubectl logs –f -c #跟踪容器的日志,相当于tail –f