第16章学习笔记

98 阅读4分钟

k8s 核心资源 Pod 基本介绍

Pod 的官方介绍文档为 Pods, 对应的中文文档为 Pods.

每个 Pod 都会被网络插件分配 ip, 通过 kubectl get pods -n kube-system -o wide 可以查看对应的 pod ip. 其中 10.244.x.x 是网络插件分配的 ip, 192.168.x.x 是创建时指定了使用物理机的 ip.

创建 Pod 的时候可以指定挂载的存储卷. pod 中的所有容器都可以访问共享卷, 允许这些容器共享数据. pod 只要挂载持久化数据卷, pod 重启之后数据还是会存在的.

创建自主式 Pod

在 k8s 中, 所有的资源都可以使用一个 yaml 文件来创建, 创建 pod 也可以使用 yaml 配置文件. 或者使用 kubectl run 在命令行创建 Pod(不常用).

自主式 Pod

所谓的自主式 Pod, 就是直接定义一个 Pod 资源, 如下 vim pod-tomcat.yaml:

apiVersion: v1
kind: Pod  # 直接指定为 Pod
metadata:
  name: tomcat-test
  namespace: default
  labels:
    app:  tomcat
spec:
  containers:
  - name:  tomcat-java
    ports:
    - containerPort: 8080
    image: tomcat
    imagePullPolicy: IfNotPresent

执行 kubectl apply -f pod-tomcat.yaml 创建 pod, 创建后再次执行为更新. 执行 kubectl get pods 获取所有的 pod, 执行 kubectl delete pods tomcat-test 删除 pod.

如果直接定义一个 Pod 资源, 那 Pod 被删除, 就彻底被删除了, 不会再创建一个新的 Pod, 这在生产环境还是具有非常大风险的, 所以今后我们接触的 Pod, 都是控制器管理的. 当控制器检测到启动的 Pod 数少于设定值的时候, 会自动启动.

控制器管理 Pod

常见的管理 Pod 的控制器: Replicaset, Deployment, Job, CronJob, Daemonset, Statefulset. 控制器管理的 Pod 可以确保 Pod 始终维持在指定的副本数运行. 如通过 Deployment 管理 Pod.

执行 vim nginx-deploy.yaml 填写内容如下:

apiVersion: apps/v1 #
kind: Deployment  # 资源类型.
metadata:
  name: nginx-test  # 控制器的名字.
  labels:
    app: nginx-deploy
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2  # 副本数.
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

执行 kubectl get pods 可以发现有两个名为 nginx-test-哈希值 的 pod 被创建了. 通过 kubectl get deploy 可以发现一个名为 nginx-test 的 deploy 资源. 通过 kubectl get rs 可以获取名为 nginx-test-哈希值 的 replicaset 资源(也可以使用 kubectl get replicaset).

即使执行了 kubectl delete pods nginx-test-哈希值 删除了一个 pod, 也会自动新创建一个新的 pod. 即始终将副本数维持在指定的数量上.

Pod 创建具体流程

第一步: 客户端提交创建 Pod 的请求, 可以通过调用 API Server 的 Rest API 接口, 也可以通过 kubectl 命令行工具. 如 kubectl apply -f filename.yaml. 或者 k8s 的 UI 页面.

第二步: API Server 将属性写入 etcd 中.

第三步: API Server 触发生成 pod 并将信息传递给 Scheduler, Scheduler 找到合适的节点返回给 API Server, API Server 再次将该值写入到 etcd 中.

第四步: API Server 触发绑定 pod 到节点并通知给 kubelet 启动 pod. kubelet 去启动容器.

第五步: 将 pod 信息上报给 API Server, API Server 再次将信息写入到 etcd 中了.

Pod 资源 YAML 编写技巧

执行 kubectl api-versions 查看所有 api 版本.

apiVersion: v1 # api 版本
kind: Pod  # 创建的资源
metadata:
  name: tomcat-test  # pod 的名字
  namespace: default # Pod 所在的名称空间
  labels:
    app:  tomcat  # pod 具有的标签
spec:
  containers:
  - name:  tomcat-java  # pod 里容器的名字
    ports:
    - containerPort: 8080 # 容器暴露的接口
      name: web
    image: tomcat  # 容器使用的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略 

  • 执行 kubectl explain pods 查看如何编写 yaml 资源清单文件.

  • 执行 kubectl explain pod.metadata 查看如何编写 metadata 字段.

  • 执行 kubectl explain pod.spec 查看如何编写 spec 字段.

  • 执行 kubectl explain pod.spec.containers 查看如何编写 containers 字段.

  • 执行 kubectl explain pod.spec.containers.ports 查看如何编写 ports 字段.

  • kubectl get pods -o wide -l app= pod名称 可以查看 pod 运行情况.

  • kubectl logs -f pod名称 获取 pod 日志.

  • kubectl logs pod名称 -c 容器名称 获取 pod 中指定容器的日志.

  • kubectl exec -it pod名称 -- /bin/bash 进入 pod 终端.

  • kubectl exec -it pod名称 -c 容器名称 -- /bin/bash 进入指定容器终端.

kubectl run 运行 pod 资源

kubectl run --help 查看用法.

通过 kubectl run 创建 pod. kubectl run tomcat --image=tomcat --image-pull-policy='IfNotPresent' --port=8080.

执行 kubectl get pods pod名称 -o yaml 获取 pod 的 yaml 资源文件.