
1.3.2 启动MySQL服务
首先,为MySQL服务创建一个Deployment定义文件mysql-deploy.yaml,下面给出了该文件的完整内容和说明:

以上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上运行如下命令:

接下来,运行kubectl命令查看刚刚创建的Deployment:

查看Pod的创建情况时,可以运行下面的命令:

可以看到一个名称为mysql-85f4b4cdf4-k97wh的Pod实例,这是Kubernetes根据mysql这个Deployment的定义自动创建的Pod。由于Pod的调度和创建需要花费一定的时间,比如需要确定调度到哪个节点上,而且下载Pod所需的容器镜像也需要一段时间,所以一开始Pod的状态为Pending。在Pod成功创建启动完成后,其状态最终会更新为Running。
我们可以在Kubernetes节点的服务器上通过docker ps指令查看正在运行的容器,发现提供MySQL服务的Pod容器已创建且正常运行,并且MySQL Pod对应的容器多创建了一个Pause容器,该容器就是Pod的根容器。


最后,创建一个与之关联的Kubernetes Service—MySQL的定义文件(文件名为mysql-svc.yaml),完整的内容和说明如下:

其中,metadata.name是Service的服务名(ServiceName);spec.ports属性定义了Service的虚端口;spec.selector确定了哪些Pod副本(实例)对应本服务。类似地,我们通过kubectl create命令创建Service对象:

运行kubectl get命令,查看刚刚创建的Service对象:

可以发现,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连接请求。