![Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/305/47379305/b_47379305.jpg)
1.3.2 启动MySQL服务
首先,为MySQL服务创建一个Deployment定义文件mysql-deploy.yaml,下面给出了该文件的完整内容和说明:
![img](https://epubservercos.yuewen.com/EB1063/26763832509462206/epubprivate/OEBPS/Images/txt001_2.jpg?sign=1739233252-QX5P9FTLVEF7tM9c1zMO3mxWqVTzuXpH-0-90109be18bd284e3c356535ccbc9ce76)
以上YAML定义文件中的kind属性用来表明此资源对象的类型,比如这里的属性值表示这是一个Deployment;spec部分是Deployment的相关属性定义,比如spec.selector是Deployment的Pod选择器,符合条件的Pod实例受到该Deployment的管理,确保在当前集群中始终有且仅有replicas个Pod实例在运行(这里设置replicas=1,表示只能运行一个MySQL Pod实例)。当在集群中运行的Pod数量少于replicas时,Deployment控制器会根据在spec.template部分定义的Pod模板生成一个新的Pod实例,spec.template.metadata.labels指定了该Pod的标签,labels必须匹配之前的spec.selector。
创建好mysql-deploy.yaml文件后,为了将它发布到Kubernetes集群中,我们在Master上运行如下命令:
![img](https://epubservercos.yuewen.com/EB1063/26763832509462206/epubprivate/OEBPS/Images/txt001_3.jpg?sign=1739233252-h2WTGp7AZ7So8rwbGRsXh3w5prHqHVg6-0-c14800efcb6d59385173227c8ef0c4dc)
接下来,运行kubectl命令查看刚刚创建的Deployment:
![img](https://epubservercos.yuewen.com/EB1063/26763832509462206/epubprivate/OEBPS/Images/txt001_4.jpg?sign=1739233252-w0o9Nj79QSC8DgoVz90enuXsf80p6I81-0-6157d1e04e9d7ea2d63a5cc0dfcc57e3)
查看Pod的创建情况时,可以运行下面的命令:
![img](https://epubservercos.yuewen.com/EB1063/26763832509462206/epubprivate/OEBPS/Images/txt001_5.jpg?sign=1739233252-HDzxTi3fCbejsSNCZFKwpT8aM9Xyqe0r-0-bd2016f52d2cb8cad1b0d61db1afc5d7)
可以看到一个名称为mysql-85f4b4cdf4-k97wh的Pod实例,这是Kubernetes根据mysql这个Deployment的定义自动创建的Pod。由于Pod的调度和创建需要花费一定的时间,比如需要确定调度到哪个节点上,而且下载Pod所需的容器镜像也需要一段时间,所以一开始Pod的状态为Pending。在Pod成功创建启动完成后,其状态最终会更新为Running。
我们可以在Kubernetes节点的服务器上通过docker ps指令查看正在运行的容器,发现提供MySQL服务的Pod容器已创建且正常运行,并且MySQL Pod对应的容器多创建了一个Pause容器,该容器就是Pod的根容器。
![img](https://epubservercos.yuewen.com/EB1063/26763832509462206/epubprivate/OEBPS/Images/txt001_6.jpg?sign=1739233252-gunw86ds2neXb7QPQ5iClGoVNbmFwmgT-0-ca620c905034fe6bf4ea549242453f75)
![img](https://epubservercos.yuewen.com/EB1063/26763832509462206/epubprivate/OEBPS/Images/txt001_7.jpg?sign=1739233252-gWlpSkf5Vy87j8zO2emcXYE9ESeFmvXY-0-d93492a7eb16d0b65e832fa50d54649e)
最后,创建一个与之关联的Kubernetes Service—MySQL的定义文件(文件名为mysql-svc.yaml),完整的内容和说明如下:
![img](https://epubservercos.yuewen.com/EB1063/26763832509462206/epubprivate/OEBPS/Images/txt001_8.jpg?sign=1739233252-uUQmhzkyHpTHRet4tlUSFIIphTXPJsc4-0-76f56cc2ba47bfb881fe6f63693f06f9)
其中,metadata.name是Service的服务名(ServiceName);spec.ports属性定义了Service的虚端口;spec.selector确定了哪些Pod副本(实例)对应本服务。类似地,我们通过kubectl create命令创建Service对象:
![img](https://epubservercos.yuewen.com/EB1063/26763832509462206/epubprivate/OEBPS/Images/txt001_9.jpg?sign=1739233252-AgR0j9krOawnuPEZEqIkf2HrwyDFDH8y-0-3356a807beaa5f215dcdb3bba3228845)
运行kubectl get命令,查看刚刚创建的Service对象:
![img](https://epubservercos.yuewen.com/EB1063/26763832509462206/epubprivate/OEBPS/Images/txt001_10.jpg?sign=1739233252-SXan7mWZFNPiu8HQk7G44bGEtdYJ04CP-0-63a52dafb3211488da88ce8d221a1c9e)
可以发现,MySQL服务被分配了一个值为10.245.161.22的ClusterIP地址(在不同环境中分配的IP地址可能不同)。随后,在Kubernetes集群中新创建的其他Pod就可以通过Service的ClusterIP+端口号3306来连接和访问它了。
通常,ClusterIP地址是在Service创建后由Kubernetes系统自动分配的,其他Pod无法预先知道某个Service的ClusterIP地址,因此需要一个服务发现机制来找到这个服务。为此,Kubernetes最初巧妙地使用了Linux环境变量(Environment Variable)来解决这个问题。根据Service的唯一名称,容器可以从环境变量中获取Service对应的ClusterIP地址和端口号,从而发起TCP/IP连接请求。