在 Pod 中运行容器

KubernetesKubernetesBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何在 Kubernetes Pod 中运行容器。Pod 是 Kubernetes 中最小的、最简单的单元,它可以包含一个或多个容器。在 Pod 中运行容器具有许多优势,包括更好的资源利用率、更轻松的扩展以及更高效的部署。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicsGroup(["`Basics`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicCommandsGroup(["`Basic Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/AdvancedCommandsGroup(["`Advanced Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/ConfigurationandVersioningGroup(["`Configuration and Versioning`"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("`Initialization`") kubernetes/BasicCommandsGroup -.-> kubernetes/get("`Get`") kubernetes/BasicCommandsGroup -.-> kubernetes/create("`Create`") kubernetes/BasicCommandsGroup -.-> kubernetes/run("`Run`") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("`Apply`") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/config("`Config`") subgraph Lab Skills kubernetes/initialization -.-> lab-14998{{"`在 Pod 中运行容器`"}} kubernetes/get -.-> lab-14998{{"`在 Pod 中运行容器`"}} kubernetes/create -.-> lab-14998{{"`在 Pod 中运行容器`"}} kubernetes/run -.-> lab-14998{{"`在 Pod 中运行容器`"}} kubernetes/apply -.-> lab-14998{{"`在 Pod 中运行容器`"}} kubernetes/config -.-> lab-14998{{"`在 Pod 中运行容器`"}} end

启动 Minikube 集群

在创建资源之前,你需要一个正在运行的 Kubernetes 集群。Minikube 是一个轻量级的 Kubernetes 环境,可以在你的本地机器上运行。

  1. 导航到工作目录

    打开终端并导航到默认的项目文件夹:

    cd /home/labex/project
  2. 启动 Minikube

    启动 Minikube 以初始化一个 Kubernetes 集群:

    minikube start
    • 此命令将在你的本地机器上设置一个单节点的 Kubernetes 集群。
    • 根据系统性能,Minikube 可能需要几分钟才能启动。
  3. 验证 Minikube 是否正在运行

    检查 Minikube 集群的状态:

    minikube status
    • 查找 kubeletapiserver 等组件是否显示为 Running
    • 如果集群未运行,请重新运行 minikube start

如果启动 Minikube 时遇到问题,可以使用 minikube delete 来重置环境(如有需要)。

创建包含单个容器的 Pod

第一步是创建一个包含单个容器的 Pod。为此,你需要创建一个 YAML 文件来定义 Pod 及其容器。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod-1
spec:
  containers:
    - name: my-container
      image: nginx

将上述代码保存到名为 /home/labex/project/pod-single-container.yaml 的文件中,并执行以下命令:

kubectl apply -f /home/labex/project/pod-single-container.yaml

此命令将创建一个名为 my-pod-1 的 Pod,其中包含一个名为 my-container 的容器,该容器运行 Nginx 镜像。

创建包含多个容器的 Pod

第二步是创建一个包含多个容器的 Pod。为此,你需要修改之前的 YAML 文件以添加另一个容器。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod-2
spec:
  containers:
    - name: my-container
      image: nginx
    - name: my-sidecar
      image: busybox
      command: ["sh", "-c", "echo Hello from the sidecar! && sleep 3600"]

将上述代码保存到名为 /home/labex/project/pod-multiple-containers.yaml 的文件中,并执行以下命令:

kubectl apply -f /home/labex/project/pod-multiple-containers.yaml

此命令将创建一个名为 my-pod-2 的 Pod,其中包含两个容器。第一个容器运行 Nginx 镜像,第二个容器运行 BusyBox 镜像并向控制台打印一条消息。

创建包含环境变量的 Pod

第三步是创建一个包含环境变量的 Pod。为此,你需要修改 YAML 文件以向 Nginx 容器添加环境变量。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod-3
spec:
  containers:
    - name: my-container
      image: nginx
      env:
        - name: MY_ENV_VAR
          value: "Hello World!"

将上述代码保存到名为 /home/labex/project/pod-env-vars.yaml 的文件中,并执行以下命令:

kubectl apply -f /home/labex/project/pod-env-vars.yaml

此命令将创建一个名为 my-pod-3 的 Pod,其中包含一个名为 my-container 的容器,该容器运行 Nginx 镜像,并具有一个名为 MY_ENV_VAR 的环境变量,其值为 Hello World!

创建包含 ConfigMap 的 Pod

第四步是创建一个包含 ConfigMap 的 Pod。ConfigMap 是一种将配置数据与应用程序代码分离的方式。

为此,你首先需要创建一个包含一些数据的 ConfigMap。

kubectl create configmap my-config --from-literal=MY_ENV_VAR=labex

此命令将创建一个名为 my-config 的 ConfigMap,其中包含一个键 MY_ENV_VAR 和值 labex

接下来,你需要修改 YAML 文件以将 ConfigMap 添加到 Nginx 容器中。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod-4
spec:
  containers:
    - name: my-container
      image: nginx
      envFrom:
        - configMapRef:
            name: my-config

将上述代码保存到名为 /home/labex/project/pod-configmap.yaml 的文件中,并执行以下命令:

kubectl apply -f /home/labex/project/pod-configmap.yaml

此命令将创建一个名为 my-pod-4 的 Pod,其中包含一个名为 my-container 的容器,该容器运行 Nginx 镜像,并将名为 my-config 的 ConfigMap 注入为环境变量。

创建包含持久卷(Persistent Volume)的 Pod

第五步是创建一个包含持久卷(Persistent Volume, PV)和持久卷声明(Persistent Volume Claim, PVC)的 Pod。PV 和 PVC 用于在 Pod 重启时持久存储和访问数据。

为此,你首先需要创建一个 PV。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

将上述代码保存到名为 /home/labex/project/pv.yaml 的文件中,并执行以下命令:

kubectl apply -f /home/labex/project/pv.yaml

此命令将创建一个名为 my-pv 的 PV,容量为 1Gi,主机路径为 /mnt/data

接下来,你需要创建一个 PVC,从 PV 中请求 1Gi 的存储空间。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

将上述代码保存到名为 /home/labex/project/pvc.yaml 的文件中,并执行以下命令:

kubectl apply -f /home/labex/project/pvc.yaml

此命令将创建一个名为 my-pvc 的 PVC,请求 1Gi 的存储空间。

最后,你需要修改 YAML 文件,向 Nginx 容器添加一个卷和卷挂载。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod-5
spec:
  containers:
    - name: my-container
      image: nginx
      volumeMounts:
        - name: my-volume
          mountPath: /mnt/data
  volumes:
    - name: my-volume
      persistentVolumeClaim:
        claimName: my-pvc

将上述代码保存到名为 /home/labex/project/pod-pv.yaml 的文件中,并执行以下命令:

kubectl apply -f /home/labex/project/pod-pv.yaml

此命令将创建一个名为 my-pod-5 的 Pod,其中包含一个名为 my-container 的容器,该容器运行 Nginx 镜像,并在 /mnt/data 处挂载了一个由 PVC my-pvc 支持的卷。

总结

恭喜!你已经完成了本实验,并学习了如何在 Kubernetes Pod 中运行容器。你还学习了如何创建包含多个容器、环境变量、ConfigMap 和持久卷(Persistent Volume)的 Pod。这些是强大的概念,将帮助你构建更具弹性和可扩展性的应用程序。

您可能感兴趣的其他 Kubernetes 教程