- Kubernetes權威指南:從Docker到Kubernetes實踐全接觸(第5版)
- 龔正等編著
- 828字
- 2024-01-22 18:49:43
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連接請求。