k8s 是容器编排系统,使用 K8s 可以做到 自动扩缩 、 故障转移,等等优秀的特性,被常常在企业中使用。
搭建一个简易的 k8s 可以使用 k3s 。
具体搭建过程及更多信息可以参考官网。
wordpress 部分
搭建 wordpress ,需要了解搭建一个完整的 wordpress 服务并且对外开放,所需要的服务。
根据以上信息,wordpress 服务端和 Mysql 需要存储一些信息,故需要对数据进行持久化。
k8s 中卷常见的类型:
由于本地是单机部署,采用 local 类型。
在 k8s 中,一个 pod 可以包含多个 container ,那么对于 wordpress 与 mysql 也可以吗?
可以,但是不推荐。
最后需要对外暴露服务,故需要 service 对 pod 指定一个访问接口。
mysql 部分:
对于 mysql 需要密码等敏感信息,故可以使用 k8s 中的 secret 去保存密码,但是 secret 中是使用 base64 进行保存的,并不是特别安全,可以使用其他更安全的方式进行存储。
需要使用持久卷去存储数据。
使用 service 暴露端口,提供给内部 pod (wordpress) 访问,通过 k8s 的 DNS 服务访问 myslq 。
service : 对集群内部暴露 80 端口给集群内部访问,通过 LoadBalancer 暴露端口给外部访问。
apiVersion: v1
kind: Service
metadata:
name: wordpress
namespace: wordpress
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: fontend
type: LoadBalancer
PersistentVolumeClaim : 申请 20G 存储空间
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-claim
namespace: wordpress
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
Deployment : 部署 wordpress
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
namespace: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: wordpress:laest
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
- name: WORDPRESS_DB_USER
value: wordpress
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wp-pv-claim
secret :
apiVersion: v1
kind: Secret
metadata:
name: mysql-pass
namespace: wordpress
type: Opaque
data:
password: -base64-encoded-password>
service :
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
namespace: wordpress
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
clusterIP: None
PersistentVolumeClaim :
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
namespace: wordpress
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
Deployment :
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-mysql
namespace: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: mysql:8.0
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
value: wordpress
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
将以上两个配置,分别组合为 wordpress-frontend.yaml / wordpress-mysql.yaml 文件。
kubectl apply -f wordpress-frontend.yaml
kubectl apply -f wordpress-mysql.yaml
k8s 将会开始部署。由于镜像可能有点慢,等待时间可以会有点久。
可以通过以下命令进行验证:
kubectl get secrets -n wordpress
查看为 mysql 创建的 secret 是否存在。
kubectl get pvc -n wordpress
查看为 wordpress 与 mysql 创建的两个 pvc 是否存在。
kubectl get pods -n wordpress
查看 wordpress 与 mysql 两个服务是否在运行。
kubectl get services -n wordpress
查看两个 service 是否操作。
当两个 pod 都在运行时,可以通过 kubectl get services -n wordpress
查看进行服务信息,如上图,名为 wordpress 栏的 PORT(s) 列,其中 30122 为外部地址访问的端口。
我使用云服务器部署该应用,故可以通过 http://