k8s集群内pod访问集群外的mysql
k8s

k8s集群内pod访问集群外的mysql

axing
2023-08-22 / 0 评论 / 11 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年09月29日,已超过115天没有更新,若内容或图片失效,请留言反馈。

一、储备知识
svc的四种类型

  1. ClusterIP:只能用于集群内部访问(默认)
    通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部(任一安装有kube-prxoy组件的节点上)可以访问,这也是默认的 ServiceType。
  2. NodePort:用于集群外部访问
    该类型下的servie,会在集群主机上(所有安装有kubelet组件的主机)监听一个端口与service的端口映射,该端口称之为NodePort
    因为NodePort是在所有集群主机监听的物理端口,所以搭配任意一台集群主机的ip地址就可以访问了,转发链路如下

    集群外部通过请求 <NodeIP>:<NodePort> ----》ipvs规则计算出要转发的目标pod ip(ipvsadm -Ln)-----》然后转发到<Podip>:<TargetPort>
  3. LoadBalancer:向云提供商申请一个独立于k8s的负载均衡器,该负载均衡器会将流量转发到每个物理节点,形式为::NodePort
    只要把svc的type=NodePort改为type=LoadBalancer即可,k8s会自动帮我们创建一个对应的负载均衡器实例
    并返回它的ip地址供外部客户端使用
    其他公有云提供商只要实现了支持此特性的驱动,则也可以达到上述目的。
  4. ExternalName:將svc映射為一個外部域名地址,通過externalName字段进行设置。
    如果外部服务有可以解析的域名,直接指定即可

二、实验准备

  1. 使用k8s集群以外的一台机器下载好mysql
  2. 防火墙,selinux等关闭
  3. 配置文件加上

    [mysqld]
    bind-address = 0.0.0.0
  4. 如果外部服务没有域名,而只有ip+port,那我们无法指定ExternalName,此时只能通过自建endpoint来实现
    注意:
    1、我们的svc的clusterIP必须设置为None
    2、endpoint的名字要与svc的名字保持一致

    apiVersion: v1
    kind: Service
    metadata:
      name: mysql-k8s
    spec:
      type: ClusterIP
      clusterIP: None
      ports:
     - name: port
       port: 13306
    
    ---
    apiVersion: v1
    kind: Endpoints
    metadata:
      name: mysql-k8s # 名称必须和 Service 一致
    subsets:
      - addresses:
       - ip: 192.168.110.109 # Service 将连接重定向到 endpoint
     ports:
       - name: port
         port: 3306
    [root@k8s-master-01 test1]# kubectl apply -f 3.yaml 
    service/mysql-k8s created
    endpoints/mysql-k8s created
    [root@k8s-master-01 test1]# kubectl get endpoints
    NAME         ENDPOINTS              AGE
    kubernetes   192.168.110.97:6443    15d
    mysql-k8s    192.168.110.110:3306   11s
    [root@k8s-master-01 test1]# kubectl get service
    NAME         TYPE           CLUSTER-IP   EXTERNAL-IP     PORT(S)     AGE
    kubernetes   ClusterIP      10.96.0.1    <none>          443/TCP     15d
    my-service   ExternalName   <none>       www.baidu.com   <none>      44m
    mysql-k8s    ClusterIP      None         <none>          13306/TCP   19s
  5. 在集群外mysql里面配置

    mysql -uroot -p
    CREATE USER 'mysql-k8s'@'%' IDENTIFIED BY 'Egon@123';
    GRANT ALL PRIVILEGES ON *.* TO 'mysql-k8s'@'%';
    FLUSH PRIVILEGES;
    exit
  6. 在k8s部署

    apiVersion: v1
    kind: Pod
    metadata:
      name: mysql-client
    spec:
      containers:
      - name: mysql-client
     image: mysql:5.7
     command: ["sleep", "3600"] # 持续运行以便于你进入Pod进行测试
    [root@k8s-master-01 test1]# kubectl exec -it mysql-client -- /bin/bash
    bash-4.2# mysql -h 192.168.110.110 -P 3306 -u mysql-k8s -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 6
    Server version: 5.7.44-log MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2023, Oracle and/or its affiliates.
    
    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> exit
0

评论 (0)

取消