入门实战

一、Namespace

Namespace是Kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离

默认情况下,Kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。Kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理。

可以通过Kubernetes的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合Kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。

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

 [root@master ~]# kubectl get ns
 NAME              STATUS   AGE
 default           Active   41h
 kube-node-lease   Active   41h
 kube-public       Active   41h
 kube-system       Active   41h

default:所有未指定Namespace的对象都会被分配在default命名空间。

kube-node-lease:集群节点之间的心跳维护,v1.13开始引入。

kube-public:此命名空间下的资源可以被所有人访问(包括未认证用户)。

kube-system:所有Kubernetes系统创建的资源都处于这个命名空间。

下面来看namespace资源的具体操作:

查看

 [root@master ~]# kubectl get ns
 NAME              STATUS   AGE
 default           Active   41h
 kube-node-lease   Active   41h
 kube-public       Active   41h
 kube-system       Active   41h

查看具体的命名空间

 [root@master ~]# kubectl get ns kube-system
 NAME          STATUS   AGE
 kube-system   Active   41h
 ​
 # kubectl get ns 命名空间的名称

指定输出的格式

 # kubectl get ns ns名称 -o 格式参数
 # kubernetes支持的格式有很多,比较常见的是wide、json、yaml
 ​
 [root@master ~]# kubectl get ns kube-system -o wide
 NAME          STATUS   AGE
 kube-system   Active   41h
 ​
 [root@master ~]# kubectl get ns kube-system -o json
 {
     "apiVersion": "v1",
     "kind": "Namespace",
     "metadata": {
         "creationTimestamp": "2025-10-28T07:45:47Z",
         "labels": {
             "kubernetes.io/metadata.name": "kube-system"
         },
         "name": "kube-system",
         "resourceVersion": "6",
         "uid": "6e2e7c98-0ee6-4cdf-aa63-cdbaf1483b58"
     },
     "spec": {
         "finalizers": [
             "kubernetes"
         ]
     },
     "status": {
         "phase": "Active"
     }
 }

查看ns的内部信息

 # kubectl describe ns ns名称
 ​
 [root@master ~]# kubectl describe ns kube-system
 Name:         kube-system
 Labels:       kubernetes.io/metadata.name=kube-system
 Annotations:  <none>
 Status:       Active # Active 命名空间正在使用中  Terminating 正在删除命名空间
 # ResourceQuota 针对namespace做的资源限制 # LimitRange针对namespace中的每个组件做的资源限制
 ​
 No resource quota.
 ​
 No LimitRange resource.

创建命名空间

 # kubectl create ns ns名称
 ​
 [root@master ~]# kubectl create ns ldh
 namespace/ldh created

删除命名空间

 # kubectl delete ns ns名称
 ​
 [root@master ~]# kubectl delete ns ldh
 namespace "ldh" deleted

配置方式

准备一个yaml文件,ns-test.yaml

 apiVersion: v1
 kind: Namespace
 metadata:
   name: test

然后就可以执行对应的创建和删除命令了

# 创建
[root@master ns]# kubectl create -f ns-test.yaml 
namespace/test created

# 删除
[root@master ns]# kubectl delete -f ns-test.yaml 
namespace "test" deleted

二、Pod

Pod是Kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。

Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。

Kubernetes在集群启动之后,集群中的各个组件也都是以Pod方式运行的。可以通过下面命令查看:

[root@master ~]# kubectl get po -n kube-system
NAME                                      READY   STATUS    RESTARTS      AGE
calico-kube-controllers-9d57d8f49-sd45z   1/1     Running   3 (19m ago)   41h
calico-node-4tzp5                         1/1     Running   3 (19m ago)   41h
calico-node-hgn9j                         1/1     Running   3 (20m ago)   41h
calico-node-sps7n                         1/1     Running   3 (19m ago)   41h
coredns-6554b8b87f-j4m6b                  1/1     Running   3 (19m ago)   41h
coredns-6554b8b87f-jknsd                  1/1     Running   3 (19m ago)   41h
etcd-master                               1/1     Running   3 (20m ago)   41h
kube-apiserver-master                     1/1     Running   4 (19m ago)   41h
kube-controller-manager-master            1/1     Running   3 (20m ago)   41h
kube-proxy-knlmm                          1/1     Running   3 (20m ago)   41h
kube-proxy-t6glq                          1/1     Running   3 (19m ago)   41h
kube-proxy-tcfm4                          1/1     Running   3 (19m ago)   41h
kube-scheduler-master                     1/1     Running   3 (20m ago)   41h

创建并运行pod

Kubernetes没有提供单独运行Pod的命令,都是通过Pod控制器来实现的

# 命令格式: kubectl run (pod名称) [参数] 
# --image  指定Pod的镜像
# --port   指定端口
# --namespace  指定namespace

# 以nginx为例
[root@master ~]# kubectl run nginx-pod --image=nginx:latest --port=80
pod/nginx-pod created

# 没有指定命名空间,则会创建在默认命名空间里
[root@master ~]# kubectl get po
NAME        READY   STATUS    RESTARTS   AGE
nginx-pod   1/1     Running   0          37s

查看pod的详细信息

[root@master ~]# kubectl describe po nginx-pod -n default
Name:             nginx-pod
Namespace:        default
Priority:         0
Service Account:  default
Node:             node1/192.168.100.13
Start Time:       Thu, 30 Oct 2025 09:13:06 +0800
Labels:           run=nginx-pod
Annotations:      cni.projectcalico.org/containerID: 4a9477d97a43a528ae8133a5d1846e8fd2faa696e896d6554a5157ed0395de70
                  cni.projectcalico.org/podIP: 172.16.166.135/32
                  cni.projectcalico.org/podIPs: 172.16.166.135/32
Status:           Running
IP:               172.16.166.135
......
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  2m2s  default-scheduler  Successfully assigned default/nginx-pod to node1
  Normal  Pulling    2m2s  kubelet            Pulling image "nginx:latest"
  Normal  Pulled     2m1s  kubelet            Successfully pulled image "nginx:latest" in 667ms (667ms including waiting)
  Normal  Created    2m1s  kubelet            Created container nginx-pod
  Normal  Started    2m1s  kubelet            Started container nginx-pod

访问pod(没有设置service,只能内部访问)

# 首先查看pod的IP地址
[root@master ~]# kubectl get po nginx-pod -o wide
NAME        READY   STATUS    RESTARTS   AGE    IP               NODE    NOMINATED NODE   READINESS GATES
nginx-pod   1/1     Running   0          4m3s   172.16.166.135   node1   <none>           <none>

# 访问该IP地址
[root@master ~]# curl http://172.16.166.135
<!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 po nginx-pod
pod "nginx-pod" deleted

配置操作

创建一个nginx-pod.yaml文件

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - image: nginx:latest
    name: nginx

然后就可以执行对应的创建和删除命令了:

# 创建
[root@master pods]# kubectl create -f nginx-pod.yaml 
pod/nginx-pod created

# 删除
[root@master pods]# kubectl delete -f nginx-pod.yaml 
pod "nginx-pod" deleted

三、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进行组合,使用逗号","进行分隔即可。例如:

name=slave,env!=production

name not in (frontend),env!=production

命令方式:

为pod资源打标签

[root@master ~]# kubectl label pod nginx-pod version=1.0
pod/nginx-pod labeled

查看标签

[root@master ~]# kubectl get po nginx-pod --show-labels
NAME        READY   STATUS    RESTARTS   AGE    LABELS
nginx-pod   1/1     Running   0          108s   version=1.0

为pod更新标签

更新标签只能更新标签的值

[root@master ~]# kubectl label pod nginx-pod version=2.0 --overwrite
pod/nginx-pod labeled

[root@master ~]# kubectl get po nginx-pod --show-labels
NAME        READY   STATUS    RESTARTS   AGE     LABELS
nginx-pod   1/1     Running   0          2m53s   version=2.0

筛选标签

# 查看有version=2.0这个标签的pod
[root@master ~]# kubectl get po -l version=2.0 --show-labels
NAME        READY   STATUS    RESTARTS   AGE     LABELS
nginx-pod   1/1     Running   0          5m16s   version=2.0

删除标签

[root@master ~]# kubectl label po nginx-pod version-
pod/nginx-pod unlabeled

[root@master ~]# kubectl get po nginx-pod --show-labels
NAME        READY   STATUS    RESTARTS   AGE     LABELS
nginx-pod   1/1     Running   0          6m54s   <none>

配置方式

在nginx-pod.yaml这个文件基础上修改

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    version: 1.1.2
    env: test
spec:
  containers:
  - image: nginx:latest
    name: nginx

因为已有nginx-pod这个pod,所以直接更新即可

[root@master pods]# kubectl apply -f nginx-pod.yaml
# 会有警告信息,因为之前create时没有加--save-config选项


[root@master pods]# kubectl get po nginx-pod --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          14m   env=test,version=1.1.2

四、Deploment

在Kubernetes中,Pod是最小的控制单元,但是Kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。

在Kubernetes中Pod控制器的种类有很多,本章节只介绍一种:Deployment。

# 命令格式: kubectl create deployment 名称  [参数] 
# --image  指定pod的镜像
# --port   指定端口
# --replicas  指定创建pod数量
# --namespace  指定namespace

创建名为nginx的deploy控制器,并使用该控制器创建三个pod

[root@master ~]# kubectl create deploy nginx --image=nginx:latest --port=80 --replicas=3
deployment.apps/nginx created

查看创建的pod

[root@master ~]# kubectl get po
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7c79c4bf97-4j69p   1/1     Running   0          67s
nginx-7c79c4bf97-g8gzk   1/1     Running   0          67s
nginx-7c79c4bf97-x59gd   1/1     Running   0          67s
nginx-pod                1/1     Running   0          20m

查看deployment的信息

[root@master ~]# kubectl get deploy
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           118s
# UP-TO-DATE:成功升级的副本数量
# AVAILABLE:可用副本的数量
[root@master ~]# kubectl get deploy -o wide
NAME    READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES         SELECTOR
nginx   3/3     3            3           2m36s   nginx        nginx:latest   app=nginx

查看deploy的详细信息

[root@master ~]# kubectl describe deploy nginx
Name:                   nginx
Namespace:              default
CreationTimestamp:      Thu, 30 Oct 2025 09:46:08 +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  3m14s  deployment-controller  Scaled up replica set nginx-7c79c4bf97 to 3

删除deploy

使用deploy创建的pod,删除后,deploy会重新创建新的pod,所以要删除pod,直接删除deploy即可

[root@master ~]# kubectl delete deploy nginx
deployment.apps "nginx" deleted

[root@master ~]# kubectl get po
NAME        READY   STATUS    RESTARTS   AGE
nginx-pod   1/1     Running   0          24m

配置操作

创建一个nginx-deploy.yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

然后就可以执行对应的创建和删除命令了:

# 创建
[root@master deploys]# kubectl create -f nginx-deploy.uaml 
deployment.apps/nginx-deployment created

# 删除
[root@master deploys]# kubectl delete -f nginx-deploy.uaml 
deployment.apps "nginx-deployment" deleted

更多推荐