跳到主要内容

先查看服务

服务发现

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

演示服务发现:

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

# 先查看服务
$ kubectl -n luffy get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
eladmin-api ClusterIP 10.99.182.32 <none> 8000/TCP 4h50m
mysql ClusterIP 10.99.14.241 <none> 3306/TCP 21h
redis ClusterIP 10.105.226.34 <none> 6379/TCP 2d1h

# 进入eladmin-web容器
$ kubectl -n luffy exec -ti eladmin-web-7b9d5994fd-lhznk -- sh
# curl eladmin-api:8000
# nslookup eladmin-api

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

  1. configMap中数据库地址可以换成Service名称,这样跨环境的时候,配置内容基本上可以保持不用变化

修改deploy-mysql.yaml

修改configmap.yaml

$ kubectl -n luffy edit configmap eladmin
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
DB_HOST: mysql
REDIS_HOST: redis
REDIS_PORT: "6379"
kind: ConfigMap
metadata:
creationTimestamp: "2022-10-28T13:33:26Z"
name: eladmin
namespace: luffy
resourceVersion: "452964"
uid: 54ab5ed4-64f9-4175-aab5-0ddadeb187e0

重建服务:

$ kubectl -n luffy scale deployment eladmin-api --replicas=0

$ kubectl -n luffy scale deployment eladmin-api --replicas=2

服务发现实现:

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

# 查看eladmin-api的pod解析配置
$ kubectl -n luffy exec -ti eladmin-api-5d979bb778-2g62k -- bash
root@eladmin-api-5d979bb778-2g62k:/opt/eladmin# cat /etc/resolv.conf
search luffy.svc.cluster.local svc.cluster.local cluster.local in.ctcdn.cn ss.in.ctcdn.cn
nameserver 10.96.0.10
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
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 26h