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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 云原生|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 文件夹名称



部署成功截图:

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
3天前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
2天前
|
Kubernetes Cloud Native 微服务
云原生之旅:从容器到微服务
【10月更文挑战第29天】在这篇文章中,我们将一起探索云原生的奥秘。云原生不仅仅是一种技术,更是一种文化和方法论。我们将从容器技术开始,逐步深入到微服务架构,最后探讨如何在云平台上实现高效的服务部署和管理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和实用的技能。让我们一起踏上这段激动人心的云原生之旅吧!
|
2天前
|
运维 Kubernetes Cloud Native
云原生之旅:容器化与微服务的融合
【10月更文挑战第28天】 在数字化转型的浪潮中,云原生技术如星辰般璀璨,引领着企业IT架构的未来。本文将带你穿梭于云原生的世界,探索容器化技术和微服务架构如何携手共舞,打造灵活、高效的应用部署和运维模式。我们将通过实际代码示例,揭示这股力量背后的奥秘,并展现它们是如何为现代软件开发带来革新。准备好了吗?让我们启航,驶向云原生技术的深海。
|
3天前
|
Kubernetes 负载均衡 Cloud Native
云原生应用:Kubernetes在容器编排中的实践与挑战
【10月更文挑战第27天】Kubernetes(简称K8s)是云原生应用的核心容器编排平台,提供自动化、扩展和管理容器化应用的能力。本文介绍Kubernetes的基本概念、安装配置、核心组件(如Pod和Deployment)、服务发现与负载均衡、网络配置及安全性挑战,帮助读者理解和实践Kubernetes在容器编排中的应用。
18 4
|
2天前
|
Cloud Native 持续交付 云计算
云原生入门指南:从容器到微服务
【10月更文挑战第28天】在数字化转型的浪潮中,云原生技术成为推动现代软件开发的关键力量。本篇文章将带你了解云原生的基本概念,探索它如何通过容器化、微服务架构以及持续集成和持续部署(CI/CD)的实践来提升应用的可伸缩性、灵活性和可靠性。你将学习到如何利用这些技术构建和部署在云端高效运行的应用,并理解它们对DevOps文化的贡献。
12 2
|
4天前
|
Kubernetes 监控 Cloud Native
云原生应用:Kubernetes在容器编排中的实践与挑战
【10月更文挑战第26天】随着云计算技术的发展,容器化成为现代应用部署的核心趋势。Kubernetes(K8s)作为容器编排领域的佼佼者,以其强大的可扩展性和自动化能力,为开发者提供了高效管理和部署容器化应用的平台。本文将详细介绍Kubernetes的基本概念、核心组件、实践过程及面临的挑战,帮助读者更好地理解和应用这一技术。
21 3
|
3天前
|
弹性计算 Kubernetes Cloud Native
云原生架构下的微服务设计原则与实践####
本文深入探讨了在云原生环境中,微服务架构的设计原则、关键技术及实践案例。通过剖析传统单体架构面临的挑战,引出微服务作为解决方案的优势,并详细阐述了微服务设计的几大核心原则:单一职责、独立部署、弹性伸缩和服务自治。文章还介绍了容器化技术、Kubernetes等云原生工具如何助力微服务的高效实施,并通过一个实际项目案例,展示了从服务拆分到持续集成/持续部署(CI/CD)流程的完整实现路径,为读者提供了宝贵的实践经验和启发。 ####
|
10天前
|
Kubernetes Cloud Native 持续交付
云端新纪元:云原生技术重塑IT架构####
【10月更文挑战第20天】 本文深入探讨了云原生技术的兴起背景、核心理念、关键技术组件以及它如何引领现代IT架构迈向更高效、灵活与可扩展的新阶段。通过剖析Kubernetes、微服务、Docker等核心技术,本文揭示了云原生架构如何优化资源利用、加速应用开发与部署流程,并促进企业数字化转型的深度实践。 ####
|
9天前
|
监控 Cloud Native Java
云原生架构下微服务治理策略与实践####
【10月更文挑战第20天】 本文深入探讨了云原生环境下微服务架构的治理策略,通过分析当前技术趋势与挑战,提出了一系列高效、可扩展的微服务治理最佳实践方案。不同于传统摘要概述内容要点,本部分直接聚焦于治理核心——如何在动态多变的分布式系统中实现服务的自动发现、配置管理、流量控制及故障恢复,旨在为开发者提供一套系统性的方法论,助力企业在云端构建更加健壮、灵活的应用程序。 ####
52 10
|
4天前
|
Kubernetes Cloud Native API
云原生架构下微服务治理的深度探索与实践####
本文旨在深入剖析云原生环境下微服务治理的核心要素与最佳实践,通过实际案例分析,揭示高效、稳定的微服务架构设计原则及实施策略。在快速迭代的云计算领域,微服务架构以其高度解耦、灵活扩展的特性成为众多企业的首选。然而,伴随而来的服务间通信、故障隔离、配置管理等挑战亦不容忽视。本研究聚焦于云原生技术栈如何赋能微服务治理,涵盖容器编排(如Kubernetes)、服务网格(如Istio/Envoy)、API网关、分布式追踪系统等关键技术组件的应用与优化,为读者提供一套系统性的解决方案框架,助力企业在云端构建更加健壮、可维护的服务生态。 ####