当前位置:网站首页>Simple integration of client go gin -update
Simple integration of client go gin -update
2022-06-25 04:05:00 【saynaihe】
background
It's done client-go gin Simple integration of nine -Create Of namespace deployment pod Of Create operation , Now let's go update Modified operation !
update namespace
With a ns For example, add a label
About namespace, The labels we use most are name and labels( Well, I also did an example of quotas , Here is a simple way to take labels For example )
[[email protected] k8s-demo1]$ kubectl get ns --show-labels
NAME STATUS AGE LABELS
default Active 53d kubernetes.io/metadata.name=default
kube-node-lease Active 53d kubernetes.io/metadata.name=kube-node-lease
kube-public Active 53d kubernetes.io/metadata.name=kube-public
kube-system Active 53d kubernetes.io/metadata.name=kube-system
zhangpeng Active 1s kubernetes.io/metadata.name=zhangpeng
zhangpeng1 Active 3h21m kubernetes.io/metadata.name=zhangpeng1
If you go update modify namespace What we usually use is to modify namespace Of labels, With zhangpeng namespace For example , I want to add one name=abcd The label of
/src/service/Namespace.go
package service
import (
"context"
"fmt"
"github.com/gin-gonic/gin"
. "k8s-demo1/src/lib"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"time"
)
type Time struct {
time.Time `protobuf:"-"`
}
type Namespace struct {
Name string `json:"name"`
CreateTime time.Time `json:"CreateTime"`
Status string `json:"status"`
Labels map[string]string `json:"labels"`
Annotations map[string]string `json:"annotations"`
}
func ListNamespace(g *gin.Context) {
ns, err := K8sClient.CoreV1().Namespaces().List(context.Background(), metav1.ListOptions{})
if err != nil {
g.Error(err)
return
}
ret := make([]*Namespace, 0)
for _, item := range ns.Items {
ret = append(ret, &Namespace{
Name: item.Name,
CreateTime: item.CreationTimestamp.Time,
Status: string(item.Status.Phase),
Labels: item.Labels,
})
}
g.JSON(200, ret)
return
}
func create(ns Namespace) (*v1.Namespace, error) {
ctx := context.Background()
newNamespace, err := K8sClient.CoreV1().Namespaces().Create(ctx, &v1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: ns.Name,
Labels: ns.Labels,
},
}, metav1.CreateOptions{})
if err != nil {
fmt.Println(err)
}
return newNamespace, err
}
func updatenamespace(ns Namespace) (*v1.Namespace, error) {
ctx := context.Background()
newNamespace, err := K8sClient.CoreV1().Namespaces().Update(ctx, &v1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: ns.Name,
Labels: ns.Labels,
},
}, metav1.UpdateOptions{})
if err != nil {
fmt.Println(err)
}
return newNamespace, err
}
func CreateNameSpace(g *gin.Context) {
var nameSpace Namespace
if err := g.ShouldBind(&nameSpace); err != nil {
g.JSON(500, err)
}
namespace, err := create(nameSpace)
if err != nil {
g.JSON(500, err)
}
ns := Namespace{
Name: namespace.Name,
CreateTime: namespace.CreationTimestamp.Time,
Status: string(namespace.Status.Phase),
Labels: nil,
Annotations: nil,
}
g.JSON(200, ns)
}
func UpdateNameSpace(g *gin.Context) {
var nameSpace Namespace
if err := g.ShouldBind(&nameSpace); err != nil {
g.JSON(500, err)
}
namespace, err := updatenamespace(nameSpace)
if err != nil {
g.JSON(500, err)
}
ns := Namespace{
Name: namespace.Name,
CreateTime: namespace.CreationTimestamp.Time,
Status: string(namespace.Status.Phase),
Labels: namespace.Labels,
Annotations: nil,
}
g.JSON(200, ns)
}
establish updatenamespace Method UpdateNameSpace service
main.go Create route :
package main
import (
"github.com/gin-gonic/gin"
"k8s-demo1/src/core"
"k8s-demo1/src/service"
// "k8s.io/client-go/informers/core"
)
func main() {
r := gin.Default()
r.GET("/", func(context *gin.Context) {
context.JSON(200, "hello")
})
r.GET("/namespaces", service.ListNamespace)
r.POST("/namespace", service.CreateNameSpace)
r.POST("/namespace/update", service.UpdateNameSpace)
r.GET("/deployments", service.ListDeployment)
r.GET("/service", service.ListService)
r.GET("pods", service.ListallPod)
r.POST("/pod", service.CreatePod)
r.POST("/deployment", service.CreateDep)
core.InitDeployment()
r.Run()
}
function main.go
Postman test
post http://127.0.0.1:8080/namespace/update
{"name":"zhangpeng",
"labels":{"name":"abcd"}}

[[email protected] k8s-demo1]$ kubectl get ns --show-labels

modify name Labels are other values
post http://127.0.0.1:8080/namespace/update
{"name":"zhangpeng",
"labels":{"name":"abcd123"}}

Other things you can play : Extend the resourcequotas, You can refer to this quota Configuration of , There is no need to demonstrate it first !
update pod?
pod Whether it can be or not? update Update ?
pod Whether it can be or not? update Update ? The answer is No …
notes :pod It's a container Life cycle , Theoretically, it cannot be renewed , And in general pod Is based on deployment or rs Etc. control management pod Of , Modification means the end of the life cycle and the new pod The birth of , Of course, it can be based on openkruise Other application implementations of pod Upgrade in place !
Draw ladles according to gourds , Experience mistakes
[[email protected] k8s]$ kubectl get pods -n zhangpeng
NAME READY STATUS RESTARTS AGE
zhangpeng 1/1 Running 0 78m
[[email protected] k8s-demo1]$ kubectl get pods -o yaml -n zhangpeng
apiVersion: v1
items:
- apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2022-06-22T02:31:49Z"
name: zhangpeng
namespace: zhangpeng
resourceVersion: "6076576"
uid: cee39c9d-fc29-40ee-933e-d9fa76ba20e1
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: zhangpeng
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-f7qvv
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: k8s-2
preemptionPolicy: PreemptLowerPriority
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes:
- name: kube-api-access-f7qvv
projected:
defaultMode: 420
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
items:
- key: ca.crt
path: ca.crt
name: kube-root-ca.crt
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2022-06-22T02:31:49Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2022-06-22T02:32:06Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2022-06-22T02:32:06Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2022-06-22T02:31:49Z"
status: "True"
type: PodScheduled
containerStatuses:
- containerID: docker://47d2c805f72cd023ff9b33d46f63b1b8e7600f64783685fe4c16d97f4b58b290
image: nginx:latest
imageID: docker-pullable://[email protected]:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
lastState: {}
name: zhangpeng
ready: true
restartCount: 0
started: true
state:
running:
startedAt: "2022-06-22T02:32:05Z"
hostIP: 192.168.0.176
phase: Running
podIP: 10.244.1.64
podIPs:
- ip: 10.244.1.64
qosClass: BestEffort
startTime: "2022-06-22T02:31:49Z"
kind: List
metadata:
resourceVersion: ""
/src/service/Pod.go
notes : imitation deployment create Written … Anyway, the result is failure , Just go through the process ! The following are to be deleted …
func (d *Pod) GetImageName() string {
// All shall be alphanumeric and :
pods := strings.Index(d.Images, ":")
if pods > 0 {
return d.Images[:pods]
}
return d.Images
}
func updatepod(pod Pod) (*corev1.Pod, error) {
newpod, err := K8sClient.CoreV1().Pods(pod.Namespace).Update(context.TODO(), &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: pod.Name,
Namespace: pod.Namespace,
Labels: pod.Labels,
Annotations: pod.Annotations,
},
Spec: corev1.PodSpec{
Containers: []corev1.Container{
{Name: pod.Name, Image: pod.Images, Ports: pod.GetPorts()},
},
},
}, metav1.UpdateOptions{})
if err != nil {
fmt.Println(err)
}
return newpod, err
}
func UpdatePod(g *gin.Context) {
var NewPod Pod
if err := g.ShouldBind(&NewPod); err != nil {
g.JSON(500, err)
}
pod, err := updatepod(NewPod)
if err != nil {
g.JSON(500, err)
}
newpod := Pod{
Namespace: pod.Namespace,
Name: pod.Name,
Images: pod.Spec.Containers[0].Image,
CreateTime: pod.CreationTimestamp.Format("2006-01-02 15:04:05"),
Annotations: pod.ObjectMeta.Annotations,
}
g.JSON(200, newpod)
}
main.go Add the following configuration :
r.POST("/pod/update", service.UpdatePod)
function main.go postman test :
Okay That's about it Just to demonstrate , Take a closer look at pod Life cycle , Of course, you can also study the methods of upgrading in place openkruise It's pretty good !
update deployment
initial deployment For the next
[[email protected] k8s]$ kubectl get pods -n zhangpeng
NAME READY STATUS RESTARTS AGE
zhangpeng-5dffd5664f-nvfsm 1/1 Running 0 27s
[[email protected] k8s]$ kubectl get deployment zhangpeng -n zhangpeng
NAME READY UP-TO-DATE AVAILABLE AGE
zhangpeng 1/1 1 1 40s
[[email protected] k8s]$ kubectl get deployment zhangpeng -n zhangpeng -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2022-06-22T06:44:06Z"
generation: 1
name: zhangpeng
namespace: zhangpeng
resourceVersion: "6096527"
uid: d42d5851-2e63-439b-b2a5-976b5fe246bb
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: zhangpeng
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: zhangpeng
name: zhangpeng
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
name: web
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 1
conditions:
- lastTransitionTime: "2022-06-22T06:44:24Z"
lastUpdateTime: "2022-06-22T06:44:24Z"
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
- lastTransitionTime: "2022-06-22T06:44:06Z"
lastUpdateTime: "2022-06-22T06:44:24Z"
message: ReplicaSet "zhangpeng-5dffd5664f" has successfully progressed.
reason: NewReplicaSetAvailable
status: "True"
type: Progressing
observedGeneration: 1
readyReplicas: 1
replicas: 1
updatedReplicas: 1
The key word is :
{"name":"zhangpeng",
"namespace":"zhangpeng",
"replicas":1,
"ports":"tcp,80,web",
"images":"nginx"}
Write program files
/src/service/Deployment.go
func Updatedep(dep Deployment) (*v1.Deployment, error) {
deployment := &v1.Deployment{
ObjectMeta: metav1.ObjectMeta{
Name: dep.Name,
Namespace: dep.Namespace,
Labels: dep.GetLabels(),
},
Spec: v1.DeploymentSpec{
Replicas: &dep.Replicas,
Selector: &metav1.LabelSelector{
MatchLabels: dep.GetSelectors(),
},
Template: corev1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Name: dep.Name,
Labels: dep.GetSelectors(),
},
Spec: corev1.PodSpec{
Containers: []corev1.Container{
{
Name: dep.GetImageName(),
Image: dep.Images,
Ports: dep.GetPorts(),
},
},
},
},
},
}
ctx := context.Background()
newdep, err := lib.K8sClient.AppsV1().Deployments(dep.Namespace).Update(ctx, deployment, metav1.UpdateOptions{})
if err != nil {
fmt.Println(err)
}
return newdep, nil
}
func UpdateDep(g *gin.Context) {
var newDep Deployment
if err := g.ShouldBind(&newDep); err != nil {
g.JSON(500, err)
}
newdep, err := Updatedep(newDep)
if err != nil {
g.JSON(500, err)
}
newDep1 := Deployment{
Namespace: newdep.Namespace,
Name: newdep.Name,
Pods: GetPodsByDep(*newdep),
CreateTime: newdep.CreationTimestamp.Format("2006-01-02 15:03:04"),
}
g.JSON(200, newDep1)
}
Be careful : Basically, take the front one deployment create The method of …
Add routing operation main.go
main.go Add routes and run main.go
r.POST("/deployment/update", service.UpdateDep)

Postman test
Change the copy to 2
http://127.0.0.1:8080/deployment/update
{"name":"zhangpeng",
"namespace":"zhangpeng",
"replicas":2,
"ports":"tcp,80,web",
"images":"nginx"}

Modify the mirror tag
I began to think about modifying nginx by nginx:1.18 And it failed …
Estimation is images The problem of data format , Ignore it first … Second, change the image to apache Mirror image ( Note that mirroring is httpd)
http://127.0.0.1:8080/deployment/update
{"name":"zhangpeng",
"namespace":"zhangpeng",
"replicas":2,
"ports":"tcp,80,web",
"images":"httpd"}

Log in to the server to verify :
[email protected] k8s]$ kubectl get pods -n zhangpeng
NAME READY STATUS RESTARTS AGE
zhangpeng-5546976d9-mkslb 1/1 Running 0 73s
zhangpeng-5546976d9-tcsb5 0/1 ContainerCreating 0 14s
zhangpeng-5dffd5664f-nvfsm 1/1 Running 0 18m
[[email protected] k8s]$ kubectl get pods -n zhangpeng
NAME READY STATUS RESTARTS AGE
zhangpeng-5546976d9-mkslb 1/1 Running 0 100s
zhangpeng-5546976d9-tcsb5 1/1 Running 0 41s
[[email protected] k8s]$ kubectl get deployment -n zhangpeng -o yaml |grep image
- image: httpd
imagePullPolicy: Always
summary :
1.Pod Life cycle
2.update And create The comparison was modified update metav1.UpdateOptions{}
3. mirrored tag See how to solve the label problem later
边栏推荐
- JS tool function, self encapsulating a throttling function
- BSC parsing input data of transaction
- Development of trading system (XII) - Official quickfix document
- Jilin University 22 spring March "technical economics" assignment assessment-00073
- 《悉达多》:一生之书,可以时常反刍
- 学习码 滚动码 固定码 有什么区别重码数,编码容量滚动码的原理
- [proteus simulation] Arduino uno key controls the flashing increase / decrease display of nixie tube
- Smart wind power: operation and maintenance of digital twin 3D wind turbine intelligent equipment
- [rust submission] review impl trail and dyn trail in rust
- 练习:仿真模拟福彩双色球——中500w巨奖到底有多难?跑跑代码就晓得了。
猜你喜欢

Internet Explorer died, and netizens started to build a true tombstone

Crawler crawls Sina Weibo data

How to use ide to automatically sign and debug Hongmeng application

opencv最大能打开多少图像?

BGP biplane architecture

Crawler grabs the idea of reading on wechat

Development of trading system (VI) -- HFT high frequency trading

【Proteus仿真】Arduino UNO按键控制数码管闪烁增/减显示

Zuckerberg's latest VR prototype is coming. It is necessary to confuse virtual reality with reality

How far is the memory computing integrated chip from popularization? Listen to what practitioners say | collision school x post friction intelligence
随机推荐
1.初识半音阶口琴
ZABBIX installation pit avoidance Guide
Now, the ear is going into the metauniverse
uniapp 制作手机app程序, 使用uni.chooseVideo录制视频,视频播放模糊分辨率低的原因
Zuckerberg's latest VR prototype is coming. It is necessary to confuse virtual reality with reality
Crawler grabs the idea of reading on wechat
AI quantitative transaction (II) -- tushare financial data framework
PHP代码审计1—PHP.ini的那些事
【Rust投稿】捋捋 Rust 中的 impl Trait 和 dyn Trait
冷热酸甜、想成就成?冷酸灵母公司登康口腔欲在深交所主板上市
虽然传统意义上的互联网早已不复存在,但这并不代表互联网早已消失不再
Monitoring pancakeswap new token
JSP cannot be resolved to a type error reporting solution
BGP biplane architecture
JS tool function, self encapsulating a throttling function
Understand (DI) dependency injection in PHP
Jilin University 22 spring March "technical economics" assignment assessment-00073
《Missing Parts》NFT 作品集第 5 系列上线 The Sandbox 市场平台
Russian Airi Research Institute, etc. | SEMA: prediction of antigen B cell conformation characterization using deep transfer learning
Dr. Sun Jian was commemorated at the CVPR conference. The best student thesis was awarded to Tongji Ali. Lifeifei won the huangxutao Memorial Award