参考文档:
Kubernetes 部署metrics-server - 简书 (jianshu.com)
Kubernetes 部署metrics-server - 简书 (jianshu.com)
k8s-v1.22安装metrics-server_zhangdd的博客-CSDN博客
仅提供参考。
如有问题请点击页脚(联系博主)反馈
一、需求分析
目的:本次实验是使用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/pv1vim /root/wordpress/pv1.yaml#####pv的yaml文件(注意修改)apiVersion: v1kind: PersistentVolumemetadata:name: mypvnamespace: blogspec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Recyclenfs:path: /nfs/pv1server: 192.168.30.30//namespace使用创建的blog//ReadWriteOnce可读写但只能被一个节点挂载//path:/nfs/pv挂载到本机/nfs/pv目录,需要事先创建好此目录//server: 192.168.30.30NFS服务器的地址,根据自己实际情况填写
kubectl apply -f /root/wordpress/pv1.yaml
1.3、创建PVC
vim /root/wordpress/pvc1.yaml#pvc的yaml文件apiVersion: v1kind: PersistentVolumeClaimmetadata:name: mypvcnamespace: blogspec:accessModes:- ReadWriteOncevolumeName: mypvresources:requests:storage: 1Gikubectl apply -f /root/wordpress/pvc1.yaml
2、创建MySQL
2.1、创建MySQL的Deployment对象
#####master#####vim /root/wordpress/mysql-db.yaml#mysql的deploymnet的文件//注://namespace使用上一步自己创建的命名空间//创建wordpress时,mysql相关参数需与此处创建mysql时保存一致apiVersion: apps/v1kind: Deploymentmetadata:name: mysql-deploynamespace: bloglabels:apps: mysqlspec:selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:5.6imagePullPolicy: IfNotPresentports:- containerPort: 3306name: dbportenv:- name: MYSQL_ROOT_PASSWORDvalue: rootPassWord- name: MYSQL_DATABASEvalue: wordpress- name: MYSQL_USERvalue: wordpress- name: MYSQL_PASSWORDvalue: wordpressvolumeMounts:- name: db-pvmountPath: /var/lib/mysqlvolumes:- name: db-pvpersistentVolumeClaim:claimName: mypvc
kubectl apply -f mysql-db.yaml
2.2、创建MySQL的service
#创建mysql的service.yaml文件vim /root/wordpress/mysql-service.yamlapiVersion: v1kind: Servicemetadata:name: mysqlnamespace: blogspec:selector:app: mysqlports:- name: mysqlportprotocol: TCPport: 3306targetPort: 3306kubectl apply -f /root/wordpress/mysql-service.yaml
3、创建WordPress
3.1、创建 Wordpress 的 Deployment 对象,添加滚动更新策略,配置资源限额,添加探针。
对 pod 增加 liveness probe 和 rediness probe 两个探针,每 10s 检测一次应用是否可读,每 3s 检测一次应用是否存活。存活探针liveness采用tcpSocket端口探测方式,每3s一次检测80端口是否存活;就绪探针readiness采用httpGet方式每10s一次探测wardpress主页的http返回值是否正常。
编辑wordpress的yaml文件
#####master#####vim /root/wordpress/wordpressdeploy.yaml#wordpress的deploymnet的文件//注://namespace使用上一步自己创建的命名空间//密码都要与MySQL密码相匹配//host填MySQL的虚拟IP//resources里定义资源的上限和下限apiVersion: apps/v1kind: Deploymentmetadata:name: wordpress-deploynamespace: bloglabels:app: wordpressspec:selector:matchLabels:app: wordpressstrategy:type: RollingUpdaterollingUpdate:maxSurge: 50%maxUnavailable: 0template:metadata:labels:app: wordpressspec:containers:- name: wordpressimage: wordpressimagePullPolicy: IfNotPresentports:- containerPort: 80name: wdportenv:- name: WORDPRESS_DB_HOSTvalue: mysql:3306- name: WORDPRESS_DB_USERvalue: wordpress- name: WORDPRESS_DB_PASSWORDvalue: wordpress resources:requests:cpu: 100mmemory: 100Milimits:cpu: 100mmemory: 500MilivenessProbe:tcpSocket:port: 80initialDelaySeconds: 3periodSeconds: 3readinessProbe:tcpSocket:port: 80initialDelaySeconds: 5periodSeconds: 10kubectl apply -f wordpressdeploy.yaml
注:如果部署后访问wordpress的web界面显示连接不上数据库,则该k8s环境的DNS有问题,只需将以上指向Mysql的值(mysql:3306)改为(mysql服务的IP地址:3306)跳过DNS即可,如果可以连上则不用改。
3.2、创建 Wordpress 的 Service 对象
#创建wordpress的service.yaml文件vim /root/wordpress/wordpress-service.yaml//NodePort属性映射端口,提供外部访问apiVersion: v1kind: Servicemetadata:name: wordpressnamespace: blogspec:type: NodePortselector:app: wordpressports:- name: wordpressportprotocol: TCPport: 80targetPort: wdportkubectl apply -f /root/wordpress/wordpress-service.yaml
3.3、配置 HPA,让应用能够自动应对流量高峰期。
HPA需要metrics-server进行资源监控,如没部署,可参考第四点进行部署。
kubectl autoscale deployment wordpress-deploy --cpu-percent=10 --min=1 --max=10 -n blog
HPA负载测试
HPA创建完毕,现在进行HPA的负载测试,查看是否能够进行自动横向扩展
#启动一个用于测试的容器kubectl run v1 -it --image=busybox /bin/sh#登录到容器执行如下命令while true; do wget -q -O- http://wordpress服务的IP:端口; done
此容器会不停的去访问去获取wordpress的界面
重开一个终端用于查看HPA的状态。
#重开一个终端执行以下命令kubectl get hpa -n blog -wkubectl get pod -n blog
几分钟后可以看到,自动横向拓展了8个pod,当我停止了curl命令,不一会儿pod数量又恢复了
所以HPA成功。
3.4、主机浏览器尝试访问,http://IP:端口
此IP是节点的IP,端口通过kubectl get svc -n blog,对应查询
http://192.168.30.30:端口/
已经可以访问,进行安装操作,填入对应数据库的信息,wordpress就搭建完成。
3.5、测试滚动更新
#将wordpressdeploy.yaml中wordpress的image版本改为5.8image: wordpress:5.8#再次部署,kubectl apply -f wordpressdeploy.yaml#查看滚动更新状态,同时不同的访问web界面是否存在影响。
可以看到滚动更新成功,web界面依然一直可以访问,并不受影响。
四、(补充)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、下载部署文件
因为部署文件中image地址指向的是国外的镜像,如果可以访问外网则可以直接拉取,否则手动拉取镜像。
######在node1节点手动拉取镜像docker pull registry.cn-shanghai.aliyuncs.com/szr0728/metrics-server:v0.5.0docker tag registry.cn-shanghai.aliyuncs.com/szr0728/metrics-server:v0.5.0 k8s.gcr.io/metrics-server/metrics-server:v0.5.0
######在master节点yum install wget -ycdwget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.5.0/components.yaml#在components.yaml文件中添加如下参数- --kubelet-insecure-tls
3、部署
kubectl apply -f components.yaml#查看状态是否为runningkubectl -n kube-system get pods -l k8s-app=metrics-server#查看是否有报错kubectl -n kube-system logs -l k8s-app=metrics-server -f#查看资源监控能否正常显示kubectl top node
五、把部署的应用整合到一个 YAML 文件 wordpress-all.yaml 中
#删除前面步骤创建的资源kubectl delete deploy wordpress-deploy mysql-deploy -n blogkubectl delete hpa wordpress-deploy -n blogkubectl delete svc wordpress mysql -n blogkubectl delete pvc mypvc -n blogkubectl delete pv mypvrm -rf /nfs/pv1/*
#wordpress-all.yaml文件#vim wordpress-all.yamlapiVersion: v1kind: PersistentVolumemetadata:name: mypvnamespace: blogspec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Recyclenfs:path: /nfs/pv1server: 192.168.30.30---apiVersion: v1kind: PersistentVolumeClaimmetadata:name: mypvcnamespace: blogspec:accessModes:- ReadWriteOncevolumeName: mypvresources:requests:storage: 1Gi---apiVersion: apps/v1kind: Deploymentmetadata:name: mysql-deploynamespace: bloglabels:apps: mysqlspec:selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:5.6imagePullPolicy: IfNotPresentports:- containerPort: 3306name: dbportenv:- name: MYSQL_ROOT_PASSWORDvalue: rootPassWord- name: MYSQL_DATABASEvalue: wordpress- name: MYSQL_USERvalue: wordpress- name: MYSQL_PASSWORDvalue: wordpressvolumeMounts:- name: db-pvmountPath: /var/lib/mysqlvolumes:- name: db-pvpersistentVolumeClaim:claimName: mypvc---apiVersion: v1kind: Servicemetadata:name: mysqlnamespace: blogspec:selector:app: mysqlports:- name: mysqlportprotocol: TCPport: 3306targetPort: 3306---apiVersion: apps/v1kind: Deploymentmetadata:name: wordpress-deploynamespace: bloglabels:app: wordpressspec:selector:matchLabels:app: wordpressstrategy:type: RollingUpdaterollingUpdate:maxSurge: 50%maxUnavailable: 0template:metadata:labels:app: wordpressspec:containers:- name: wordpressimage: wordpressimagePullPolicy: IfNotPresentports:- containerPort: 80name: wdportenv:- name: WORDPRESS_DB_HOSTvalue: mysql:3306- name: WORDPRESS_DB_USERvalue: wordpress- name: WORDPRESS_DB_PASSWORDvalue: wordpress resources:requests:cpu: 100mmemory: 100Milimits:cpu: 100mmemory: 500MilivenessProbe:tcpSocket:port: 80initialDelaySeconds: 3periodSeconds: 3readinessProbe:tcpSocket:port: 80initialDelaySeconds: 5periodSeconds: 10---apiVersion: v1kind: Servicemetadata:name: wordpressnamespace: blogspec:type: NodePortselector:app: wordpressports:- name: wordpressportprotocol: TCPport: 80targetPort: wdport---apiVersion: autoscaling/v2beta1kind: HorizontalPodAutoscalermetadata:name: wordpress-hpanamespace: blogspec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: wordpress-deployminReplicas: 1maxReplicas: 10metrics:- type: Resourceresource:name: memorytargetAverageUtilization: 50
kubectl apply -f wordpress-all.yaml
部署完成后,查看pod和HPA状态,查看svc的NodePort端口,访问web。
六、问题记录:
1、yaml文件中密码的值如果是数字要加引号
2、部署完metrics-server后依然unknow
问题:ScalingActive False FailedGetResourceMetric the HPA was unable to compute the replica count: failed to get cpu utilization: unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: an error on the server (“Internal Server Error: “/apis/metrics.k8s.io/v1beta1/namespaces/blog/pods?labelSelector=app%!D(MISSING)wordpress”: the server could not find the requested resource”) has prevented the request from succeeding (get pods.metrics.k8s.io)
通过排查发现metrics-server服务没有running,查看日志:Failed to make webhook authorizer request: the server could not find the requested resource E1121 12:53:58.3613851 errors.go:77] the server could not find the requested resource
解决方法:查看自己环境的k8s版本,如果是1.21+,部署metrics-server:v0.5.0以下的则会报错,只需部署0.5版本以上即可解决,部署方法详见上文。
3、挂载遇到的问题
如果挂载遇到如下文件,请检查NFS服务器相关设置