Kubernetes 实战入门核心内容总结
Kubernetes(K8s)核心资源与控制器展开实战教学,涵盖 Namespace、Pod、Label、Deployment 四大核心组件,包含概念定义、默认配置、操作命令及配置文件示例,以下是详细总结:
一、Namespace(命名空间)
1. 核心作用
实现资源隔离,支持多环境(如开发、测试、生产)或多租户的资源划分与管理,可结合 K8s 授权机制分配管理权限,搭配资源配额机制(如 CPU、内存限制)控制租户资源占用。
2. 默认 Namespace
K8s 集群启动后自动创建 4 个默认命名空间,功能如下表:
| 命名空间名称 | 状态 | 核心作用 |
|---|---|---|
| default | Active | 未指定 Namespace 的资源默认分配至此 |
| kube-node-lease | Active | 维护集群节点间心跳(v1.13 + 引入) |
| kube-public | Active | 资源对所有用户(含未认证用户)可见 |
| kube-system | Active | 存放 K8s 系统组件(如 apiserver、coredns) |
3. 关键操作(命令 + 配置文件)
| 操作类型 | 命令行方式 | 配置文件方式(以创建 dev 命名空间为例) |
|---|---|---|
| 查看 | - 查看所有:kubectl get ns- 查看指定:kubectl get ns <ns名称>- 指定格式(yaml/json):kubectl get ns <ns名称> -o yaml- 查看详情:kubectl describe ns <ns名称> |
- |
| 创建 | kubectl create ns <ns名称>(如kubectl create ns dev) |
1. 编写 yaml 文件(如 ns-dev.yaml):yaml<br>apiVersion: v1<br>kind: Namespace<br>metadata:<br> name: dev<br>2. 执行创建:kubectl create -f ns-dev.yaml |
| 删除 | kubectl delete ns <ns名称> |
kubectl delete -f ns-dev.yaml |
二、Pod(最小管理单元)
1. 核心概念
- K8s 集群中最小部署与管理单元,容器必须运行在 Pod 内,一个 Pod 可包含 1 个或多个容器(通常为 "1 主多辅助" 模式)
- K8s 系统组件(如 coredns、etcd)均以 Pod 形式运行,可通过
kubectl get pod -n kube-system查看
2. 关键操作
(1)创建与运行
K8s 不直接单独运行 Pod,需通过控制器(如 Deployment)或自主式创建:
- 控制器创建(推荐,支持自动重建):
kubectl run <pod名称> --image=<镜像> --port=<端口> --namespace=<ns名称>(如kubectl run nginx --image=nginx:latest --port=80 --namespace dev) - 自主式创建(删除后不重建):
kubectl create deployment <名称> --image=<镜像> --port=<端口> -n <ns名称>
(2)查看与访问
- 查看基本信息:
kubectl get pods -n <ns名称>(加-o wide可显示 Pod IP、所在节点) - 查看详情(含容器状态、事件):
kubectl describe pod <pod名称> -n <ns名称> - 访问 Pod:先通过
kubectl get pods -n <ns名称> -o wide获取 Pod IP,再用curl http://<Pod IP>:<端口>访问(如curl http://10.244.1.23:80)
(3)删除
-
自主式 Pod 删除:
kubectl delete pod <pod名称> -n <ns名称> -
控制器管理的 Pod 删除:需先删除控制器(如 Deployment),步骤为:
-
查看控制器:
kubectl get deploy -n <ns名称>
-
删除控制器:
kubectl delete deploy <控制器名称> -n <ns名称>
(Pod 会随控制器删除)
-
(4)配置文件创建
编写 pod-nginx.yaml:
yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx # Pod名称
namespace: dev # 所属命名空间
spec:
containers:
- image: nginx:latest # 容器镜像
name: pod # 容器名称
ports:
- name: nginx-port # 端口名称
containerPort: 80 # 容器内部端口
protocol: TCP # 协议类型
执行命令:kubectl create -f pod-nginx.yaml(创建)、kubectl delete -f pod-nginx.yaml(删除)
三、Label(标签)
1. 核心作用
- 以key/value 键值对形式附加到资源(Pod、Node、Service 等),用于资源分类、筛选与管理,支持多维度分组(如版本、环境、架构)
- 特点:一个资源可添加多个 Label,一个 Label 可附加到多个资源,支持创建后动态添加 / 删除
2. 常用 Label 示例
| 标签类型 | 示例 |
|---|---|
| 版本标签 | version: release、version: stable |
| 环境标签 | environment: dev、environment: test、environment: pro |
| 架构标签 | tier: frontend(前端)、tier: backend(后端) |
3. Label Selector(标签选择器)
用于筛选符合条件的资源,分两类:
- 基于等式 :如
name=slave(选 key=name 且 value=slave 的资源)、env!=production(选 key=env 且 value≠production 的资源) - 基于集合 :如
name in (master, slave)(选 key=name 且 value 为 master/slave 的资源)、name not in (frontend)(选 key=name 且 value≠frontend 的资源) - 多条件组合:用逗号分隔,如
name=slave, env!=production
4. 关键操作
| 操作类型 | 命令行方式(以 Pod 为例,-n 指定命名空间) | 配置文件方式(在 Pod yaml 中添加 labels) |
|---|---|---|
| 打标签 | kubectl label pod <pod名称> <key>=<value> -n <ns名称>(如kubectl label pod nginx-pod version=1.0 -n dev) |
编写 Pod yaml 时添加:yaml<br>metadata:<br> labels:<br> version: "3.0"<br> env: "test"<br>执行更新:kubectl apply -f pod-nginx.yaml |
| 更新标签 | kubectl label pod <pod名称> <key>=<新value> -n <ns名称> --overwrite(如kubectl label pod nginx-pod version=2.0 -n dev --overwrite) |
修改 yaml 中 labels 值,执行kubectl apply -f pod-nginx.yaml |
| 查看标签 | kubectl get pod <pod名称> -n <ns名称> --show-labels |
- |
| 筛选标签 | kubectl get pod -n <ns名称> -l <selector> --show-labels(如kubectl get pod -n dev -l version=2.0 --show-labels) |
- |
| 删除标签 | kubectl label pod <pod名称> <key>- -n <ns名称>(如kubectl label pod nginx-pod version- -n dev) |
删除 yaml 中对应 label 项,执行kubectl apply -f pod-nginx.yaml |
四、Deployment(Pod 控制器)
1. 核心作用
- 属于 K8s Pod 控制器,用于管理 Pod 生命周期,确保 Pod 数量与状态符合预期(如 Pod 故障时自动重启 / 重建),支持滚动更新、副本扩缩容等功能
- 工作逻辑:通过 Label Selector 匹配 Pod,控制 Pod 副本数(replicas),维持集群稳定
2. 关键操作
(1)创建与配置
- 命令行创建(指定副本数、镜像、端口):
kubectl create deploy <名称> --image=<镜像> --port=<端口> --replicas=<副本数> -n <ns名称>(如kubectl create deploy nginx --image=nginx:latest --port=80 --replicas=3 -n dev) - 配置文件创建(deploy-nginx.yaml):
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx # 控制器名称
namespace: dev # 所属命名空间
spec:
replicas: 3 # 期望Pod副本数
selector: # 匹配Pod的Label Selector
matchLabels:
run: nginx
template: # Pod模板(定义Pod配置)
metadata:
labels:
run: nginx # 与selector.matchLabels对应
spec:
containers:
- image: nginx:latest # 容器镜像
name: nginx # 容器名称
ports:
- containerPort: 80 # 容器端口
protocol: TCP
执行命令:kubectl create -f deploy-nginx.yaml(创建)、kubectl delete -f deploy-nginx.yaml(删除)
(2)查看与管理
- 查看 Deployment 基本信息:
kubectl get deploy -n <ns名称>(加-o wide显示容器、镜像、选择器) - 查看 Deployment 详情(含策略、事件):
kubectl describe deploy <名称> -n <ns名称> - 查看 Deployment 管理的 Pod:
kubectl get pods -n <ns名称>(Pod 名称含 Deployment 关联的随机字符串)
(3)核心字段说明
READY:就绪的 Pod 副本数(格式:就绪数 / 期望数,如 3/3)UP-TO-DATE:成功升级的 Pod 副本数AVAILABLE:当前可用的 Pod 副本数StrategyType:更新策略(默认 RollingUpdate,滚动更新)
具体示例:
kubernetes在集群启动之后,会默认创建几个namespace:
[root@master ~]# kubectl get namespaces
NAME STATUS AGE
default Active 47h //所有未指定Namespace的对象都会被分配在default命名空间
kube-node-lease Active 47h //集群节点之间的心跳维护,v1.13开始引入
kube-public Active 47h //此命名空间下的资源可以被所有人访问(包括未认证用户)
kube-system Active 47h //所有由Kubernetes系统创建的资源都处于这个命名空间
下面来看namespace资源的具体操作:
查看:
查看所有的ns:
[root@master ~]# kubectl get ns
NAME STATUS AGE
default Active 47h
kube-node-lease Active 47h
kube-public Active 47h
kube-system Active 47h
查看指定的ns:
[root@master ~]# kubectl get ns default
NAME STATUS AGE
default Active 2d
指定输出格式:命令:kubectl get ns ns名称 -o 格式参数# kubernetes支持的格式有很多,比较常见的是wide、json、yaml:
[root@master ~]# kubectl get ns default -o yaml
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: "2025-10-28T10:52:10Z"
labels:
kubernetes.io/metadata.name: default
name: default
resourceVersion: "44"
uid: c0721538-50eb-4b6d-b889-22c949bec80e
spec:
finalizers:
- kubernetes
status:
phase: Active
查看ns详情:
[root@master ~]# kubectl describe ns default
Name: default
Labels: kubernetes.io/metadata.name=default
Annotations: <none>
Status: Active // Active 命名空间正在使用中 Terminating 正在删除命名空间
No resource quota. //针对namespace做的资源限制# LimitRange针对namespace中的每个组件做的资源限制
No LimitRange resource.
创建namespace:
[root@master ~]# kubectl create ns dev
namespace/dev created
删除:(删除namespace)
[root@master ~]# kubectl delete ns dev
namespace "dev" deleted
配置方式:
首先准备一个yaml文件,ns-dev.yaml:
[root@master ~]# vim ns-dev.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
~
然后就可以执行对应的创建和删除命令了:
创建:
[root@master ~]# kubectl create -f ns-dev.yaml
namespace/dev created
[root@master ~]# kubectl get -f ns-dev.yaml
NAME STATUS AGE
dev Active 37s
[root@master ~]# kubectl get ns
NAME STATUS AGE
default Active 2d
dev Active 85s
kube-node-lease Active 2d
kube-public Active 2d
kube-system Active 2d
删除:
[root@master ~]# kubectl delete -f ns-dev.yaml
namespace "dev" deleted
[root@master ~]# kubectl get ns
NAME STATUS AGE
default Active 2d
kube-node-lease Active 2d
kube-public Active 2d
kube-system Active 2d
kubernetes在集群启动之后,集群中的各个组件也都是以Pod方式运行的。可以通过下面命令查看:
[root@master ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-9d57d8f49-xp62k 1/1 Running 2 (158m ago) 47h
calico-node-5b5dz 1/1 Running 2 (158m ago) 47h
calico-node-c5nkj 1/1 Running 2 (158m ago) 47h
calico-node-nkl7z 1/1 Running 2 (158m ago) 47h
coredns-6554b8b87f-h6265 1/1 Running 2 (158m ago) 2d
coredns-6554b8b87f-p4vrt 1/1 Running 2 (158m ago) 2d
etcd-master 1/1 Running 2 (158m ago) 2d
kube-apiserver-master 1/1 Running 3 (57m ago) 2d
kube-controller-manager-master 1/1 Running 2 (158m ago) 2d
kube-proxy-62dkk 1/1 Running 2 (158m ago) 2d
kube-proxy-tjfkz 1/1 Running 2 (158m ago) 47h
kube-proxy-wddnk 1/1 Running 2 (158m ago) 47h
kube-scheduler-master 1/1 Running 2 (158m ago) 2d
创建并运行:
kubernetes没有提供单独运行Pod的命令,都是通过Pod控制器来实现的:
命令格式:kubectl run (pod名称) [参数]
--image 指定Pod的镜像
--port 指定端口
--namespace 指定namespace
[root@master ~]# kubectl run nginx --image=nginx:latest --port=80 --namespace dev
pod/nginx created
查看pod信息:
查看pod基本信息:
[root@master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 3m4s
查看pod的详细信息:
[root@master ~]# kubectl describe pod nginx -n dev
Name: nginx
Namespace: dev
Priority: 0
Service Account: default
Node: node1.exmaple.com/192.168.100.20
Start Time: Thu, 30 Oct 2025 19:15:16 +0800
Labels: run=nginx
Annotations: cni.projectcalico.org/containerID: f0c56ea62bb3f87ad719815118f6c99af922583d3ec41fe530e921bc445933eb
cni.projectcalico.org/podIP: 172.16.98.132/32
cni.projectcalico.org/podIPs: 172.16.98.132/32
Status: Running
IP: 172.16.98.132
IPs:
IP: 172.16.98.132
Containers:
nginx:
Container ID: docker://54c65d00d209b7dcb3132d2a8577b789113c14829cfbedab0c66e3a2f43cb194
Image: nginx:latest
Image ID: docker-pullable://nginx@sha256:f547e3d0d5d02f7009737b284abc87d808e4252b42dceea361811e9fc606287f
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Thu, 30 Oct 2025 19:15:17 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-rv8vw (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-rv8vw:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 4m9s default-scheduler Successfully assigned dev/nginx to node1.exmaple.com
Normal Pulling 4m9s kubelet Pulling image "nginx:latest"
Normal Pulled 4m8s kubelet Successfully pulled image "nginx:latest" in 952ms (952ms including waiting)
Normal Created 4m8s kubelet Created container nginx
Normal Started 4m8s kubelet Started container nginx
访问pod:
获取pod IP:
[root@master ~]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 10m 172.16.98.132 node1.exmaple.com <none> <none>
访问pod:
[root@master ~]# curl http://172.16.98.132:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
删除指定pod:
[root@master ~]# kubectl delete pod nginx -n dev
pod "nginx" deleted
如果create,显示删除pod成功,但是再查询,发现又新产生一个:
[root@master ~]# kubectl create deployment nginx --image nginx --port 80 -n dev
deployment.apps/nginx created //当前pod是由pod控制器管理
[root@master ~]# kubectl run nginx --image nginx --port 80 -n dev //自主式管理pod
pod/nginx created
[root@master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 50s
nginx-7c5ddbdf54-n5cs2 1/1 Running 0 2m28s
这是因为当前pod是由pod控制器创建的,控制器会监控pod状况,一旦发现pod死亡,会立即重建,此时要想删除pod,必须删除pod控制器
先来查询一下当前namespace下的pod控制器:
[root@master ~]# kubectl get deploy -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 6m22s
接下来,删除此pod,pod控制器:
[root@master ~]# kubectl delete deploy nginx -n dev
deployment.apps "nginx" deleted
稍等片刻,再查询pod,发现pod被删除了:
[root@master ~]# kubectl get pods -n dev
No resources found in dev namespace.
配置操作:
创建一个pod-nginx.yaml,内容如下:
[root@master ~]# vim pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
spec:
containers:
- image: nginx:latest
name: pod
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
~
然后就可以执行对应的创建和删除命令了:
创建:
[root@master ~]# kubectl create ns dev
namespace/dev created
[root@master ~]# kubectl create -f pod-nginx.yaml
pod/nginx created
删除:
[root@master ~]# kubectl delete -f pod-nginx.yaml
pod "nginx" deleted
命令方式:
为pod资源打标签:
[root@master ~]# kubectl run nginx-pod --image=nginx:latest -n dev
pod/nginx-pod created
[root@master ~]# kubectl label pod nginx-pod version=1.0 -n dev
pod/nginx-pod labeled
为pod资源更新标签:
[root@master ~]# kubectl label pod nginx-pod version=2.0 -n dev --overwrite
pod/nginx-pod labeled
查看标签:
[root@master ~]# kubectl get pod nginx-pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 3m8s run=nginx-pod,version=2.0
筛选标签:
[root@master ~]# kubectl get pod -n dev -l version=2.0 --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 3m52s run=nginx-pod,version=2.0
[root@master ~]# kubectl get pod -n dev -l version!=2.0 --show-labels
No resources found in dev namespace.
删除标签:
[root@master ~]# kubectl label pod nginx-pod version- -n dev
pod/nginx-pod unlabeled
配置方式:
[root@master ~]# vim pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
labels:
version: "3.0"
env: "test"
spec:
containers:
- image: nginx:latest
name: pod
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
~
然后就可以执行对应的更新命令了:
[root@master ~]# kubectl apply -f pod-nginx.yaml
pod/nginx created
命令操作:
命令格式:kubectl create deployment 名称 [参数]
--image 指定pod的镜像
--port 指定端口
--replicas 指定创建pod数量
--namespace 指定namespace
[root@master ~]# kubectl create deploy nginx --image=nginx:latest --port=80 --replicas=3 -n dev
deployment.apps/nginx created
查看创建的pod:
[root@master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 4m47s
nginx-7c79c4bf97-4pv2h 1/1 Running 0 32s
nginx-7c79c4bf97-9mq9v 1/1 Running 0 32s
nginx-7c79c4bf97-z7fth 1/1 Running 0 32s
nginx-pod 1/1 Running 0 15m
查看deployment的信息:
[root@master ~]# kubectl get deploy -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 3/3 3 3 82s
UP-TO-DATE:成功升级的副本数量
AVAILABLE:可用副本的数量
[root@master ~]# kubectl get deploy -n dev -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx 3/3 3 3 2m18s nginx nginx:latest app=nginx
查看deployment的详细信息:
[root@master ~]# kubectl describe deploy nginx -n dev
Name: nginx
Namespace: dev
CreationTimestamp: Thu, 30 Oct 2025 20:17:30 +0800
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=nginx
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx:latest
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-7c79c4bf97 (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 3m12s deployment-controller Scaled up replica set nginx-7c79c4bf97 to 3
删除:
[root@master ~]# kubectl delete deploy nginx -n dev
deployment.apps "nginx" deleted
配置操作:
创建一个deploy-nginx.yaml,内容如下:
[root@master ~]# vim deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- image: nginx:latest
name: nginx
ports:
- containerPort: 80
protocol: TCP
~
然后就可以执行对应的创建和删除命令了:
创建:
[root@master ~]# kubectl create -f deploy-nginx.yaml
deployment.apps/nginx created
删除:
[root@master ~]# kubectl delete -f deploy-nginx.yaml
deployment.apps "nginx" deleted