Kubernetes Pod 管理及控制器管理
查看命名空间 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
更多推荐

所有评论(0)