在 Pod 中运行容器

KubernetesKubernetesBeginner
立即练习

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

简介

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

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 94%。获得了学习者 100% 的好评率。

启动 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!

使用 ConfigMaps 创建 Pod

第四步是使用 ConfigMaps 创建一个 Pod。ConfigMap 是一种 Kubernetes 资源,它允许你将配置数据(如环境变量、配置文件)与应用程序代码分开存储。这种分离方式使得在不重新构建容器的情况下更改配置变得更加容易。

让我们将这个过程分解为简单的步骤:

  1. 首先,创建一个 ConfigMap

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

    此命令创建了一个名为 my-config 的 ConfigMap,它存储了一个键值对:

    • 键:MY_ENV_VAR
    • 值:labex

    你可以使用以下命令验证 ConfigMap 是否创建成功并查看其内容:

    kubectl get configmap my-config -o yaml
  2. 接下来,创建一个使用此 ConfigMap 的 Pod

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

    将此 YAML 文件保存到 /home/labex/project/pod-configmap.yaml 并应用它:

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

这将创建一个 Pod,它可以访问我们存储在 ConfigMap 中的配置值。该值将作为环境变量在容器内部可用。你可以通过运行以下命令来验证:

kubectl exec -it my-pod-4 -- env | grep MY_ENV_VAR

创建包含持久卷(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。这些是强大的概念,将帮助你构建更具弹性和可扩展性的应用程序。