K8S自己动手系列 - 2.4 - Service
前言
上个实验2.3 – PV & PVC,我们将wordpress+mysql的Deployment绑定PVC,并成功将mysql的数据保存才PV存储卷上。
但是mysql作为数据库应用,当水平扩展后,就是多个独立的数据库实例,数据彼此分离,导致应用在多个实例间的状态不一致,那么这个问题如何解决呢?
答案就是将mysql与wordpress进行分离,我们把wordpress看做一个支持水平扩展的无状态应用,多个wordpress连接同一个mysql数据库。
那么wordpress又如何找到对应的mysql数据库呢?答案就是通过Service
场景
将wordpress与mysql分离成两个Deployment,并为mysql定义Service,wordpress通过ServiceName发现mysql的实例信息,mysql的Deployment使用PVC保存数据状态,完成后wordpress可以水平扩展为多个实例,并且能够保证数据一致性
本文实验所有的源码保存在:
https://github.com/zrbcool/blog-public/tree/master/k8s-hands-on/lab07
实战
对Deployment进行分离
先准备好PVC及PV
lab07 git:(master) kubectl apply -f 01-1-mysql-pvc.yaml persistentvolumeclaim/wordpress-mysql-pv-claim created lab07 git:(master) kubectl apply -f 01-2-mysql-pv.yaml persistentvolume/wordpress-mysql-pv-volume created lab07 git:(master) kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE wordpress-mysql-pv-claim Bound wordpress-mysql-pv-volume 2Gi RWO 15s
为mysql创建Deployment
lab07 git:(master) cat 01-3-mysql-deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: app: wordpress type: mysql name: wordpress-mysql spec: replicas: 1 selector: matchLabels: app: wordpress type: mysql template: metadata: labels: app: wordpress type: mysql spec: containers: - image: mysql:5.7.26 imagePullPolicy: IfNotPresent name: mysql env: - name: MYSQL_ROOT_PASSWORD value: "passw0rd" - name: MYSQL_DATABASE value: "wordpress" volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: wordpress-mysql-pv-claim lab07 git:(master) kubectl apply -f 01-3-mysql-deployment.yaml deployment.extensions/wordpress-mysql created # 这里可以简单测试一下
为mysql创建Service
lab07 git:(master) cat 01-4-mysql-svc.yaml apiVersion: v1 kind: Service metadata: name: wordpress-mysql-svc labels: app: wordpress type: mysql spec: ports: - port: 3306 protocol: TCP targetPort: 3306 selector: app: wordpress type: mysql lab07 git:(master) kubectl apply -f 01-4-mysql-svc.yaml service/wordpress-mysql-svc created lab07 git:(master) kubectl get svc -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR wordpress-mysql-svc ClusterIP 10.98.45.79 <none> 3306/TCP 9s app=wordpress,type=mysql
我们来测试下这个Service是否work,
lab07 git:(master) kubectl run -it --rm --image=mysql:5.7.26 --restart=Never mysql-client -- mysql -h wordpress-mysql-svc -ppassw0rd If you don't see a command prompt, try pressing enter. mysql> use wordpress Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +-----------------------+ | Tables_in_wordpress | +-----------------------+ | wp_commentmeta | | wp_comments | | wp_links | | wp_options | | wp_postmeta | | wp_posts | | wp_term_relationships | | wp_term_taxonomy | | wp_termmeta | | wp_terms | | wp_usermeta | | wp_users | +-----------------------+ 12 rows in set (0.00 sec)
为wordpress创建Deployment
lab07 git:(master) cat 02-1-wordpress-deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: app: wordpress type: wordpress name: wordpress-wp spec: replicas: 1 selector: matchLabels: app: wordpress type: wordpress template: metadata: labels: app: wordpress type: wordpress spec: containers: - image: wordpress:latest imagePullPolicy: IfNotPresent name: wordpress env: - name: WORDPRESS_DB_HOST value: "wordpress-mysql-svc" - name: WORDPRESS_DB_USER value: "root" - name: WORDPRESS_DB_PASSWORD value: "passw0rd"
需要注意到wordpress连接的数据库信息已经不再是127.0.0.1了,而是"wordpress-mysql-svc",这样wordpress的Pod就可以通过ServiceName连接到mysql了,我们来试试
lab07 git:(master) kubectl apply -f 02-1-wordpress-deployment.yaml deployment.extensions/wordpress-wp created ne> lab07 git:(master) kubectl get pods NAME READY STATUS RESTARTS AGE wordpress-mysql-66df4d4dd6-gwjsx 1/1 Running 0 19m wordpress-wp-66ffcc84c5-tgbsc 1/1 Running 0 55s
使用NodePort类型的Service暴露wordpress,我们来测试一下:
lab07 git:(master) cat 02-2-wordpress-svc.yaml apiVersion: v1 kind: Service metadata: name: wordpress-svc labels: app: wordpress spec: ports: - port: 80 protocol: TCP targetPort: 80 nodePort: 30611 selector: app: wordpress type: NodePort lab07 git:(master) kubectl apply -f 02-2-wordpress-svc.yaml service/wordpress-svc created
测试OK,可以正常访问,我们来对wordpress的Pod进行扩容,
lab07 git:(master) kubectl scale --replicas=5 deploy/wordpress-wp deployment.extensions/wordpress-wp scaled lab07 git:(master) kubectl get pods NAME READY STATUS RESTARTS AGE wordpress-mysql-66df4d4dd6-gwjsx 1/1 Running 0 23m wordpress-wp-66ffcc84c5-76tsh 1/1 Running 0 41s wordpress-wp-66ffcc84c5-c4r4q 1/1 Running 0 41s wordpress-wp-66ffcc84c5-qrv2r 1/1 Running 0 41s wordpress-wp-66ffcc84c5-tgbsc 1/1 Running 0 5m24s wordpress-wp-66ffcc84c5-w24sv 1/1 Running 0 41s
多次访问网页,发现已经状态一致,所有请求均由一个数据库处理,完成任务!
清除数据
lab07 git:(master) kubectl delete -f . persistentvolumeclaim "wordpress-mysql-pv-claim" deleted persistentvolume "wordpress-mysql-pv-volume" deleted deployment.extensions "wordpress-mysql" deleted service "wordpress-mysql-svc" deleted deployment.extensions "wordpress-wp" deleted service "wordpress-svc" deleted
更多参考
https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
K8S自己动手系列 - 2.3 - PV & PVC
前言 在实验2.2 – Deployment中,我们将原来基于Pod部署的wordpress+mysql成功改造成基于Deployment部署,基于Deployment部署有很多好处,例如:支持滚动升级(Rolling Update),支持水平扩展。 不过有个问题,就是当我们的Deployment修改了,或者Pod删除重建了,数据也随之丢失了,这是我们不希望看到的,本篇文章我们就来尝试一下基于PV & PVC保存数据状态的有状态应用。 场景 对于单实例的有状态应用,我们可以定义Deployment并且replicas只能为1,用指定PVC的方式关联到一个PV上,使用PV提供的状态存储功能。如果要启动多实例,那么Deployment就无法胜任这个任务,必须使用到我们后面会讲到的StatefulSet+PVC Template的方式创建多实例对多PVC的模型。 本文实验所有的源码保存在:https://github.com/zrbcool/blog-public/tree/master/k8s-hands-on/lab06 实战 PVC定义 lab06 git:(master) c...
- 下一篇
阿里云ECS实例邮件发送不了的解决办法
最近要做一个定时任务错误信息实时转发到邮件,由于用的阿里云服务器一直不成功,在网上找了下原因: 是因为阿里云服务器关闭了25端口,发送邮件才会显示链接超时,而且官方不允许打开该端口,而且大部分邮件都是通过25端口,在网上找了个还不错,以网易163邮箱为例,使用SSL下的465端口。 具体操作: 一、请求数字证书 mkdir -p /root/.certs/ ####创建目录,用来存放证书 echo -n | openssl s_client -connect smtp.163.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/163.crt ####向163请求证书 certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/163.crt ####添加一个SSL证书到证书数据库中 certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.cer...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS6,CentOS7官方镜像安装Oracle11G
- Windows10,CentOS7,CentOS8安装Nodejs环境