部署WordPress以前已经完成Kubernetes1.6.0集群环境部署和初步测试,这里以部署WordPress为例,整理部署一般应用的流程。

1. 创建单独的命名空间

为应用创建一个单独的命名空间wordpress

kubectl create namespace wordpress

2. 创建mysql

2.1 创建mysql对应的PV

创建pv以前,通过nfs创建共享目录。如果没有安装nfs则需要先安装nfs服务。

yum install nfs-utils -y

创建目录:

mkdir -p /root/data/nfs/pvmysql

添加到nfs

#vim /etc/exports

/root/data/nfs/pvmysql 192.168.17.0/8(rw,no_root_squash)

#systemctl restart nfs

准备脚本mysql-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysqlpv
  namespace: wordpress
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /root/data/nfs/pvmysql
    server: 192.168.17.81

选择nfs,path就是刚才创建的目录/root/data/nfs/pvmysql,

这里的nfs server选择的是192.168.17.81

创建pv

# kubectl apply -f mysql-pv.yaml 
persistentvolume/mysqlpv created


# kubectl get pv -n wordpress
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
mysqlpv   1Gi        RWO            Recycle          Available                                   39s

可以看到pv创建成功了。

2.2 创建mysql对应的PVC

vi mysql-pvc.yaml

脚本内容: 

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysqlpvc
  namespace: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  volumeName: mysqlpv
  resources:
    requests:
      storage: 1Gi

执行创建

# kubectl apply -f mysql-pvc.yaml 
persistentvolumeclaim/mysqlpvc created


# kubectl get pvc -n wordpress
NAME       STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysqlpvc   Bound    mysqlpv   1Gi        RWO                           52s

可以看到pvc创建成功。

2.3 创建mysql deployment

准备脚本文件

vim mysql-deploy.yaml

脚本内容:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deploy
  namespace: wordpress
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deploy
  namespace: wordpress
  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: mysqlpvc

创建mysql deploy:

# kubectl apply -f mysql-deploy.yaml
deployment.apps/mysql-deploy created


# kubectl get deploy -n wordpress
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
mysql-deploy   1/1     1            1           78s

可以看到,已经部署成功。

2.4 创建mysql service

准备脚本文件:

vim mysql-service.yaml

文件内容:

apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: wordpress
spec:
  selector:
    app: mysql
  ports:
  - name: mysqlport
    protocol: TCP
    port: 3306
    targetPort: 3306

执行部署:

# kubectl apply -f mysql-service.yaml 
service/mysql created

[root@k8s-master wordpress]# kubectl get service -n wordpress
NAME    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
mysql   ClusterIP   10.10.92.175   <none>        3306/TCP   13s

至此,mysql已经创建完毕。

3. 创建wordpress

3.1 创建wordpress deploy

创建脚本

vim wordpressdeploy.yaml

脚本内容:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-deploy
  namespace: wordpress
  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

执行部署:

# kubectl apply -f wordpressdeploy.yaml 
deployment.apps/wordpress-deploy created


# kubectl get deploy -n wordpress
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
wordpress-deploy   1/1     1            1           3m50s

3.2 创建wordpress对应的service

创建脚本:

vim wordpress-service.yaml

文件内容:

apiVersion: v1
kind: Service
metadata:
  name: wordpress
  namespace: wordpress
spec:
  type: NodePort
  selector:
    app: wordpress
  ports:
  - name: wordpressport
    protocol: TCP
    port: 80
    targetPort: wdport

执行创建:

# kubectl apply -f wordpress-service.yaml 
service/wordpress created

# kubectl get svc -n wordpress
NAME        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
wordpress   NodePort    10.10.156.2    <none>        80:32474/TCP   13s

至此wordpress部署成功

4. 基本测试

4.1 浏览器访问测试

http://192.168.17.85:32474/

可以使用集群的任一节点ip进行访问。

出现配置界面:

 4.2 查看共享的nfs目录

# ls /root/data/nfs/pvmysql
auto.cnf  ibdata1  ib_logfile0  ib_logfile1  mysql  performance_schema  wordpress

可以看到mysql创建的文件。

5. HPA创建和测试

hpa是为了在请求数量多导致节点负载增加时,可以自动启动更多的节点来满足业务需求,当业务请求减少的时候,又可以自动地降低节点数来释放资源。

HPA依赖于metrics-server,只有正确部署了metrics-server,HPA才能正常工作。

# kubectl autoscale deployment wordpress-deploy --cpu-percent=10 --min=1 --max=10 -n wordpress
horizontalpodautoscaler.autoscaling/wordpress-deploy autoscaled


# kubectl get hpa -n wordpress -w
NAME               REFERENCE                     TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
wordpress-deploy   Deployment/wordpress-deploy   1%/10%    1         10        1          3m40s

5.1 模拟压力测试

创建一个容器来进行模拟测试。

#启动一个用于测试的容器
kubectl run v1 -it --image=busybox /bin/sh

#登录到容器执行如下命令
while true; do wget -q -O- http://192.168.17.81:32474/; done

可以看到容器的持续创建过程:

# kubectl get pod -n wordpress
NAME                                READY   STATUS              RESTARTS   AGE
mysql-deploy-777bfff47c-fq966       1/1     Running             0          174m
wordpress-deploy-668c7b5484-528js   0/1     ContainerCreating   0          45s
wordpress-deploy-668c7b5484-5mdbn   0/1     ContainerCreating   0          75s
wordpress-deploy-668c7b5484-6x5jt   1/1     Running             0          60s
wordpress-deploy-668c7b5484-8bsm7   1/1     Running             0          148m
wordpress-deploy-668c7b5484-8rbgn   1/1     Running             0          75s
wordpress-deploy-668c7b5484-9ddxc   1/1     Running             0          60s
wordpress-deploy-668c7b5484-dlw64   0/1     ContainerCreating   0          60s
wordpress-deploy-668c7b5484-jjsmh   0/1     ContainerCreating   0          60s
wordpress-deploy-668c7b5484-t685t   0/1     ContainerCreating   0          2m46s
wordpress-deploy-668c7b5484-w2j87   1/1     Running             0          45s

从图形界面也可以看到创建的实例:

5.2 停止压力测试

停止压力测试一段时间后,可以看到多余的节点在逐步释放。

# kubectl get pod -n wordpress
NAME                                READY   STATUS        RESTARTS   AGE
mysql-deploy-777bfff47c-fq966       1/1     Running       0          3h7m
wordpress-deploy-668c7b5484-6x5jt   1/1     Terminating   0          13m
wordpress-deploy-668c7b5484-8bsm7   1/1     Running       0          161m
wordpress-deploy-668c7b5484-8rbgn   1/1     Terminating   0          13m
wordpress-deploy-668c7b5484-9ddxc   1/1     Terminating   0          13m
wordpress-deploy-668c7b5484-w2j87   1/1     Terminating   0          12m

最后只有一个pod节点。

# kubectl get pod -n wordpress
NAME                                READY   STATUS    RESTARTS   AGE
mysql-deploy-777bfff47c-fq966       1/1     Running   0          3h7m
wordpress-deploy-668c7b5484-8bsm7   1/1     Running   0          161m

6. 滚动更新测试

修改wordpressdeploy.yaml文件,为镜像增加版本。

image: wordpress:5.8

重新执行部署。

kubectl apply -f wordpressdeploy.yaml

可以查看更新状态

# kubectl rollout status deploy wordpress-deploy -n wordpress
Waiting for deployment "wordpress-deploy" rollout to finish: 2 out of 4 new replicas have been updated...
Waiting for deployment "wordpress-deploy" rollout to finish: 2 out of 4 new replicas have been updated...
Waiting for deployment "wordpress-deploy" rollout to finish: 2 out of 4 new replicas have been updated...
Waiting for deployment "wordpress-deploy" rollout to finish: 2 out of 4 new replicas have been updated...
Waiting for deployment "wordpress-deploy" rollout to finish: 2 out of 4 new replicas have been updated...
Waiting for deployment "wordpress-deploy" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "wordpress-deploy" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "wordpress-deploy" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "wordpress-deploy" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "wordpress-deploy" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "wordpress-deploy" rollout to finish: 2 old replicas are pending termination...
Waiting for deployment "wordpress-deploy" rollout to finish: 2 old replicas are pending termination...
Waiting for deployment "wordpress-deploy" rollout to finish: 2 old replicas are pending termination...
Waiting for deployment "wordpress-deploy" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "wordpress-deploy" rollout to finish: 1 old replicas are pending termination...
deployment "wordpress-deploy" successfully rolled out

在更新过程中,web页面可以正常访问。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐