第二章: Kubernetes - 操作 Pod
·
第二章:创建 Pod
2.1 Pod 基本操作
1. 创建 pod
kubectl create -f 01-nginx-pod.yaml
kubectl apply -f 01-nginx-pod.yaml
注意: create 仅仅是不存在时创建,如果已经存在则报错!apply 不存在创建,存在更新配置。推荐使用 apply!
2. 查看 pod
# 查看默认命名空间的 pod
kubectl get pods|pod|po
# 查看所有命名空间的 pod
kubectl get pods|pod -A
kubectl get pods|pod|po -n 命名空间名称
# 查看默认命名空间下 pod 的详细信息
kubectl get pods -o wide
# 查看所有命名空间下 pod 的详细信息
kubectl get pods -o wide -A
# 实时监控 pod 的状态
kubectl get pod -w
3. 删除 pod
kubectl delete pod pod名称
kubectl delete -f pod.yml
4. 进入 pod 中容器
# 注意: 这种方式进入容器默认只会进入 pod 中第一个容器
kubectl exec -it nginx(pod名称) --(固定写死) bash(执行命令)
# 注意: 进入指定 pod 中指定容器
kubectl exec -it pod名称 -c 容器名称 --(固定写死) bash(执行命令)
5. 查看 pod 日志
# 注意: 查看 pod 中第一个容器日志
kubectl logs -f(可选,实时) nginx(pod 名称)
# 注意: 查看 pod 中指定容器的日志
kubectl logs -f pod名称 -c 容器名称
6. 查看 pod 描述信息
kubectl describe pod nginx(pod名称)
2.2 创建第一个Pod
apiVersion: v1 # 必选,指定该对象的API版本,通常是v1,用于Pod、Service等对象
kind: Pod # 必选,资源类型,这里表示一个Pod对象
metadata:
name: nginx # 必选,Pod的名称,唯一标识Pod
labels: # 标签是Key/Value键值对,用于组织、选择Pod
app: nginx # app标签,用于标识Pod属于哪个应用
tier: frontend # tier标签,用于标识Pod在应用中的层级,例如:前端、后端等
namespace: default # 必选,Pod所在的命名空间,默认是default,可以创建不同的命名空间来隔离资源
annotations: # 注解用于存储非标识性的元数据
app: nginx # 注解,可以包含更多的非标识性信息,便于管理和跟踪
spec:
containers: # 定义Pod中包含的容器
- name: nginx # 必选,容器的名称,通常用于标识容器
image: nginx:latest # 必选,容器使用的镜像,这里使用的是nginx的最新镜像
imagePullPolicy: IfNotPresent # 可选,定义容器镜像拉取策略,IfNotPresent表示如果本地已有该镜像,则不再拉取
command: # 可选,覆盖容器的默认命令
- /bin/sh
- -c
- nginx -g "daemon off;" # nginx的启动命令,指定以前台模式启动nginx
workingDir: /usr/share/nginx/html # 可选,容器的工作目录,nginx将从该目录提供静态文件
ports: # 定义容器暴露的端口
- name: http # 可选,端口的名称,可以用于引用
containerPort: 80 # 必选,容器内部的端口号,nginx监听的端口
protocol: TCP # 必选,协议类型,默认是TCP
env: # 环境变量,可以在容器启动时传递配置
- name: TZ # 可选,定义时区环境变量
value: Asia/Shanghai # 设置时区为上海
- 创建pod,查看运行状态

2.3 Pod 运行多个容器
apiVersion: v1
kind: Pod
metadata:
name: mypods
labels:
app: mypods
namespace: default
annotations:
nginxVersion: latest
redisVersion: latest
spec:
containers:
- name: nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- nginx -g "daemon off;"
workingDir: /usr/share/nginx/html
ports:
- name: http
containerPort: 80
protocol: TCP
env:
- name: TZ
value: Asia/Shanghai
- name: redis # 第二个容器
image: redis:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 6379
restartPolicy: Always
kubectl apply -f mypods.yaml
2.4 查看指定容器日志
# 查看日志 (默认只查看第一个容器日志,这里是展示 nginx 日志)
kubectl logs -f myapp
# 查看 pod 中指定容器的日志
kubectl logs -f myapp -c nginx(容器名称)
kubectl logs -f myapp -c redis(容器名称)
2.5 进入容器
# 进入 pod 的容器 (默认进入第一个容器内部,这里会进入 nginx 容器内部)
kubectl exec -it myapp -- sh
# 进入 pod 中指定容器内部
kubectl exec -it myapp -c nginx -- sh
kubectl exec -it myapp -c redis -- sh
2.6 Pod 的 Labels(标签)
标签(Labels)是附加到 Kubernetes 对象(比如 Pod)上的键值对。 标签旨在用于指定对用户有意义且相关的对象的标识属性。标签可以在创建时附加到对象,随后可以随时添加和修改。每个对象都可以定义一组键(key)/值(value)标签,但是每个键(key)对于给定对象必须是唯一的。- 标签作用: 就是用来给 k8s 中对象起别名, 有了别名可以过滤和筛选
1. 语法:
标签由键值对组成,其有效标签值:- 必须为 63 个字符或更少(可以为空)
- 除非标签值为空,必须以字母数字字符(
[a-z0-9A-Z])开头和结尾 - 包含破折号(
-)、下划线(_)、点(.)和字母或数字
2. 示例
apiVersion: v1
kind: Pod
metadata:
name: myapp
labels:
name: myapp #创建时添加
spec:
containers:
- name: nginx
image: nginx:1.21
imagePullPolicy: IfNotPresent
- name: redis
image: redis:5.0.10
imagePullPolicy: IfNotPresent
restartPolicy: Always
3. 标签基本操作
# 查看标签
kubectl get pods --show-labels
# kubectl label pod pod名称 标签键值对
kubectl label pod myapp env=prod
# 覆盖标签 --overwrite
kubectl label --overwrite pod myapp env=test
# 删除标签 -号代表删除标签
kubectl label pod myapp env-
# 根据标签筛选 env=test/env > = <
kubectl get po -l env=test
kubectl get po -l env
kubectl get po -l '!env' # 不包含的 pod
kubectl get po -l 'env in (test,prod)' #选择含有指定值的 pod
kubectl get po -l 'env notin (test,prod)' #选择含有指定值的 pod
2.7 Pod 中 init 容器
1. Init 容器
- Init 容器是在 Pod 中、业务容器之前顺序执行的容器,用于完成初始化工作。
- 核心特点:
- 先执行
- 顺序执行
- 执行成功后才会启动业务容器
| 特性 | 说明 |
|---|---|
| 执行顺序 | 按定义顺序串行执行 |
| 执行时机 | 主容器之前 |
| 失败行为 | 失败会重试,Pod 不 Ready |
| 资源计算 | 取 init 容器中最大值 |
| 生命周期 | 执行完成即退出 |
2. 定义 Init 容器
apiVersion: v1
kind: Pod
metadata:
name: init-demo
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', 'echo init-myservice is running! && sleep 5']
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', 'echo init-mydb is running! && sleep 10']
更多推荐



所有评论(0)