k8s 实战入门
k8s 实战入门
一、Namespace(命名空间)
作用
- 实现多环境资源隔离或多租户资源隔离
- 默认情况下所有 Pod 可互相访问,通过 Namespace 可实现逻辑隔离
- 可配合 RBAC 和 Resource Quota 实现权限和资源限制
默认命名空间
kubernetes 在集群启动之后,会默认创建几个 namespace
[root@master ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   44h		# 所有未指定 Namespace 的对象都会被分配在 default 命名空间
kube-node-lease   Active   44h		# 集群节点之间的心跳维护,v1.13开始引入
kube-public       Active   44h		# 此命名空间下的资源可以被所有人访问(包括未认证用户)
kube-system       Active   44h		# 所有由 Kubernetes 系统创建的资源都处于这个命名空间
操作命令
查看所有 ns
[root@master ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   44h
kube-node-lease   Active   44h
kube-public       Active   44h
kube-system       Active   44h
查看指定 ns
[root@master ~]# kubectl get ns default 
NAME      STATUS   AGE
default   Active   44h
指定输出格式
kubernetes支持的格式有很多,比较常见的是wide、json、yaml
[root@master ~]# kubectl get ns default -o yaml
apiVersion: v1
kind: Namespace
metadata:creationTimestamp: "2025-10-28T10:02:08Z"labels:kubernetes.io/metadata.name: defaultname: defaultresourceVersion: "39"uid: d37dd814-baca-4683-b617-eb77832e6969
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.		# ResourceQuota 针对 namespace 做的资源限制No LimitRange resource.	# LimitRange 针对 namespace 中的每个组件做的资源限制
创建 ns
[root@master ~]# kubectl create ns dev
namespace/dev created
删除 ns
[root@master ~]# kubectl delete ns dev 
namespace "dev" deleted
配置方式
首先准备一个 yaml 文件
官方文档查找模板 https://kubernetes.io/
[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 ns
NAME              STATUS   AGE
default           Active   44h
dev               Active   16s
kube-node-lease   Active   44h
kube-public       Active   44h
kube-system       Active   44h
[root@master ~]# kubectl delete -f ns-dev.yaml 
namespace "dev" deleted
[root@master ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   44h
kube-node-lease   Active   44h
kube-public       Active   44h
kube-system       Active   44h
二、Pod
概念
- Pod 是 Kubernetes 最小管理单元
- 一个 Pod 可包含一个或多个容器
- 系统组件也以 Pod 形式运行在 kube-system命名空间中
操作命令
查看某个 ns 的 pod
[root@master ~]# kubectl get pod -n kube-system 
NAME                                      READY   STATUS    RESTARTS        AGE
calico-kube-controllers-9d57d8f49-88mgl   1/1     Running   2 (5h34m ago)   44h
calico-node-2vw44                         1/1     Running   2 (5h34m ago)   44h
calico-node-52ms4                         1/1     Running   2 (5h34m ago)   44h
calico-node-7kh9c                         1/1     Running   2 (5h34m ago)   44h
coredns-6554b8b87f-mjx7v                  1/1     Running   2 (5h34m ago)   44h
coredns-6554b8b87f-sz9ft                  1/1     Running   2 (5h34m ago)   44h
etcd-master                               1/1     Running   2 (5h34m ago)   44h
kube-apiserver-master                     1/1     Running   3 (5h33m ago)   44h
kube-controller-manager-master            1/1     Running   2 (5h34m ago)   44h
kube-proxy-dww5p                          1/1     Running   2 (5h34m ago)   44h
kube-proxy-lqh62                          1/1     Running   2 (5h34m ago)   44h
kube-proxy-nmtph                          1/1     Running   2 (5h34m ago)   44h
kube-scheduler-master                     1/1     Running   2 (5h34m ago)   44h
创建并运行 pod
kubernetes 没有提供单独运行 Pod 的命令,都是通过 Pod 控制器来实现的
[root@master ~]# kubectl run nginx --image=nginx:latest --port=80 --namespace dev
pod/nginx created
-  --image指定Pod的镜像
-  --port指定端口
-  --namespace指定namespace
查看 pod 信息
[root@master ~]# kubectl get pods -n dev 
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          5m57s
查看 pod 详细信息
[root@master ~]# kubectl describe pod nginx -n dev
Name:             nginx
Namespace:        dev
Priority:         0
Service Account:  default
Node:             node2/192.168.100.30
Start Time:       Thu, 30 Oct 2025 14:37:23 +0800
Labels:           run=nginx
......
获取 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          6m13s   172.16.104.4   node2   <none>           <none>
访问 pod
[root@master ~]# curl http://172.16.104.4
<!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
[root@master ~]# kubectl get pod -n dev
No resources found in dev namespace.
控制器管理
控制器创建
创建多个 pod
–replicas=个数
[root@master ~]# kubectl create deploy nginx --image=nginx:latest --port=80 --replicas=3 -n dev
deployment.apps/nginx created
查看
[root@master ~]# kubectl get deploy -n dev
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           80s[root@master ~]# kubectl get pods -n dev
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7c79c4bf97-4cz44   1/1     Running   0          2m
nginx-7c79c4bf97-k48jj   1/1     Running   0          2m
nginx-7c79c4bf97-zxtw6   1/1     Running   0          2m
删除 pod
显示删除Pod成功,但是再查询,发现又新产生了一个,这是因为当前Pod是由Pod控制器创建的,控制器会监控Pod状况,一旦发现Pod死亡,会立即重建
[root@master ~]# kubectl delete pod nginx-7c79c4bf97-4cz44 -n dev
pod "nginx-7c79c4bf97-4cz44" deleted
[root@master ~]# kubectl get pods -n dev
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7c79c4bf97-k48jj   1/1     Running   0          5m14s
nginx-7c79c4bf97-qlzs6   1/1     Running   0          6s
nginx-7c79c4bf97-zxtw6   1/1     Running   0          5m14s# 此时要想删除Pod,必须删除Pod控制器
[root@master ~]# kubectl delete deploy nginx -n dev
deployment.apps "nginx" deleted
[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: nginxnamespace: dev
spec:containers:- image: nginx:latestname: podports:- name: nginx-portcontainerPort: 80protocol: TCP
然后就可以执行对应的创建和删除命令了
[root@master ~]# kubectl create -f pod-nginx.yaml 
pod/nginx created
[root@master ~]# kubectl get pods -n dev
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          17s
[root@master ~]# kubectl delete -f pod-nginx.yaml 
pod "nginx" deleted
[root@master ~]# kubectl get pods -n dev
No resources found in dev namespace.
三、Label
概念与作用
Label(标签) 是Kubernetes系统中的核心概念之一,其核心作用是为集群中的资源对象(如Pod、Node、Service等)添加可标识的键值对(key/value) 元数据,从而实现资源的灵活区分、选择、分组和管理
主要管理场景包括
- 资源分配
- 工作负载调度
- 服务配置
- 滚动部署
Label 特点
- 附加性:以 key=value的形式附加到各种对象上
- 多对多:一个资源可以定义任意数量的Label;一个Label也可以被添加到任意数量的资源上。
- 动态性:通常在资源定义时确定,但也支持在对象创建后动态添加或删除
常用 Label 示例
| 类别 | 示例 | 
|---|---|
| 版本标签 | "version": "release","version": "stable" | 
| 环境标签 | "environment": "dev","environment": "test","environment": "pro" | 
| 架构标签 | "tier": "frontend","tier": "backend" | 
Label Selector(标签选择器)
Label用于定义标识,而 Label Selector 用于根据这些标识来查询和筛选资源对象。
基于等式的Selector
| 表达式 | 说明 | 
|---|---|
| name = slave | 选择所有包含Label中 key="name"且value="slave"的对象 | 
| env != production | 选择所有包含Label中 key="env"且value不等于"production"的对象 | 
基于集合的Selector
| 表达式 | 说明 | 
|---|---|
| name in (master, slave) | 选择 value是"master"或"slave"的对象 | 
| name not in (frontend) | 选择 value不等于"frontend"的对象 | 
多条件组合
多个选择条件可以使用逗号 , 进行分隔,表示 “AND” 关系。
- name=slave, env!=production
- name not in (frontend), env!=production
操作命令
创建 pod 时打标签
[root@master ~]# kubectl run nginx --labels test=1 --image=nginx:latest --port=80 -n dev
pod/nginx created
[root@master ~]# kubectl get pod -n dev --show-labels
NAME    READY   STATUS    RESTARTS   AGE   LABELS
nginx   1/1     Running   0          32s   test=1
为 pod 更新标签
[root@master ~]# kubectl label pod nginx test=2 -n dev --overwrite
pod/nginx labeled
[root@master ~]# kubectl get pod -n dev --show-labels
NAME    READY   STATUS    RESTARTS   AGE   LABELS
nginx   1/1     Running   0          6m    test=2
为 pod 打标签
[root@master ~]# kubectl label pod nginx app=nginx -n dev
pod/nginx labeled
[root@master ~]# kubectl get pod -n dev --show-labels
NAME    READY   STATUS    RESTARTS   AGE    LABELS
nginx   1/1     Running   0          7m4s   app=nginx,test=2
查看标签
[root@master ~]# kubectl get pod -n dev --show-labels
NAME     READY   STATUS    RESTARTS   AGE     LABELS
nginx    1/1     Running   0          8m17s   app=nginx,test=2
nginx1   1/1     Running   0          5s      test=1
筛选标签
[root@master ~]# kubectl get pod -n dev -l test=2 --show-labels
NAME    READY   STATUS    RESTARTS   AGE    LABELS
nginx   1/1     Running   0          9m9s   app=nginx,test=2
删除标签
[root@master ~]# kubectl label pod nginx app- -n dev
pod/nginx unlabeled
[root@master ~]# kubectl get pod -n dev --show-labels
NAME     READY   STATUS    RESTARTS   AGE    LABELS
nginx    1/1     Running   0          10m    test=2
nginx1   1/1     Running   0          114s   test=1
配置方式
[root@master ~]# vim pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx2namespace: devlabels:test: "3"      app: "nginx"
spec:containers:- image: nginx:latestname: podports:- name: nginx-portcontainerPort: 80protocol: TCP
[root@master ~]# kubectl apply -f pod-nginx.yaml 
pod/nginx2 created
[root@master ~]# kubectl get pod -n dev --show-labels
NAME     READY   STATUS    RESTARTS   AGE     LABELS
nginx    1/1     Running   0          13m     test=2
nginx1   1/1     Running   0          5m32s   test=1
nginx2   1/1     Running   0          4s      app=nginx,test=3
四、Deployment
作用
- 管理 Pod 的生命周期,确保 Pod 数量符合预期
- 支持滚动更新、回滚、副本扩缩容
操作命令
创建 pod
[root@master ~]# kubectl create deploy nginx --image=nginx:latest --port=80 --replicas=3 -n dev
deployment.apps/nginx created
-  --image指定pod的镜像
-  --port指定端口
-  --replicas指定创建pod数量
-  --namespace指定namespace
查看 pod
[root@master ~]# kubectl get pods -n dev
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7c79c4bf97-87jv7   1/1     Running   0          74s
nginx-7c79c4bf97-qjh4j   1/1     Running   0          74s
nginx-7c79c4bf97-tq5jx   1/1     Running   0          74s
查看 deployment 的信息
[root@master ~]# kubectl get deploy -n dev
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           3m24s[root@master ~]# kubectl get deploy -n dev -o wide
NAME    READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES         SELECTOR
nginx   3/3     3            3           4m51s   nginx        nginx:latest   app=nginx
-  UP-TO-DATE成功升级的副本数量
-  AVAILABLE可用副本的数量
查看 deployment 的详细信息
[root@master ~]# kubectl describe deploy -n dev
Name:                   nginx
Namespace:              dev
CreationTimestamp:      Thu, 30 Oct 2025 15:37:56 +0800
Labels:                 app=nginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=nginx
......
删除
[root@master ~]# kubectl delete deploy nginx -n dev
deployment.apps "nginx" deleted
[root@master ~]# kubectl get deploy -n dev
No resources found in dev namespace.
[root@master ~]# kubectl get pods -n dev
No resources found in dev namespace.
配置操作
[root@master ~]# vim deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginxnamespace: dev
spec:replicas: 3selector:matchLabels:run: nginxtemplate:metadata:labels:run: nginxspec:containers:- image: nginx:latestname: nginxports:- containerPort: 80protocol: TCP
[root@master ~]# vim deploy.yaml
[root@master ~]# kubectl apply -f deploy.yaml 
deployment.apps/nginx created
[root@master ~]# kubectl get deploy -n dev
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           13s
[root@master ~]# kubectl get pods -n dev
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6c45cbd8c5-4jb54   1/1     Running   0          31s
nginx-6c45cbd8c5-m8s8h   1/1     Running   0          31s
nginx-6c45cbd8c5-vsv72   1/1     Running   0          31s
删除
[root@master ~]# kubectl delete -f deploy.yaml 
deployment.apps "nginx" deleted
[root@master ~]# kubectl get deploy -n dev
No resources found in dev namespace.
[root@master ~]# kubectl get pods -n dev
No resources found in dev namespace.
五、总结
| 资源类型 | 作用 | 常用操作 | 
|---|---|---|
| Namespace | 资源隔离 | create,get,describe,delete | 
| Pod | 最小部署单元 | run,get,describe,delete | 
| Label | 资源标识与选择 | label,get -l,--show-labels | 
| Deployment | Pod 控制器 | create deploy,get deploy,delete deploy | 
