Kubernetes的hostpath创建pv和pvc的验证---以部署halo博客系统为例

结论:hostapath作为一种存储类型是支持使用pv及pvc声明使用的。

缘由:最近在寻求云计算方向的运维管理岗位,周五晚上参加了一个头部大厂的西安岗位电面,面试人似乎不情愿作为本场考评的面试官,我在电子会议等了大约17分钟对方才姗姗迟来,张口就问H厂计算产品的各部件工作原理是什么(恕我已经在工作简历中描述清楚了,我只是部署使用过H厂的产品,在公开的技术资料中并未见到各部件的工作原理详细描述,因为各厂商都宣称自己的产品基于开源产品进行了深度重构,并以商业机密为由拒绝披露),在谈到Kubernetes云原生的存储实现时,对方趾高气扬地打断我道:hostpath不能使用pvc动态申明使用。昨天我查阅了Kubernetes的产品文档、专题书籍和相关的博客文章均为明确定义hostpath不能使用pvc动态申明使用 ,最多的描述是在业务生产环境中不建议使用hostapath作为存储。

好吧,实践是检验真理正确与否的唯一标准,到实验靶场上验证一下使用hostapath 做 k8s-APP 的持久化存储是否可行就一清二楚了。

Kubernetes靶场环境:

1master和2slave组成最小化集群,宿主机OS为CentOS7-2207版本,搭建的Kubernetes集群是 基于containerd的 version 1.28.0 版本的。

宿主机规格为 2C/2G、20GB硬盘。

具体操作过程描述如下:

1 使用 crictl image pull 拉取 halo 的docker镜像到本地镜像仓库;

2 编写 Kubernetes-APP 的 yaml配置文件

halo-deployment.yaml

halo-deployment.yaml.original

halo-namespace.yaml

halo-network-service.yaml

halo-persistent-volume-claim.yaml

halo-persistent-volume.yaml

其中 halo-deployment.yaml.original 用于以非PV的形式部署 halo,目的在于验证 halo 是否可以运行再 containerd 上。

验证使用到配置文件的内容如下

slax@slax:~/k8s部署halo博客$

slax@slax:~/k8s部署halo博客$ cat halo-namespace.yaml

apiVersion: v1

kind: Namespace

metadata:

name: halo

labels:

name: halo

slax@slax:~/k8s部署halo博客$

slax@slax:~/k8s部署halo博客$ cat halo-persistent-volume.yaml

apiVersion: v1

kind: PersistentVolume

metadata:

name: root-halo

namespace: halo

spec:

capacity:

storage: 2Gi

accessModes:

  • ReadWriteOnce
    persistentVolumeReclaimPolicy: Recycle
    hostPath:
    path: /home/centos7-00/k8shostpath/halo
    slax@slax:~/k8s部署halo博客 slax[@slax](https://github.com/slax "@slax"):\~/k8s部署halo博客 cat halo-persistent-volume-claim.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: root-halo
    namespace: halo
    spec:
    accessModes:
  • ReadWriteOnce
    resources:
    requests:
    storage: 2Gi
    slax@slax:~/k8s部署halo博客 slax[@slax](https://github.com/slax "@slax"):\~/k8s部署halo博客 cat halo-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    labels:
    app: halo
    name: halo-deployment20231028
    namespace: halo
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: halo
    template:
    metadata:
    labels:
    app: halo
    spec:
    containers:
  • image: docker.io/halohub/halo
    ports:
  • containerPort: 80
    name: halo
    volumeMounts:
  • name: root-halo
    mountPath: /root/.halo2
    volumes:
  • name: root-halo
    persistentVolumeClaim:
    claimName: root-halo
    slax@slax:~/k8s部署halo博客 slax[@slax](https://github.com/slax "@slax"):\~/k8s部署halo博客 cat halo-network-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
    labels:
    app: halo
    name: halo-deployment20231028
    namespace: halo
    spec:
    ports:
  • port: 8090
    name: halo-network-service80
    protocol: TCP
    targetPort: 8090
    nodePort: 30009
    selector:
    app: halo
    type: NodePort
    slax@slax:~/k8s部署halo博客$

3 创建 namespace

4 创建 pv

5 创建 pvc

6 创建 deployment

7 创建 service

具体操作过程如下:

root[@master0](https://github.com/master0 "@master0") centos7-00#

root[@master0](https://github.com/master0 "@master0") centos7-00# ls -F Working/

halo-deployment.yaml halo-deployment.yaml.original

halo-namespace.yaml halo-network-service.yaml

halo-persistent-volume-claim.yaml halo-persistent-volume.yaml

root[@master0](https://github.com/master0 "@master0") centos7-00#

root[@master0](https://github.com/master0 "@master0") centos7-00# kubectl create -f

Working/halo-namespace.yaml

namespace/halo created

root[@master0](https://github.com/master0 "@master0") centos7-00#

root[@master0](https://github.com/master0 "@master0") centos7-00# kubectl get namespaces

NAME STATUS AGE

default Active 44dhalo Active 14s

kube-flannel Active 44d

kube-node-lease Active 44d

kube-public Active 44d

kube-system Active 44d

root[@master0](https://github.com/master0 "@master0") centos7-00#

root[@master0](https://github.com/master0 "@master0") centos7-00# kubectl describe namespace halo

Name: halo

Labels: kubernetes.io/metadata.name=halo

name=halo

Annotations:

Status: Active

No resource quota.

No LimitRange resource.

root[@master0](https://github.com/master0 "@master0") centos7-00#

root[@master0](https://github.com/master0 "@master0") centos7-00# kubectl create -f

Working/halo-persistent-volume.yaml

persistentvolume/root-halo created

root[@master0](https://github.com/master0 "@master0") centos7-00#

root[@master0](https://github.com/master0 "@master0") centos7-00# kubectl get pv -n halo

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM

STORAGECLASS REASON AGE

root-halo 2Gi RWO Recycle Bound

halo/root-halo 58s

root[@master0](https://github.com/master0 "@master0") centos7-00#

root[@master0](https://github.com/master0 "@master0") centos7-00# kubectl create -f

Working/halo-persistent-volume-claim.yamlpersistentvolumeclaim/root-halo created

root[@master0](https://github.com/master0 "@master0") centos7-00#

root[@master0](https://github.com/master0 "@master0") centos7-00# kubectl get pvc -n halo

NAME STATUS VOLUME CAPACITY ACCESS MODES

STORAGECLASS AGE

root-halo Bound root-halo 2Gi RWO

36s

root[@master0](https://github.com/master0 "@master0") centos7-00#

root[@master0](https://github.com/master0 "@master0") centos7-00# kubectl create -f

Working/halo-deployment.yaml

deployment.apps/halo-deployment20231028 created

root[@master0](https://github.com/master0 "@master0") centos7-00#

root[@master0](https://github.com/master0 "@master0") centos7-00# kubectl get pods -n halo

NAME READY STATUS

RESTARTS AGE

halo-deployment20231028-7c46d785c7-72hxf 1/1 Running 0

19s

root[@master0](https://github.com/master0 "@master0") centos7-00#

root[@master0](https://github.com/master0 "@master0") centos7-00# kubectl describe deployment

halo-deployment20231028 -n halo

Name: halo-deployment20231028

Namespace: halo

CreationTimestamp: Sun, 29 Oct 2023 12:24:53 +0800

Labels: app=halo

Annotations: deployment.kubernetes.io/revision: 1

Selector: app=halo

Replicas: 1 desired | 1 updated | 1 total | 1 available

| 0 unavailable

StrategyType: RollingUpdateMinReadySeconds: 0

RollingUpdateStrategy: 25% max unavailable, 25% max surge

Pod Template:

Labels: app=halo

Containers:

halo:

Image: docker.io/halohub/halo

Port: 80/TCP

Host Port: 0/TCP

Environment:

Mounts:

/root/.halo2 from root-halo (rw)

Volumes:

root-halo:

Type: PersistentVolumeClaim (a reference to a

PersistentVolumeClaim in the same namespace)

ClaimName: root-halo

ReadOnly: false

Conditions:

Type Status Reason


Available True MinimumReplicasAvailable

Progressing True NewReplicaSetAvailable

OldReplicaSets:

NewReplicaSet: halo-deployment20231028-7c46d785c7 (1/1 replicas

created)

Events:

Type Reason Age From Message

------ --------- ------ ------ ----------Normal ScalingReplicaSet 5m40s deployment-controller Scaled up

replica set halo-deployment20231028-7c46d785c7 to 1

root[@master0](https://github.com/master0 "@master0") centos7-00#

root[@master0](https://github.com/master0 "@master0") centos7-00# kubectl describe pod

halo-deployment20231028-7c46d785c7-72hxf -n halo

Name: halo-deployment20231028-7c46d785c7-72hxf

Namespace: halo

Priority: 0

Service Account: default

Node: slave1/192.168.136.152

Start Time: Sun, 29 Oct 2023 12:24:54 +0800

Labels: app=halo

pod-template-hash=7c46d785c7

Annotations:

Status: Running

IP: 10.244.2.3

IPs:

IP: 10.244.2.3

Controlled By: ReplicaSet/halo-deployment20231028-7c46d785c7

Containers:

halo:

Container ID:

containerd://5b908410f29ec3aa2ba55613842a69c105320d8aa633cd7acc12e3e

8afcb5a78

Image: docker.io/halohub/halo

Image ID:

docker.io/halohub/halo@sha256:994537a47aff491b29251665dc86ef2a87bd70

00516c330b5e636ca4b029d35c

Port: 80/TCPHost Port: 0/TCP

State: Running

Started: Sun, 29 Oct 2023 12:25:10 +0800

Ready: True

Restart Count: 0

Environment:

Mounts:

/root/.halo2 from root-halo (rw)

/var/run/secrets/kubernetes.io/serviceaccount from

kube-api-access-m7lqg (ro)

Conditions:

Type Status

Initialized True

Ready True

ContainersReady True

PodScheduled True

Volumes:

root-halo:

Type: PersistentVolumeClaim (a reference to a

PersistentVolumeClaim in the same namespace)

ClaimName: root-halo

ReadOnly: false

kube-api-access-m7lqg:

Type: Projected (a volume that contains injected

data from multiple sources)

TokenExpirationSeconds: 3607

ConfigMapName: kube-root-ca.crt

ConfigMapOptional:

DownwardAPI: trueQoS Class: BestEffort

Node-Selectors:

Tolerations: node.kubernetes.io/not-ready:NoExecute

op=Exists for 300s

node.kubernetes.io/unreachable:NoExecute op=Exists for 300s

Events:

Type Reason Age From Message


Normal Scheduled 7m23s default-scheduler Successfully assigned

halo/halo-deployment20231028-7c46d785c7-72hxf to slave1

Normal Pulling 7m23s kubelet Pulling image

"docker.io/halohub/halo"

Normal Pulled 7m7s kubelet Successfully pulled

image "docker.io/halohub/halo" in 15.665s (15.665s including waiting)

Normal Created 7m7s kubelet Created container halo

Normal Started 7m7s kubelet Started container halo

root[@master0](https://github.com/master0 "@master0") centos7-00#

root[@master0](https://github.com/master0 "@master0") centos7-00# kubectl create -f

Working/halo-network-service.yaml

service/halo-deployment20231028 created

root[@master0](https://github.com/master0 "@master0") centos7-00#

root[@master0](https://github.com/master0 "@master0") centos7-00# kubectl get services -n halo

NAME TYPE CLUSTER-IP EXTERNAL-IP

PORT(S) AGE

halo-deployment20231028 NodePort 10.108.173.68

8090:30009/TCP 27s

root[@master0](https://github.com/master0 "@master0") centos7-00#

root[@master0](https://github.com/master0 "@master0") centos7-00# kubectl describe servicehalo-deployment20231028 -n halo

Name: halo-deployment20231028

Namespace: halo

Labels: app=halo

Annotations:

Selector: app=halo

Type: NodePort

IP Family Policy: SingleStack

IP Families: IPv4

IP: 10.108.173.68

IPs: 10.108.173.68

Port: halo-network-service80 8090/TCP

TargetPort: 8090/TCP

NodePort: halo-network-service80 30009/TCP

Endpoints: 10.244.2.3:8090

Session Affinity: None

External Traffic Policy: Cluster

Events:

root[@master0](https://github.com/master0 "@master0") centos7-00#

root[@master0](https://github.com/master0 "@master0") centos7-00# kubectl get pod -n halo

NAME READY STATUS

RESTARTS AGE

halo-deployment20231028-7c46d785c7-72hxf 1/1 Running 0

12m

root[@master0](https://github.com/master0 "@master0") centos7-00#

root[@master0](https://github.com/master0 "@master0") centos7-00# kubectl logs -f -n halo

halo-deployment20231028-7c46d785c7-72hxf
/ / / /_ / /__

/ // / `/ / \
/ __ / /
/ / / // /
/
/ //__, //___ /

Version: 1.4.16

2023-10-29 12:25:13.363 INFO 7 ---- main

run.halo.app.Application : Starting Application

v1.4.16 using Java 11.0.11 on halo-deployment20231028-7c46d785c7-72hxf

with PID 7 (/application/BOOT-INF/classes started by root in

/application)

2023-10-29 12:25:13.365 INFO 7 ---- main

run.halo.app.Application : No active profile set,

falling back to default profiles: default

2023-10-29 12:25:15.203 INFO 7 ----

main .s.d.r.c.RepositoryConfigurationDelegate :

Bootstrapping Spring Data JPA repositories in DEFAULT mode.

2023-10-29 12:25:15.441 INFO 7 ----

main .s.d.r.c.RepositoryConfigurationDelegate : Finished

Spring Data repository scanning in 225 ms. Found 22 JPA repository

interfaces.

2023-10-29 12:25:17.525 INFO 7 ---- main

org.eclipse.jetty.util.log : Logging initialized @6453ms

to org.eclipse.jetty.util.log.Slf4jLog

2023-10-29 12:25:17.898 INFO 7 ---- main

o.s.b.w.e.j.JettyServletWebServerFactory : Server initialized with port:

8090

2023-10-29 12:25:17.921 INFO 7 ---- main

org.eclipse.jetty.server.Server : jetty-9.4.42.v20210604;built: 2021-06-04T17:33:38.939Z; git:

5cd5e6d2375eeab146813b0de9f19eda6ab6e6cb; jvm 11.0.11+9

2023-10-29 12:25:18.045 INFO 7 ---- main

o.e.j.s.h.ContextHandler.application : Initializing Spring

embedded WebApplicationContext

2023-10-29 12:25:18.046 INFO 7 ---- main

w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext:

initialization completed in 4598 ms

2023-10-29 12:25:18.524 INFO 7 ---- main

run.halo.app.config.HaloConfiguration : Halo cache store load impl :

class run.halo.app.cache.InMemoryCacheStore

2023-10-29 12:25:18.778 INFO 7 ---- main

com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...

2023-10-29 12:25:19.209 INFO 7 ---- main

com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start

completed.

2023-10-29 12:25:20.136 INFO 7 ---- main

o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing

PersistenceUnitInfo name: default

2023-10-29 12:25:20.216 INFO 7 ---- main

org.hibernate.Version : HHH000412: Hibernate ORM

core version 5.4.32.Final

2023-10-29 12:25:20.299 INFO 7 ---- main

o.hibernate.annotations.common.Version : HCANN000001: Hibernate

Commons Annotations {5.1.2.Final}

2023-10-29 12:25:20.609 INFO 7 ---- main

org.hibernate.dialect.Dialect : HHH000400: Using dialect:

org.hibernate.dialect.H2Dialect

2023-10-29 12:25:22.775 INFO 7 ---- maino.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using

JtaPlatform implementation:

[org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatfor

m]

2023-10-29 12:25:22.789 INFO 7 ---- main

j.LocalContainerEntityManagerFactoryBean : Initialized JPA

EntityManagerFactory for persistence unit 'default'

2023-10-29 12:25:24.479 INFO 7 ---- main

org.eclipse.jetty.server.session : DefaultSessionIdManager

workerName=node0

2023-10-29 12:25:24.480 INFO 7 ---- main

org.eclipse.jetty.server.session : No SessionScavenger set,

using defaults

2023-10-29 12:25:24.480 INFO 7 ---- main

org.eclipse.jetty.server.session : node0 Scavenging every

660000ms

2023-10-29 12:25:24.494 INFO 7 ---- main

o.e.jetty.server.handler.ContextHandler : Started

o.s.b.w.e.j.JettyEmbeddedWebAppContext@2cc3df02{application,/,[file:

///tmp/jetty-docbase.8090.3227147541353187501/,

jar:file:/application/BOOT-INF/lib/springfox-swagger-ui-3.0.0.jar!/M

ETA-INF/resources],AVAILABLE}

2023-10-29 12:25:24.494 INFO 7 ---- main

org.eclipse.jetty.server.Server : Started @13424ms

2023-10-29 12:25:25.565 INFO 7 ---- main

run.halo.app.handler.file.FileHandlers : Registered 9 file

handler(s)

2023-10-29 12:25:29.824 INFO 7 ---- main

o.s.b.a.e.web.EndpointLinksResolver : Exposing 4 endpoint(s)beneath base path '/api/admin/actuator'

2023-10-29 12:25:29.887 INFO 7 ---- main

o.e.j.s.h.ContextHandler.application : Initializing Spring

DispatcherServlet 'dispatcherServlet'

2023-10-29 12:25:29.887 INFO 7 ---- main

o.s.web.servlet.DispatcherServlet : Initializing Servlet

'dispatcherServlet'

2023-10-29 12:25:29.889 INFO 7 ---- main

o.s.web.servlet.DispatcherServlet : Completed initialization in

1 ms

2023-10-29 12:25:29.898 INFO 7 ---- main

o.e.jetty.server.AbstractConnector : Started

ServerConnector@2f8c4fae{HTTP/1.1, (http/1.1)}{0.0.0.0:8090}

2023-10-29 12:25:29.899 INFO 7 ---- main

o.s.b.web.embedded.jetty.JettyWebServer : Jetty started on port(s)

8090 (http/1.1) with context path '/'

2023-10-29 12:25:29.948 INFO 7 ---- main

run.halo.app.Application : Started Application in

18.115 seconds (JVM running for 18.879)

2023-10-29 12:25:29.953 INFO 7 ---- main

run.halo.app.listener.StartedListener : Starting migrate

database...

2023-10-29 12:25:30.080 INFO 7 ---- main

o.f.c.internal.license.VersionPrinter : Flyway Community Edition

7.5.1 by Redgate

2023-10-29 12:25:30.100 INFO 7 ---- main

o.f.c.i.database.base.DatabaseType : Database:

jdbc:h2:file:/root/.halo//db/halo (H2 1.4)

2023-10-29 12:25:30.120 INFO 7 ---- maino.f.c.i.s.JdbcTableSchemaHistory : Repair of failed migration

in Schema History table "PUBLIC"."flyway_schema_history" not necessary

as table doesn't exist.

2023-10-29 12:25:30.154 INFO 7 ---- main

o.f.core.internal.command.DbRepair : Successfully repaired

schema history table "PUBLIC"."flyway_schema_history" (execution time

00:00.036s).

2023-10-29 12:25:30.169 INFO 7 ---- main

o.f.c.internal.license.VersionPrinter : Flyway Community Edition

7.5.1 by Redgate

2023-10-29 12:25:30.196 INFO 7 ---- main

o.f.core.internal.command.DbValidate : Successfully validated 4

migrations (execution time 00:00.016s)

2023-10-29 12:25:30.245 INFO 7 ---- main

o.f.c.i.s.JdbcTableSchemaHistory : Creating Schema History

table "PUBLIC"."flyway_schema_history" with baseline ...

2023-10-29 12:25:30.321 INFO 7 ---- main

o.f.core.internal.command.DbBaseline : Successfully baselined

schema with version: 1

2023-10-29 12:25:30.359 INFO 7 ---- main

o.f.core.internal.command.DbMigrate : Current version of schema

"PUBLIC": 1

2023-10-29 12:25:30.363 INFO 7 ---- main

o.f.core.internal.command.DbMigrate : Migrating schema "PUBLIC"

to version "2 - migrate 1.2.0-beta.1 to 1.2.0-beta.2"

2023-10-29 12:25:30.421 INFO 7 ---- main

o.f.core.internal.command.DbMigrate : Migrating schema "PUBLIC"

to version "3 - migrate 1.3.0-beta.1 to 1.3.0-beta.2"

2023-10-29 12:25:30.562 INFO 7 ---- maino.f.core.internal.command.DbMigrate : Migrating schema "PUBLIC"

to version "4 - migrate 1.3.0-beta.2 to 1.3.0-beta.3"

2023-10-29 12:25:30.609 INFO 7 ---- main

o.f.core.internal.command.DbMigrate : Successfully applied 3

migrations to schema "PUBLIC" (execution time 00:00.269s)

2023-10-29 12:25:30.611 INFO 7 ---- main

run.halo.app.listener.StartedListener : Migrate database succeed.

2023-10-29 12:25:30.612 INFO 7 ---- main

run.halo.app.listener.StartedListener : Created backup directory:

/tmp/halo-backup

2023-10-29 12:25:30.612 INFO 7 ---- main

run.halo.app.listener.StartedListener : Created data export

directory: /tmp/halo-data-export

2023-10-29 12:25:30.740 INFO 7 ---- main

run.halo.app.listener.StartedListener : Copied theme folder from

/application/BOOT-INF/classes/templates/themes to

/root/.halo/templates/themes/caicai_anatole

2023-10-29 12:25:30.792 INFO 7 ---- main

run.halo.app.listener.StartedListener : Halo started at
http://127.0.0.1:8090

2023-10-29 12:25:30.792 INFO 7 ---- main

run.halo.app.listener.StartedListener : Halo admin started at
http://127.0.0.1:8090/admin

2023-10-29 12:25:30.792 INFO 7 ---- main

run.halo.app.listener.StartedListener : Halo has started

successfully!

^C

root[@master0](https://github.com/master0 "@master0") centos7-00#

相关推荐
AAA@峥1 小时前
容器数据不丢失:Docker 分层存储 + Volume 共享、备份迁移完整指南
运维·docker·容器
十年磨一剑~2 小时前
docker 为何每次 docker tag才能 docker push
docker·容器·eureka
gs801404 小时前
记一次多 Agent 架构在单节点 K8s 触发的 PID 耗尽与 Pod 驱逐(Evicted)大摸排
容器·架构·kubernetes
bukeyiwanshui5 小时前
20260701 k8s Metric Server
容器·贪心算法·kubernetes
江湖有缘6 小时前
基于Docker环境部署tillywork开源工作管理工具
docker·容器·开源
鸿儒5178 小时前
MR-50国产化GPU docker配置方法
docker·容器·mr
Zhu7589 小时前
在k8s集群部署ApacheHadoop单节点单数据副本
云原生·容器·kubernetes
Akamai中国9 小时前
Akamai收购安全企业浏览器提供商LayerX
人工智能·云原生·云计算·云服务
摇滚侠9 小时前
云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 51-60
java·云原生·kubernetes