EndPoint+glusterFS/Mysql引用外部资源

EndPoint+<glusterFS/Mysql>引用外部资源

前言

https://wangtingwei.info/?p=866 这篇文章中我介绍了不要把数据库放在容器中运行,那么kubernetes是如何将运行在容器外部的资源(数据库,外部存储)映射到kubernetes中让我们进行访问呢?endpoint资源对象就是为了解决这个问题的。因为资源的访问无非就是建立连接,而建立连接也是基于传输层(IP+PORT),我们的endpoint的原理就是将外部资源真实的ip和port进行绑定形成endpoint资源。而在kubernetes中访问资源的入口就是service。我们也要给endpoint资源创建service,此时外部资源连接的建立就会被映射成kubernetes集群内部的建立(cluster ip))进行访问。既然原来已经清楚了,我们开始实战把。本文会以mysql 和glusterfs 两个例子进行讲解。

endpoint+Mysql实战

  • 环境准备

node-2 192.168.137.102    kubernetes 节点机器

node-1   192.168.137.101   kubernetes 节点机器     宿主机已安装mysql5.7.17

master   192.168.137.100  kubenetes master机器

  • 创建endpoint+service

[root@master endpoint_test]# cat mysql_endpoint.yaml
apiVersion: v1
kind: Endpoints
metadata:
name: end-mysql
subsets:
– addresses:
– ip: “192.168.137.101”
ports:
– port: 3306


apiVersion: v1
kind: Service
metadata:
name: end-mysql
spec:
ports:
– port: 3306
protocol: TCP
targetPort: 3306

解释:第一部分endpoint绑定了容器外部的数据库ip 和端口,第二部分service没有用lable selector ,而是直接定义二者名字相同,从而自动关联。创建后查看svc资源

此时容器外部的服务被映射到kubernetes里了,通过ip :10.98.194.91  port:3306进行访问。

  • 创建mysql客户端资源进行验证

[root@master endpoint_test]# cat mysql-client.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: “root”

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: 30306
selector:
name: mysql-pod

备注:这里我直接通过kubernetes启了一个mysql服务并创建了service,如图所示

  • 查看mysql-client 背调度到哪个机器

  • 授权操作

注意:根据源进源出的道理,被调度到node-2(192.168.137.102)的内部资源mysql-client请求外部mysql建立连接的最终ip实际就是mysql-client被调度到node-2的宿主机ip,也就是192.168.137.102,所以在mysql机器授权即可。 

  • 进入mysql-client验证

  • 进入node-1的外部数据库查看

  • 实验成功,node-2在k8s内部连接的数据库,就是node-1部署在宿主机上的数据库。

gluster +endpoint+pv+pvc  实现外部分布式存储资源调用

环境规划

[root@client-1 ~]# cat /etc/hosts
192.168.137.107 client-3
192.168.137.105 client-1
192.168.137.106 client-2

client-2是管理节点

执行部署脚本

三台机器统一执行

[root@client-2 ~]# cat install_gls.sh
yum install centos-release-gluster -y
yum install -y glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma glusterfs-geo-replication glusterfs-devel
mkdir /opt/glusterd
sed -i ‘s/var\/lib/opt/g’ /etc/glusterfs/glusterd.vol
systemctl start glusterd.service
systemctl enable glusterd.service
systemctl status glusterd.service

  • client-2上添加其他节点

gluster peer probe client-3

gluster peer probe client-1

  • 查看添加节点情况

  • 创建存储卷
    [root@client-2 ~]# gluster volume create k8s-volume transport tcp client-1:/opt/gfs_data client-2:/opt/gfs_data client-3:/opt/gfs_data force
    volume create: k8s-volume: success: please start the volume to access data
  • 启动存储卷

gluster volume start k8s-volume

  • 查看存储卷状态

  • 为gluster 创建end-point

{
“kind”: “Endpoints”,
“apiVersion”: “v1”,
“metadata”: {
“name”: “glusterfs-cluster”
},
“subsets”: [
{
“addresses”: [
{
“ip”: “192.168.137.106”
}
],
“ports”: [
{
“port”: 49152
}
]
}
]
}

  • 给gluster创建service

{
“kind”: “Service”,
“apiVersion”: “v1”,
“metadata”: {
“name”: “glusterfs-cluster”
},
“spec”: {
“ports”: [
{“port”: 49152}
]
}
}

注意:49152是我通过gluster volume status 查看的,是我的gluster tcp 连接端口。另外service和endpoint名字要一致才能自动关联。

  • 查看service 和endpoint

  • 需要挂载gluster的节点提前要下载好客户端和host解析(必须)

yum install -y glusterfs glusterfs-fuse

192.168.137.107 client-3
192.168.137.105 client-1
192.168.137.106 client-2

  • 配置gluster测试pod

{
“apiVersion”: “v1”,
“kind”: “Pod”,
“metadata”: {
“name”: “glusterfs”
},
“spec”: {
“containers”: [
{
“name”: “glusterfs”,
“image”: “nginx”,
“volumeMounts”: [
{
“mountPath”: “/mnt/glusterfs”,
“name”: “glusterfsvol”
}
]
}
],
“volumes”: [
{
“name”: “glusterfsvol”,
“glusterfs”: {
“endpoints”: “glusterfs-cluster”,
“path”: “k8s-volume”,
“readOnly”: true
}
}
]
}
}

注意:path位置要和之前在client-2创建的volume名字一致。我之前创建的是k8s-volume

  • 查看测试pod状态

  • 进入pod验证

  • 错误排查

在创建测试Pod时候,我们的pod被调度到node-2节点上,但是报错查看日志提示如下。

然后去目标主机node-2节点对应目录查看日志如下

意思是node-2节点不能解析client-1,我首先查看了node-2是否存在client-1对应的记录,结果发现存在。ping了其他几个client-2 client-3都可以。排除解析功能问题。猜测配置里有其他符号导致解析错误。重新清空改写后正常,原来复制粘贴后多了几个隐藏符号占位了。

  • 配置pv

[root@master gluster_test]# cat glusterfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: gluster-dev-volume
spec:
capacity:
storage: 10Gi
accessModes:
– ReadWriteMany
glusterfs:
endpoints: “glusterfs-cluster”
path: “k8s-volume”
readOnly: false

  • 查看pv

注意:此时status是 Available ,CLAIM 为空

  • 配置pvc

[root@master gluster_test]# cat glusterfs-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: glusterfs-nginx
spec:
accessModes:
– ReadWriteMany
resources:
requests:
storage: 1Gi

  • 查看pvc和现在的pv

注意:此时pv 状态已经为bound 并且claim 为pvc的名字。

  • 创建deployment来使用pvc

[root@master gluster_test]# cat nginx-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-volume
spec:
replicas: 1
template:
metadata:
labels:
name: nginx
spec:
containers:
– name: nginx
image: nginx:alpine
imagePullPolicy: IfNotPresent
ports:
– containerPort: 80
volumeMounts:
– name: test-volume
mountPath: “/usr/share/nginx/html”
volumes:
– name: test-volume
persistentVolumeClaim:
claimName: glusterfs-nginx

  • 查看nginx-deployment相关信息

  • 进入nginx容器在网站根目录创建文件

  • 验证结果

数据流向:数据(王庭威你是真的666啊)->pvc->pv->gluster volume(k8s-volume)->三块磁盘(/opt/gfs_data/)

由于gluster我这里做的是DHT模式,数据只会写进三块盘中的一个

分别查看

client-1

client-2

client-3

数据最终在client-3上存储。

 

 

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Loading...