多种Firewalld规则的控制器规则(一):Controller规则

目录

概览

Kubernetes 提供了几种自定义控制器的方法:

控制器是 CRD 的核心。在这里,我们将解释如何使用代码生成器来创建自定义控制器。作为本文的示例,我们将完成一个 Firewalld Port 规则控制器作为描述,并通过 Kubernetes 规则生成相应的节点。 iptables 规则。

先决条件CRD

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: ports.firewalld.fedoraproject.org
spec:
  group: firewalld.fedoraproject.org
  scope: Namespaced
  names:
    plural: ports
    singular: port
    kind: PortRule
    shortNames: 
    - fp
  versions:
  - name: v1
    served: true
    storage: true
    schema:
      openAPIV3Schema:
        type: object
        properties:
          spec:
            type: object
            properties:
              name:
                type: string
              port:
                type: integer
              host:
                type: string
              isPermanent:
                type: boolean

代码生成器

需要预下载代码生成器。因为这个工具不是必需的。

注意,下载完成后,需要将代码库的分支更改为当前使用的版本。版本选择类似于client-go。如果使用 master 分支,将与当前 Kubernetes 集群不兼容。

git clone https://github.com/kubernetes/code-generator
cd code-generator; git checkout {version}  # ex. v0.18.0

编写代码模板

使用code-generator生成控制器,需要准备三个文件 doc.go , register.go , types.go 。

代码生成器标签说明

使用code-generator时,需要了解code-generator的标签。代码生成器的标签是根据几种固定格式定义的。标签是+k8s:+转换的组合。仓库中cmd中的*-gen*文件夹代表转换的替换位置。

注意:最终准备好的文件(doc.go、register.go、types.go)应该是:apis/example.com/v1这个类型

需要遵循的是将这些文件放在 v1 等目录中。这里v1,v1alpha1,根据自己的需要定义。

开始填写文件内容type.go

package v1
import (
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// +genclient
// +genclient:noStatus
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type Port struct {
	metav1.TypeMeta `json:",inline"`
	// Standard object metadata.
	// +optional
	metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
	// Specification of the desired behavior of the Deployment.
	// +optional
	Spec PortSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`
}
// +k8s:deepcopy-gen=false
type PortSpec struct {
	Name        string `json:"name"`
	Host        string `json:"host"`
	Port        int    `json:"port"`
	IsPermanent bool   `json:"isPermanent"`
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type PortList struct {
	metav1.TypeMeta `json:",inline"`
	// +optional
	metav1.ListMeta `json:"metadata,omitempty"`
	Items []Port `json:"items"`
}

doc.go

// +k8s:deepcopy-gen=package
// +k8s:protobuf-gen=package
// +k8s:openapi-gen=true
// +groupName=firewalld.fedoraproject.org
package v1 // import "k8s.io/api/firewalld/v1"

注册.go

这是从任何 k8s.io/api 复制的,例如

package v1
import (
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/runtime"
	"k8s.io/apimachinery/pkg/runtime/schema"
)
// GroupName is the group name use in this package
const GroupName = "firewalld.fedoraproject.org"
// SchemeGroupVersion is group version used to register these objects
var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1"}
// Resource takes an unqualified resource and returns a Group qualified GroupResource
func Resource(resource string) schema.GroupResource {
	return SchemeGroupVersion.WithResource(resource).GroupResource()
}
var (
	// TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api.
	// localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes.
	SchemeBuilder      = runtime.NewSchemeBuilder(addKnownTypes)
	localSchemeBuilder = &SchemeBuilder
	AddToScheme        = localSchemeBuilder.AddToScheme
)
// Adds the list of known types to the given scheme.
func addKnownTypes(scheme *runtime.Scheme) error {
	scheme.AddKnownTypes(SchemeGroupVersion,
		&Port{},
		&PortList{},
	)
	metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
	return nil
}

生成所需文件

在使用code-generator的时候,其实是在这个库中使用脚本generate-groups.sh,有四个参数

注意:对于参数2和3以及-output-base指定的路径,可以使用go.mod中定义的相对路径或包名。对于相对路径,生成的文件中导入的也会是“../../”格式

一个完整的例子

../code-generator/generate-groups.sh all 
	../code-controller/client 
	../code-controller/apis  
	firewalld:v1 
	--output-base ../code-controller/ 
	--go-header-file ../code-generator/hack/boilerplate.go.txt

参考

CRD编程

© 版权声明
THE END
喜欢就支持一下吧
点赞149赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容