개요
- GitHub
- 예제는 해당 클러스터의 파드로 기동된다고 가정
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