Namespace 命名空间
1.资源的分组管理;
2.资源限制;
# 创建命名空间
kubectl create namespace/ns test;
# 查看所有命名空间
kubectl get ns
NAME STATUS AGE
default Active 25h
kube-flannel Active 25h
kube-node-lease Active 25h
kube-public Active 25h
kube-system Active 25h
work Active 87m
* default 默认命名空间,查询资源时默认显示。
* kube-flannel flannel网络插件的命名空间。
kubectl get all -n kube-flannel
* kube-node-lease 是K8s集群中用于节点租约(Node Lease)的一个命名空间。
* kube-public 所有用户(包括未经过身份验证的用户)都可以读取。
* kube-system K8s服务的命名空间,K8s的组件。
# 删除命名空间,会将命名空间中的所有资源全部删除
kubectl delete ns test
# 指定资源的namespace
cp 01-nginx-pod.yaml 04-test-nginx-ns.yaml
cat 04-test-nginx-ns.yaml
vim 04-test-nginx-ns.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: myapp
name: myapp
namespace: work # 创建资源时,指定namespace
spec:
containers:
- image: nginx:1.26
name: myapp
resources: # resources字段是在资源限制时必须添加的
requests: # 缩进在resources下
memory: "64Mi"
cpu: "250m"
limits: # 缩进在resources下
memory: "128Mi"
cpu: "500m"
dnsPolicy: ClusterFirst # 注意:这个字段属于spec,要和containers同级缩进
restartPolicy: Always
status: {}
# 创建Pod
kubectl apply -f 04-test-nginx-ns.yaml
# 指定命名空间查看Pod(显示这样就成功了)
kubectl get pod -n work
NAME READY STATUS RESTARTS AGE
myapp 1/1 Running 0 8m50s
# 如果报错可以查看Pod详细信息,重点关注Events部分,它会提示调度失败的具体原因
kubectl describe pod <pod-name> -n <namespace>
K8s资源限制
Namespace的资源限制主要通过两种资源对象实现:
-
ResourceQuota(资源配额) -
LimitRange(限制范围)
它们共同作用于Namespace级别,用于控制资源使用、防止资源滥用,并确保集群资源的合理分配。
配置示例(ResourceQuota)
# resource-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: ns-resource-quota
namespace: work # 目标Namespace
spec:
hard: # 硬限制(不可突破)
# 计算资源总限制
requests.cpu: "1" # 所有Pod的CPU请求总和≤1核
requests.memory: "1Gi" # 所有Pod的内存请求总和≤1Gi
limits.cpu: "2" # 所有Pod的CPU限制总和≤2核
limits.memory: "2Gi" # 所有Pod的内存限制总和≤2Gi
# 存储资源限制
requests.storage: "5Gi" # 所有PVC的存储请求总和≤5Gi
persistentvolumeclaims: "3" # 最多创建3个PVC
# 对象数量限制
pods: "10" # 最多创建10个Pod
services: "5" # 最多创建5个Service
configmaps: "10" # 最多创建10个ConfigMap
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
配置示例(LimitRange)
# limit-range.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: ns-limit-range
namespace: work # 目标Namespace
spec:
limits:
- type: Container # 对容器的限制
default: # 容器未指定时的默认limits
cpu: "500m" # 默认CPU限制:0.5核
memory: "512Mi" # 默认内存限制:512Mi
defaultRequest: # 容器未指定时的默认requests
cpu: "100m" # 默认CPU请求:0.1核
memory: "128Mi" # 默认内存请求:128Mi
min: # 容器资源的最小值(不能低于此值)
cpu: "50m"
memory: "64Mi"
max: # 容器资源的最大值(不能超过此值)
cpu: "1000m"
memory: "1Gi"
- type: Pod # 对Pod的限制(所有容器的资源总和)
max:
cpu: "2000m" # 单个Pod的总CPU限制≤2核
memory: "2Gi" # 单个Pod的总内存限制≤2Gi
使用流程
1.创建目标Namespace:
kubectl create namespace my-namespace
2.应用ResourceQuota:
kubectl apply -f resource-quota.yaml
# 如果之前有旧的就先删除再更新
3.应用LimitRange:
kubectl apply -f limit-range.yaml
4.查看配置:
# 查看资源配额
kubectl get resourcequota -n my-namespace
kubectl describe resourcequota ns-resource-quota -n my-namespace
# 查看限制范围
kubectl get limitrange -n my-namespace
kubectl describe limitrange ns-limit-range -n my-namespace
注意事项
-
若仅配置
ResourceQuota而无LimitRange,用户创建Pod时必须显式指定资源requests和limits,否则会被拒绝(无法满足配额约束)。 -
LimitRange的默认值仅对新创建的对象生效,不影响已存在的对象。 -
资源限制需根据集群实际容量和业务需求合理配置,避免过松(资源滥用)或过紧(业务无法运行)。
通过这两种机制,可以实现Namespace级别的精细化资源管控,确保Kubernetes集群的稳定性和资源利用率。
Pod:K8s中最小的运行管理单元
Pod:(豆荚),K8s中最小的运行管理单元,它包含一个或多个容器,并共享网络和存储资源。
当我们启动一个 Pod 以后,每个 Pod 内都会有一个 Pause 的容器
Pause容器:给其他业务容器共享网络、共享数据卷、数据通信等;
同一个Pod中的所有容器可以使用127.0.0.1或localhost进行通信;
创建Pod的流程
用户 → API Server(认证/授权/准入校验)→ etcd(存Pod配置,状态Pending) → Scheduler(过滤→打分→选节点,绑定到节点)→ etcd(更新节点信息) → 目标节点kubelet(调用容器运行时拉镜像、配网络/存储、启动容器) → kubelet(健康检查,向API Server上报状态)→ etcd(更新为Running) → 用户(通过kubectl查看到Running状态)

Pod 的网络
-
每个Pod都有独立的IP地址;
-
同一个Pod共享IP和端口,端口号不能冲突,通过localhost通信;
-
K8s集群中的不同Pod,通过IP+端口进行网络通信。
Pod的生命周期
常见的几种状态:
1.Pending:等待调度状态;(调度已经完成,但容器尚未启动)
2.Running:正常运行状态;(调度成功)
3.Succeeded:正常完成任务;(一次性任务完成,并且不会再次启动)
4.Failed:任务未完成;(容器因为非零退出状态而失败)
5.Unknown:未知状态,例如,节点通信故障(K8s无法获取Pod的状态)
6.Initialized:所有初始化容器,初始化成功;
7.Ready:就绪状态,可以响应请求;
8.ContainersReady:所有容器就绪;(所有容器都已经成功启动)
9.PodScheduled:Pod调度成功;(还没有Running)
创建 Pod
| 操作 | 命令 |
|---|---|
| 创建 | kubectl create -f 文件名.yaml kubectl run pod名称 参数 |
| 查询运行状态 | kubectl get pods -n 空间名称,如果不指定则默认显示default空间内的 pod |
| 查询详情 | kebectl describe pod Pod名称 -n 空间名称,如果不指定则默认显示default空间内的 pod |
| 删除 | kubectl delete pod Pod名称 / kubectl delete pod --all |
| 更新(不常用) | kubectl replace 文件名.yaml |
# 使kubectl命令直接生成yaml文件
kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > nginx-deployment.yaml
# 导出某个pod的信息并生成yaml文件
kubectl get pod <pod名称> -o yaml > pod.yaml
# 导出所有pods的yaml信息
kubectl get pods --all-namespaces -o yaml > pods.yaml

完整资源清单模板:(需要多少粘多少)
apiVersion: v1 #必选,版本号,例如v1
kind: Pod #必选,Pod
metadata: #必选,元数据
name: string #必选,Pod名称
namespace: string #创建资源所属于的命名空间,不写的话默认创建在default空间
labels: #自定义标签
- name: string #自定义标签名字
annotations: #自定义注释列表
- name: string
spec: #必选,Pod中容器的详细定义
containers: #必选,Pod中容器列表
- name: string #必选,容器名称
image: string #必选,容器的镜像名称
imagePullPolicy: [Always | Never | IfNotPresent] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令
args: [string] #容器的启动命令参数列表
workingDir: string #容器的工作目录
volumeMounts: #挂载到容器内部的存储卷配置
- name: string #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
readOnly: boolean #是否为只读模式
ports: #端口号名称
containerPort: int #容器需要监听的端口号
hostPort: int #容器所在主机需要监听的端口号,默认与Container相同
protocol: string #端口协议,支持TCP和UDP,默认TCP
env: #容器运行前需设置的环境变量列表
- name: string #环境变量名称
value: string #环境变量的值
resources: #资源限制和请求的设置
limits: #资源限制的设置
cpu: string #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
memory: string #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
requests: #资源请求的设置
cpu: string #Cpu请求,容器启动的初始可用数量
memory: string #内存清楚,容器启动的初始可用数量
livenessProbe: #对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
exec: #对Pod容器内检查方式设置为exec方式
command: [string] #exec方式需要制定的命令或脚本
httpGet: #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #对Pod内个容器健康检查方式设置为tcpSocket方式
port: number
initialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒
timeoutSeconds: 0 #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
periodSeconds: 0 #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged:false
restartPolicy: [Always | Never | OnFailure] #Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定
- name: string
hostNetwork:false #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
volumes: #在该pod上定义共享存储卷列表
- name: string #共享存储卷名称 (volumes类型有很多种)
emptyDir: {} #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
hostPath: string #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
path: string #Pod所在宿主机的目录,将被用于同期中mount的目录
secret: #类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
scretname: string
items:
- key: string
path: string
configMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
name: string
items:
- key: string
path: string
常见错误及排错方法
-
ImagePullBackOff :镜像拉取失败;(一开始就失败)可能原因有镜像仓库无法连接、镜像不存在或者权限不足等。
-
确保镜像能够在集群中访问
-
检查镜像仓库是否可连接
-
确保镜像名称和标签正确
-
检查镜像拉取的凭证是否正确
-
-
CrashLoopBackOff :容器重复启动和崩溃;可能原因是应用程序内部错误、配置问题或者资源不足等。
-
检查容器日志以找出导致容器崩溃的问题
-
检查应用程序配置和资源使用情况
-
确保容器运行时参数正确
-
-
ErrImagePull :拉取镜像失败;(拉取过程中失败)通常是镜像无效、镜像仓库无法连接或者权限问题等。
-
检查镜像是否存在
-
检查镜像仓库是否可连接
-
检查拉取镜像的权限
-
-
CreateContainerConfigError :当 Pod 创建容器配置失败时会出现这个报错。可能是容器配置文件错误、命令错误或者环境变量设置问题等;
-
检查容器配置文件是否正确
-
确保容器命令和参数正确
-
检查环境变量的设置是否正确
-
-
PodInitializing :表示 Pod 正在初始化;这通常是因为容器启动需要时间,可以耐心等待。
-
等待 Pod 初始化完成
-
-
Pending :Pod 处于待定状态,长时间Pending时需要检查节点状态;可能是因为节点资源不足或者调度问题等。可以使用 kubectl describe pod 命令查看具体原因。
-
检查节点资源是否充足
-
检查调度器是否有足够的资源可用来调度 Pod
-
-
Error :Pod 出错,网络、权限、容器运行错误;可能是由于容器无法运行、网络问题或者权限问题等。可以使用 kubectl logs 命令查看容器日志获取更多信息。
-
检查容器是否能够正常运行
-
检查网络是否正常
-
检查权限是否正确配置
-
91

被折叠的 条评论
为什么被折叠?



