D26 kubernetes Service服务发现

1、简介

	kubernetes提供了两种的服务发现模式,环境变量和DNS。pod中的应用程序可以通过它们访问其他Service

2、环境变量

	当创建一个pod时,kubernetes默认会见同一命名空间下的所有Service信息以环境变量的形式注入pod中。其中SERVICE_NAME_SERIVICE_HOST环境变量保存了Service的虚拟IP地址。SERVICE_NAME_SERIVICE_PORT环境变量保存了Service的端口号。这样,容器中的应用程序可以通过这些变量来获取Service的访问地址
  • 创建一个临时pod并进入容器中以执行env命令查看环境变量
[root@k8s-master ~]# kubectl run -it --rm  test3 --image=uhub.service.ucloud.cn/librarys/busybox:latest -- sh
If you don't see a command prompt, try pressing enter.
/ # env | grep _SERVICE_
POD_READINESS_SERVICE_PORT=80
KUBERNETES_SERVICE_PORT=443
SEARCH_API_SERVICE_PORT=80
PORTAL_SERVICE_HOST=10.107.176.157
NGINX_SERVICE_HOST=10.99.169.247
PORTAL_SERVICE_PORT=80
NGINX_SERVICE_PORT=180
MYSQL_PROXY_SERVICE_HOST=10.98.237.25
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_HOST=10.96.0.1
POD_READINESS_SERVICE_HOST=10.107.77.122
SEARCH_API_SERVICE_HOST=10.108.242.82
MYSQL_PROXY_SERVICE_PORT=3306

3、DNS

	kubernetes默认使用coredns作为集群内部的dns服务,它主要负责解析Service名称,这允许集群中的应用程序可以通过Service名称进行通信,而无需硬编码具体的虚拟IP地址
	Service名称的域名格式为SERVICE_NAME.NAMESPACE>svc.cluster.local
  • 在busybox容器中进行域名解析测试,结果如下
/ # nslookup nginx.default.svc.cluster.local
Server:		10.96.0.10
Address:	10.96.0.10:53

Name:	nginx.default.svc.cluster.local
Address: 10.99.169.247

域名 nginx.default.svc.cluster.local解析的IP正式对应的虚拟IP地址,这意味着可以通过这个域名访问Service
[root@k8s-master ~]# kubectl get service
NAME            TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
nginx           ClusterIP      10.99.169.247    <none>        180/TCP        23h

3.1、coredns工作流程

	在容器中访问一个域名时,系统会将dns查询请求发送到/etc/resolv.conf文件中配置的dns服务器地址,既coredns的虚拟IP地址。coredns服务接收到dns查询的请求后,根据Service名称解析为相应的虚拟IP地址。coredns工作流程如下所示

image

  • 容器中的/etc/resolv.conf文件的内容如下
/ # cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
  • 上述各字段含义如下:
nameserver:DNS服务器IP地址。这里的值为10.96.0.10,既Coredns Service的虚拟IP地址
search:DNS查询搜索域列表
options:选线参数。ndots参数表示,如果域名中的 . 少于5个,系统会先将域名与上述search搜索域列表中的 内容按顺序进行拼接并依次进行DNS查询。如果解析失败,系统将尝试使用原域名进行DNS查询。例如,对于域名“nginx”,系统将使用完整域名“nginx.default.svc.cluster.local”进行dns查询
  • 查看Coredns pod和service对象
[root@k8s-master ~]# kubectl get pod,svc -l k8s-app=kube-dns -n kube-system
NAME                           READY   STATUS    RESTARTS       AGE
pod/coredns-66f779496c-ftmmv   1/1     Running   24 (76m ago)   94d
pod/coredns-66f779496c-tdkk7   1/1     Running   25 (76m ago)   94d

NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   94d

3.2 Pod的DNS策略

	Pod的DNS策略指定了Pod内部用于域名解析的策略。在Pod配置中,“dnsPolicy”字段的设置具有以下可选值
  • ClusterFirst:默认值。优先使用机器内部的Coredns服务进行域名解析,如果无法解析,则尝试使用主机上配置的DNS服务器进行域名解析
    ClusterFirstWithHostNet:作用域ClusterFirst一样,但仅在pod运行在主机网络命名空间中(hostnetwork: true)时使用,确保pod仍然可以使用集群内部的Coredns服务进行域名解析
    Default:Pod使用主机上配置的dns服务器进行域名解析,这意味着它不支持service名称解析
    None:当设置为None时,需要通过“dnsConfig”字段来手动配置dns参数,如dns服务器、搜索路径等,以满足特定dns解析需求

PodDNS策略的配置示例如下:

[root@k8s-master k8s]# cat pod-dns-policy.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-dns-policy-test
spec:
  containers:
  - image: uhub.service.ucloud.cn/k8s-repo/busybox:1.28
    name: busybox
    command: ['/bin/sh', '-c', 'sleep 1d']
  hostNetwork: true
  dnsPolicy: ClusterFirstWithHostNet

[root@k8s-master k8s]# kubectl apply -f pod-dns-policy.yaml
pod/pod-dns-policy-test created
[root@k8s-master k8s]# kubectl get pod
NAME                  READY   STATUS    RESTARTS        AGE
pod-dns-policy-test   1/1     Running   0               3s

3.3自定义DNS记录

	Coredns允许用户自定义DNS记录,以满足更多的域名解析需求。例如,集群中的应用程序可以通过自定义的域名mysql.k8s.com访问外部的MySQL服务。编辑Coredns配置文件,存储在ConfigMap对象中
[root@h-k8s-master-181 ~]# kubectl edit configmap coredns -n kube-system
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        # 新增
        hosts {
          192.168.31.181 mysql.k8s.com
        }
        prometheus :9153
....
上述配置新增了hosts{}部分,用于定义域名和IP地址映射,其中有一条映射规则,表示将域名mysql.k8s.com解析到192.168.31.181
  • 重建pod使其配置生效:
[root@h-k8s-master-181 k8s]# kubectl rollout restart deployment/coredns -n kube-system
deployment.apps/coredns restarted
  • 新建一个busybox容器,进行域名解析测试
cat  busybox.yaml
apiVersion: v1
kind: Pod
metadata:
  name: busybox-pod
spec:
  containers:
    - name: busybox
      image: uhub.service.ucloud.cn/librarys/busybox:latest
      command: ["sleep", "3600"]  # 容器会在启动后执行 sleep 命令,保持容器运行1小时
kubectl apply -f busybox.yaml

kubectl exec -it busybox-pod  nslookup mysql.k8s.com
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
Server:		10.96.0.10
Address:	10.96.0.10:53


Name:	mysql.k8s.com
Address: 192.168.31.181
域名mysql.k8s.com解析的IP地址为192.168.31.181,这意味着集群中的应用程序可以通过这个域名访问mysql服务

3.4 指定外部dns服务

  假设公司内部有一台dns服务器,负责对内部应用程序的域名进行解析。现在,我们希望集群中的应用程序能够继续使用该域名访问内部应用程序。这虽然可以通过自定义dns记录来实现,但是当域名较多或者动态变化时,会显得很不方面。这这种情况下,可以给Coredns指定外部dns服务器作为上游服务器,将来自指定域名后缀的dns查询请求转发到这台dns服务器上,如下图所示

image

  • 指定外部DNS服务器的配置示例如下:
[root@h-k8s-master-181 ~]# kubectl edit configmap coredns -n kube-system
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        # 新增
        hosts {
          192.168.31.181 mysql.k8s.com
        }
        prometheus :9153
        forward . /etc/resolv.conf {
           max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }
    # 新增
    sumumu.top:53 {
        errors                   # 错误记录到标准输出
        cache 30                 # 启用缓存
        forward . 192.168.31.200 # 指定转发的DNS服务器
    }

上述配置新增了sumumu.top:53部分,这意味着来自sumumu.top域名后缀的DNS查询请求被转发到外部DNS服务器192.168.31.200

  • 重建Pod使其配置生效
kubectl rollout restart deployment/coredns -n kube-system
  • 当集群中的应用程序访问域名 www.sumumu.top时,它将返回IP地址为 192.168.31.100
posted @   Hello_worlds  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示