[kubernetes] Go client
Updated:
개요
- GitHub
- 예제는 해당 클러스터의 파드로 기동된다고 가정
- config 설정이 따로 필요 없음
- 외부 클러스터에 대한 예제
Dockerfile
-
FROM golang:1.21.3 AS build WORKDIR /work COPY go.mod go.sum ./ RUN go mod download COPY ./ ./ RUN CGO_ENABLED=0 GOOS=linux go build -o main ./main.go FROM alpine/curl COPY --from=build /work/main /usr/bin/. ENTRYPOINT ["main"]
yaml
-
--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: test-api rules: - apiGroups: - "" resources: - nodes - services - namespaces - pods - endpoints - persistentvolumeclaims - persistentvolumes verbs: - create - get - list - update - delete --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: test-api subjects: - kind: ServiceAccount name: test-api namespace: test apiGroup: "" roleRef: kind: ClusterRole name: test-api apiGroup: rbac.authorization.k8s.io --- apiVersion: v1 kind: ServiceAccount metadata: name: test-api namespace: test --- apiVersion: apps/v1 #kind: Deployment kind: StatefulSet metadata: name: test-api namespace: test spec: replicas: 1 selector: matchLabels: app: test-api template: metadata: annotations: labels: app: test-api spec: serviceAccountName: test-api containers: - name: test-api image: xxx.xxx.xxx.xxx:xxxx/test-api:0.0.0.1 imagePullPolicy: Always ports: - name: http containerPort: 10000 protocol: TCP tolerations: - key: node-role.kubernetes.io/master operator: Exists effect: NoSchedule - key: node.kubernetes.io/not-ready operator: Exists effect: NoSchedule
예제 - 파드 리스트 가져오기
- 코드
-
package main import ( "context" "time" metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" ) func main() { config, err := rest.InClusterConfig() if err != nil { panic(err) } clientset, err := kubernetes.NewForConfig(config) if err != nil { panic(err) } for { pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metaV1.ListOptions{}) if err != nil { println(err) continue } println("pod count :", len(pods.Items)) time.Sleep(10 * time.Second) } }
-
- 실행 결과
-
# kubectl logs -f test-api-0 -n test pod count : 28
-
예제 - 서비스 생성/삭제
- 코드
-
package main import ( "context" coreV1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" ) func main() { config, err := rest.InClusterConfig() if err != nil { panic(err) } clientset, err := kubernetes.NewForConfig(config) if err != nil { panic(err) } name := "service-test" namespace := "test" if err := clientset.CoreV1().Services(namespace).Delete(context.TODO(), name, metaV1.DeleteOptions{}); err != nil && errors.IsNotFound(err) == false { panic(err) } service := &coreV1.Service{ ObjectMeta: metaV1.ObjectMeta{ Name: name, Namespace: namespace, Labels: map[string]string{ "app": name, }, }, Spec: coreV1.ServiceSpec{ Ports: []coreV1.ServicePort{ coreV1.ServicePort{ Name: "metrics", Protocol: coreV1.ProtocolTCP, Port: 9610, TargetPort: intstr.IntOrString{Type: intstr.Int, IntVal: 9610}, }, }, Type: coreV1.ServiceTypeClusterIP, }, } if _, err := clientset.CoreV1().Services(namespace).Create(context.TODO(), service, metaV1.CreateOptions{}); err != nil { panic(err) } println("create") }
-
- 실행 결과
-
# kubectl logs -f test-api-0 -n test create
-
예제 - 엔드포인트 생성/삭제
- 코드
-
package main import ( "context" coreV1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" ) func main() { config, err := rest.InClusterConfig() if err != nil { panic(err) } clientset, err := kubernetes.NewForConfig(config) if err != nil { panic(err) } name := "endpoints-test" namespace := "test" ip := "192.168.1.111" if err := clientset.CoreV1().Endpoints(namespace).Delete(context.TODO(), name, metaV1.DeleteOptions{}); err != nil && errors.IsNotFound(err) == false { panic(err) } endpoints := &coreV1.Endpoints{ ObjectMeta: metaV1.ObjectMeta{ Name: name, Namespace: namespace, Labels: map[string]string{ "app": name, }, }, Subsets: []coreV1.EndpointSubset{ coreV1.EndpointSubset{ Addresses: []coreV1.EndpointAddress{ coreV1.EndpointAddress{ IP: ip, }, }, Ports: []coreV1.EndpointPort{ coreV1.EndpointPort{ Name: "metrics", Port: 9610, Protocol: coreV1.ProtocolTCP, }, }, }, }, } if _, err := clientset.CoreV1().Endpoints(namespace).Create(context.TODO(), endpoints, metaV1.CreateOptions{}); err != nil { panic(err) } println("create") }
-
- 실행 결과
-
# kubectl logs -f test-api-0 -n test create
-