Skip to content

Commit 6f065db

Browse files
committed
.
0 parents  commit 6f065db

File tree

59 files changed

+4962
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+4962
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.idea
2+
.vscode

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# programming-kubernetes
2+
3+
本仓库会存储我在学习 Kubernetes 开发过程中的一些笔记和示例代码。
4+
5+
[-> 编程示例](./examples/index.md)
6+
7+
[-> 收藏文章](./collected-articles/index.md)

advanced/gin-informer/main.go

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"net/http"
6+
"time"
7+
8+
"pk/basic/client"
9+
10+
"github.com/gin-gonic/gin"
11+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
12+
"k8s.io/apimachinery/pkg/labels"
13+
"k8s.io/apimachinery/pkg/runtime"
14+
"k8s.io/apimachinery/pkg/runtime/schema"
15+
"k8s.io/apimachinery/pkg/util/wait"
16+
"k8s.io/client-go/informers"
17+
ctrl "sigs.k8s.io/controller-runtime"
18+
)
19+
20+
var (
21+
sharedInformers informers.SharedInformerFactory
22+
)
23+
24+
func init() {
25+
setupInformers()
26+
}
27+
28+
func setupInformers() {
29+
konfig := ctrl.GetConfigOrDie()
30+
fmt.Printf("konfig.Host: %v\n", konfig.Host)
31+
fmt.Printf("konfig.ServerName: %v\n", konfig.ServerName)
32+
fmt.Printf("konfig.APIPath: %v\n", konfig.APIPath)
33+
clientset := client.Clientset(konfig)
34+
35+
sharedInformers = informers.NewSharedInformerFactory(clientset, time.Minute*5)
36+
37+
gvrs := []schema.GroupVersionResource{
38+
{Group: "apps", Version: "v1", Resource: "deployments"},
39+
{Group: "apps", Version: "v1", Resource: "statefulsets"},
40+
{Group: "apps", Version: "v1", Resource: "daemonsets"},
41+
{Group: "", Version: "v1", Resource: "pods"},
42+
{Group: "", Version: "v1", Resource: "services"},
43+
{Group: "", Version: "v1", Resource: "namespaces"},
44+
{Group: "", Version: "v1", Resource: "configmaps"},
45+
{Group: "", Version: "v1", Resource: "secrets"},
46+
}
47+
48+
for _, gvr := range gvrs {
49+
_, err := sharedInformers.ForResource(gvr)
50+
if err != nil {
51+
panic(err)
52+
}
53+
}
54+
sharedInformers.Start(wait.NeverStop)
55+
sharedInformers.WaitForCacheSync(wait.NeverStop)
56+
fmt.Println("synced done.")
57+
}
58+
59+
func main() {
60+
e := gin.Default()
61+
e.GET("/pods", listPods)
62+
e.GET("/:g/:v/:r", listResources)
63+
64+
e.Run(":8888")
65+
}
66+
67+
func listPods(c *gin.Context) {
68+
pods, err := sharedInformers.Core().V1().Pods().Lister().Pods("default").List(labels.Everything())
69+
if err != nil {
70+
c.JSON(http.StatusInternalServerError, gin.H{
71+
"code": http.StatusInternalServerError,
72+
"msg": err.Error(),
73+
})
74+
return
75+
}
76+
77+
var res []string
78+
for _, pod := range pods {
79+
res = append(res, pod.Name)
80+
}
81+
c.JSON(http.StatusOK, gin.H{
82+
"code": http.StatusOK,
83+
"msg": fmt.Sprintln(res),
84+
})
85+
}
86+
87+
func listResources(c *gin.Context) {
88+
g := c.Param("g")
89+
v := c.Param("v")
90+
r := c.Param("r")
91+
92+
gvr := schema.GroupVersionResource{
93+
Group: g,
94+
Version: v,
95+
Resource: r,
96+
}
97+
gi, err := sharedInformers.ForResource(gvr)
98+
if err != nil {
99+
c.JSON(http.StatusInternalServerError, gin.H{
100+
"code": http.StatusInternalServerError,
101+
"msg": err.Error(),
102+
})
103+
}
104+
105+
objs, err := gi.Lister().List(labels.Everything())
106+
if err != nil {
107+
c.JSON(http.StatusInternalServerError, gin.H{
108+
"code": http.StatusInternalServerError,
109+
"msg": err.Error(),
110+
})
111+
}
112+
113+
var res []interface{}
114+
for _, obj := range objs {
115+
unstructuredObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj)
116+
if err != nil {
117+
c.JSON(http.StatusInternalServerError, gin.H{
118+
"code": http.StatusInternalServerError,
119+
"msg": err.Error(),
120+
})
121+
return
122+
}
123+
124+
name, ok, err := unstructured.NestedString(unstructuredObj, "metadata", "name")
125+
if err != nil || !ok {
126+
c.JSON(http.StatusInternalServerError, gin.H{
127+
"code": http.StatusInternalServerError,
128+
"msg": "get name failed",
129+
})
130+
return
131+
}
132+
namespace, _, _ := unstructured.NestedString(unstructuredObj, "metadata", "namespace")
133+
res = append(res, struct {
134+
Group string `json:"group"`
135+
Version string `json:"version"`
136+
Kind string `json:"kind"`
137+
Name string `json:"name"`
138+
Namespace string `json:"namespace,omitempty"`
139+
}{
140+
Group: obj.GetObjectKind().GroupVersionKind().Group,
141+
Version: obj.GetObjectKind().GroupVersionKind().Version,
142+
Kind: obj.GetObjectKind().GroupVersionKind().Kind,
143+
Name: name,
144+
Namespace: namespace,
145+
})
146+
}
147+
c.JSON(http.StatusOK, gin.H{
148+
"code": http.StatusOK,
149+
"msg": res,
150+
})
151+
}

basic/client/ctrl_client.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package client
2+
3+
import (
4+
"k8s.io/apimachinery/pkg/runtime"
5+
"k8s.io/client-go/kubernetes/scheme"
6+
"k8s.io/client-go/rest"
7+
runtimecli "sigs.k8s.io/controller-runtime/pkg/client"
8+
// 假设定义了一个 foo CRD,里面包含 register.go 中定义了 AddToScheme 实例
9+
// foosv1 "pkg/apis/foos/v1"
10+
)
11+
12+
func RuntimeClient(config *rest.Config) runtimecli.Client {
13+
client, err := runtimecli.New(config, runtimecli.Options{
14+
Scheme: scheme.Scheme,
15+
})
16+
if err != nil {
17+
panic(err)
18+
}
19+
return client
20+
}
21+
22+
func RuntimeClientForCRD(config *rest.Config) runtimecli.Client {
23+
crScheme := runtime.NewScheme()
24+
// foosv1.AddToScheme(scheme.Scheme)
25+
client, err := runtimecli.New(config, runtimecli.Options{
26+
Scheme: crScheme,
27+
})
28+
if err != nil {
29+
panic(err)
30+
}
31+
return client
32+
}

basic/client/discovery_client.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package client
2+
3+
import (
4+
"k8s.io/client-go/discovery"
5+
"k8s.io/client-go/rest"
6+
)
7+
8+
func DiscoveryClient(config *rest.Config) *discovery.DiscoveryClient {
9+
client, err := discovery.NewDiscoveryClientForConfig(config)
10+
if err != nil {
11+
panic(err)
12+
}
13+
return client
14+
}

basic/client/dynamic_client.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package client
2+
3+
import (
4+
"k8s.io/client-go/dynamic"
5+
"k8s.io/client-go/rest"
6+
)
7+
8+
func DynamicClient(config *rest.Config) dynamic.Interface {
9+
client, err := dynamic.NewForConfig(config)
10+
if err != nil {
11+
panic(err)
12+
}
13+
return client
14+
}

basic/client/http_client.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package client
2+
3+
import (
4+
"net/http"
5+
6+
"k8s.io/client-go/rest"
7+
)
8+
9+
func HTTPClient(config *rest.Config) *http.Client {
10+
client, err := rest.HTTPClientFor(config)
11+
if err != nil {
12+
panic(err)
13+
}
14+
return client
15+
}

basic/client/kubernetes_clientset.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package client
2+
3+
import (
4+
"k8s.io/client-go/kubernetes"
5+
"k8s.io/client-go/rest"
6+
)
7+
8+
func Clientset(config *rest.Config) *kubernetes.Clientset {
9+
client, err := kubernetes.NewForConfig(config)
10+
if err != nil {
11+
panic(err)
12+
}
13+
return client
14+
}

basic/client/rest_client.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package client
2+
3+
import "k8s.io/client-go/rest"
4+
5+
func RESTClient(config *rest.Config) *rest.RESTClient {
6+
client, err := rest.RESTClientFor(config)
7+
if err != nil {
8+
panic(err)
9+
}
10+
return client
11+
}

basic/config/config_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package config_test
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"testing"
7+
8+
"pk/basic/config"
9+
10+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
"k8s.io/client-go/kubernetes"
12+
)
13+
14+
func TestConfig(t *testing.T) {
15+
clientset, _ := kubernetes.NewForConfig(config.KubeConfigFromFlags())
16+
// clientset2, _ := kubernetes.NewForConfig(config.KubeConfigFromInClusterConfig())
17+
// clientset3, _ := kubernetes.NewForConfig(config.KubeConfigFromCtrlRuntime())
18+
// clientset4, _ := kubernetes.NewForConfig(config.KubeConfigFromConfigContent())
19+
pods, _ := clientset.CoreV1().Pods(metav1.NamespaceDefault).List(context.TODO(), metav1.ListOptions{})
20+
if pods != nil {
21+
for _, pod := range pods.Items {
22+
fmt.Println(pod.Name)
23+
}
24+
}
25+
}

0 commit comments

Comments
 (0)