K8S引入外部服务
# K8S引入外部服务
将外部服务抽象为内部 Service,好处都围绕一个核心:为应用提供一致的、K8s 原生的服务发现和访问体验。
只需要通过固定的 K8s 内部 DNS 名称(如 <service-name>.<namespace>.svc.cluster.local)就能访问。
# 引入外部MySQL
vim mysql-external-service.yaml
1
apiVersion: v1
kind: Service
metadata:
name: mysql-external # 服务名,应用将通过此名称访问
namespace: default
spec:
type: ClusterIP # 仅在集群内部可访问
ports:
- port: 3306 # Service 暴露的端口
targetPort: 3306 # 目标端口,与 MySQL 端口一致
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
kubectl apply -f mysql-external-service.yaml
1
vim mysql-external-endpoints.yaml
1
apiVersion: v1
kind: Endpoints
metadata:
name: mysql-external # 名称必须与上面的 Service 名称完全相同
namespace: default
subsets:
- addresses:
- ip: 192.168.187.100 # 替换为你的外部 MySQL 真实 IP
# - ip: 192.168.1.101 # 可以加多个实现负载均衡
ports:
- port: 3306
protocol: TCP
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
kubectl apply -f mysql-external-endpoints.yaml
1
进入pod内部连接MySQL
[root@master external]# kubectl exec -it nginx-84bd7b58cc-jv5nj -- /bin/bash
1
root@nginx-84bd7b58cc-jv5nj:/# mysql -h mysql-external.default.svc.cluster.local -u root -p --skip-ssl
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
MariaDB [(none)]> create database zyj;
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| zyj |
+--------------------+
5 rows in set (0.001 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
此时在外部连接MySQL
[root@zyj mysql]# mysql -u root -p
1
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| zyj |
+--------------------+
5 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
看到刚才创建的数据库,说明引入成功。
# 读写分离
实现读写分离就是分别创建两个svc和ep
vim mysql-write-svc.yaml
1
apiVersion: v1
kind: Service
metadata:
name: mysql-write # 服务名:应用写数据时连接这个域名
spec:
type: ClusterIP
ports:
- port: 3306
---
apiVersion: v1
kind: Endpoints
metadata:
name: mysql-write # 名称必须与 Service 完全一致
subsets:
- addresses:
- ip: 192.168.1.100 # 这里只填主库 IP
ports:
- port: 3306
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
vim mysql-read-svc.yaml
1
apiVersion: v1
kind: Service
metadata:
name: mysql-read # 服务名
spec:
type: ClusterIP
ports:
- port: 3306
---
apiVersion: v1
kind: Endpoints
metadata:
name: mysql-read # 名称必须与 Service 完全一致
subsets:
- addresses:
- ip: 192.168.1.101 # 从库 1
- ip: 192.168.1.102 # 从库 2
ports:
- port: 3306
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19