当前位置:网站首页>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
边栏推荐
- Russian Airi Research Institute, etc. | SEMA: prediction of antigen B cell conformation characterization using deep transfer learning
- Monitoring pancakeswap new token
- 教你如何在winpe里安装win11系统
- [rust contribution] implement Message Oriented Middleware (6) -client from zero
- Comprehensive assignment of thesis writing instruction of Dongcai
- Google founder brin's second marriage broke up: it was revealed that he had filed for divorce from his Chinese wife in January, and his current fortune is $631.4 billion
- Musk: Twitter should learn from wechat and make 1billion people "live on it" into a super app
- 【Rust投稿】捋捋 Rust 中的 impl Trait 和 dyn Trait
- La gamme NFT Color, qui représente la diversité, est en ligne sur la plate - forme du marché Sandbox
- Solution to the problem that Linux crontab timed operation Oracle does not execute (crontab environment variable problem)
猜你喜欢

《悉达多》:一生之书,可以时常反刍
佐喃社区

Time management understood after working at home | community essay solicitation

Cesium drag 3D model

Hello CTP (IV) - CTP transaction API

The era of copilot free is over! The official version is 67 yuan / month, and the student party and the defenders of popular open source projects can prostitute for nothing

居家办公之后才明白的时间管理 | 社区征文

(ultra detailed onenet TCP protocol access) arduino+esp8266-01s accesses the Internet of things platform, uploads real-time collected data /tcp transparent transmission (and how to obtain and write Lu

MySQL插入过程报错1062,但是我没有该字段。

Internet Explorer died, and netizens started to build a true tombstone
随机推荐
NFT Insider #63:The Sandbox与时代杂志达成合作,YGG成立西班牙subDAO
Maybe it's the wrong reason
代錶多樣性的彩色 NFT 系列上線 The Sandbox 市場平臺
What is the difference between learning code, rolling code and fixed code? The number of repeated codes, coding capacity and the principle of rolling code
Hello CTP (III) - CTP quotation API
Understand (DI) dependency injection in PHP
cesium 图形标注圆形、正方形、多边形、椭圆等
Jilin University 22 spring March "automatic control principle" work assessment-00050
MySQL插入过程报错1062,但是我没有该字段。
Redis related-01
DevEco Studio 3.0编辑器配置技巧篇
Xidian AI ranked higher than Qingbei in terms of AI majors, and Nantah ranked the first in China in 2022 in terms of soft science majors
Jilin University 22 spring March "career design" assignment assessment-00072
代表多样性的彩色 NFT 系列上线 The Sandbox 市场平台
论一个优秀红队人员的自我修养
js工具函数,自己封装一个节流函数
Sun Wu plays Warcraft? There is a picture and a truth
Mobile mall project operation
Cesium 加载显示热力图
web3.eth. Getpendingtransactions() returns null?