第二章:创建 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']
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐