前言
- 参考书籍:
Kubernetes权威指南:从Docker到Kubernetes实践全接触(第2版)-2016.10-电工-P519-龚正,吴治辉,王伟 等.pdf
- 参考博客:
确定一些信息:
搭建kubernetes集群,确定版本资源信息
如 Group: “apps”, Version: “v1”, Resource: “deployments”。
鉴权注意用户角色绑定的名称空间(namespace),如:default。
- 确定deplouments资源的名称。
- 用户名密码方式提前在xshell里设置
一、 kubeconfig
据说已有!
加载配置文件的代码如下:
func main() {
var kubeconfig *string
// 默认会从~/.kube/config路径下获取配置文件
if home := 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()
// 使用k8s.io/client-go/tools/clientcmd加载配置文件并生成config的对象
if config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig); err != nil {
panic(err.Error())
}
}
更:这个得自己研究看看!
二、 service account
集群要求:
- 有角色和角色绑定
- 用service account 方式绑定
- 部署方式:https://www.yuque.com/qiaokate/somwp3/gpl57f
测试步骤:
- 设置资源组合版本
- 获取config对象
- 获取动态客户端dynamicClient
- 获取deployment资源
- 将unstructured序列化成json
- 打印json
代码:
package main
import (
"context"
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/rest"
)
func getConfig() *rest.Config {
config := rest.Config{
Host: "https://10.4.104.169:6443",
TLSClientConfig: rest.TLSClientConfig{
Insecure: true,
},
BearerToken: "eyJhbGciOiJSUzI1NiIsImtpZCI6IlhGbHRva3gyMDB6RnJoYlBhRjJ0XzdvdVZZZjNBLU5ONHhEMFVGdmNiN0EifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InNhLXNhLXRva2VuLXZ0YjJ0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6InNhLXNhIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiODljOGVlYWEtZGY5Mi00NjI2LWJkMzUtOTczZmRlODlhYWUyIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6c2Etc2EifQ.DdhVDUO6azpa9bY-803SvFm-YAyz4pSOspFBLts91mnxaQEH9AY-yTJt1DR8QBMVz4XnIY0bckkq3SJoIq_ZgOdcBl31EM7srvPl67hkjYF1562i3YmOfDj3D7b3X7hrB3xKdpbK9youlqAtalfR9DnvP3c9H4n5asI2Nu37IoxBuEPLv7Ke_mizfb638sV4rNyhKzx7WWeyLIxmebk-_C7_F6rZlGLgG3245OwLwvYu_HSiZtcRMeK9-pM417PXLqAVOJ5g1VKgn30jXXs6U0ht0DMylziv2en1q_iQfT3YAPfVenqjtaBxmlnZlGuiA9rXGFuCuBxiCWe7viP6Qw",
}
return &config
}
func main() {
// 设置资源组合版本
gvr := schema.GroupVersionResource{Group: "apps", Version: "v1", Resource: "deployments"}
// 获取config对象
config := getConfig()
// 获取动态客户端
dynamicClient, _ := dynamic.NewForConfig(config)
//获取deployment资源
resStruct, _ := dynamicClient.Resource(gvr).Namespace("default").Get(context.TODO(), "mysql", metav1.GetOptions{})
// 将unstructured序列化成json
j, _ := resStruct.MarshalJSON()
// 打印json
fmt.Println(string(j))
}
更:我的集群若是转json序列会报如下错误!,应该是在集群的apiserver文件中更改配置会这样。
重新装了一下go环境(实际不需要),又改了配置,就不报错了!
以下是正常结果!
三、 username/password
要求条件:
master节点新增一个文件,如果是会有多个master,那么每个master同下操作。
里面内容结构是:用户名,密码(用户名和密码要保持一致),唯一ID。
部署方式:https://www.yuque.com/qiaokate/somwp3/grxqyw
package main
import (
"context"
"fmt"
// v1 "k8s.io/api/apps/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/dynamic"
// "k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
)
func getConfig() *rest.Config {
config := rest.Config{
Host: "https://10.4.104.169:6443",
// ContentConfig: rest.ContentConfig{
// GroupVersion: &v1.SchemeGroupVersion,
// NegotiatedSerializer: scheme.Codecs.WithoutConversion(),
// },
TLSClientConfig: rest.TLSClientConfig{
Insecure: true,
},
Username: "admin",
Password: "admin",
}
return &config
}
func main() {
// 设置资源组合版本
gvr := schema.GroupVersionResource{Group: "apps", Version: "v1", Resource: "deployments"}
// 获取config对象
config := getConfig()
// 获取动态客户端
dynamicClient, _ := dynamic.NewForConfig(config)
// 获取deployment资源
resStruct, _ := dynamicClient.Resource(gvr).Namespace("default").Get(context.TODO(), "mysql", metav1.GetOptions{})
// 将unstructured序列化成json
j, _ := resStruct.MarshalJSON()
// 打印json
fmt.Println(string(j))
}
测试结果:
四、 对比
对比获取的json文件:
二者是相同的,说明获取资源相同!
这三种访问方式主要区别是认证方法的不同:
kubeconfig | https | CA认证 |
---|---|---|
service account | http token | token |
username/password | http base | Username Password |
鉴权使用的都是RBAC(角色及角色绑定)
最安全的应该是https双向认证√