CKAD考试实操指南(八)---永恒记忆:状态持久性实践技巧

原创
2023/10/08 20:10
阅读数 137

状态持久性

在这份CKAD考试实操指南中,我将为你详细介绍如何利用CKAD-exercises项目知十平台进行CKAD考试的准备和复习。通过CKAD-exercises提供的练习题,你可以在知十平台的云原生环境中进行实践和模拟。在这个过程中,你将熟悉Kubernetes的各种操作和场景,并在实践中加深对知识的理解。这种结合实践和理论的学习方式将为你在考试中取得优异成绩提供强有力的支持。

首先,打开浏览器,访问知十平台。在页面右上角点击“登录”,然后使用微信扫码登录即可。

在未登录状态下,每个环境只能体验15分钟,每天有5次机会使用。登录后,每个环境可用时长为1小时,每天登录也有5次的使用机会。

当选择好要进入环境后,通常只需要等待约一分钟左右,就能进入环境中。在等待期间,你可以浏览环境说明文档,了解该环境包含哪些组件及版本。

现在开始第七个主题----状态持久性的实操

官网链接及访问路径

这里使用到官网的链接及访问路径如下:

Kubernetes Documentation > Concepts > Storage > Volumes

https://kubernetes.io/docs/concepts/storage/volumes/

Kubernetes Documentation > Concepts > Storage > Persistent Volumes

https://kubernetes.io/docs/concepts/storage/persistent-volumes/

题目

状态持久性

1、Create busybox pod with two containers, each one will have the image busybox and will run the 'sleep 3600' command. Make both containers mount an emptyDir at '/etc/foo'. Connect to the second busybox, write the first column of '/etc/passwd' file to '/etc/foo/passwd'. Connect to the first busybox and write '/etc/foo/passwd' file to standard output. Delete pod.

译:用两个容器创建busybox pod,每个容器都使用busybox镜像,并运行'sleep 3600'命令。让两个容器都在'/etc/foo'挂载一个emptyDir。连接到第二个busybox容器,将“/etc/passwd”文件的第一列写入“/etc/foo/passwd”。连接到第一个busybox容器并将'/etc/foo/passwd'文件写入标准输出。删除pod。

# 首先创建一个pod的模板文件:

# kubectl: 这是Kubernetes命令行工具,用于与Kubernetes集群进行交互和管理。
# run busybox: 这部分命令表示要创建一个名为"busybox"的Pod。Pod是Kubernetes中的最小部署单元,通常包含一个或多个容器。
# --image=busybox: 这是一个选项,用于指定要在Pod中使用的容器镜像。在这里,使用的是"busybox"容器镜像,这是一个轻量级Linux发行版。
# --restart=Never: 这是另一个选项,用于指定Pod的重启策略。"Never"表示一旦Pod终止,就不会自动重新启动。这意味着这个Pod只会运行一次并在完成后停止。
# -o yaml: 这是一个选项,用于指示kubectl以YAML格式输出Pod的配置。
# --dry-run=client: 这是另一个选项,用于执行模拟运行而不实际创建Pod。这样,你可以在创建之前查看生成的YAML配置。
# -- /bin/sh -c 'sleep 3600': 这部分命令是容器的入口命令。它告诉容器在启动时执行/bin/sh -c 'sleep 3600'命令,即在容器内部运行sleep 3600,使容器保持运行状态3600秒(1小时)。
# > pod.yaml: 这部分命令将kubectl命令的输出重定向到一个名为"pod.yaml"的文件中,以保存生成的Pod配置。
kubectl run busybox --image=busybox --restart=Never -o yaml --dry-run=client -- /bin/sh -c 'sleep 3600' > pod.yaml

vi pod.yaml

# 复制粘贴容器定义,并键入末尾有注释的行:

---
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: busybox
  name: busybox
spec:
  dnsPolicy: ClusterFirst
  restartPolicy: Never
  containers:
  - args:
    - /bin/sh
    - -c
    - sleep 3600
    image: busybox
    imagePullPolicy: IfNotPresent
    name: busybox
    resources: {}
    volumeMounts: #
    - name: myvolume #
      mountPath: /etc/foo #
  - args:
    - /bin/sh
    - -c
    - sleep 3600
    image: busybox
    name: busybox2 # 第二个容器的名称,必须与第一个容器的名称不同
    volumeMounts: #
    - name: myvolume #
      mountPath: /etc/foo #
  volumes: #
  - name: myvolume #
    emptyDir: {} #
---
# 创建pod
kubectl apply -f pod.yaml

# 连接到第二个容器:
kubectl exec -it busybox -c busybox2 -- /bin/sh

# 将/etc/passwd第一列写入/etc/foo/passwd
cat /etc/passwd | cut -f 1 -d ':' > /etc/foo/passwd 

# 确认写入成功
cat /etc/foo/passwd 
exit

# 连接到第一个容器:
kubectl exec -it busybox -c busybox -- /bin/sh

# 确认已经挂载
mount | grep foo 
# 查看内容
cat /etc/foo/passwd
exit

#删除pod
kubectl delete po busybox

知识点

  • 多容器Pod:
    • 共享网络命名空间:多容器Pod中的所有容器共享同一个网络命名空间。这意味着它们可以使用localhost相互通信,也可以使用相同的网络端口。
    • 共享存储卷:Pod中的多个容器可以共享存储卷。这意味着它们可以在同一目录中读取和写入文件,从而实现容器之间的数据共享。
    • 生命周期:多容器Pod中的容器共享生命周期,它们在同一时间启动和停止。这意味着它们的生命周期是紧密耦合的,一个容器的退出可能会影响其他容器。
  • 容器间共享目录:
    • 共享卷(Volume) :容器可以通过卷(Volume)来共享目录。卷是Kubernetes中的一种资源,它可以附加到Pod并在容器之间共享。容器可以在卷上读取和写入文件,实现数据共享。
    • 空目录卷:Kubernetes提供了一个特殊类型的卷叫做"空目录卷"(emptyDir),它可以用于容器之间的临时数据共享。它会在Pod启动时创建,并在Pod中的容器之间共享,但当Pod被删除时,数据将丢失。
    • 主机路径卷:容器也可以通过挂载主机文件系统路径来共享目录。这使得容器可以访问主机上的文件和目录,但这需要更高的权限。
    • 持久卷(Persistent Volume) :如果需要在容器之间共享持久性数据,可以使用持久卷。持久卷是持久性存储的抽象,可以附加到Pod并在容器之间共享。
    • ConfigMap和Secret:Kubernetes还提供了ConfigMap和Secret这两种资源,它们可以用于在容器之间共享配置数据和敏感数据。这些资源可以在Pod中挂载为文件或环境变量。

2、Create a PersistentVolume of 5Gi, called 'myvolume'. Make it have accessMode of 'ReadWriteOnce' and 'ReadWriteMany', storageClassName 'normal', mounted on hostPath '/etc/foo'. Save it on pv.yaml, add it to the cluster. Show the PersistentVolumes that exist on the cluster

译:创建一个5 Gi的PersistentVolume,称为“myvolume”。使其accessMode为“ReadWriteOnce”和“ReadWriteMany”,storageClassName为“normal”,挂载在hostPath“/etc/foo”上。将其保存在pv.yaml中,并将其添加到集群中。展示群集上存在的PersistentVolumes。

# 写入pv.yaml文件
vi pv.yaml

---
kind: PersistentVolume
apiVersion: v1
metadata:
  name: myvolume # PV的名称,供后续引用
spec:
  storageClassName: normal # 指定StorageClass的名称
  capacity:
    storage: 5Gi # PV的存储容量为5GB
  accessModes:
    - ReadWriteOnce # 支持单个Pod以读写模式挂载
    - ReadWriteMany # 支持多个Pod以读写模式挂载
  hostPath:
    path: /etc/foo # PV使用本地主机路径作为存储
---

# 创建pv
kubectl create -f pv.yaml

# 获取pv状态
kubectl get pv

知识点

  • 持久卷(Persistent Volume) :PV表示物理或虚拟的持久性存储资源,如硬盘驱动器、网络存储、云存储卷等。
  • 容量(Capacity) :PV具有指定的存储容量,用于定义卷的大小。
  • 访问模式(Access Modes) :PV可以配置为支持不同的访问模式,如:
    • ReadWriteOnce (RWO):可以被一个Pod以读写模式挂载。
    • ReadOnlyMany (ROX):可以被多个Pod以只读模式挂载。
    • ReadWriteMany (RWX):可以被多个Pod以读写模式挂载。
  • 回收策略(Reclaim Policy) :PV可以配置为指定回收策略,确定PV在其绑定的PVC(Persistent Volume Claim)被删除后的行为。常见的回收策略包括:
    • Retain:PV保留卷中的数据,需要手动处理删除和回收。
    • Delete:PV删除卷中的数据,当PVC被删除时,PV也被删除。
  • 分配策略(Volume Binding Mode) :PV可以配置为指定分配策略,例如 ImmediateWaitForFirstConsumer。Immediate 表示PV将立即绑定到PVC,而 WaitForFirstConsumer 表示PV将等待第一个Pod使用PVC时才绑定。

3、Create a PersistentVolumeClaim for this storage class, called 'mypvc', a request of 4Gi and an accessMode of ReadWriteOnce, with the storageClassName of normal, and save it on pvc.yaml. Create it on the cluster. Show the PersistentVolumeClaims of the cluster. Show the PersistentVolumes of the cluster

译:为这个存储类创建一个PersistentVolumeClaim,名为'mypvc',请求为4Gi,accessMode为ReadWriteOnce,storageClassName为normal,并将其保存在pvc. yaml上。在集群上创建它。展示集群的PersistentVolumeClaims。展示群集的PersistentVolumes

vi pvc.yaml

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mypvc # PVC的名称,供后续引用
spec:
  storageClassName: normal # 指定使用的StorageClass的名称
  accessModes:
    - ReadWriteOnce #请求以单个Pod以读写模式挂载
  resources:
    requests:
      storage: 4Gi # 请求4GB的存储容量
---

#创建PVC
kubectl create -f pvc.yaml

# 查看pvc
kubectl get pvc

# 查看pv
kubectl get pv 

知识点

  • 声明持久性存储:PVC允许应用程序声明其需要的持久性存储资源。应用程序可以指定存储容量、访问模式等需求。
  • 独立于底层存储:PVC与底层存储资源(PV)分开定义。PVC仅声明需求,而PV表示实际的存储资源。这种分离允许集群管理员为不同的PVC提供适当的存储资源。
  • 存储类别关联:PVC可以与存储类别(StorageClass)关联,存储类别定义了如何动态分配PV。存储类别通常与云提供商或存储系统集成,可以自动创建PV。
  • 访问模式(Access Modes) :PVC可以指定访问模式,以确定Pod如何使用PV。常见的访问模式包括:
    • ReadWriteOnce (RWO):支持单个Pod以读写模式挂载。
    • ReadOnlyMany (ROX):支持多个Pod以只读模式挂载。
    • ReadWriteMany (RWX):支持多个Pod以读写模式挂载。
  • 绑定到PV:一旦PVC被创建,Kubernetes会尝试将其绑定到符合其需求的PV。PV必须满足PVC的存储容量、访问模式等需求才能成功绑定。
  • Pod中的挂载:Pod可以引用PVC来挂载PV中的持久性存储。这允许Pod在重新部署或迁移时保留其数据。
  • 动态和静态配置:PVC可以与静态PV关联,其中PV是由管理员手动配置的,也可以与动态PV关联,其中PV是由StorageClass动态创建的。
  • 生命周期与删除策略:PVC的生命周期通常与Pod关联,当Pod被删除时,PVC也会被删除。可以配置PVC以指定保留或删除策略。

4、Create a busybox pod with command 'sleep 3600', save it on pod.yaml. Mount the PersistentVolumeClaim to '/etc/foo'. Connect to the 'busybox' pod, and copy the '/etc/passwd' file to '/etc/foo/passwd'

译:使用命令'sleep 3600'创建一个busybox pod,将其保存在pod. yaml中。挂载pvc到/etc/foo目录,连接到'busybox' pod,并将'/etc/passwd'文件复制到'/etc/foo/passwd'

# kubectl: 这是Kubernetes命令行工具,用于与Kubernetes集群进行交互和管理。
# run busybox: 这部分命令表示要创建一个名为"busybox"的Pod。
# --image=busybox: 指定了要在Pod中使用的容器镜像,这里使用的是"busybox"容器镜像,它是一个轻量级的Linux发行版。
# --restart=Never: 指定Pod的重启策略。"Never"表示一旦Pod终止,就不会自动重新启动。这意味着这个Pod只会运行一次,运行一个sleep命令,然后在1小时后自动终止。
# -o yaml: 指示kubectl以YAML格式输出Pod的配置。
# --dry-run=client: 它告诉kubectl执行模拟运行而不实际创建Pod。这样,可以在创建之前查看生成的YAML配置,以便检查是否符合预期。
# /bin/sh -c 'sleep 3600': 这部分命令是容器的入口命令。它告诉容器在启动时执行/bin/sh -c 'sleep 3600'命令,即在容器内部运行sleep 3600,使容器保持运行状态3600秒(1小时)。
# > pod.yaml: 这部分命令将kubectl命令的输出重定向到一个名为"pod.yaml"的文件中,以保存生成的Pod配置。
kubectl run busybox --image=busybox --restart=Never -o yaml --dry-run=client -- /bin/sh -c 'sleep 3600' > pod.yaml

vi pod.yaml


#添加以注释结尾的行:
---
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: busybox
  name: busybox
spec:
  containers:
  - args:
    - /bin/sh
    - -c
    - sleep 3600
    image: busybox
    imagePullPolicy: IfNotPresent
    name: busybox
    resources: {}
    volumeMounts: #
    - name: myvolume #
      mountPath: /etc/foo #
  dnsPolicy: ClusterFirst
  restartPolicy: Never
  volumes: #
  - name: myvolume #
    persistentVolumeClaim: #
      claimName: mypvc #
status: {}
---


# 创建pod:
kubectl create -f pod.yaml

# 连接到pod并将'/etc/passwd'复制到'/etc/foo/passwd':
kubectl exec busybox -it -- cp /etc/passwd /etc/foo/passwd

5、Create a second pod which is identical with the one you just created (you can easily do it by changing the 'name' property on pod.yaml). Connect to it and verify that '/etc/foo' contains the 'passwd' file. Delete pods to cleanup. Note: If you can't see the file from the second pod, can you figure out why? What would you do to fix that?

译:创建第二个pod,它与刚才创建的pod相同(可以通过更改pod.yaml上的'name'属性轻松完成)。连接到它并验证'/etc/foo'包含'passwd'文件。删除要清理的pod。注意:如果您看不到第二个pod中的文件,您能找出原因吗?你会怎么做来弥补

# 创建第二个pod,名为busybox2:

vim pod.yaml
# 修改 'metadata.name: busybox' 为 'metadata.name: busybox2'
kubectl create -f pod.yaml

# 查看/etc/foo文件夹
kubectl exec busybox2 -- ls /etc/foo 
# 清理资源
kubectl delete po busybox busybox2
kubectl delete pvc mypvc
kubectl delete pv myvolume


# 如果文件在第二个pod上没有显示,但在第一个pod上显示,则很可能是在其他节点上调度的。
# 查看pod是否存在于同一个节点
kubectl get po busybox -o wide
kubectl get po busybox2 -o wide


# 如果它们位于不同的节点上,您将看不到该文件,因为我们使用了hostPath卷类型。如果需要访问多节点群集中的相同文件,则需要独立于特定节点的卷类型。每个云提供商都有很多不同的类型,一般的解决方案可能是使用NFS。

知识点

常见的Volume类型:

  • EmptyDir:EmptyDir卷是一个空目录,它在Pod的生命周期内存在,并且可以由Pod中的容器共享。它通常用于临时数据共享,但不具有持久性。
  • HostPath:HostPath卷允许将宿主节点上的文件系统路径挂载到Pod中,以便Pod可以访问宿主节点上的文件。它主要用于开发、测试和特殊用例。注意:如果调度到不同的节点,hostpath中存在的内容可能不一致
  • PersistentVolumeClaim (PVC) :PVC是一种用于声明和请求持久性存储资源的卷类型。PVC可以与各种存储后端(如NFS、AWS EBS、Azure Disk等)关联,以提供持久性存储。
  • ConfigMap:ConfigMap卷允许将ConfigMap资源中的配置数据挂载到Pod中,以便容器可以访问配置信息。这对于将配置数据注入容器非常有用。
  • Secret:Secret卷类似于ConfigMap,但用于敏感数据的存储,如密码、API密钥等。它可以将Secret资源中的数据挂载到Pod中。
  • NFS:NFS卷允许将Network File System(NFS)共享挂载到Pod中,以提供网络存储访问。这对于需要共享数据的多个Pod非常有用。
  • iSCSI、Fibre Channel等块存储:这些Volume类型允许将块存储设备挂载到Pod中,通常用于需要低级别块访问的应用程序,如数据库。
  • CSI(Container Storage Interface) :CSI是一种插件化的存储接口,允许集群中的不同存储后端(如Ceph、GlusterFS、CSI驱动等)与Kubernetes集成,并提供各种Volume类型。
  • PersistentVolume(PV) :PersistentVolume本身也是一种卷类型,表示集群中的持久性存储资源,它可以被PVC声明和使用。

6、Create a busybox pod with 'sleep 3600' as arguments. Copy '/etc/passwd' from the pod to your local folder

译:创建一个busybox pod,参数为'sleep 3600'。将Pod中的“/etc/passwd”复制到本地文件夹

# kubectl: 这是 Kubernetes 命令行工具,用于与 Kubernetes 集群进行交互和管理。
# run busybox: 这部分命令表示要创建一个名为 "busybox" 的 Pod。"busybox" 是一个轻量级的 Linux 发行版,通常用于调试和测试。
# --image=busybox: 这是一个选项,指定了要在 Pod 中使用的容器镜像,这里使用的是 "busybox" 容器镜像。
# --restart=Never: 这是另一个选项,它指定了 Pod 的重启策略。"Never" 表示一旦 Pod 终止,就不会自动重新启动。这意味着这个 Pod 只会运行一次,执行 sleep 3600 命令,然后在 3600 秒(1 小时)后自动终止。
# -- sleep 3600: 这部分命令是容器的入口命令。它告诉容器在启动时执行 sleep 3600 命令,即在容器内部运行 sleep 命令以使容器保持运行状态 3600 秒(1 小时)。
kubectl run busybox --image=busybox --restart=Never -- sleep 3600

# kubectl: 这是 Kubernetes 命令行工具,用于与 Kubernetes 集群进行交互和管理。
# cp: 这是 kubectl 命令的子命令,用于复制文件到或从Pod中。
# busybox:/etc/passwd: 这是指定源文件的部分,表示要从名为 "busybox" 的 Pod 中的 /etc/passwd 文件进行复制。
# busybox 是目标 Pod 的名称。
# :/etc/passwd 是目标文件的路径。这表示要从目标 Pod 的 /etc/passwd 文件复制数据。
# ./passwd: 这是指定目标文件的部分,表示复制的数据将保存为当前工作目录下的 passwd 文件。
kubectl cp busybox:/etc/passwd ./passwd

cat passwd

知识点

kubectl cp 命令的基本语法如下:

  • 从本地到 Pod:kubectl cp /:
  • 从 Pod 到本地:kubectl cp /:
    • ``:本地文件系统上的源文件或目录的路径。
    • ``:Pod 所在的命名空间。
    • ``:目标 Pod 的名称。
    • ``:在 Pod 中的目标文件或目录路径。
    • ``:在 Pod 中的源文件或目录路径。
    • ``:本地文件系统上的目标文件或目录路径。

模拟考试

注意:注册CKA,CKAD或CKS认证考试的考生将有 2 次机会(每次注册的考试)到 Killer.sh 参加模拟考试。

预约方式:

  • 登录 个人账户,点击CKA,CKAD或CKS右侧的 Start/Resume 按钮进入Checklist页面。
  • 在 Schedule Exam 这一项中找到 Simulator(考试模拟器) 的访问链接。
  • 每注册一次考试可获得两次模拟考试的机会。
  • 每一次模拟考试可在激活后的36个小时内访问。
  • 模拟考试包含20-25个问题,与真实考试保持一致。

系列文章

我叫小十,关注我,我将继续更新 CKAD 考试攻略与实操指南文章系列

CKAD 考试实操指南(一)--- 登顶 CKAD:征服考试的完美蓝图

CKAD 考试实操指南(二)--- 深入核心:探秘 Kubernetes 核心实操秘技

CKAD 考试实操指南(三)--- 舞动容器:多容器 Pod 实践指南

CKAD 考试实操指南(四)--- 优雅设计:掌握 Pod 设计技巧

CKAD 考试实操指南(五)---定制你的舞台:配置实践要点

CKAD考试实操指南(六)---剖析系统:深入可观察性实践

CKAD 考试实操指南(七)--- 网络纵横谋略:服务和网络实战要诀

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部