查看命名空间 kubectl get namespaces

[root@master services]# kubectl get namespaces
NAME              STATUS   AGE
default           Active   4d12h
kube-flannel      Active   4d12h
kube-node-lease   Active   4d12h
kube-public       Active   4d12h
kube-system       Active   4d12h
metallb-system    Active   6h56m

创建命名空间
kubectl create namespace timinglee

[root@master services]# kubectl create namespace timinglee

namespace/timinglee created
 

删除命名空间
kubectl delete namespace timinglee

[root@master services]# kubectl delete namespace timinglee
namespace "timinglee" deleted
 

查看 Pod
kubectl get pods
kubectl get pods -o wide          显示 IP 和节点
kubectl get pods --show-labels    显示标签

[root@master services]# kubectl get pods
NAME        READY   STATUS    RESTARTS   AGE
webserver   1/1     Running   0          7h19m
[root@master services]# kubectl get pods -o wide
NAME        READY   STATUS    RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES
webserver   1/1     Running   0          7h19m   10.244.2.93   node2   <none>           <none>
[root@master services]# kubectl get pods --show-labels 
NAME        READY   STATUS    RESTARTS   AGE     LABELS
webserver   1/1     Running   0          7h19m   app=webserver,run=webserver
[root@master services]# 
 

创建 Pod
kubectl run nginx-pod --image=nginx:latest

查看 Pod 详情
kubectl describe pod nginx-pod

查看日志
kubectl logs nginx-pod

进入容器
kubectl exec -it nginx-pod -- /bin/bash

删除 Pod
kubectl delete pod nginx-pod
kubectl delete pods --all         删除所有 Pod

[root@master services]# kubectl run nginx-pod --image=nginx:latest
pod/nginx-pod created
[root@master services]# kubectl describe pod nginx-pod
Name:             nginx-pod
Namespace:        default
Priority:         0
Service Account:  default
Node:             node1/172.25.254.10
Start Time:       Mon, 24 Aug 2026 23:12:11 +0800
Labels:           run=nginx-pod
Annotations:      <none>
Status:           Running
IP:               10.244.1.18
IPs:
  IP:  10.244.1.18
Containers:
  nginx-pod:
    Container ID:   docker://1a6e4f73a7f17758994f250b5fa20ae80c1233b551fb05c86fe0348fba5ca770
    Image:          nginx:latest
    Image ID:       docker-pullable://nginx@sha256:c2e305ef468149bdc3297621cea453b47b095816fec4fc7be6ff837bce8deb7d
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Mon, 24 Aug 2026 23:12:11 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-t5zgn (ro)
Conditions:
  Type                        Status
  PodReadyToStartContainers   True 
  Initialized                 True 
  Ready                       True 
  ContainersReady             True 
  PodScheduled                True 
Volumes:
  kube-api-access-t5zgn:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    Optional:                false
    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  7s    default-scheduler  Successfully assigned default/nginx-pod to node1
  Normal  Pulling    7s    kubelet            spec.containers{nginx-pod}: Pulling image "nginx:latest"
  Normal  Pulled     7s    kubelet            spec.containers{nginx-pod}: Successfully pulled image "nginx:latest" in 168ms (168ms including waiting). Image size: 63326664 bytes.
  Normal  Created    7s    kubelet            spec.containers{nginx-pod}: Container created
  Normal  Started    7s    kubelet            spec.containers{nginx-pod}: Container started
[root@master services]# kubectl logs nginx-pod
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2026/08/24 15:12:11 [notice] 1#1: using the "epoll" event method
2026/08/24 15:12:11 [notice] 1#1: nginx/1.31.4
2026/08/24 15:12:11 [notice] 1#1: built by gcc 14.2.0 (Debian 14.2.0-19) 
2026/08/24 15:12:11 [notice] 1#1: OS: Linux 5.14.0-687.5.3.el9_8.x86_64
2026/08/24 15:12:11 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1024:524288
2026/08/24 15:12:11 [notice] 1#1: start worker processes
2026/08/24 15:12:11 [notice] 1#1: start worker process 29
2026/08/24 15:12:11 [notice] 1#1: start worker process 30
[root@master services]# kubectl exec -it nginx-pod -- /bin/bash
root@nginx-pod:/# 
exit
[root@master services]# kubectl delete pod nginx-pod
pod "nginx-pod" deleted from default namespace
[root@master services]# kubectl delete pods --all   
error: name cannot be provided when a selector is specified
 

查看标签
kubectl get pods --show-labels

添加标签
kubectl label pod nginx-pod app=nginx version=v1

删除标签
kubectl label pod nginx-pod app-

通过标签筛选
kubectl get pods -l app=nginx

多容器 Pod(YAML 声明式)

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  containers:
  - image: reg.timinglee.org/library/myapp:v1
    name: myapp1
  - image: reg.timinglee.org/library/busybox:latest
    name: busybox
    command:
    - /bin/sh
    - -c
    - sleep 10000

kubectl apply -f testpod.yaml
kubectl exec -it testpod -c busybox -- /bin/sh

hostPort 暴露端口

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  containers:
  - image: reg.timinglee.org/library/myapp:v1
    name: myapp1
    ports:
    - name: http
      containerPort: 80
      hostPort: 8080
      protocol: TCP

kubectl apply -f testpod.yaml
curl http://172.25.254.20:8080

环境变量

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: mysql
  name: mysql
spec:
  containers:
  - image: mysql:8.0
    name: mysql8
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: lee

hostNetwork(共享宿主机网络)

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  hostNetwork: true
  containers:
  - image: reg.timinglee.org/library/busybox:latest
    name: busybox
    command:
    - /bin/sh
    - -c
    - sleep 10000

kubectl exec -it testpod -- ifconfig(会看到主机的eth0的ip)

nodeSelector(调度到指定节点)
spec:
  nodeSelector:
    kubernetes.io/hostname: node2
  containers:
  - image: nginx:latest
    name: nginx

kubectl get nodes --show-labels  查看节点标签

QoS 级别    条件    优先级
BestEffort    无 requests 和 limits    最低
Burstable    requests ≠ limits    中等
Guaranteed    requests = limits    最高

 init 容器

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: webserver
  name: webserver
spec:
  initContainers:
  - name: init-busybox
    image: busybox:latest
    command:
    - /bin/sh
    - -c
    - "until test -e /testfile; do echo waiting; sleep 2; done"
  containers:
  - image: nginx:latest
    name: webserver
  restartPolicy: Always

kubectl apply -f init-example.yml
kubectl get pods -w
进入 init 容器创建触发文件
kubectl exec -it webserver -c init-busybox -- touch /testfile

livenessProbe:
  tcpSocket:
    port: 80
  initialDelaySeconds: 3
  periodSeconds: 1
  timeoutSeconds: 1

模拟故障
kubectl exec -it webserver -- nginx -s stop
观察 RESTARTS 增加
kubectl get pods -w

readinessProbe:
  httpGet:
    path: /index.html
    port: 80
  initialDelaySeconds: 3
  periodSeconds: 2
  timeoutSeconds: 1

kubectl exec -it webserver -- rm -f /usr/share/nginx/html/index.html
kubectl describe svc webserver | grep Endpoints   应为空

ReplicaSet 控制器

生成 YAML
kubectl create deployment webcluster --image=myapp:v1 --dry-run=client -o yaml > repset.yml

修改 kind 为 ReplicaSet,删除 strategy
vim repset.yml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  labels:
    app: webcluster
  name: webcluster
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webcluster
  template:
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: reg.timinglee.org/library/myapp:v1
        name: myapp

kubectl apply -f repset.yml
kubectl scale replicaset webcluster --replicas=4
kubectl scale replicaset webcluster --replicas=2
kubectl scale replicaset webcluster --replicas=0

Deployment 控制器

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: webcluster
  name: webcluster
spec:
  minReadySeconds: 5
  replicas: 2
  selector:
    matchLabels:
      app: webcluster
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: reg.timinglee.org/library/myapp:v1
        name: myapp

kubectl apply -f dep.yml
kubectl expose deployment webcluster --port=80 --target-port=80
SVC_IP=$(kubectl get svc webcluster -o jsonpath='{.spec.clusterIP}')
curl http://$SVC_IP

升级到 v2
sed -i 's/myapp:v1/myapp:v2/' dep.yml
kubectl apply -f dep.yml
curl http://$SVC_IP   返回 v2

回滚到 v1
sed -i 's/myapp:v2/myapp:v1/' dep.yml
kubectl apply -f dep.yml
curl http://$SVC_IP   返回 v1

DaemonSet 控制器    在每个节点运行一个 Pod(日志收集、监控代理、网络插件)

apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: daemonset
  name: daemonset
spec:
  selector:
    matchLabels:
      app: daemonset
  template:
    metadata:
      labels:
        app: daemonset
    spec:
      containers:
      - image: reg.timinglee.org/library/myapp:v1
        name: myapp

Job 控制器   执行一次性任务

apiVersion: batch/v1
kind: Job
metadata:
  name: testjob
spec:
  completions: 6
  parallelism: 2
  backoffLimit: 4
  template:
    spec:
      containers:
      - image: perl:5.34.0
        name: testjob
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

kubectl apply -f job.yml
kubectl get pods -w          观察 Pod 创建和完成
kubectl logs <pod-name>      查看输出

CronJob 控制器     用途:定时执行任务

apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - image: busybox:latest
            name: cronjob
            command:
            - /bin/sh
            - -c
            - echo "hello timinglee"
          restartPolicy: OnFailure

kubectl apply -f cronjob.yml
kubectl get cronjobs
kubectl get pods              整分钟后出现 Pod
kubectl logs <pod-name>       输出 hello timinglee

更多推荐