一、web服務訪問db服務
1.啟動mysql服務
為mysql服務創建一個RC定義文件:mysql-rc.yaml,創建好之后,將其發布到k8s集群中
[root@kub_master k8s]# mkdir tomcat_demo [root@kub_master k8s]# cd tomcat_demo/
[root@kub_master tomcat_demo]# vim mysql-rc.yaml [root@kub_master tomcat_demo]# cat mysql-rc.yaml apiVersion: v1 kind: ReplicationController metadata: name: mysql spec: replicas: 1 selector: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: 192.168.0.212:5000/mysql:5.7 ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: '123456'
[root@kub_master tomcat_demo]# kubectl create -f mysql-rc.yaml replicationcontroller "mysql" created [root@kub_master tomcat_demo]# kubectl get rc NAME DESIRED CURRENT READY AGE mysql 1 1 0 9s [root@kub_master tomcat_demo]# kubectl get rc NAME DESIRED CURRENT READY AGE mysql 1 1 1 32s [root@kub_master tomcat_demo]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE mysql-x6ql5 1/1 Running 0 1m 172.16.46.2 192.168.0.184
可以看到一個名為mysql-x6ql5的pod實例,這就是k8s根據mysql這個rc定義自動創建的pod。可以通過docker指令查看正在運行的容器。
[root@kub_node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7e68b0d7186c 192.168.0.212:5000/mysql:5.7 "docker-entrypoint..." 2 minutes ago Up 2 minutes k8s_mysql.ce4b222f_mysql-x6ql5_default_2e2061a8-ffd6-11ea-8a8e-fa163e38ad0d_9b303ade ab8349676815 192.168.0.212:5000/pod-infrastructure:latest "/pod" 2 minutes ago Up 2 minutes k8s_POD.4e302f1_mysql-x6ql5_default_2e2061a8-ffd6-11ea-8a8e-fa163e38ad0d_8015ffff
此時發現mysql pod對應的容器還多創建一個pod容器,這就是pod的根容器。
再創建一個與之關聯的k8s service-mysql的定義文件,文件名為:mysql-svc.yaml
[root@kub_master tomcat_demo]# vim mysql-svc.yaml [root@kub_master tomcat_demo]# cat mysql-svc.yaml apiVersion: v1 kind: Service metadata: name: mysql spec: ports: - port: 3306 targetPort: 3306 selector: app: mysql
其中:metadata.name 是service的服務名;port定義了service的虛端口;spec.selector確定了哪些pod副本對應的服務到本服務。
創建service對象
[root@kub_master tomcat_demo]# kubectl create -f mysql-svc.yaml service "mysql" created [root@kub_master tomcat_demo]# kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 192.168.0.1 <none> 443/TCP 5d mysql 192.168.41.34 <none> 3306/TCP 14s
mysql服務被分配到一個職位192.168.137.225的cluster ip地址上,這是一個虛地址。隨后k8s集群中其他新創建的pod的就可以通過service 的cluster ip+端口3306來連接和訪問它。
通常情況下,cluster ip是在service創建后由k8s系統自動分配的,其他pod是無法預先知道某個service的cluster ip地址,因此需要一個服務發現機制來找到這個服務。為此,k8s使用了Linux環境變量來解決這個問題。
2. 啟動tomcat服務
以同樣的步驟,完成tomcat應用的啟動過程。首先,創建tomcat對應的RC文件tomcat-rc.yaml
[root@kub_master tomcat_demo]# vim tomcat-rc.yaml [root@kub_master tomcat_demo]# cat tomcat-rc.yaml apiVersion: v1 kind: ReplicationController metadata: name: myweb spec: replicas: 2 selector: app: myweb template: metadata: labels: app: myweb spec: containers: - name: myweb image: 192.168.0.212:5000/tomcat-app:v1 ports: - containerPort: 8080 env: - name: MYSQL_SERVICE_HOST value: '192.168.41.34' - name: MYSQL_SERVICE_PORT value: '3306'
Tomcat容器內,應用將使用的環境變量MYSQL_SERVICE_HOST的值連接mysql服務。更安全可靠的用法是使用服務的名稱“mysql”。
[root@kub_master tomcat_demo]# kubectl create -f tomcat-rc.yaml replicationcontroller "myweb" created [root@kub_master tomcat_demo]# kubectl get rc -o wide NAME DESIRED CURRENT READY AGE CONTAINER(S) IMAGE(S) SELECTOR mysql 1 1 1 6m mysql 192.168.0.212:5000/mysql:5.7 app=mysql myweb 2 2 1 13s myweb 192.168.0.212:5000/tomcat-app:v1 app=myweb [root@kub_master tomcat_demo]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE mysql-x6ql5 1/1 Running 0 6m 172.16.46.2 192.168.0.184 myweb-03lkh 1/1 Running 0 21s 172.16.81.3 192.168.0.212 myweb-d5h4z 1/1 Running 0 21s 172.16.66.2 192.168.0.208
最后,創建對應的service
[root@kub_master tomcat_demo]# vim tomcat-svc.yaml [root@kub_master tomcat_demo]# cat tomcat-svc.yaml apiVersion: v1 kind: Service metadata: name: myweb spec: type: NodePort ports: - port: 8080 nodePort: 30001 selector: app: myweb
type=NodePort和nodePort=30001這兩個屬性,表明service開啟了NodePort方式的外網訪問模式,在k8s集群之外,在本機的瀏覽器里,可以通過30001這個端口訪問myweb(對應到8080的虛端口上)。
[root@kub_master tomcat_demo]# kubectl create -f tomcat-svc.yaml service "myweb" created [root@kub_master tomcat_demo]# kubectl get svc -o wide NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes 192.168.0.1 <none> 443/TCP 5d <none> mysql 192.168.41.34 <none> 3306/TCP 3m app=mysql myweb 192.168.7.143 <nodes> 8080:30001/TCP 11s app=myweb
3. 測試訪問
進入數據庫查看
[root@kub_master tomcat_demo]# kubectl exec -it mysql-x6ql5 bash root@mysql-x6ql5:/# mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 Server version: 5.7.15 MySQL Community Server (GPL) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | HPE_APP | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> use HPE_APP; 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_HPE_APP | +-------------------+ | T_USERS | +-------------------+ 1 row in set (0.00 sec) mysql> select * from T_USERS; +----+-----------+-------+ | ID | USER_NAME | LEVEL | +----+-----------+-------+ | 1 | me | 100 | | 2 | our team | 100 | | 3 | HPE | 100 | | 4 | teacher | 100 | | 5 | docker | 100 | | 6 | google | 100 | | 7 | haha | 100 | +----+-----------+-------+ 7 rows in set (0.00 sec)
二、wordpress + mysql服務
1.啟動mysql服務
為mysql創建一個deployment文件,mysql-wp-deployment.yaml
[root@kub_master k8s]# mkdir wordpress_deployment [root@kub_master k8s]# cd wordpress_deployment/ [root@kub_master wordpress_deployment]# vim mysql-deployment.yaml [root@kub_master wordpress_deployment]# cat mysql-deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: mysql-wp spec: replicas: 1 template: metadata: labels: app: mysql-wp spec: containers: - name: mysql-wp image: 192.168.0.212:5000/mysql:5.7 ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: '123456' - name: MYSQL_DATABASE value: 'wordpress' - name: MYSQL_USER value: 'wordpress' - name: MYSQL_PASSWORD value: 'wordpress'
[root@kub_master wordpress_deployment]# kubectl create -f mysql-deployment.yaml deployment "mysql-wp" created [root@kub_master wordpress_deployment]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE mysql-wp 1 1 1 1 9s
為其創建一個與之關聯的Service-Mysql定義文件,文件名為:mysql-wp-svc.yaml
[root@kub_master wordpress_deployment]# vim mysql-wp-svc.yaml [root@kub_master wordpress_deployment]# cat mysql-wp-svc.yaml apiVersion: v1 kind: Service metadata: name: mysql-wp spec: ports: - port: 3306 targetPort: 3306 selector: app: mysql-wp
[root@kub_master wordpress_deployment]# kubectl create -f mysql-wp-svc.yaml service "mysql-wp" created [root@kub_master wordpress_deployment]# kubectl get svc -o wide NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes 192.168.0.1 <none> 443/TCP 5d <none> mysql 192.168.41.34 <none> 3306/TCP 1h app=mysql mysql-wp 192.168.179.3 <none> 3307/TCP 12s app=mysql-wp myweb 192.168.7.143 <nodes> 8080:30001/TCP 56m app=myweb [root@kub_master wordpress_deployment]# kubectl get pods -o wide |grep mysql-wp mysql-wp-3745398300-msm4j 1/1 Running 0 2m 172.16.46.3 192.168.0.184
可以看到mysql-wp被分配到的cluster ip地址為192.168.179.3。這是一個虛地址。
2. 啟動wordpress服務
首先,創建wordpress對應的deployment文件wp-deployment.yaml
[root@kub_master wordpress_deployment]# vim wp-deployment.yaml [root@kub_master wordpress_deployment]# cat wp-deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: wp-deployment spec: replicas: 1 template: metadata: labels: app: wp spec: containers: - name: wp image: 192.168.0.212:5000/wordpress:latest ports: - containerPort: 80 env: - name: WORDPRESS_DB_HOST value: '192.168.179.3' - name: WORDPRESS_DB_USER value: 'wordpress' - name: WORDPRESS_DB_PASSWORD value: 'wordpress' resources: limits: cpu: 100m requests: cpu: 100m
[root@kub_master wordpress_deployment]# kubectl create -f wp-deployment.yaml deployment "wordpress-deployment" created [root@kub_master wordpress_deployment]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE mysql-wp 1 1 1 1 8m wp-deployment 1 1 1 1 10s [root@kub_master wordpress_deployment]# kubectl get pods -o wide |grep wordpress wp-deployment-2881001018-lqpsf 1/1 Running 0 28s 172.16.81.4 192.168.0.212
wordpress容器內,使用環境變量WORDPRESS_DB_HOST的值連接mysql服務。
創建與其對應的Service。以下是完整的yaml定義文件(wp-svc.yaml)
[root@kub_master wordpress_deployment]# vim wp-svc.yaml [root@kub_master wordpress_deployment]# cat wp-svc.yaml apiVersion: v1 kind: Service metadata: name: wp spec: type: NodePort ports: - port: 80 nodePort: 30002 selector: app: wp
在k8s集群外,可以通過30002端口訪問wp(對應到80的虛端口上)
運行命令進行創建
[root@kub_master wordpress_deployment]# kubectl create -f wp-svc.yaml service "wp" created [root@kub_master wordpress_deployment]# kubectl get svc -o wide NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes 192.168.0.1 <none> 443/TCP 5d <none> mysql 192.168.41.34 <none> 3306/TCP 1h app=mysql mysql-wp 192.168.179.3 <none> 3307/TCP 12m app=mysql-wp myweb 192.168.7.143 <nodes> 8080:30001/TCP 1h app=myweb wp 192.168.184.38 <nodes> 80:30002/TCP 21s app=wp
3. 測試訪問
進入數據庫查看數據
[root@kub_master wordpress_deployment]# kubectl exec -it mysql-wp-3651026459-v31gc bash root@mysql-wp-3651026459-v31gc:/# mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 26 Server version: 5.7.31 MySQL Community Server (GPL) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | wordpress | +--------------------+ 5 rows in set (0.00 sec) 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)