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

简介: 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/

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
22天前
|
存储 Kubernetes 负载均衡
Kubernetes的“厨房”:架构是菜谱,组件是厨具,资源对象是食材(下)
本文深入探讨了Kubernetes(K8s)的架构、核心组件以及资源对象。Kubernetes作为一个开源的容器编排系统,通过其独特的架构设计和丰富的组件,实现了对容器化应用程序的高效管理和扩展。通过本文的介绍,读者可以深入了解Kubernetes的架构、核心组件以及资源对象,从而更好地应用和管理容器化应用程序。Kubernetes的灵活性和可扩展性使得它成为容器编排领域的领先者,为企业提供了强大的容器运行环境。
|
22天前
|
存储 Kubernetes 监控
K8S核心组件介绍
K8S核心组件介绍
|
8月前
|
Kubernetes 容器
使用Kubeadm部署K8s集群获取kube-scheduler和kube-controller-manager组件状态异常问题
使用Kubeadm部署K8s集群获取kube-scheduler和kube-controller-manager组件状态异常问题
|
8月前
|
Prometheus Kubernetes 监控
prometheus operator监控k8s集群之外的haproxy组件
prometheus operator监控k8s集群之外的haproxy组件
|
8月前
|
存储 Kubernetes Cloud Native
【云原生】k8s组件&架构介绍与K8s最新版部署
【云原生】k8s组件&架构介绍与K8s最新版部署
208 0
|
6天前
|
Kubernetes 网络虚拟化 网络架构
k8s 网络组件详细 介绍
k8s 网络组件详细 介绍
|
22天前
|
Kubernetes API 调度
Kubernetes学习-核心概念篇(二) 集群架构与组件
Kubernetes学习-核心概念篇(二) 集群架构与组件
|
22天前
|
Kubernetes Java API
Kubernetes详解(三)——Kubernetes集群组件
Kubernetes详解(三)——Kubernetes集群组件
35 1
|
22天前
|
JSON Kubernetes 网络架构
Kubernetes CNI 网络模型及常见开源组件
【4月更文挑战第13天】目前主流的容器网络模型是CoreOS 公司推出的 Container Network Interface(CNI)模型
|
22天前
|
Kubernetes 网络协议 调度
Kubernetes架构与组件
Kubernetes架构与组件
33 0