目录
一、架构介绍
二、组件介绍
三、调度介绍
四、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 -nnamespace 查看service
kubectl get ingress -nnamespace
kubectl get node
查看资源属性kubectl describe *****
kubectl describe pods -nnamespacepod-name
kubectl describe deploy -nnamespace deploy-name
kubectl describe service -nnamespace service-name
kubectl describe ingress -nnamespace ingress-name
编辑资源kubect edit *****
kubectl edit pods -nnamespacepod-name
kubectl edit deploy -nnamespacedeploy-name
kubectl edit service -nnamespaceservice-name
kubectl edit ingress -nnamespaceingress-name
查看资源使用
kubectl top node
kubectl top pods -n namespacepod-name
kubectl describe node
重启
kubectl delete pod -nnamespace 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-nnamespace 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:由于资源不足,被驱逐