client-go连接kubernetes集群-update相关操作
背景:
紧接client-go连接kubernetes集群-connect and list,client-go连接kubernetes集群-create相关操作。实例都是拿namespace 和deployment两个为代表进行展开延伸的(个人环境中deployment还是具有代表性的),前面创建了namespace deployment,正常的流程下一步就是修改namespace and deployment 了!
client-go连接kubernetes集群-update相关操作
1. namespace的update
参照create
文章图片
先看一眼&corev1.Namespace metav1.ObjectMeta中都有哪些配置可以修改,metav1.ObjectMeta{}填充一下所有字段:
文章图片
Name还是默认的zhangpeng namespace了,我添加一个labels?
文章图片
文章图片
文章图片
main.go
package mainimport (
"context"
"flag"
"fmt"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
"path/filepath"
)func main() {
var kubeconfig *string
if home := homedir.HomeDir();
home != "" {
kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
} else {
kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
}
flag.Parse()
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err.Error())
}// create the clientset
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
namespace := &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name:"zhangpeng",
GenerateName:"",
Namespace:"",
SelfLink:"",
UID:"",
ResourceVersion:"",
Generation:0,
CreationTimestamp:metav1.Time{},
DeletionTimestamp:nil,
DeletionGracePeriodSeconds: nil,
Labels: map[string]string{
"dev": "test",
},
Annotations:nil,
OwnerReferences: nil,
Finalizers:nil,
ClusterName:"",
ManagedFields:nil,
},
}
result, _ := clientset.CoreV1().Namespaces().Update(context.TODO(), namespace, metav1.UpdateOptions{})
fmt.Println(result)
}
运行main.go
文章图片
文章图片
登录某云后台确认生成label!这里正好看到了自愿配额与限制?正巧最近在看文章的时候看到一个这样的例子:基于client-go操作namespace资源配额设计
2. 扩展一下resourcequotas
main.go
package mainimport (
"context"
"flag"
"fmt"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
"path/filepath"
)func main() {
var kubeconfig *string
if home := homedir.HomeDir();
home != "" {
kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
} else {
kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
}
flag.Parse()
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err.Error())
}// create the clientset
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
namespace := &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name:"zhangpeng",
GenerateName:"",
Namespace:"",
SelfLink:"",
UID:"",
ResourceVersion:"",
Generation:0,
CreationTimestamp:metav1.Time{},
DeletionTimestamp:nil,
DeletionGracePeriodSeconds: nil,
Labels: map[string]string{
"dev": "test",
},
Annotations:nil,
OwnerReferences: nil,
Finalizers:nil,
ClusterName:"",
ManagedFields:nil,
},
}
result, _ := clientset.CoreV1().Namespaces().Update(context.TODO(), namespace, metav1.UpdateOptions{})
fmt.Println(result)
quotaTest := clientset.CoreV1().ResourceQuotas("zhangpeng")
quota := &corev1.ResourceQuota{
ObjectMeta: metav1.ObjectMeta{
Name: "quota-namespace",
},
Spec: corev1.ResourceQuotaSpec{
Hard: map[corev1.ResourceName]resource.Quantity{
corev1.ResourceLimitsCPU:resource.MustParse("200m"),
corev1.ResourceLimitsMemory:resource.MustParse("200M"),
corev1.ResourceRequestsCPU:resource.MustParse("1000m"),
corev1.ResourceRequestsMemory: resource.MustParse("1Gi"),
},
},
}result1, err := quotaTest.Create(context.TODO(), quota, metav1.CreateOptions{})
if err != nil {
fmt.Println(err)
} else {
fmt.Println(result1)
}
}
文章图片
kubectl get resourcequotas -n zhangpeng
文章图片
3. update deployment
参照:client-go连接kubernetes集群-create相关操作,生成yaml读取文件流的方式:
修改nginx镜像tag为1.16
src/yamls/nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:1.16
name: nginx
resources: {}
status: {}
现在如果直接运行肯定是already exists的!
文章图片
修改main.go如下:
package mainimport (
"context"
"encoding/json"
"flag"
"fmt"
"io/ioutil"
v1 "k8s.io/api/apps/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/yaml"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
"path/filepath"
)func main() {
var kubeconfig *string
if home := homedir.HomeDir();
home != "" {
kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
} else {
kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
}
flag.Parse()
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err.Error())
}// create the clientset
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
b, err := ioutil.ReadFile("src/yamls/nginx.yaml")
nginxDep := &v1.Deployment{}
nginxJson, _ := yaml.ToJSON(b)
if err = json.Unmarshal(nginxJson, nginxDep);
err != nil {
return
}
if _, err = clientset.AppsV1().Deployments("zhangpeng").Update(context.Background(), nginxDep, metav1.UpdateOptions{});
err != nil {
fmt.Println(err)
return
}
}
运行main.go
文章图片
kubectl get deployments -n zhangpeng -o yaml
【client-go连接kubernetes集群-update相关操作】
文章图片
强调:
- context.Background() context.TODO()还是有点懵 分不清什么时候用......
- 执行结果的返回没有一致格式化输出,以及一下错误的处理?
推荐阅读
- 网络ip地址错误连接不上网
- Appium中报错,“URLError(10061-由于目标计算机积极拒绝,无法连接”解决方案)
- 电脑网络重置后如何连接网络
- 路由器怎样连接2台电脑?路由器连接2台电脑上网办法
- 打印机共享无法连接处理办法总结
- 佳能6d连接iPhone手机拍照图文详细教程
- 电脑无法连接网络怎么办
- 在mac上搭建完成 开发环境之后 跑android 项目 模拟器连接不上的问题 模拟器是genymotion
- 手机如何连接电脑上网
- Hadoop(四)C#连接Hive