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