目录

一、概念

二、查看k8s集群的coreDNS的IP地址

三、验证


一、概念

  • service发现是k8s中的一个重要机制,其基本功能为:在集群内通过服务名对服务进行访问,即需要完成从服务名到ClusterIP的解析。
  • k8s主要有两种service发现机制:环境变量和DNS。没有DNS服务的时候,k8s会采用环境变量的形式,但一旦有多个service,环境变量会变复杂,为解决该问题,我们使用DNS服务。
  • kubeadm部署的k8s集群自带coreDNS组件,二进制部署需要自己手动部署;

  k8s系统中安装了coreDNS组件后,会有一个coreDNS开头的pod资源; 

[root@k8s1 ~]# kubectl get pods -o wide -A

二、查看k8s集群的coreDNS的IP地址

查看kubelet的配置文件中,可以看到集群dns的地址;

vim /var/lib/kubelet/config.yaml 

查看k8s集群中DNS的svc的详细信息,可以看到,里面解析了coreDNS的地址在endpoint列表中; 

[root@k8s1 k8s]# kubectl get svc -A
NAMESPACE     NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
default       kubernetes   ClusterIP   10.200.0.1       <none>        443/TCP                  3d21h
default       svc01        NodePort    10.200.200.200   <none>        99:31000/TCP             8h
kube-system   kube-dns     ClusterIP   10.200.0.10      <none>        53/UDP,53/TCP,9153/TCP   3d21h
[root@k8s1 k8s]# kubectl describe -n kube-system svc kube-dns
Name:              kube-dns
Namespace:         kube-system
Labels:            k8s-app=kube-dns
                   kubernetes.io/cluster-service=true
                   kubernetes.io/name=CoreDNS
Annotations:       prometheus.io/port: 9153
                   prometheus.io/scrape: true
Selector:          k8s-app=kube-dns
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.200.0.10
IPs:               10.200.0.10
Port:              dns  53/UDP
TargetPort:        53/UDP
Endpoints:         10.100.1.20:53,10.100.1.21:53
Port:              dns-tcp  53/TCP
TargetPort:        53/TCP
Endpoints:         10.100.1.20:53,10.100.1.21:53
Port:              metrics  9153/TCP
TargetPort:        9153/TCP
Endpoints:         10.100.1.20:9153,10.100.1.21:9153
Session Affinity:  None
Events:            <none>

三、验证

# 安装dig
[root@k8s1 k8s]# yum -y install bind-utils
[root@k8s1 k8s]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.200.0.1       <none>        443/TCP        5d11h
svc01        NodePort    10.200.200.200   <none>        99:31000/TCP   46h
[root@k8s1 k8s]# dig @10.200.0.10 svc01.default.svc.oslee.com +short
10.200.200.200

应用软件在连接集群内的中间件时(比如数据库),可以使用svc名代替IP地址。

四、如何让 Pod 访问其他 Pod 和 Service

Pod内部通信

Pod内的多个容器可以通过localhost进行通信。

同一个Namespace下的Pod通信

Pod可以通过其他Pod的名称作为主机名进行访问。

不同Namespace下的Pod通信

Pod可以通过Pod的全名(即 <pod-name>.<namespace>)作为主机名进行访问。

Cluster外部访问Pod

可以通过Node的IP加上容器端口进行访问。

通过 Service 访问

  • 在 Kubernetes 内部,Pod 可以通过 Service 的名称来访问其他 Pod。Service 会自动将流量路由到其后端的 Pod。
  • Service 的 DNS 名称可以在集群内部解析,因此 Pod 可以通过这个名称来访问其他 Service 或 Pod。
# service
apiVersion: v1
kind: Service
metadata:
  name: my-service

# 调用示例
client := &http.Client{}
resp, err := client.Get("http://my-service")

===============================至此,已成艺术==============================

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐