目录
一、架构介绍
二、组件介绍
三、调度介绍
四、CLI指令介绍
五、常见CLI指令
六、常见问题排查思路
一、架构介绍
Kubernetes系统架构为客户端/服务端(C/S)架构,Master作为服务端,Node作为客户端。
Master服务端也被称为主控节点,它在集群中主要负责如下任务:
(1)集群的“大脑”,负责管理所有Node
(2)负责调度Pod在哪些节点上运行
(3)负责控制集群运行过程中的所有状态
Node客户端也被称为工作节点,它在集群中主要负责如下任务:
(1)负责管理所有容器(Container)
(2)负责监控/上报所有Pod的运行状态
二、组件介绍
Master服务端主要负责管理和控制整个Kubernetes集群,对集群做出全局性决策。
Master服务端主要包含如下组件:
(1)kube-apiserver组件:集群的HTTP REST API接口,是集群控制的入口。
(2)kube-controller-manager组件:集群中所有资源对象的自动化控制中心。
(3)kube-scheduler组件:集群中Pod资源对象的调度服务。
Node客户端是Kubernetes集群中的工作节点,Node节点上的工作由Master服务端进行分配。
Node节点主要包含如下组件:
(1)kubelet组件:负责管理节点上容器的创建、删除、启停等任务,与Master节点进行通信。(2)kube-proxy组件:负责Kubernetes服务的通信及负载均衡服务。
(3)container组件:负责容器的基础管理服务,接收kubelet组件的指令。
(4)namespace:kubernetes集群中的虚拟空间,将资源进行逻辑上的隔离。
(5)pod:Kubernetes中能够创建和部署的最小单元,是Kubernetes集群中的一个应用实例Pod中包含了一个或多个容器,还包括存储、网络等各个容器共享的资源。可简单理解为一个启动java服务,基本单独创建pod使用。
(6)deployment:最常用无状态服务资源,会自动创建replicasets,replicasets能够控制副本数量。
(7)service:service是一组逻辑pod的抽象,为一组pod提供统一入口,用户只需与service打交道,service提供DNS解析名称,负责追踪pod动态变化并更新转发表,通过负载均衡算法最终将流量转发到后端的pod。4层tcp。
(8)ingress:ingress是一个管理kubernetes集群外部到内部流量的api对象,7层http,https。(9)configmap:用来将非加密数据保存到键值对中。一般用作环境变量、命令行参数或者存储卷中的配置文件。
三、调度介绍
(1)创建 Deployment ,请求被发送至 API Server ,经过认证、鉴权和准入, Deployment 对象被保存至 etcd 。
(2)Controller Manager 中的 Deployment Controller 监听 API Server 中所有 Deployment 的变更事件,捕获 Deployment 的创建事件。
(3)Deployment Controller 会创建新的 ReplicaSet 。
(4)ReplicaSet Controller 将新建 Pod 的请求发送至 API Server , API Server 将 Pod 保存至 etcd 。
(5)调度器监听 API Server 中所有 nodeName 为空的 Pod ,经过一系列调度算法评分,将 pod 的 nodeName 属性保存至 etcd 。
(6)被调度节点的 kubelet 监听到有归属于自己节点的新 Pod 时,开始加载 Pod 清单,下载 Pod 所需的配置信息,并完成 Pod 的启动。
四、CLI指令介绍
kubectl CLI命令行结构分别为
Command
、
TYPE
、
NAME
及
Flag
,分别介绍如下。
(1)Command :指定命令操作,例如 create 、 get 、 describe 、 delete 等。
(2)TYPE :指定资源类型,例如 pod 、 pods 、 rc 等。资源类型不区分大小写。
(3)NAME :指定资源名称,可指定多个,例如 name1 name2 。资源名称需要区分大小写。
(4)Flag :指定可选命令行参数,例如 -n 命令行参数用于指定不同的命名空间。
五、常见CLI指令
查看资源信息kubect get *****
kubectl get pods -n namespace 查看pods
kubectl get deploy -n namespace 查看deployment
kubectl get service -n namespace 查看service
kubectl get ingress -n namespace
kubectl get node
查看资源属性kubectl describe *****
kubectl describe pods -n namespace pod-name
kubectl describe deploy -n namespace deploy-name
kubectl describe service -n namespace service-name
kubectl describe ingress -n namespace ingress-name
编辑资源kubect edit *****
kubectl edit pods -n namespace pod-name
kubectl edit deploy -n namespace deploy-name
kubectl edit service -n namespace service-name
kubectl edit ingress -n namespace ingress-name
查看资源使用
kubectl top node
kubectl top pods -n namespace pod-name
kubectl describe node
重启
kubectl delete pod -n namespace pod-name
kubectl rollout restart deploy -n namespace deployname
查看日志
kubectl logs -n cityos pod-name -c container-name -f
kubectl logs -n cityos pod-name -c container-name --tail=100
进入容器
kubectl exec -it -n cityos pod-name -c container-name --sh
设置节点不调度/调度,驱离
kubectl cordon node node-name
kubectl uncordon node node-name
kubectl drain node-name --force --ignore-daemonsets
回滚
kubectl rollout history deploy -n namespace deploy-name
kubectl rollout history deploy -n namespace deploy-name --revision 2
kubectl rollout undo deploy -n namespace deploy-name --to-revision=2
设置服务个数
kubectl scale deployment servicename -n namespace --replicas=1
六、常见问题排查思路
node常见状态:
1)Ready:正常运行状态
2)UnReady:组件状态不正常,查看kebelet、docker等服务
3)Unknown:节点已失联,查看节点状态
pod的常见状态:
1)Running:Pod已经绑定到一个节点上了,并且已经创建了所有容器。只是有一个容器正在运行,或者在启动中。
2)Pending:Pod创建已经提交给k8s,但是因为某种原因不能顺利创建,例如集群内存不足
3)InvalidImageName: 无法解析镜像名称
4)ImagePullBackOff: 正在重试拉取
5)ErrImagePull: 通用的拉取镜像出错
上面这几种状态都可以用kubectl describe pod查看,event有详细原因
6)CrashLoopBackOff: 容器退出,容器kubelet正在将它重启
7)Unkown:由于某中原因apiserver无法获取到Pod的状态。通常是由于Master与pod所在的主机失去连接了。
8)Evicted:由于资源不足,被驱逐