k8s client-go快速入门教程及源代码阅读之Scheme编解码
本文主要讲解k8s源码中基于Scheme的编解码机制, Scheme就像一个类型大管家,内部注册了各种GVK, 所以使用静态客户端的时候,我们才能无感的直接得到静态类型的指定对象,而不是像动态客户端得到一个Unstructured。
本文主要讲解k8s源码中基于Scheme的编解码机制, Scheme就像一个类型大管家,内部注册了各种GVK, 所以使用静态客户端的时候,我们才能无感的直接得到静态类型的指定对象,而不是像动态客户端得到一个Unstructured。
golang的net/http包同时支持客户端和服务端,而本文主要分析客户端的代码,通过查看源代码可以更好的理解net/http的使用,也能好好的学习一下golang官方的代码风格。
之前无论是讲解静态客户端还是动态客户端都可以略过了client-go底层的RESTClient的构造过程,这篇文章主要分析RESTClient的构造和请求过程,k8s的API都遵循RESTFul规范,所以客户端自然可以以对应的约定形式构造,所以叫做RESTClient。
与client-go静态客户端相对应的自然就是动态客户端了,动态客户端的价值在于灵活,不用重新生成客户端代码就能访问k8s集群中的所有资源,即使是非内置资源。
client-go的客户端可以分为两类,一类称为静态客户端,另一类称为动态客户端,前者的好处在接口已经固定,在写代码的时候有很好的提示,坏处是无法访问非k8s内置资源,后者的好处是够灵活,但是需要使用者知道GVK/GVR等前置知识。两者各有好处,需要根据自己需要选择。
从上一篇文章,我们知道使用client-go操作k8s的资源基本分为三步,1. 配置加载,2. 创建客户端,3. 使用接口,这一篇文章主要专注于使用client-go时的配置加载, 而配置加载,主要是加载认证和连接信息。
client-go是kubernetes官方维护的一个go语言客户端,用于与k8s集群交互,使用client-go可以很方便的完成k8s的二次开发(似乎也必不可少),无论是稳定性还是健壮性都有充分的保障。
apisix主要是lua脚本跟openresty(或者说nginx)的组合, 流量具体转发由nginx承载, 但是按照什么规则转发用lua脚本定义. apisix在nginx之上封装了非常多功能强大有用的特性, 提供丰富的流量管理功能,比如态调整upstream, 灰度发布, 流量熔断, 认证, 观测性等。
本文通过阅读CoreDNS的源代码来了解CoreDNS的内部机制, 通过对源代码的阅读可以让我们更好的理解并使用CoreDNS,之所以被称为粗解,是因为阅读的程度并没有太深,忽略了一些细节。
ingress-nginx用于将集群内部的服务暴露给外部调用, 鉴于nginx的出色表现,所以nginx-ingress也是一个高性能的网关, 通过阅读ingress-nginx-controller的源代码可以更好的理解并使用ingress-nginx, 在理解源代码之后也可以更容易的扩展ingress-nginx.
在k8s集群内部,或者说在集群的任一节点上执行命令,访问任何资源都是没什么障碍的,但是,在集群外部呢?我们并不能直接访问pod的IP,或者service的IP,这些IP是一些内部地址,一般在外部是不会设置路由的,那么如何在集群外部访问这些资源呢?最简单的解决方式是hostPort及nodePort,通过hostPort可以在运行pod的节点监听指定接口,好处是没有端口限制,但是外部访问需要知道pod运行在哪个节点,可能会存在单点故障(当然了,你也可以每个节点都运行hostport,但是太浪费端口了),如果只有一个pod运行的话,相对于hostPort, nodePort可以在所有节点监听一个指定的端口,这样访问集群的任一节点都可以访问到所需资源,好处是不需要关心pod运行在哪个节点,但是有端口限制。除了这些限制以外,最痛苦的是每个接口一个端口,或者说一个域名一个端口,如果有一个统一的端口并且可以动态的关联配置的服务该多好。