用 Go 搭建 Kubernetes Operators

简介: 1、容器间通信: 同一个Pod的容器共享同一个网络命名空间,它们之间的访问可以用localhost地址 + 容器端口就可以访问。 2、同一Node中Pod间通信: 同一Node中Pod的默认路由都是docker0的地址,由于它们关联在同一个docker0网桥上,地址网段相同,所有它们之间应当是能直接通信的。

1、容器间通信:

同一个Pod的容器共享同一个网络命名空间,它们之间的访问可以用localhost地址 + 容器端口 就可以访问。

20170526205259

2、同一Node中Pod间通信:

同一Node中Pod的默认路由都是docker0的地址,由于它们关联在同一个docker0网桥上,地址网段相同,所有它们之间应当是能直接通信的。

20170526205307

3、不同Node中Pod间通信:

不同Node中Pod间通信要满足2个条件: Pod的IP不能冲突; 将Pod的IP和所在的Node的IP关联起来,通过这个关联让Pod可以互相访问。

20170526205316

4、Service介绍:

Service是一组Pod的服务抽象,相当于一组Pod的LB,负责将请求分发给对应的

Pod;Service会为这个LB提供一个IP,一般称为ClusterIP。

20170526205331 20170526205339

5、Kube-proxy介绍:

Kube-proxy是一个简单的网络代理和负载均衡器,它的作用主要是负责Service的实现,具体来说,就是实现了内部从Pod到Service和外部的从NodePort向Service的访问。

实现方式:

  • userspace是在用户空间,通过kuber-proxy实现LB的代理服务,这个是kube-proxy的最初的版本,较为稳定,但是效率也自然不太高。
  • iptables是纯采用iptables来实现LB,是目前kube-proxy默认的方式。

下面是iptables模式下Kube-proxy的实现方式:

20170526205348
  • 在这种模式下,kube-proxy监视Kubernetes主服务器添加和删除服务和端点对象。对于每个服务,它安装iptables规则,捕获到服务的clusterIP(虚拟)和端口的流量,并将流量重定向到服务的后端集合之一。对于每个Endpoints对象,它安装选择后端Pod的iptables规则。
  • 默认情况下,后端的选择是随机的。可以通过将service.spec.sessionAffinity设置为“ClientIP”(默认为“无”)来选择基于客户端IP的会话关联。
  • 与用户空间代理一样,最终结果是绑定到服务的IP:端口的任何流量被代理到适当的后端,而客户端不知道关于Kubernetes或服务或Pod的任何信息。这应该比用户空间代理更快,更可靠。然而,与用户空间代理不同,如果最初选择的Pod不响应,则iptables代理不能自动重试另一个Pod,因此它取决于具有工作准备就绪探测。

6、Kube-dns介绍

Kube-dns用来为kubernetes service分配子域名,在集群中可以通过名称访问service;通常kube-dns会为service赋予一个名为“service名称.namespace.svc.cluster.local”的A记录,用来解析service的clusterip。

Kube-dns组件:

  • 在Kubernetes v1.4版本之前由“Kube2sky、Etcd、Skydns、Exechealthz”四个组件组成。
  • 在Kubernetes v1.4版本及之后由“Kubedns、dnsmasq、exechealthz”三个组件组成。
20170526205356

Kubedns

  • 接入SkyDNS,为dnsmasq提供查询服务。
  • 替换etcd容器,使用树形结构在内存中保存DNS记录。
  • 通过K8S API监视Service资源变化并更新DNS记录。
  • 服务10053端口。

Dnsmasq

  • Dnsmasq是一款小巧的DNS配置工具。
  • 在kube-dns插件中的作用是:
  1. 通过kubedns容器获取DNS规则,在集群中提供DNS查询服务
  2. 提供DNS缓存,提高查询性能
  3. 降低kubedns容器的压力、提高稳定性
  • Dockerfile在GitHub上Kubernetes组织的contrib仓库中,位于dnsmasq目录下。
  • 在kube-dns插件的编排文件中可以看到,dnsmasq通过参数–server=127.0.0.1:10053指定upstream为kubedns。

Exechealthz

  • 在kube-dns插件中提供健康检查功能。
  • 源码同样在contrib仓库中,位于exec-healthz目录下。
  • 新版中会对两个容器都进行健康检查,更加完善。
本文转自开源中国-用 Go 搭建 Kubernetes Operators
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3月前
|
Kubernetes Linux 应用服务中间件
Kubernetes—集群环境搭建
Kubernetes—集群环境搭建
78 0
|
11月前
|
Kubernetes Cloud Native jenkins
下篇:使用jenkins发布go项目到k8s,接上篇的手工体验改造为自动化发布
下篇:使用jenkins发布go项目到k8s,接上篇的手工体验改造为自动化发布
487 1
|
9月前
|
Kubernetes 应用服务中间件 nginx
02-Kubernetes-集群环境搭建(下)
02-Kubernetes-集群环境搭建(下)
|
9月前
|
Kubernetes 网络协议 安全
|
9月前
|
JSON Kubernetes 测试技术
在 Go 中使用 Kubernetes 对象
通常,在某些情况下,我们需要通用的方法去使用 Kubernetes 资源对象,而不是编写代码来处理特定类型。
113 0
|
9月前
|
运维 Kubernetes 负载均衡
Go微服务架构实战 中篇:5. k8s基于ingress和service实现金丝雀发布和蓝绿发布
Go微服务架构实战 中篇:5. k8s基于ingress和service实现金丝雀发布和蓝绿发布
|
9月前
|
Kubernetes 监控 负载均衡
Go微服务架构实战-中篇 1. k8s架构介绍
Go微服务架构实战-中篇 1. k8s架构介绍
|
弹性计算 Kubernetes Docker
|
Kubernetes Cloud Native 应用服务中间件
kubernetes Deployment【4】 client-go 管理 deployment
kubernetes Deployment【4】 client-go 管理 deployment
|
JSON Kubernetes API
Kubernetes ImagePolicyWebhook与ValidatingAdmissionWebhook【3】validating_admission.go源码解析
Kubernetes ImagePolicyWebhook与ValidatingAdmissionWebhook【3】validating_admission.go源码解析
Kubernetes ImagePolicyWebhook与ValidatingAdmissionWebhook【3】validating_admission.go源码解析

推荐镜像

更多