下载地址: https://github.com/kubernetes/client-go
官方使用文档参考:https://v1-16.docs.kubernetes.io/docs/reference/using-api/client-libraries/
安装,使用的为kubernetes1.15.6版本的kubernetes集群
go get -u -v k8s.io/client-go@kubernetes-1.15.6
在操作外部k8s集群示例
创建一个clientSet
package main
import (
"flag"
"fmt"
apiv1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
appv1 "k8s.io/api/apps/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)
func main() {
var (
k8sconfig = flag.String("k8sconfig", "./admin.conf", "kubernetes auth config") //使用kubeconfig配置文件进行集群权限认证
config \*rest.Config
err error
)
flag.Parse()
config, err = clientcmd.BuildConfigFromFlags("", \*k8sconfig)
if err != nil {
fmt.Println(err)
return
}
// 从指定的config创建一个新的clientset
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
fmt.Println(err)
return
} else {
fmt.Println("connect kubernetes cluster success.")
}
获取指定namespace中的pod信息
// 获取pod列表 pod为名称空间级别资源需指定名称空间
pods, err := clientset.CoreV1().Pods("default").List(metav1.ListOptions{})
if err != nil {
panic(err)
}
// 循环打印pod的信息
for _,pod := range pods.Items {
fmt.Println(pod.ObjectMeta.Name,pod.Status.Phase)
}
创建namespace
nsClient := clientset.CoreV1().Namespaces()
ns := &apiv1.Namespace{
ObjectMeta:metav1.ObjectMeta{
Name: "testzhangsan",
},
Status:apiv1.NamespaceStatus{
Phase:apiv1.NamespaceActive,
},
}
ns,err = nsClient.Create(ns)
if err != nil{
panic(err)
}
fmt.Println(ns.ObjectMeta.Name,ns.Status.Phase)
获取指定名称空间下svc信息
svclist,err := clientset.CoreV1().Services("kube-system").List(metav1.ListOptions{})
for _,svc := range svclist.Items {
fmt.Println(svc.Name,svc.Spec.ClusterIP,svc.Spec.Ports)
}
创建一个deployment控制器
kubernetes中控制器的资源清单如下列所示,故需要按照资源清单的示例来根据客户端库创建控制器
apiVersion: v1
kind: Pod
metadata:
name: test-pod
namespace: default
labels:
app: redis
spec:
containers:
deployment控制器格式是如下结构体,需要根据此结构体创建
// Deployment enables declarative updates for Pods and ReplicaSets.
type Deployment 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 DeploymentSpec \`json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"\`
// Most recently observed status of the Deployment.
// +optional
Status DeploymentStatus \`json:"status,omitempty" protobuf:"bytes,3,opt,name=status"\`
}
需要metadata和spec两个选项
故需创建两个结构体,metadate只需要简单的名称和标签定义即可
ObjectMeta:metav1.ObjectMeta{
Name: "testgolangclient",
},
spec为pod的属性定义和副本数量等信息。一个完整的deployment控制器的结构体格式如下
type DeploymentSpec struct {
// Number of desired pods. This is a pointer to distinguish between explicit
// zero and not specified. Defaults to 1.
// +optional
Replicas *int32 `json:"replicas,omitempty" protobuf:"varint,1,opt,name=replicas"`
// Label selector for pods. Existing ReplicaSets whose pods are
// selected by this will be the ones affected by this deployment.
// It must match the pod template's labels.
Selector \*metav1.LabelSelector \`json:"selector" protobuf:"bytes,2,opt,name=selector"\`
// Template describes the pods that will be created.
Template v1.PodTemplateSpec \`json:"template" protobuf:"bytes,3,opt,name=template"\`
// The deployment strategy to use to replace existing pods with new ones.
// +optional
// +patchStrategy=retainKeys
Strategy DeploymentStrategy \`json:"strategy,omitempty" patchStrategy:"retainKeys" protobuf:"bytes,4,opt,name=strategy"\`
// Minimum number of seconds for which a newly created pod should be ready
// without any of its container crashing, for it to be considered available.
// Defaults to 0 (pod will be considered available as soon as it is ready)
// +optional
MinReadySeconds int32 \`json:"minReadySeconds,omitempty" protobuf:"varint,5,opt,name=minReadySeconds"\`
// The number of old ReplicaSets to retain to allow rollback.
// This is a pointer to distinguish between explicit zero and not specified.
// Defaults to 10.
// +optional
RevisionHistoryLimit \*int32 \`json:"revisionHistoryLimit,omitempty" protobuf:"varint,6,opt,name=revisionHistoryLimit"\`
// Indicates that the deployment is paused.
// +optional
Paused bool \`json:"paused,omitempty" protobuf:"varint,7,opt,name=paused"\`
// The maximum time in seconds for a deployment to make progress before it
// is considered to be failed. The deployment controller will continue to
// process failed deployments and a condition with a ProgressDeadlineExceeded
// reason will be surfaced in the deployment status. Note that progress will
// not be estimated during the time a deployment is paused. Defaults to 600s.
ProgressDeadlineSeconds \*int32 \`json:"progressDeadlineSeconds,omitempty" protobuf:"varint,9,opt,name=progressDeadlineSeconds"\`
}
此处简单创建一个deployment控制器,故只需副本数量 选择器 template即可。
在资源清单中的spec属性的为如下结构体
type PodTemplateSpec struct {
// Standard object's metadata.
// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
// +optional
metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
// Specification of the desired behavior of the pod.
// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
// +optional
Spec PodSpec \`json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"\`
}
故此处需要定义,副本数量,选择器,podspec,而副本数量为一个int32类型的数字,标签选择器为一个map[string]string的数组
故定义如下
repl := int32(1) // 副本数量
match := make(map[string]string) // 标签选择器
match["app"] = "nginx"
var podSpec = apiv1.Container {
Name: "golang-client",
Image:"redis",
ImagePullPolicy:"IfNotPresent",
}
containers := []apiv1.Container{podSpec}
var templateSpec = apiv1.PodTemplateSpec{
ObjectMeta:metav1.ObjectMeta{
Name:"testpod",
Labels:match,
},
Spec: apiv1.PodSpec{
Containers:containers,
},
}
定义deployment控制器格式
selecter := metav1.LabelSelector{
MatchLabels: match,
}
deploy := appv1.Deployment{
ObjectMeta:metav1.ObjectMeta{
Name: "testgolangclient",
},
Spec: appv1.DeploymentSpec{
Replicas: &repl,
Selector:&selecter,
Template:templateSpec,
},
}
创建的deplyment 控制器
podsClient,err := clientset.AppsV1().Deployments("default" /* 名称空间 */).Create(&deploy)
手机扫一扫
移动阅读更方便
你可能感兴趣的文章