Kubernetes资源对象:Endpoint、kube-dns、kube-proxy、ingress-controller、服务访问形式

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: Kubernetes资源对象:Endpoint、kube-dns、kube-proxy、ingress-controller、服务访问形式

endpoint实际上是service以及其对应pods 的数据集合;在kubernetes 多种机制中,相关数据来源都是取自endpoint,故了解endpoint,才会更明晰机制的实现逻辑以及问题的诞生原因。

apiVersion: v1
kind: Endpoints
metadata:
  name: nginx
  namespace: default
subsets:
- addresses:
  - ip: 10.168.84.187
    nodeName: caas-node
    targetRef:
      kind: Pod
      name: nginx-5ccd677bdb-44vjt
      namespace: default
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80

endpoint.metadata.name : 代表着service name

endpoint.subsets[].addresses[].ip 代表 状态为ready pod 的ip

endpoint.subsets[].targetRef: 代表来自该ip的pod详情

endpoint. subsets[].ports[]:  数据来源于service.spec.ports,当pods内的port 并不满足targetPort ,则会在endpoint.subsets[].addresses[]中剔除该pod ip


endpoint  controller

Endpoint controller 主要是维护endpoint,保证endpoint内ip:port 能够提供正常服务

  • endpoint controller 建立 service 与 pod 的list-watch
  • 轮询service队列,查询属于对应该service的pods
  • 判断pods状态以及port情况,生成endpoint对象
  • 过滤掉状态为not ready 的pods
  • 过滤掉不满足service.spec.targetPort 的pods
  • 获取pods 的ip 以及service.spec.ports ,生成endpoint对象
  • 比较该endpoint对象与当前endpoint ,若当前endpoint不存在,则发送给apiserver创建请求,若与当前endpoint不一致,则发送给apiserver更新请求


kube-dns

kube-dns 是为kubernetes提供域名解析服务的组件。每个pod创建的时候,会自动把dns服务


kube-dns由三个容器组成:

  • kube-dns:DNS 服务的核心组件,主要由 KubeDNS 和 SkyDNS 组成
  • KubeDNS 负责监听 Service 和 Endpoint 的变化情况,并将相关的信息更新到 SkyDNS 中
  • SkyDNS 负责 DNS 解析,监听在 10053 端口 (tcp/udp),同时也监听在 10055 端口提供 metrics
  • kube-dns 还监听了 8081 端口,以供健康检查使用
  • dnsmasq-nanny:负责启动 dnsmasq,并在配置发生变化时重启 dnsmasq
  • dnsmasq 的 upstream 为 SkyDNS,即集群内部的 DNS 解析由 SkyDNS 负责
  • sidecar:负责健康检查和提供 DNS metrics(监听在 10054 端口)

支持的dns解析格式:

  • service:my-svc.my-namespace.svc.cluster.local,解析返回ip:

          普通service 返回 service的cluster IP

          headless service 返回pod ip list

  • pod: pod-ip-address.my-namespace.pod.cluster.local ,解析返回pod ip,pod-ip-address格式就是将pod ip :xx.xx.xx.xx 转换为xx-xx-xx-xx


kube-proxy

每台机器上都运行一个 kube-proxy 服务,它监听 API server 中 service 和 endpoint 的变化情况,并通过 iptables 等来为服务配置负载均衡(仅支持 TCP 和 UDP)。

kube-proxy 当前支持一下几种实现

  • userspace:最早的负载均衡方案,它在用户空间监听一个端口,所有服务通过 iptables 转发到这个端口,然后在其内部负载均衡到实际的 Pod。该方式最主要的问题是效率低,有明显的性能瓶颈。
  • iptables:目前推荐的方案,完全以 iptables 规则的方式来实现 service 负载均衡。该方式最主要的问题是在服务多的时候产生太多的 iptables 规则,非增量式更新会引入一定的时延,大规模情况下有明显的性能问题
  • ipvs:为解决 iptables 模式的性能问题,v1.8 新增了 ipvs 模式,采用增量式更新,并可以保证 service 更新期间连接保持不断开
  • winuserspace:同 userspace,但仅工作在 windows 上

注意:使用 ipvs 模式时,需要预先在每台 Node 上加载内核模块 nf_conntrack_ipv4, ip_vs, ip_vs_rr, ip_vs_wrr, ip_vs_sh 等。

Kube-proxy iptables 模式:

 

kube-proxy 目前仅支持 TCP 和 UDP,不支持 HTTP 路由,并且也没有健康检查机制。故可以使用ingress-controller 来解决该问题


ingress-controller

ingress-controller 会根据ingress 内配置的规则,确定要暴露的服务,生成nginx.conf,让外部服务能够通过nginx负载均衡到暴露服务上

ingress 为进入集群的请求提供路由规则的集合


ingress demo

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /testpath
        backend:
          serviceName: test
          servicePort: 80

ingress.spec.rules[].host :  代表定义域名

ingress.spec.rules[].http:代表访问的协议为http

ingress.spec.rules[].http.paths[].path 代表该域名的path

ingress.spec.rules[].http.paths[].backend: 代表访问该域名该path,转发到对应的服务以及端口


ingress-controller 逻辑

  • ingress-controller list-watch ingress ,service变化
  • 轮询ingress列表,获取ingress 对应服务service
  • 根据service 获取endpoint
  • 根据endpoint ip 数据,port 与 ingress  host,path 数据 生成 nginx-conf 对象
  • 进行 排序,比较旧的nginx-conf对象,判断是否一致
  • 若不一致,则生成nginx.conf , 将nginx 进行热更新,使配置生效


深入Ingress-Nginx

  • Deployment?  使用Deployment管理ingress-controller是否合适,在节点变化控制是否方便

调整为DaemonSet类型

好处:不用关心实例数,需要在那个机器上运行打个标签就可以;如果使用Deployment,每次增加或者减少就需要调整replicas

  • 四层代理? 服务如果对外提供的是tcp,而不是http,如何做服务发现?
apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: ingress-nginx
data:
  # tcp四层代理,使用30000端口代理web服务
  "30000": dev/web-demo:80
  • 定制配置? 调整Nginx的配置:如超时、BufferSize如何设置?
kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-configuration
  namespace: ingress-nginx
  labels:
    app: ingress-nginx
data:
  proxy-body-size: "64m"
  proxy-read-timeout: "180"
  proxy-send-timeout: "180"
  • Https? 如何配置证书?

 

  • 访问控制?Session保持?小流量?AB测试?

 

服务访问形式

内部服务互相访问:

     内部服务之间的调用往往通过serviceName.serviceNamespace 域名形式访问,域名通过kube-dns解析ClusterIp,ClusterIp经过iptables,确定pod ip

内部服务访问外部服务

      内部服务访问外部服务,可以直接访问外部服务的域名或ip,也可以将外部服务配置成没有selector的服务,使内部服务访问该服务,也可以达到访问外部服务效果

外部服务访问内部服务

       1. 内部服务通过nodeport开放,外部服务可以通过nodeip:nodeport访问到该服务

       2. 内部服务信息配置在ingress-nginx,外部服务访问ingress-nginx, ingress-nginx统一进行负载均衡


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2月前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
88 3
|
2月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
134 60
|
22天前
|
网络协议 安全 文件存储
动态DNS(DDNS)技术在当前网络环境中日益重要,它允许使用动态IP地址的设备通过固定域名访问
动态DNS(DDNS)技术在当前网络环境中日益重要,它允许使用动态IP地址的设备通过固定域名访问,即使IP地址变化,也能通过DDNS服务保持连接。适用于家庭网络远程访问设备及企业临时或移动设备管理,提供便捷性和灵活性。示例代码展示了如何使用Python实现基本的DDNS更新。尽管存在服务可靠性和安全性挑战,DDNS仍极大提升了网络资源的利用效率。
44 6
|
1月前
|
存储 Kubernetes 网络协议
k8s的无头服务
Headless Service 是一种特殊的 Kubernetes 服务,其 `spec:clusterIP` 设置为 `None`,不会分配 ClusterIP,通过 DNS 解析提供服务发现。与普通服务不同,Headless Service 不提供负载均衡功能,每个 Pod 都有唯一的 DNS 记录,直接映射到其 IP 地址,适用于有状态应用的场景,如与 StatefulSet 一起部署数据库。示例中通过创建 Nginx 的 StatefulSet 和 Headless Service,展示了如何直接访问单个 Pod 并进行内容修改。
40 3
|
1月前
|
域名解析 缓存 网络协议
浏览器中输入URL返回页面过程(超级详细)、DNS域名解析服务,TCP三次握手、四次挥手
浏览器中输入URL返回页面过程(超级详细)、DNS域名解析服务,TCP三次握手、四次挥手
|
1月前
|
安全 测试技术 数据安全/隐私保护
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
|
27天前
|
存储 Kubernetes Devops
Kubernetes集群管理和服务部署实战
Kubernetes集群管理和服务部署实战
46 0
|
2月前
|
Kubernetes 安全 Cloud Native
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问
本文介绍了云原生环境下Kubernetes集群的安全问题及攻击方法。首先概述了云环境下的新型攻击路径,如通过虚拟机攻击云管理平台、容器逃逸控制宿主机等。接着详细解释了Kubernetes集群架构,并列举了常见组件的默认端口及其安全隐患。文章通过具体案例演示了API Server 8080和6443端口未授权访问的攻击过程,以及Kubelet 10250端口未授权访问的利用方法,展示了如何通过这些漏洞实现权限提升和横向渗透。
234 0
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问
|
2月前
|
弹性计算 网络协议 网络安全
内网DNS解析&VPN网关联动实现云上访问云下资源
内网DNS解析&VPN网关联动实现云上访问云下资源
|
2月前
|
域名解析 缓存 网络协议
Windows系统云服务器自定义域名解析导致网站无法访问怎么解决?
Windows系统云服务器自定义域名解析导致网站无法访问怎么解决?

相关产品

  • 云解析DNS
  • 推荐镜像

    更多