上图各组件功能如下 kubectl: k8s是命令行端,用来发送客户的操作指令。
API server: 是k8s 集群的前端接口,各种客户端工具以及k8s的其他组件 可以通过它管理k8s集群的各种资源。它提供了HTTP/HTTPS RESTful API, 即K8S API.
Scheduler: 负责决定将Pod放在哪个Node上运行。在调度时,会充分考 虑集群的拓扑结构,当前各个节点的负载情况,以及应对高可用、性能、 数据亲和性和需求。
Controller Manager : 负责管理集群的各种资源,保证资源处于预期的 状态。它由多种Controller 组成,包括 Replication Controller、 Endpoints Controller、Namespace Controller、Serviceaccounts Controller等等。
Etcd: 负责保存k8s集群的配置信息和各种资源的状态信息。当数据发生变 化时,etcd会快速的通知k8s相关组件。第三方组件,它有可替换方案。 Consul、zookeeper
Pod:k8s集群的小组成单位。一个Pod内,可以运行一个或多个容器。 大多数情况下,一个Pod内只有一个Container容器。 Flannel: 是k8s集群网路方案,可以保证Pod的跨主机通信。第三方解决 方案,也有替换方案。 Kubelet: 它是Node的agent(代理),当Scheduler确定某个Node上运行 Pod之后,会将Pod的具体配置信息发送给该节点的kubelet,kubelet会根 据这些信息创建和运行容器,并向Master报告运行状态。 kube-proxy: 负责将访问service的TCP/UDP数据流转发到后端的容器。 如果有多个副本,kube-proxy会实现负载均衡。
举个栗子:
代码语言:javascript复制//创建一个deployment资源对象。Pod控制器。
[root@master ~]# kubectl run test-web --image=httpd --replicas=2
分析各个组件的作用以及架构工作流程:
- kubectl发送部署请求到API server
- APIserver通知Controller Manager 创建一个Deployment资源。
- Scheduler执行调度任务,将两个副本Pod分发到node01和node02 上。
- node01和node02上的kubelet在各自节点上创建并运行Pod。 补充: 1.应用的配置和当前的状态信息保存在etcd中,执行kubectl get pod 时 API server 会从etcd中读取这些数据。 2.flannel会为每个Pod分配一个IP。但此时没有创建Service资源,目前 kube-proxy还没有参与进来。
K8s命令汇总
代码语言:javascript复制#查询相关命令
[root@master ~]# kubectl get nodes #查看各节点的状态
[root@master ~]# kubectl api-versions #查看API的所有版本
[root@master ~]# kubectl explain deployment.metadata #查看Deployment资源对象对应的API版本
KIND: Deployment
VERSION: extensions/v1beta1
[root@master ~]# kubectl explain pod #查看pod资源对象对应的api版本
KIND: Pod
VERSION: v1
[root@master ~]# kubectl get pod #查询pod的简略信息
[root@master ~]# kubectl get pod -o wide #查询pod的详细信息
[root@master ~]# kubectl explain service #查看service资源对象对应的api版本
KIND: Service
VERSION: v1
[root@master ~]# kubectl get pod -n kube-system #查询kube-system名称空间中的pod资源对象
#配置群集
[root@master ~]# kubectl taint node master node-role.kubernetes.io/master-
#设置master参加工作
[root@master ~]# kubectl taint node master node-role.kubernetes.io/master="":NoSchedule #设置master不参加工作
[root@master ~]# kubectl label nodes node01 disktype=ssd
#给节点node01打标签“disktype=ssd”(自定义的标签)
[root@master ~]# kubectl get nodes --show-labels #查看nodes的标签
[root@master ~]# kubectl label nodes node01 disktype- #删除ndoe01节点的“disktype”标签
[root@master ~]# kubectl apply -f nginx.yaml #根据yaml文件运行资源
[root@master ~]# kubectl delete deployment test #删除控制器test