「走进k8s」Kubernetes1.15.1的部署 WordPress(29)

上节说了RBAC的使用方法,这次实践的方式部署下wordpress,之前也用docker-conpose的方式部署过wordpress,wordpress里面包含两部分,一个程序方式,一个是mysql数据库。现在通过不同的思路来解读如何通过k8s完成服务编排。

(一)一个Pod

  • ①创建一个命名空间
 kubectl create namespace wdblog

  • ②编写yaml单个文件
    > wordpress-pod.yaml

mysql这个容器我们做了一个数据卷的挂载,这是为了能够将mysql的数据能够持久化到节点上,为了保证数据不丢失,容器挂了,重启数据还是通过挂载点

apiVersion: v1
kind: Pod
metadata:
  name: wordpress
  namespace: wdblog
spec:
  containers:
  - name: wordpress
    image: wordpress
    ports:
    - containerPort: 80
      name: wdport
    env:
    - name: WORDPRESS_DB_HOST
      value: db:3306
    - name: WORDPRESS_DB_USER
      value: wordpress
    - name: WORDPRESS_DB_PASSWORD
      value: wordpress
  - name: mysql
    image: mysql:5.7
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 3306
      name: dbport
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: rootPass123456
    - name: MYSQL_DATABASE
      value: wordpress
    - name: MYSQL_USER
      value: wordpress
    - name: MYSQL_PASSWORD
      value: wordpress
    volumeMounts:
    - name: db
      mountPath: /var/lib/mysql
  volumes:
  - name: db
    hostPath:
      path: /var/lib/mysql

  • ③ 运行yaml文件
kubectl apply -f wordpress-pod.yaml

  • ④ 查看描述详情
kubectl describe pod wordpress -n wdblog

kubectl get pod -n wdblog 

  • ⑤ 单pod的问题

针对pod进行扩容,结果wordpress程序扩容没问题,但是mysql数据库怎么办啊 给三份啊,明显这种是不行的。数据必须唯一性啊。真的这么简单的话就不需要各种数据库集群解决方案了。那怎么办?拆分成2个pod不就可以了。下面咱们一起实践。

(二)两个Pod

wordpress 一个pod,mysql一个pod。在结合之前学到的知识。

  • ① 编写wordpress-all.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: mysql-deploy
  namespace: wdblog
  labels:
    app: mysql
spec:
  template:
    metadata:
      labels:
        app: mysql
    spec: 
      containers:
      - name: mysql
        image: mysql:5.7
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3306
          name: dbport
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: rootPass123
        - name: MYSQL_DATABASE
          value: wordpress
        - name: MYSQL_USER
          value: wordpress
        - name: MYSQL_PASSWORD
          value: wordpress
        volumeMounts:
        - name: db
          mountPath: /var/lib/mysql
      volumes:
      - name: db
        hostPath:
          path: /var/lib/mysql

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

---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: wordpress-deploy
  namespace: wdblog
  labels:
    app: wordpress
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      initContainers:
      - name: init-db
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ['sh', '-c', 'until nslookup mysql;do echo waiting for mysql service; sleep 2; done;']
      containers:
      - name: wordpress
        image: wordpress
        imagePullPolicy: IfNotPresent
        ports:
        - name: wdport
          containerPort: 80
        livenessProbe:
          tcpSocket:
            port: 80
          initialDelaySeconds: 10
          periodSeconds: 3
        readinessProbe:
          tcpSocket:
            port: 80
          initialDelaySeconds: 15
          periodSeconds: 10
        resources:
          limits:
            cpu: 200m
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 100Mi
        env:
        - name: WORDPRESS_DB_HOST
          value: mysql:3306
        - name: WORDPRESS_DB_USER
          value: wordpress
        - name: WORDPRESS_DB_PASSWORD
          value: wordpress

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

  • ② 运行上边的yaml 尝试访问

kubectl apply -f wordpress-all.yaml kubectl get pod -n wdblog

  • ③ 自动应对流量高峰期
kubectl autoscale deployment wordpress-deploy --cpu-percent=10 --min=1 --max=10 -n wdblog

kubectl get pods -n wdblog

kubectl get hpa -n wdblog 

  • ④ 访问下wordpress

192.168.86.100:31306

  • ⑤ 查看dashboard

  • ⑥ 自动扩容

  • ⑥ 解析这个yaml 分析它
  1. 通过—来进行分块编写。
  2. 都在同一的一个命名空间下。
  3. 通过Deployment来管理我们的Pod。
  4. 最上边是mysql,如何让mysql和wordpress进行通信要用到一个之前说过的service,type没有写默认的还记得吧都是ClusterIP,集群内可以相互访问。
  5. 但是针对wordpress要暴露服务的,需要使用type: NodePort,添加了Nodeport,指定31306的端口。
  6. 滚动更新策略,这样可以保证我们在更新应用的时候服务不会被中断RollingUpdate。
  7. mysql重新创建后,clusterIP非常有可能就变化了,不能使用ip的方式,直接通过环境变量别名的方式来写mysql:3306。
  8. 为了确定在mysql运行起来之后在运行没wordpress,使用了容器初始化InitContainer的用法,直到mysql服务创建完成后,initContainer才结束,结束完成后我们才开始下面的部署。initContainers。
  9. 健康检测,我们前面说过liveness probe和rediness probe是提高应用稳定性非常重要的方法,每10s检测一次应用是否可读,每3s检测一次应用是否存活。
  10. 增加 HPA,让我们的应用能够自动应对流量高峰期。

PS:各位老铁下去仔细看下yaml的编写 和添加下 自动扩缩容,主要wordpress提高应用稳定性的方式和方法,这都是前面学习过的,等于把前面一起学习的回顾下。

>>原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!
>>原文链接地址:「走进k8s」Kubernetes1.15.1的部署 WordPress(29)
上一篇: 下一篇:

发表评论

电子邮件地址不会被公开。 必填项已用*标注