k8s 实战入门

k8s 实战入门

一、Namespace(命名空间)

作用
  • 实现多环境资源隔离多租户资源隔离
  • 默认情况下所有 Pod 可互相访问,通过 Namespace 可实现逻辑隔离
  • 可配合 RBAC 和 Resource Quota 实现权限和资源限制
默认命名空间

kubernetes 在集群启动之后,会默认创建几个 namespace

bash 复制代码
[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
bash 复制代码
[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
bash 复制代码
[root@master ~]# kubectl get ns default 
NAME      STATUS   AGE
default   Active   44h
指定输出格式

kubernetes支持的格式有很多,比较常见的是wide、json、yaml

bash 复制代码
[root@master ~]# kubectl get ns default -o yaml
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: "2025-10-28T10:02:08Z"
  labels:
    kubernetes.io/metadata.name: default
  name: default
  resourceVersion: "39"
  uid: d37dd814-baca-4683-b617-eb77832e6969
spec:
  finalizers:
  - kubernetes
status:
  phase: Active
查看 ns 详情
bash 复制代码
[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
bash 复制代码
[root@master ~]# kubectl create ns dev
namespace/dev created
删除 ns
bash 复制代码
[root@master ~]# kubectl delete ns dev 
namespace "dev" deleted
配置方式
首先准备一个 yaml 文件

官方文档查找模板 https://kubernetes.io/

bash 复制代码
[root@master ~]# vim ns-dev.yaml
yaml 复制代码
apiVersion: v1
kind: Namespace
metadata:
  name: dev
然后就可以执行对应的创建和删除命令了
bash 复制代码
[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
bash 复制代码
[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
bash 复制代码
[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 控制器来实现的

bash 复制代码
[root@master ~]# kubectl run nginx --image=nginx:latest --port=80 --namespace dev
pod/nginx created
  • --image 指定Pod的镜像

  • --port 指定端口

  • --namespace 指定namespace

查看 pod 信息
bash 复制代码
[root@master ~]# kubectl get pods -n dev 
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          5m57s
查看 pod 详细信息
bash 复制代码
[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
bash 复制代码
[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
bash 复制代码
[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
bash 复制代码
[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=个数
bash 复制代码
[root@master ~]# kubectl create deploy nginx --image=nginx:latest --port=80 --replicas=3 -n dev
deployment.apps/nginx created
查看
bash 复制代码
[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死亡,会立即重建

bash 复制代码
[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
bash 复制代码
[root@master ~]# vim pod-nginx.yaml
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
然后就可以执行对应的创建和删除命令了
bash 复制代码
[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
bash 复制代码
[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 时打标签
bash 复制代码
[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 更新标签
bash 复制代码
[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 打标签
bash 复制代码
[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
查看标签
bash 复制代码
[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
筛选标签
bash 复制代码
[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
删除标签
bash 复制代码
[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
配置方式
bash 复制代码
[root@master ~]# vim pod-nginx.yaml
yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: nginx2
  namespace: dev
  labels:
    test: "3"      
    app: "nginx"
spec:
  containers:
  - image: nginx:latest
    name: pod
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP
bash 复制代码
[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
bash 复制代码
[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
bash 复制代码
[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 的信息
bash 复制代码
[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 的详细信息
bash 复制代码
[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
......
删除
bash 复制代码
[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.
配置操作
bash 复制代码
[root@master ~]# vim deploy.yaml
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
bash 复制代码
[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
删除
bash 复制代码
[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
相关推荐
xx.ii7 小时前
K8s练习
云原生·容器·kubernetes
算是难了7 小时前
K8s基础总结
云原生·容器·kubernetes
失因7 小时前
Kubernetes(K8s)资源管理
云原生·容器·kubernetes
KubeSphere 云原生8 小时前
Fluid 正式入驻青云 KubeSphere Marketplace,共建云原生数据加速新生态
云原生
阿里云云原生9 小时前
云栖实录:重构可观测 - 打造大模型驱动的云监控 2.0 与 AIOps 新范式
阿里云·云原生·重构·云监控·可观测
白小云<10 小时前
docker镜像
docker·容器·eureka
不爱笑的良田11 小时前
从零开始的云原生之旅(一):把 Go 应用塞进 Docker
docker·云原生·golang
不爱笑的良田11 小时前
从零开始的云原生之旅(四):K8s 工作负载完全指南
云原生·容器·kubernetes
java_logo13 小时前
Docker 部署 Rocky Linux 全流程教程
linux·运维·服务器·docker·容器·1024程序员节