资源管理
在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。
kubernetes的本质就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在
kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。
kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在pod中,而kubernetes一般也不会
直接管理Pod,而是通过Pod控制器来管理Pod的。
Pod可以提供服务之后,就要考虑如何访问Pod中服务,kubernetes提供了Service资源实现这个功能。
当然,如果Pod中程序的数据需要持久化,kubernetes还提供了各种存储系统。

学习kubernetes的核心,就是学习如何对集群上的Pod、Pod控制器、Service、存储等各种资源进行操作
Namespace
Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。
默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,
那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成
逻辑上的“组”,以方便不同的组的资源进行隔离使用和管理。
可以通过kubernetes的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结
合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量,内存使用量等等,来实现租户可用资源的管理。
[root@dev-k8s-master1 ~]# kubectl get ns NAME STATUS AGE default Active 629d # 所有未指定Namespace的对象都会被分配在default命名空间 kube-node-lease Active 629d # 集群节点之间的心跳维护,v1.13开始引入 kube-public Active 629d # 此命名空间下的资源可以被所有人访问(包括未认证用户) kube-system Active 629d # 所有由kubernetes系统创建的资源都处于这个命名空间 # 查看ns详情 命令:kubectl describe ns ns名称 [root@dev-k8s-master1 ~]# kubectl describe ns default Name: default Labels: <none> Annotations: <none> Status: Active # Active:命名空间正在使用中 Terminating:正在删除命名空间 # ResourceQuota 针对namespace做的资源限制 # ResourceLimits 针对namespace中的每个组件做的资源限制 No resource quota. No resource limits.
创建
# 创建namespace [root@dev-k8s-master1 ~]# kubectl create ns dev namespace/dev created
删除
# 删除namespace [root@dev-k8s-master1 ~]# kubectl delete ns dev namespace "dev" deleted
配置方式
首先准备一个yaml文件:ns-dev.yaml
apiVersion: v1 kind: Namespace metadata: name: dev
然后就可以执行对应的创建和删除命令了:
创建: kubectl create -f ns-dev.yaml
删除: kubectl delete -f ns-dev.yaml
Pod
Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容易必须存在于Pod中。
Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。
kubernetes在集群启动后,集群中的各个组件也都是以Pod方式运行的。可以通过下面命令查看:
[root@dev-k8s-master1 ~]# kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE coredns-94d74667-7pqtv 1/1 Running 0 222d coredns-94d74667-zdggn 1/1 Running 0 222d etcd-dev-k8s-master1 1/1 Running 1 86d etcd-dev-k8s-master2 1/1 Running 67 86d etcd-dev-k8s-master3 1/1 Running 284 86d kube-apiserver-dev-k8s-master1 1/1 Running 1 86d kube-apiserver-dev-k8s-master2 1/1 Running 41 293d kube-apiserver-dev-k8s-master3 1/1 Running 50 293d kube-controller-manager-dev-k8s-master1 1/1 Running 1 86d kube-controller-manager-dev-k8s-master2 1/1 Running 154 293d kube-controller-manager-dev-k8s-master3 1/1 Running 153 293d kube-flannel-ds-amd64-cgm44 1/1 Running 1 629d kube-flannel-ds-amd64-dtnwt 1/1 Running 1 86d kube-flannel-ds-amd64-vv8j5 1/1 Running 2 629d kube-proxy-d48rj 1/1 Running 0 293d kube-proxy-rthxh 1/1 Running 1 86d kube-proxy-xrf4m 1/1 Running 0 293d kube-scheduler-dev-k8s-master1 1/1 Running 1 86d kube-scheduler-dev-k8s-master2 1/1 Running 126 293d kube-scheduler-dev-k8s-master3 1/1 Running 170 293d
创建并运行
kubernetes没有提供单独运行Pod的命令,都是通过Pod控制器来实现的
# 命令格式: kubectl run (pod控制器名称)[参数] # --image 指定Pod的镜像 # --port 指定端口 # --namespace 指定namespace [root@dev-k8s-master1 ~]# kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace dev deployment.apps/nginx created
配置操作
创建一个pod-nginx.yaml,内容如下:
apiVersion: v1 kind: Pod metadata: name: nginx namespace: dev spec: containers: - image: nginx:1.17.1 imagePullPolicy: IfNotPresent name: pod ports: - name: nginx-port containerPort: 80 protocol: TCP
Label
Label是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。
Label的特点:
- 一个Label会以key/value键值对的形式添加到各种对象上,如Node、Pod、Service等等
- 一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去
- Label通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除
可以通过Label实现资源的多维度分组,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。
一些常用的Label示例如下:
- 版本标签:"version":"release","version":"stable"......
- 环境标签:"environment":"dev","environment":"test","environment":"pro"
- 架构标签:"tier":"frontend","tier":"backend"
标签定义完毕之后,还要考虑到标签的选择,这就要使用到Label Selector,即:
Label用于给某个资源对象定义标识
Label Selector用于查询和筛选拥有某些标签的资源对象
当前有两种Label Selector:
- 基于等式的Label Selector
name = slave: 选择所有包含Label中key="name"且value="slave"的对象
env != production: 选择所有包括Label中的key="env"且value不等于"production"的对象 - 基于集合的Label Selector
name in (master,slave): 选择所有包含Label中的key="name"且value="master"或"slave"的对象
name not in (frontend): 选择所有包含Label中key="name"且value不等于"frontend"的对象
标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号","进行分隔即可。例如:
# 创建标签 [root@dev-k8s-master1 ~]# kubectl label pods nginx -n dev version=1.0 pod/nginx labeled # 查看标签 [root@dev-k8s-master1 ~]# kubectl get pods nginx -n dev --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx 1/1 Running 0 3h35m version=1.0 [root@dev-k8s-master1 ~]# kubectl label pods nginx -n dev tier=back pod/nginx labeled [root@dev-k8s-master1 ~]# kubectl get pods nginx -n dev --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx 1/1 Running 0 3h36m tier=back,version=1.0 # 更新标签 [root@dev-k8s-master1 ~]# kubectl label pods nginx -n dev version=2.0 --overwrite pod/nginx labeled [root@dev-k8s-master1 ~]# kubectl get pods nginx -n dev --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx 1/1 Running 0 3h36m tier=back,version=2.0 # 筛选标签 [root@dev-k8s-master1 ~]# kubectl get pods -l "version=2.0" -n dev NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 3h41m [root@dev-k8s-master1 ~]# kubectl get pods -l "version!=2.0" -n dev NAME READY STATUS RESTARTS AGE arachneexecutionengine-deploy-7bbbddd546-l84g8 1/1 Running 0 222d # 删除标签 [root@dev-k8s-master1 ~]# kubectl label pods nginx -n dev tier- pod/nginx labeled
配置方式
apiVersion: v1 kind: Pod metadata: name: nginx namespace: dev labels: version: "3.0" env: "test" spec: containers: - image: nginx:1.17.1 name: pod ports: - name: nginx-port containerPort: 80 protocol: TCP
然后就可以执行对应的更新命令了:kubectl apply -f pod-nginx.yaml
Deployment
在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成
的。Pod控制用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。
在kubernetes中Pod控制器的种类有很多,本章节只介绍一种:Deployment。
Service
通过上节课的学习,已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务。
虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两个问题:
- Pod IP会随着Pod的重建产生变化
- Pod IP仅仅是集群内可见的虚拟IP,外部无法访问
这样对于访问这个服务带来了难度。因此,kubernetes设计了Service来解决这个问题。
Service可以看作是一组同类Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?