2 분 소요

개요


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