容器与kubernetes的网络(四)

126 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

service——k8s集群对外提供服务和访问外部服务

内部服务

Pod的IP不是固定的,一组 Pod 实例之间有负载均衡和高可用的需求,所以通过服务代理对pod的访问,让k8s集群内部和外部都访问服务。

示例service通过selector 字段来声明这个 Service 只代理携带了k8s-app=prometheus标签的 Pod,并且这个 Service 的 9090端口,代理的是Pod 的 9090端口。

image.png

image.png service实现原理解析:

Service 是由kube-proxy(DaemonSet方式部署,每台主机上都有)组件,加上 iptables 来共同实现的。

image.png

image.png

将外部服务映射为service

k8s集群内部需要访问集群外部的服务,同样可以通过service配置成内部可解析的域名进行访问。 外部服务映射为service,需要配置一个与服务名称相同名称的endpoit,流量转发原理与内部服务一样。

[root@k8s12n33 ~]# k -next get svc mysql-test        
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
mysql-test   ClusterIP   10.104.99.251   <none>        3307/TCP   107d
[root@k8s12n33 ~]# k -next get ep mysql-test  
NAME         ENDPOINTS           AGE
mysql-test   10.30.32.209:3307   107d

内部DNS服务-coredns

k8s集群部署coredns作为集群内部的dns服务,同时也可以支持外部dns配置。pod本身支持配置不同dns策略,来选择不同的dns服务作为pod内部域名解析服务。

[test@yw100d33 ~]$ ks get svc kube-dns
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   2y286d

coredns的configmap配置文件
[test@yw100d33 ~]$ ks get cm coredns -oyaml
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health {
            lameduck 5s
        }
        # 实现k8s service的解析
        kubernetes cluster.local {
            ttl 30
        }
        # 自定义域名解析
        hosts {
            10.20.31.xx notify.nmg
            10.20.33.xx reg-prd.test.com
            fallthrough
        }
        # 其他转发(外部dns)
        forward . xx.xx.xx.xx
        prometheus :9153
        cache 30
        loop
        reload
        loadbalance
        log
        ready
    }