首先需要创建mysql pod资源对象,再创建一个与之关联的mysql Service服务。
一.创建mysql pod
先简单讲下,pod是k8s集群中最小单元,一个pod 可以有一个或多个容器,在大多数情况下,我们只会在Pod中运行一个容器。 首先mysql 创建一个pod, 使用yaml文件安装,yaml中的kind属性,用来表明此资源对象的类型,这里是一个RC资源对象类型。spec一节中是RC的相关属性定义,比如spec.selector是RC的Pod标签(label)选择器,即监控和管理拥有这些标签的Pod实例,确保当前集群上始终有且仅有replicas个pod实例在运行,这里replicas=1表示只能运行一个mysql pod实例。当集群中运行的pod数量小于replicas时,rc会根据spec.template一节中定义的Pod模板来生成一个新的pod实例。
需要注意的是 spec.template.medadata.labels指定了该pod的标签,该lables必须匹配spec.selector,否则此RC每次创建了一个无法匹配Label的Pod,就会不停地尝试创建新的Pod。
由于我创建的是单节点集群,就直接云本机中运行yaml文件,如果是多节点集群,需要在master节点执行下面的yaml文件
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql-rc
labels:
name: mysql-rc
spec:
replicas: 1
selector:
name: mysql-pod
template:
metadata:
labels:
name: mysql-pod
spec:
containers:
- name: mysql
image: mysql
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "mysql"
tolerations:
- key: "node-role.kubernetes.io/master"
operator: "Equal"
value: ""
effect: "NoSchedule"
文件名:mysql-rc.yaml 放入opt文件夹下,使用kubectl命令创建
[root@k8s-host opt]# kubectl create -f ./mysql-rc.yaml
replicationcontroller/mysql-rc created
1) 查看对象资源rc类型
[root@k8s-host opt]# kubectl get rc
NAME DESIRED CURRENT READY AGE
mysql-rc 1 1 0 78s
2)查看pod创建情况, 状态为Running正常,创建成功。
[root@k8s-host opt]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-rc-4cvzg 1/1 Running 0 6s
二.创建mysql的servce服务
下面创建一个服务,mysql-svc.yaml,这里的kind为Service 表明是一个k8s Service, metadata.name 为Service的全局唯一名称,mysql-svc为服务名称。 spec.selector确定了哪些Pod副本实例对应到本服务
apiVersion: v1
kind: Service
metadata:
name: mysql-svc
labels:
name: mysql-svc
spec:
type: NodePort
ports:
- port: 3306
protocol: TCP
targetPort: 3306
name: http
nodePort: 30000
selector:
name: mysql-pod
运行kubectl命令,创建service
[root@k8s-host opt]# kubectl create -f ./mysql-svc.yaml
service/mysql-svc created
3.查看创建的服务
运行kubectl命令,可以查看刚刚创建的Service,mysql服务被分配了一个值为10.109.109.170的cluster-ip地址,这是一个虚地址,k8s集群中其他创建的pod就可以通过10.109.109.170 30000来连接和访问mysql服务了(内网)。通常情况下Cluster-ip是在service创建后由k8s系统自动分配的。
[root@k8s-host opt]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4d23h
mysql-svc NodePort 10.109.109.170 <none> 3306:30000/TCP 49s
三.容器中登录mysql
执行 docker ps 命令,查看所有容器, 找到mysql的container id 标识,通过docker exec -it 进入容器中,登录mysql
[root@k8s-host opt]# docker exec -it 1d0b183a2181 /bin/bash
root@mysql-rc-4cvzg:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.20 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>
密码输入:mysql, 密码来自资源创建时指定的密码。这里看到mysql版本是 8.0.19
四. 外部远程登录mysql
先把mysql root用户限制从localhost改为%
mysql>
mysql> alter user 'root'@'%' identified with mysql_native_password by'root';
Query OK, 0 rows affected (0.01 sec)
mysql> alter user 'root'@'%' identified by 'mysql';
Query OK, 0 rows affected (0.01 sec)
要被k8s集群外的客户端访问(在外网),在mysql-svc1.yaml文件中已经设置了spec:type: NodePort 和 nodePort: 30000。 这样就能通过外网ip加端口访问了:
在外面的windows电脑上访问,安装tcping, 默认云ip不能拼通,华为云设置,放开端口30000:
最后使用windows上的客户端连接工具
参考文献 :kubenetes权威指南