1 k8s client 创建
k8s client 客户端建立连接,主要是kube config 配置,默认在工作目录~/.kube文件下,包括k8s apiserver地址,认证等配置
apiVersion: v1
kind: Config
current-context: admin-cluster.local
preferences: {}
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM5ekNDQWQrZ0F3SUJBZ0lKQUsxSFdXem4xU1FtTUEwR0NTcUdTSWIzRFFFQkN3VUFNQkl4RURBT0JnTlYKQkFNTUIydDFZbVV0WTJFd0hoY05NVGd3TkRJM01EazBPRFE0V2hjTk5EVXdPVEV5TURrME9EUTRXakFTTVJBdwpEZ1lEVlFRRERBZHJkV0psTFdOaE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBCm94TFhUT2pOcDRFc0NBeGJNSTVQbkc4Mk5iaXcxQm9sWTk2eWdEQU54aVNUdFNMY0FCVDgyaUY1UWFsN2pLK3YKZUFkZzAvdWZ2dkxsWGcvOENkVEpaZmVDUFdydTJMS3czcnZTOElBcWxNME5OdUtPbUFSTXdCNTBodFM2c2RGbQo2RWpZTlc1Nm4ySE8zQmFtOGlyWjFEOGhtYU9QWXJoTzlDWUQxSisxZHN5ekVTTklLZ3gzTm1wRFlPc1hLengxCngwMDdsUThpOERmVFFOaWFISjRld1RtSUhrbCsrQm80b1J3Ym5jNk1yZFRnUmFqWHRVOURjVmJmSTNTeDVuT0kKRFA2bVVzcHJTYVdSRElPZWdmckszY1E2Ty80VkEwK3A2WDRvVnZ2VjJha1l1c3JJSTNwV2svRGJFTjVwd3FkYgpUZjNTV0pWSExicCthTC9kbm5UMGp3SURBUUFCbzFBd1RqQWRCZ05WSFE0RUZnUVVNdUZHZ0N6cmFjK2QyU1ZvCmpyZWgwRTIweXZjd0h3WURWUjBqQkJnd0ZvQVVNdUZHZ0N6cmFjK2QyU1ZvanJlaDBFMjB5dmN3REFZRFZSMFQKQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBb3JXc0JRNCtqNjhCZS9CMUpReVQrZE1aanU3dwpCZEZxNmVONTBvYWhLZlY0T0lwWDNpSEN0VGxYSll6U1pqWWJOK3NFVmFWNzI3VVdEcEtZR28xeGhvSWZiRkN2CnlVV0N0OURYQXc2UDVZcEZKTEYrUmJuNXBVZDcxUmF6NnYzb3ZyTGw4ekNSRERSYndDeXJYQlpUWXRNS1pBM1EKT0ZlMHBUUFplZUc4Q01pQmorVmhLcHBKQkkxZGJtYUpwSmVLRHUxU1cxdlpJbVZyRWZQdW5IUitwNHYwMFlSZgpBRXdRTlgvNFBsNWRHOExjTGJlZW8xRm9KdVpWMmRxYUlEelk2VWJKMWplaTJzWWdmak5XQ0txZkoyTUFCQmFSCnlvYlpnb0NCazYrb2tCOGswOEtqRzlvcGM1MEVCTFJvQS93eHlKTEhpcS9PbWlVcFhPcm85NzFrYnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
server: https://10.12.51.84:6443
name: cluster.local
contexts:
- context:
cluster: cluster.local
user: admin-cluster.local
name: admin-cluster.local
users:
- name: admin-cluster.local
建立客户端连接如下所示:
type KubeClient struct {
kubeClientConfig *restclient.Config
Clientset *kubernetes.Clientset
}
func newKubeConfig() *restclient.Config {
var kubeconfig *string
if home := homedir.HomeDir(); home != "" {
kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
} else {
kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
}
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err)
}
return config
}
func NewKubeClient() (*KubeClient, error) {
kubeClient := &KubeClient{kubeClientConfig: newKubeConfig()}
if err := kubeClient.CreateClient(); err != nil {
return nil, err
}
return kubeClient, nil
}
func (kc *KubeClient) CreateClient() error {
if kc.Clientset == nil {
clientset, err := kubernetes.NewForConfig(kc.kubeClientConfig)
if err != nil {
return err
}
kc.Clientset = clientset
}
return nil
}
2 namespace 接口
// NamespaceInterface has methods to work with Namespace resources.
type NamespaceInterface interface {
Create(*v1.Namespace) (*v1.Namespace, error)
Update(*v1.Namespace) (*v1.Namespace, error)
UpdateStatus(*v1.Namespace) (*v1.Namespace, error)
Delete(name string, options *meta_v1.DeleteOptions) error
DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error
Get(name string, options meta_v1.GetOptions) (*v1.Namespace, error)
List(opts meta_v1.ListOptions) (*v1.NamespaceList, error)
Watch(opts meta_v1.ListOptions) (watch.Interface, error)
Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Namespace, err error)
NamespaceExpansion
}
例如使用namespace创建接口,namespace 属于core v1版本,把Namespace结构体填充,调用接口即可
func (ns *Namespace) Create() error {
klog.Infof("Create kube namespaces: %v", ns.name)
if err := ns.kubeClient.CreateClient(); err != nil {
return err
}
namespaces := &v1.Namespace{}
namespaces.Kind = kindNamespace
namespaces.Name = ns.name
_, err := ns.kubeClient.Clientset.CoreV1().Namespaces().Create(namespaces)
return err
}
3 deployment 接口
// DeploymentInterface has methods to work with Deployment resources.
type DeploymentInterface interface {
Create(*v1.Deployment) (*v1.Deployment, error)
Update(*v1.Deployment) (*v1.Deployment, error)
UpdateStatus(*v1.Deployment) (*v1.Deployment, error)
Delete(name string, options *meta_v1.DeleteOptions) error
DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error
Get(name string, options meta_v1.GetOptions) (*v1.Deployment, error)
List(opts meta_v1.ListOptions) (*v1.DeploymentList, error)
Watch(opts meta_v1.ListOptions) (watch.Interface, error)
Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Deployment, err error)
DeploymentExpansion
}
示例创建deployment,主要复杂的就是填充deployment结构体,其主要是创建容器的image,cpu memory 资源限制request以及limit,volume,readiness,liveiness等
func (d *Deployment) Create() error {
klog.Infof("Create deployment: %s to k8s", d.template.Name)
deployment, err := getDeploymentStruct(d)
if err != nil {
return err
}
if err := d.kubeClient.CreateClient(); err != nil {
return err
}
_, err = d.kubeClient.Clientset.AppsV1().
Deployments(d.namespaceName).
Create(deployment)
if err != nil {
return err
}
return nil
}
4 service 接口
// ServiceInterface has methods to work with Service resources.
type ServiceInterface interface {
Create(*v1.Service) (*v1.Service, error)
Update(*v1.Service) (*v1.Service, error)
UpdateStatus(*v1.Service) (*v1.Service, error)
Delete(name string, options *meta_v1.DeleteOptions) error
DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error
Get(name string, options meta_v1.GetOptions) (*v1.Service, error)
List(opts meta_v1.ListOptions) (*v1.ServiceList, error)
Watch(opts meta_v1.ListOptions) (watch.Interface, error)
Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Service, err error)
ServiceExpansion
}
示例创建service,主要是pod的端口设置
func (s *Service) Create() error {
klog.Infof("Create service: %s to k8s", s.template.Name)
service := getServiceStruct(s)
if err := s.kubeClient.CreateClient(); err != nil {
return err
}
if _, err := s.kubeClient.Clientset.CoreV1().
Services(s.namespaceName).
Create(service); err != nil {
return err
}
return nil
}
5 ingress 接口
// IngressInterface has methods to work with Ingress resources.
type IngressInterface interface {
Create(*v1beta1.Ingress) (*v1beta1.Ingress, error)
Update(*v1beta1.Ingress) (*v1beta1.Ingress, error)
UpdateStatus(*v1beta1.Ingress) (*v1beta1.Ingress, error)
Delete(name string, options *v1.DeleteOptions) error
DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error
Get(name string, options v1.GetOptions) (*v1beta1.Ingress, error)
List(opts v1.ListOptions) (*v1beta1.IngressList, error)
Watch(opts v1.ListOptions) (watch.Interface, error)
Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1beta1.Ingress, err error)
IngressExpansion
}
主要使用对外暴露 地址设置访问后端的service port服务
func (ing *Ingress) Create() error {
klog.Infof("Create kube ingress: %s", ing.template.Name)
ingress := getIngressStruct(ing)
if err := ing.kubeClient.CreateClient(); err != nil {
return err
}
if _, err := ing.kubeClient.Clientset.
ExtensionsV1beta1().
Ingresses(ing.namespaceName).
Create(ingress); err != nil {
return err
}
return nil
}