k8s--kubernetes 组件、资源管理方式

kubernetes 组件

一个 kubernetes 集群主要是由控制节点 (master)、工作节点 (node) 构成,每个节点上都会安装不同的组件。

master:集群的控制平面,负责集群的决策 ( 管理 )

  • ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
  • Scheduler : 负责集群资源调度,按照预定的调度策略将 Pod 调度到相应的 node 节点上
  • ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等
  • Etcd :负责存储集群中各种资源对象的信息

node:集群的数据平面,负责为容器提供运行环境 ( 干活 )

  • Kubelet : 负责维护容器的生命周期,即通过控制 docker,来创建、更新、销毁容器
  • KubeProxy : 负责提供集群内部的服务发现和负载均衡
  • Docker : 负责节点上容器的各种操作

下面,以部署一个 nginx 服务来说明 kubernetes 系统各个组件调用关系:

  1. 首先要明确,一旦 kubernetes 环境启动之后,master 和 node 都会将自身的信息存储到etcd数据库中

  2. 一个 nginx 服务的安装请求会首先被发送到 master 节点的 apiServer 组件

  3. apiServer 组件会调用 scheduler 组件来决定到底应该把这个服务安装到哪个 node 节点上

    在此时,它会从 etcd 中读取各个 node 节点的信息,然后按照一定的算法进行选择,并将结果告知 apiServer

  4. apiServer 调用 controller-manager 去调度 Node 节点安装 nginx 服务

  5. kubelet 接收到指令后,会通知 docker,然后由 docker 来启动一个 nginx 的 pod

    pod 是 kubernetes 的最小操作单元,容器必须跑在 pod 中

  6. 至此一个 nginx 服务就运行了,如果需要访问 nginx,就需要通过 kube-proxy 来对 pod 产生访问的代理

这样,外界用户就可以访问集群中的 nginx 服务了

资源管理方式

资源管理方式有下面三种

  • 命令式对象管理,直接使用命令去操作 k8s 的资源
kubectl run nginx-pod --image=nginx:1.17.1 --port=80
  • 命令式对象配置,通过命令配置和配置文件去操作 k8s 的资源
kubectl create/patch -f nginx-pod.yaml
  • 声明式对象配置:通过 apply 命令和配置文件去操作 kubernetes 资源
kubectl apply -f nginx-pod.yaml

他们之间的对比如下

类型 操作对象 适用环境 优点 缺点
命令式对象管理 对象 测试 简单 只能操作活动对象,无法审计、跟踪
命令式对象配置 文件 开发 可以审计、跟踪 项目大时,配置文件多,操作麻烦
声明式对象配置 目录 开发 支持目录操作

意外情况下难以调试

命令式对象管理

kubectl 命令

kubectl 是 kubernetes 集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。kubectl 命令的语法如下:

kubectl [command] [type] [name] [flags]
  • comand:指定要对资源执行的操作,例如 create、get、delete
  • type:指定资源类型,比如 deployment、pod、service
  • name:指定资源的名称,名称大小写敏感
  • flags:指定额外的可选参数
# 查看所有pod
kubectl get pod 

# 查看某个pod
kubectl get pod pod_name

# 查看某个pod,以yaml格式展示结果
kubectl get pod pod_name -o yaml

资源类型 

kubernetes 中所有的内容都抽象为资源,可以通过下面的命令进行查看

kubectl api-resources

经常使用的资源有下面这些

资源分类 资源名称 缩写 资源作用
集群级别资源 nodes no 集群组成部分
namespaces namespaces ns  隔离 pod
pod资源 pods po 装载容器
pod资源控制器 replicationcontrollers rc 控制pod资源
  replicasets rs 控制pod资源
  deployments deploy 控制pod资源
  daemonsets ds 控制pod资源
  jobs   控制pod资源
  cronjobs cj 控制pod资源
  horizontalpodautoscalers hpa 控制pod资源
  statefulsets sts 控制pod资源
服务发现资源 services svc 统一pod对外接口
  ingress ing 统一pod对外接口
存储资源 volumeattachments   存储
  persistentvolumes pv 存储
  persistentvolumeclaims pvc 存储
配置资源 configmaps cm 配置
  secrets   配置

kubernetes 允许对资源进行多种操作,可以通过 --help 查看详细的操作命令

kubectl --help

经常使用的操作有下面这些:

命令分类 命令 翻译 命令作用
基本命令 create 创建 创建一个资源
  edit 编辑 编辑一个资源
  get 获取 获取一个资源
  patch 更新 更新一个资源
  delete 删除 删除一个资源
  explain 解释 展示资源文档
运行和调试 run 运行 在集群中运行一个指定的镜像
  expose 暴露 暴露资源为Service
  describe 描述 显示资源内部信息
  logs 日志输出容器在 pod 中的日志 输出容器在 pod 中的日志
  attach 缠绕进入运行中的容器 进入运行中的容器
  exec 执行容器中的一个命令 执行容器中的一个命令
  cp 复制 在Pod内外复制文件
  rollout 首次展示 管理资源的发布
  scale 规模 扩(缩)容Pod的数量
  autoscale 自动调整 自动调整Pod的数量
高级命令 apply rc 通过文件对资源进行配置
  label 标签 更新资源上的标签
其他命令 cluster-info 集群信息 显示集群信息
  version 版本 显示当前Server和Client的版本
 下面以一个 namespace / pod 的创建和删除简单演示下命令的使用
# 创建一个命名空间,名字为 dev
[root@dce-10-6-215-215 ~]# kubectl create namespace dev
namespace/dev created

# 查看有哪些命名空间,namespace 可以简写为 ns
[root@dce-10-6-215-215 ~]# kubectl get ns
NAME                  STATUS   AGE
clusterpedia-system   Active   27h
dce-system            Active   6d1h
default               Active   6d1h
dev                   Active   20s
kube-node-lease       Active   6d1h
kube-public           Active   6d1h
kube-system           Active   6d1h

# 启动一个 pod,-n dev 表示在命名空间 dev 下启动,不加的话默认在 default 命名空间下
[root@dce-10-6-215-215 ~]# kubectl run nginx-pod --image=nginx:1.13 -n dev
pod/nginx-pod created

# 查看 pod,在命名空间 dev 下,不加默认是在 default 命名空间下
[root@dce-10-6-215-215 ~]# kubectl get pods -n dev
NAME        READY   STATUS              RESTARTS   AGE
nginx-pod   0/1     ContainerCreating   0          22s

# 删除 pod,要指定命名空间,不加默认是在 default 命名空间下
[root@dce-10-6-215-215 ~]# kubectl delete pod nginx-pod -n dev
pod "nginx-pod" deleted

# 删除命名空间 dev
[root@dce-10-6-215-215 ~]# kubectl delete ns dev
namespace "dev" deleted

命令式对象配置

命令式对象配置就是使用命令配合配置文件一起来操作 kubernetes 资源

创建一个 nginxpod.yaml,内容如下

apiVersion: v1
kind: Namespace  # 创建了一个命名空间
metadata:
  name: test  #  命名空间的名称叫 test

---

apiVersion: v1
kind: Pod
metadata:
  name: nginxpod
  namespace: test  # 在 test 的命名空间上
spec:
  containers:
  - name: nginx-containers
    image: nginx:1.14 # 创建了一个 nginx 镜像

执行 create 命令,创建资源

[root@dce-10-6-215-215 ~]# kubectl create -f nginxpod.yaml
namespace/test created  # 创建了一个命名空间,叫 test
pod/nginxpod created  # 创建了一个 pod,名字叫 nginxpod

执行 delete 命令,删除资源

# 删除 nginxpod.yaml 创建的对象
[root@dce-10-6-215-215 ~]# kubectl delete -f nginxpod.yaml
namespace "test" deleted
pod "nginxpod" deleted

此时发现两个资源对象被删除了

声明式对象配置

声明式对象配置跟命令式对象配置很相似,但是它只有一个命令 apply

# 首先执行一次 kubectl apply -f yaml 文件,创建了资源
[root@dce-10-6-215-215 ~]#  kubectl apply -f nginxpod.yaml
namespace/test created
pod/nginxpod created

# 再次执行一次 kubectl apply -f yaml 文件,发现说资源没有变动
[root@dce-10-6-215-215 ~]#  kubectl apply -f nginxpod.yaml
namespace/test unchanged
pod/nginxpod unchanged

kubectl 可以在 node 节点上运行吗

kubectl 的运行是需要进行配置的,它的配置文件是 $HOME/.kube,如果想要在 node 节点运行此命令,需要将 master 上的 .kube 文件复制到 node 节点上,即在 master 节点上执行下面操作

scp  -r  HOME/.kube   node1: HOME/

 

posted @ 2022-05-03 12:23  邹邹很busy。  阅读(370)  评论(0编辑  收藏  举报