10.1.k8s的附加组件(coreDNS组件)
k8s主要有两种service发现机制:环境变量和DNS。没有DNS服务的时候,k8s会采用环境变量的形式,但一旦有多个service,环境变量会变复杂,为解决该问题,我们使用DNS服务。
·
目录
一、概念
- 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")
===============================至此,已成艺术==============================
更多推荐
已为社区贡献25条内容
所有评论(0)