持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情
service——k8s集群对外提供服务和访问外部服务
内部服务
Pod的IP不是固定的,一组 Pod 实例之间有负载均衡和高可用的需求,所以通过服务代理对pod的访问,让k8s集群内部和外部都访问服务。
示例service通过selector 字段来声明这个 Service 只代理携带了k8s-app=prometheus标签的 Pod,并且这个 Service 的 9090端口,代理的是Pod 的 9090端口。
service实现原理解析:
Service 是由kube-proxy(DaemonSet方式部署,每台主机上都有)组件,加上 iptables 来共同实现的。
将外部服务映射为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
}