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的资源清单格式有yaml
和json
两种选择,我选择了yaml
来编写。
通过查询文档,我得知kubernetes通过资源清单可以创建以下这么多种类型的资源,在本示例中,我仅展示依照指定需求创建Pod
资源的方案。
- 名称空间级别:仅存此名称空间下生效
- 工作负载型资源(workload):
Pod: k8s中最小单元
ReplicaSet:调度器,通过标签控制 pod 的副本数目
Deployment:控制器,通过控制 rs 的创建来创建 pod
StatefulSet:为有状态服务创建的管理器
DaemonSet:可以在每个节点运行 pod 主键
Job:为批处理而生
CronJob(ReplicationController)在v1.11版本被废弃:为批处理而生- 服务发现及负载均衡型资源(ServiceDiscoveryLoadBalance):Service、Ingress、…
- 配置与存储型资源:Volume(存储卷)、CSI(容器存储接口,可以扩展各种各样的第三方存储卷)
- 特殊类型的存储卷:
ConfigMap(当配置中心来使用的资源类型):通过他可以创建一些配置文件,达到热更新
Secret(保存敏感数据):加密方案存储数据,可以用它存储一些秘钥等
DownwardAPI(把外部环境中的信息输出给容器):下载文件的接口,可以下载、上传- 集群级别:所有名称空间都可以使用
- Namespace:名称空间
- Node:工作节点
- Role
- ClusterRole
- RoleBinding
- ClusterRoleBinding
- 元数据型资源
- 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-资源清单