最近需要在项目中检查用户提供的cluster issuer是否存在,需要用到cert-manager pkg,但是对于golang和k8s新手来说没有详细的文档,google也没找到什么参考(可能大家觉得太简单了?),我几乎是靠chatgpt完成了这部分,记录一下。

需要import cert-manager相关的pkg(参考cert-manager-doc-contributing):

"sigs.k8s.io/controller-runtime/pkg/client/config"
cmapi "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
"github.com/cert-manager/cert-manager/pkg/client/clientset/versioned"

创建一个certManagerClient:

func getCertManagerClient() (versioned.Interface, error) {
	cfg, e := config.GetConfig()
	if e != nil {
		return nil, e
	}

	certManagerClient, e := versioned.NewForConfig(cfg)
	if e != nil {
		return nil, e
	}

	return certManagerClient, nil
}

利用GET方法获取指定的cluster issuer:

func getClusterIssuer(ctx context.Context, issuerName string) (*cmapi.ClusterIssuer, error) {
	certManagerClient, e := getCertManagerClient()
	if e != nil {
		return nil, e
	}

	ci, e := certManagerClient.CertmanagerV1().ClusterIssuers().Get(ctx, issuerName, metav1.GetOptions{})
	if e != nil {
		return nil, e
	}

	return ci, nil
}

不过最终没有采用这种方法,而是使用项目中已有的k8s controller runtime client来获取cluster issuer。这样需要将cmapi注册到runtime.scheme中(cmapi.AddToScheme(scheme)),再使用client中的GET方法。