云原生|kubernetes |来给生活比个椰---多容器之部署WordPress(多种方式部署)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 云原生|kubernetes |来给生活比个椰---多容器之部署WordPress(多种方式部署)

前言

很多同学安装部署完了kubernetes集群,总会有稍许的疑问:我安了这么一个玩意到底能干什么?

OK,本文就从实战的角度来告诉你,你可以使用kubernetes集群做许多的事情,比如,搭建一个简单的WordPress,这会是非常容易的一件事情,能容易到什么程度呢?可以说比宝塔还要简单,也就是说,搭建一个可以自己玩玩的个人网站非常容易,如果是在云服务器上部署,还可以随时的登录上去玩玩呢,当然,如果有安全风险,想关闭网站了,也非常的简单,一条命令就销毁整个网站了。

部署思路

(1)

k8s部署项目的特点:

WordPress是一个LAMP(LNMP)框架类的PHP个人cms网站,也就是说常规部署需要linux环境,Apache(httpd)或者nginx,PHP环境,MySQL数据库,那么,难点在于需要选择以上所述的软件的版本必须适配,比如,WordPress的版本,是选择4呢还是5呢,和其适配的PHP版本是多少呢?是PHP5还是PHP7呢?或者是其它特定版本呢?MySQL是5.6,5.7还是8.0呢?httpd版本又需要多少呢?这些都是问题,总的来说,常规部署需要考虑的细节非常多,部署步骤也是比较繁琐的。

kubernetes集群部署WordPress这样的需要集成环境的项目则非常简单,一个文件(也就是资源清单文件,这个是不好搞的哦),一条命令就可以搞定了。

(2)

小结论

基于以上的分析可以得出一个结论,在k8s中部署,需要使用到一个MySQL镜像(版本为5.7.23),一个WordPress镜像(最新的),这两个镜像生成的容器放在一个pod内。

(3)

安全方面的考虑:

既然使用到了MySQL那么肯定需要配置数据库的一些信息,既然是简单的WordPress,那么,数据库就没有必要搞太复杂了,都默认配置即可,只是密码需要使用secret加密一哈(两个密码,一个是WordPress数据库用户密码,一个是MySQLroot密码)。端口也都默认3306。

(4)

数据持久化的设想:

数据库使用本地存储卷做永久化处理,避免WordPress丢失数据。由于是本地静态存储卷,因此,pod不能随便漂移了,要是胡乱漂移,比如,今天在node1节点,使用的node1的某个本地目录,然后第二天由于某种原因pod挂了,k8s集群给调度到node2节点了,那就很尴尬了,是吧。因此,需要设定node调度策略,固定到某个节点,本例计划固定在node2节点上。

相关代码如下:

[root@master ~]# k get no --show-labels
NAME         STATUS   ROLES    AGE   VERSION   LABELS
k8s-master   Ready    <none>   22d   v1.18.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux
k8s-node1    Ready    <none>   22d   v1.18.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux
k8s-node2    Ready    <none>   22d   v1.18.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disk-type=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux,node=LAMP

给node2节点添加两个标签:

kubectl label nodes k8s-node2 disk-type=ssd
kubectl label nodes k8s-node2 node=LAMP

再次查询:

[root@master ~]# k get no --show-labels
NAME         STATUS   ROLES    AGE   VERSION   LABELS
k8s-master   Ready    <none>   22d   v1.18.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux
k8s-node1    Ready    <none>   22d   v1.18.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux
k8s-node2    Ready    <none>   22d   v1.18.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disk-type=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux

可以看到node2有了两个个新标签,因此,可以指定标签进行调度:

  nodeSelector:
    disk-type: k8s-node2

或者使用node这个标签也是OK的:

  nodeSelector:
    node: LAMP

(5)

持久化存储的相关实现:

计划使用pv和pvc做本地化持久,pv绑定到node2节点的/opt/mysql/data目录下,该目录需要提前在node2节点建立:

[root@slave2 opt]# mkdir -p /opt/mysql/data

sc文件--mysql-sc.yaml

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Retain

pv文件---mysql-pv.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: web
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
  namespace: web
  labels:
    type: local
spec:
  capacity:
    storage: 2Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: "/opt/mysql/data"
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key:  kubernetes.io/hostname
          operator: In
          values:
          - k8s-node2

pvc文件---mysql-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  namespace: web
  labels:
    app: mysql-pvc
spec:
  accessModes:
  - ReadWriteOnce #此处需要和pv对应才能匹配
  resources:
    requests:
      storage: 2Gi
  storageClassName: local-storage #此处需要和StorageClass.yaml匹配

(6)

secret文件的加密使用

sercet文件--mysql-secret.yaml:

例如,第二个密码加密(注意哈,WordPress这个用户的密码是wordpress,和下面secret里写的一样哈):

[root@master wordpress]# echo -n wordpress|base64
d29yZHByZXNz
kind: Secret
apiVersion: v1
metadata:
  name: user-and-password
  namespace: web
type: Opaque
data:
  username: cm9vdA==
  password1: c2hpZ3VhbmczMg==
  password2: d29yZHByZXNz

下面将贴出部署的资源清单文件,如有错误,欢迎指正。

(7)

部署文件

部署文件---deploy-wp.yaml(包含service部分):

[root@master wordpress]# cat deploy-wp.yaml 
apiVersion: v1
kind: Namespace
metadata:
  name: web
---
apiVersion: v1
kind: Pod
metadata:
  name: wordpress
  namespace: web
  labels:
    app: wordpress
spec:
#  nodeName: k8s-node2
  containers:
  - name: wordpress
    image: wordpress
    imagePullPolicy: IfNotPresent 
    ports:
    - containerPort: 80
      name: wdport
    env:
    - name: WORDPRESS_DB_HOST
      value: 127.0.0.1:3306  
    - name: WORDPRESS_DB_USER
      value: wordpress
    - name: WORDPRESS_DB_PASSWORD
      value: wordpress
#  nodeSelector:
#    disk-type: ssd
  - name: mysql
    image: mysql:5.7.23
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 3306
      name: dbport
    env:
    - name: MYSQL_ROOT_PASSWORD
      valueFrom:
        secretKeyRef: 
          name: user-and-password
          key: password1
    - name: MYSQL_DATABASE
      value: wordpress
    - name: MYSQL_USER
      value: wordpress
    - name: MYSQL_PASSWORD
      valueFrom:
        secretKeyRef: 
          name: user-and-password
          key: password2
    volumeMounts:
    - name: mysql-persistent-storage
      mountPath: "/var/lib/mysql" #不需要修改,映射到镜像内部目录
  volumes:
    - name: mysql-persistent-storage
      persistentVolumeClaim:
        claimName: mysql-pvc #对应到pvc的名字
  nodeSelector:
    node: LAMP
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: wordpress
  name: wp-svc
  namespace: web
spec:
  ports:
  - port: 8081
    protocol: TCP
    targetPort: 80
  selector:
    app: wordpress
  type: NodePort

总结

此部署主要是用到了节点选择策略,主要是pv和deploy的时候由于是本地volume,因此必须要硬选择节点,并且两次节点选择是要同一个node,否则不会部署成功。

其次是本地静态volume挂载pv和pvc以及sc的建立,为了减少不必要的麻烦,将以上部署统一为了web这个namespace。

总共五个文件,统一放到一个文件夹内,部署命令为:

[root@master wordpress]# ll
total 20
-rw-r--r-- 1 root root 1553 Sep 19 12:35 deploy-wp.yaml
-rw-r--r-- 1 root root  314 Sep 19 11:36 mysql-pvc.yaml
-rw-r--r-- 1 root root  528 Sep 19 11:36 mysql-pv.yaml
-rw-r--r-- 1 root root  185 Sep 19 11:04 mysql-sc.yaml
-rw-r--r-- 1 root root  183 Sep 19 12:43 mysql-secret.yaml
kubectl apply -f 文件夹名称

删除命令为:

kubectl delete -f 文件夹名称



部署成功截图:

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
3月前
|
Ubuntu Cloud Native 测试技术
百度搜索:蓝易云【云原生之使用Docker部署ubuntu测试环境】
请注意,以上步骤仅是简单的使用Docker部署Ubuntu测试环境的示例。在实际应用中,您可能需要根据测试需求和应用场景进行更多的配置和优化。同时,在退出容器时,容器并未删除,您可以使用 `docker rm <容器名称>`命令来删除容器。在进行测试时,请谨慎操作,并确保对Docker的使用有一定的了解,以避免不必要的问题。
40 2
|
3月前
|
Kubernetes Cloud Native 调度
云原生技术专题 | 云原生容器编排问题盘点,总结分享年度使用Kubernetes的坑和陷阱
随着云原生的兴起,越来越多的应用选择基于Kubernetes进行部署,可以说Kubernetes 是最流行的容器编排和部署平台。它的强大功能特性,可以保障在生产中可靠地运行容器化应用程序,相关的DevOps等工具也应运而生,下面就是小编简单化了一个Kubernetes的逻辑架构图。
323 9
云原生技术专题 | 云原生容器编排问题盘点,总结分享年度使用Kubernetes的坑和陷阱
|
24天前
|
Kubernetes Cloud Native Devops
云原生技术落地实现之二KubeSphere DevOps 系统在 Kubernetes 集群上实现springboot项目的自动部署和管理 CI/CD (2/2)
云原生技术落地实现之二KubeSphere DevOps 系统在 Kubernetes 集群上实现springboot项目的自动部署和管理 CI/CD (2/2)
48 1
|
1月前
|
弹性计算 运维 Kubernetes
云原生K8S场景自动化响应ECS系统事件
客户云原生K8S场景下,通过社区开源NPD+Draino+Autoscaler零开发,对接响应ECS主动运维事件,通过自动响应事件减少非预期宕机。
|
2月前
|
IDE Cloud Native 开发工具
云原生之在Docker环境下部署Atheos云IDE平台
【2月更文挑战第3天】云原生之在Docker环境下部署Atheos云IDE平台
362 2
|
2月前
|
Kubernetes 监控 Cloud Native
阿里云云原生容器高级工程师认证(ACP级-Alibaba Cloud Certification Professional)考试大纲
介绍阿里云云原生容器高级工程师认证(ACP级-Alibaba Cloud Certification Professional)所需具备的知识及学习方法等。
164 2
|
3月前
|
Cloud Native 关系型数据库 分布式数据库
《永恒岛》引入云原生数据库PolarDB实现游戏全球部署和更流畅的游戏体验
三九互娱通过采用阿里云PolarDB作为核心数据库,备份和恢复效率提高10倍以上
74 1
|
3月前
|
Kubernetes Cloud Native 网络协议
【云原生】Kubernetes介绍
【云原生】Kubernetes介绍
36 1
|
3月前
|
Kubernetes Cloud Native 安全
云原生技术专题 | 云原生架构未来发展趋势,探索容器技术未来的发展趋势
云原生架构指的是基于云原生技术的一套架构原则和设计模式,目的是最大限度地去除云应用中的非业务代码部分。这样,云设施可以接管应用中大量原有的非功能性特性(如弹性、韧性、安全性、可观察性、灰度等),使非功能性业务中断不再成为难题,为业务提供轻量化、敏捷、高度自动化的优势。
561 6
云原生技术专题 | 云原生架构未来发展趋势,探索容器技术未来的发展趋势
|
1月前
|
Java Go 开发者
Docker容器技术简介及其与Go语言的结合点
【2月更文挑战第23天】本文首先概述了Docker容器技术的核心概念和优势,接着探讨了Go语言与Docker容器技术的结合点。通过阐述Docker的轻量级、可移植性和版本控制等特性,以及Go语言在容器化应用中的优势,本文旨在说明两者结合能够实现更高效、灵活的应用开发和部署。

热门文章

最新文章