参考文档:
Kubernetes 部署metrics-server - 简书 (jianshu.com)
kubernetes(k8s)部署wordpress示例① - 简书 (jianshu.com)
仅提供参考,非权威内容。
如有问题请点击页脚(联系博主)发聩
一、需求分析
目的:本次实验是使用kubernets平台部署WordPress博客系统,最终可对外提供访问。
需求:1、可提供持久化存储的MySQL;2、配置探针检测应用是否存活;3、 配置 HPA,让应用能够自动应对流量高峰期。4、增加滚动更新策略,这样可以保证在更新应用的时候,服务不会被中断。5、把部署的应用整合到一个 YAML 文件 wordpress-all.yaml 中;6、端口映射,外部可访问。
注意:使用pv存储要事先搭建好NFS服务,本文不涉及NFS搭建。
二、平台规划
主机 | IP |
Master | 192.168.30.30 |
Node1 | 192.168.30.31 |
三、部署流程
1、创建PV和PVC
1.1、进入master节点的终端,先创建一个用于WordPress服务的namespace
kubectl create namespace blog //创建一个命名空间,名称为blog
1.2、创建PV和PVC用于为MySQL提供持续存储
新建一个WordPress文件夹,用于存放相关yaml文件
mkdir /root/wordpress
编写PVyaml文件
#####master#####
mkdir -p /nfs/pv1
vim /root/wordpress/pv1.yaml
#####pv的yaml文件(注意修改)
apiVersion: v1
kind: PersistentVolume
metadata:
name: mypv
namespace: blog
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /nfs/pv1
server: 192.168.30.30
//namespace使用创建的blog
//ReadWriteOnce 可读写但只能被一个节点挂载
//path: /nfs/pv 挂载到本机/nfs/pv目录,需要事先创建好此目录
//server: 192.168.30.30 NFS服务器的地址,根据自己实际情况填写
kubectl apply -f /root/wordpress/pv1.yaml
1.3、创建PVC
vim /root/wordpress/pvc1.yaml
#pvc的yaml文件
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
namespace: blog
spec:
accessModes:
- ReadWriteOnce
volumeName: mypv
resources:
requests:
storage: 1Gi
kubectl apply -f /root/wordpress/pvc1.yaml
1.4、创建MySQL的Deployment对象
#####master#####
vim /root/wordpress/mysql-db.yaml
#mysql的deploymnet的文件
//注:
//namespace使用上一步自己创建的命名空间
//创建wordpress时,mysql相关参数需与此处创建mysql时保存一致
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-deploy
namespace: blog
labels:
apps: mysql
spec:
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.6
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
name: dbport
env:
- name: MYSQL_ROOT_PASSWORD
value: rootPassWord
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
value: wordpress
- name: MYSQL_PASSWORD
value: wordpress
volumeMounts:
- name: db-pv
mountPath: /var/lib/mysql
volumes:
- name: db-pv
persistentVolumeClaim:
claimName: mypvc
kubectl apply -f mysql-db.yaml
1.5、创建MySQL的service
#创建mysql的service.yaml文件
vim /root/wordpress/mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: blog
spec:
selector:
app: mysql
ports:
- name: mysqlport
protocol: TCP
port: 3306
targetPort: 3306
kubectl apply -f /root/wordpress/mysql-service.yaml
1.6创建 Wordpress 的 Deployment 对象,添加滚动更新策略,配置资源限额
编辑wordpress的yaml文件
#####master#####
vim /root/wordpress/wordpressdeploy.yaml
#wordpress的deploymnet的文件
//注:
//namespace使用上一步自己创建的命名空间
//密码都要与MySQL密码相匹配
//host填MySQL的虚拟IP
//resources里定义资源的上限和下限
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-deploy
namespace: blog
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 50%
maxUnavailable: 0
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: wdport
env:
- name: WORDPRESS_DB_HOST
value: mysql:3306
- name: WORDPRESS_DB_USER
value: wordpress
- name: WORDPRESS_DB_PASSWORD
value: wordpress resources:
resources:
requests:
cpu: 100m
memory: 10Mi
limits:
cpu: 100m
memory: 50Mi
kubectl apply -f wordpressdeploy.yaml
1.7、创建 Wordpress 的 Service 对象
#创建wordpress的service.yaml文件
vim /root/wordpress/wordpress-service.yaml
//NodePort属性映射端口,提供外部访问
apiVersion: v1
kind: Service
metadata:
name: wordpress
namespace: blog
spec:
type: NodePort
selector:
app: wordpress
ports:
- name: wordpressport
protocol: TCP
port: 80
targetPort: wdport
kubectl apply -f /root/wordpress/wordpress-service.yaml
1.8主机浏览器尝试访问,http://IP:端口
http://192.168.30.30:端口/
已经可以访问
1.9、对 pod 增加 liveness probe 和 rediness probe 两个探针,每 10s 检测一次应用是否可读,每 3s 检测一次应用是否存活。
存活探针liveness采用tcpSocket端口探测方式,每3s一次检测80端口是否存活;就绪探针readiness采用httpGet方式每10s一次探测wardpress主页的http返回值是否正常。
#添加livenessProbe检测80是否可读
#添加readinessProbe检测http主页是否存活
#修改wordpress的deployment文件为如下
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-deploy
namespace: blog
labels:
app: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 50%
maxUnavailable: 0
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: wdport
env:
- name: WORDPRESS_DB_HOST
value: mysql:3306
- name: WORDPRESS_DB_USER
value: wordpress
- name: WORDPRESS_DB_PASSWORD
value: wordpress
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 5
periodSeconds: 3
readinessProbe:
httpGet:
path: /index.php
port: 80
initialDelaySeconds: 5
periodSeconds: 10
kubectl apply -f wordpressdeploy.yaml
配置 HPA,让应用能够自动应对流量高峰期。
kubectl autoscale deployment wordpress-deploy --memory-percent=10 --min=1 --max=10 -n blog
四、(补充)master节点metrics-server部署
在使用HPA的时候,k8s系统需要进行资源监控,才能使HPA生效,所有需要部署metrics-server用于监测node,pod等的CPU,内存使用情况。
1、修改apiserver文件,新增如下配置(已有项不用加)
vim /etc/kubernetes/manifests/kube-apiserver.yaml
········
- --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
- --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
- --requestheader-allowed-names=aggregator
- --requestheader-extra-headers-prefix=X-Remote-Extra-
- --requestheader-group-headers=X-Remote-Group
- --requestheader-username-headers=X-Remote-User
- --runtime-config=api/all=true
- --enable-aggregator-routing=true
······
#重启
systemctl restart kubelet.service
2、下载部署文件
cd
wget http://139.196.207.44:8888/down/NondVZwgq0SO -O metrics-server-0.3.6.zip
unzip metrics-server-0.3.6.zip
cd metrics-server-0.3.6/deploy/1.8+/
vim metrics-server-deployment.yaml
[root@master1 1.8+]# vim metrics-server-deployment.yaml
······
30 - name: metrics-server
## 修改国内镜像
31 image: registry.cn-hangzhou.aliyuncs.com/ljck8s/metrics-server-amd64:v0.3.6
32 imagePullPolicy: IfNotPresent
33 # 添加command
command:
34 - /metrics-server
35 - --metric-resolution=30s
36 - --kubelet-insecure-tls
37 - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
·····
3、部署
kubectl apply -f .
#查看状态是否为running
kubectl -n kube-system get pods -l k8s-app=metrics-server
#查看是否有报错
kubectl -n kube-system logs -l k8s-app=metrics-server -f
#查看资源监控能否正常显示
kubectl top node
五、遇到的问题:
1、
(未解决)
2、
(未解决)