kubernetes部署wordpress

kubernetes部署wordpress

需求详情

需要部署一个Pod,要求如下

  • 容器名称: wordpoess
    • 镜像: wordpass:latest
    • 端口映射: 82:80
  • 容器名称: mysql
    • 镜像: mysql:5.6
    • mysql的root为123456
    • 创建数据库 wordpress

环境详情

主机名 主机IP 备注
master 192.168.200.104 部署了docker仓库
node 192.168.200.119

注: 两台主机均在同一个kubernetes集群

解决思路

需要使用kubernetes的资源清单来自动化部署,而kubernetes的资源清单相关内容可以通过kubectl explain命令来逐个获取资源清单中每个字段的帮助手册。
kubernetes的资源清单格式有yamljson两种选择,我选择了yaml来编写。
通过查询文档,我得知kubernetes通过资源清单可以创建以下这么多种类型的资源,在本示例中,我仅展示依照指定需求创建Pod资源的方案。

  1. 名称空间级别:仅存此名称空间下生效
    • 工作负载型资源(workload):
      Pod: k8s中最小单元
      ReplicaSet:调度器,通过标签控制 pod 的副本数目
      Deployment:控制器,通过控制 rs 的创建来创建 pod
      StatefulSet:为有状态服务创建的管理器
      DaemonSet:可以在每个节点运行 pod 主键
      Job:为批处理而生
      CronJob(ReplicationController)在v1.11版本被废弃:为批处理而生
    • 服务发现及负载均衡型资源(ServiceDiscoveryLoadBalance):Service、Ingress、…
    • 配置与存储型资源:Volume(存储卷)、CSI(容器存储接口,可以扩展各种各样的第三方存储卷)
    • 特殊类型的存储卷:
      ConfigMap(当配置中心来使用的资源类型):通过他可以创建一些配置文件,达到热更新
      Secret(保存敏感数据):加密方案存储数据,可以用它存储一些秘钥等
      DownwardAPI(把外部环境中的信息输出给容器):下载文件的接口,可以下载、上传
  2. 集群级别:所有名称空间都可以使用
    • Namespace:名称空间
    • Node:工作节点
    • Role
    • ClusterRole
    • RoleBinding
    • ClusterRoleBinding
  3. 元数据型资源
    • HPA
    • PodTemplate(pod模板)
    • LimitRange(资源限制)

指定需要的镜像

依照命令kubectl explain的语法格式, 我在kubectl explain pod.spec.containers查到了指定镜像需要的方式

spec:
...
 containers:
 ...
 - name: wordpress
   image: 192.168.200.104/library/wordpress:latest

这样子的形式就能指定需要哪个镜像了,这里要注意,name字段是必须的

端口映射

我在查询镜像选择的同时,也通过kubectl explain pod.spec.containers.ports查到了端口映射的格式

spec:
...
 containers:
 ...
 - name: wordpress
   image: 192.168.200.104/library/wordpress:latest
   ports:
   - containerPort: 80  # 申明服务中需要用到的端口号
     hostPort: 82       # 申明需要将上面这个端口映射到主机的哪个端口
     protocol: TCP      # 申明服务的协议类型

设置MySQL密码

经过查询文档,我得知,MySQL的docker镜像初始密码设置是通过系统环境变量MYSQL_ROOT_PASSWORD进行设置的,而在kubernetes资源清单中,环境变量的指定则是需要env参数kubectl explain pod.spec.containers.env

spec:
...
 containers:
 ...
 - name: mysql
   image: 192.168.200.104/library/mysql:5.6
   ports:
   - containerPort: 3306
   env:
   - name: MYSQL_ROOT_PASSWORD
     value: "123456"

要注意的事情是,value字段后必须是string格式,如果是数字,则必须用双引号将值包裹起来

新建数据库

在新建数据库时,我最开始想到的是通过Init容器中的就绪检测readinessProbe进行处理,但是很快发现不可行,因为readinessProbe会在容器创建成功后立刻触发,而容器中的服务此时可能还没有跑起来。

在查阅多方文档后,我发现了startupProbe这个探针,这个探针是在v1.16被加入kubernetes的,官方文档如下:

Indicates whether the application within the Container is started. All other probes are disabled if a startup probe is provided, until it succeeds. If the startup probe fails, the kubelet kills the Container, and the Container is subjected to its restart policy. If a Container does not provide a startup probe, the default state is Success

大意是说,会检测容器内的服务是否正常运行。这正是我需要的东西,在执行kubectl explain pod.spec.containers.startupProbe命令获取帮助手册后,我很快构建出了这样的语句

spec:
...
 containers:
 ...
 - name: mysql
   image: 192.168.200.104/library/mysql:5.6
   ...
   startupProbe:
    exec:
     command: ["mysql","-uroot","-p123456","-e","\"create database wordpress\""]

执行后完美解决

代码解决

#blog.yaml
apiVersion: v1
kind: Pod
metadata:
 name: wordpress
 labels:
  app: blog
spec:
 containers:
 - name: wordpress
   image: 192.168.200.104/library/wordpress:latest
   ports:
   - containerPort: 80
     hostPort: 82
     protocol: TCP
 - name: mysql
   image: 192.168.200.104/library/mysql:5.6
   ports:
   - containerPort: 3306
   env:
   - name: MYSQL_ROOT_PASSWORD
     value: "123456"
   startupProbe:
    exec:
     command: ["mysql","-uroot","-p123456","-e","\"create database wordpress\""]

参考文章

kubernetes(k8s)部署wordpress示例①
kubernetes中启动探针startupProbe
ImagePullBackOff 错误处理
K8S-资源清单

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇