Updated:

2 minute read

개요


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