k8s 架构、基本概念及命令

2020-08-20 16:40:57 浏览数 (1)

上图各组件功能如下 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

分析各个组件的作用以及架构工作流程:

  1. kubectl发送部署请求到API server
  2. APIserver通知Controller Manager 创建一个Deployment资源。
  3. Scheduler执行调度任务,将两个副本Pod分发到node01和node02 上。
  4. 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

0 人点赞