跳转至

14. mysql-svc的服务发现

1. hostNetwork的弊端

# 目前使用hostNetwork部署,通过宿主机ip+port访问,弊端:
    - 服务使用hostNetwork,使得宿主机的端口大量暴漏,存在安全隐患
    - 容易引发端口冲突

# 服务均属于k8s集群,尽可能使用k8s的网络访问,因此可以对目前myblog访问mysql的方式做改造:
    - 为mysql创建一个固定clusterIp的Service,把clusterIp配置在myblog的环境变量中
    - 利用集群服务发现的能力,组件之间通过service name来访问

2. 服务发现演示

###### 服务发现
在k8s集群中,组件之间可以通过定义的Service名称实现通信。

## 演示思路:在myblog的容器中直接通过service名称访问服务,观察是否可以访问通

1. 查看服务及pod

kubectl -n demo get svc
kubectl -n demo get pod

2. 进入myblog容器

# 进入myblog容器
kubectl -n demo exec -ti myblog-5c97d79cdb-j485f bash

# 测试直接curl服务名称!
# curl mysql:3306
# curl myblog/blog/index/

#失败了!!!

这里失败了!

3. 总结

# 虽然podip和clusterip都不固定,但是service name是固定的,而且具有完全的跨集群可移植性,
# 因此组件之间调用的同时,完全可以通过service name去通信,这样避免了大量的ip维护成本,使得服务的yaml模板更加简单。

# 因此可以对mysql和myblog的部署进行优化改造:
    1. mysql可以去掉hostNetwork部署,使得服务只暴漏在k8s集群内部网络
    2. configMap中数据库地址可以换成Service名称,这样跨环境的时候,配置内容基本上可以保持不用变化

3. 修改deploy-mysql.yaml

    spec:
      hostNetwork: true # 去掉此行
      volumes: 
      - name: mysql-data
        hostPath: 
          path: /opt/mysql/data

4. 修改configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: myblog
  namespace: demo
data:
  MYSQL_HOST: "mysql"   # 此处替换为mysql
  MYSQL_PORT: "3306"

5. 应用修改

$ kubectl apply -f configmap.yaml
$ kubectl apply -f deploy-mysql.yaml

6. 重建mysql的pod

## 重建pod
$ kubectl -n demo delete po mysql-7f747644b8-6npzn

## myblog不用动,会自动因健康检测不过而重启

7. 服务发现原理(拓展)

服务发现实现:

CoreDNS是一个Go语言实现的链式插件DNS服务端,是CNCF成员,是一个高性能、易扩展的DNS服务端

$ kubectl -n kube-system get po -o wide|grep dns
coredns-d4475785-2w4hk             1/1     Running   0          4d22h   10.244.0.64       
coredns-d4475785-s49hq             1/1     Running   0          4d22h   10.244.0.65

# 查看myblog的pod解析配置
$ kubectl -n demo exec -ti myblog-5c97d79cdb-j485f bash
[root@myblog-5c97d79cdb-j485f myblog]# cat /etc/resolv.conf
nameserver 10.96.0.10
search demo.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

## 10.96.0.10 从哪来
$ kubectl -n kube-system get svc
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)         AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP   51d

## 启动pod的时候,会把kube-dns服务的cluster-ip地址注入到pod的resolve解析配置中,同时添加对应的namespace的search域。 因此跨namespace通过service name访问的话,需要添加对应的namespace名称,
service_name.namespace_name
$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   26h

最后更新: 2022-02-22 04:55:01