实现:

用client-go测试是否能获取资源的Json文件

1、 将用户名、密码及ID写入master

去master节点新增一个文件,如果是有多个master,那么每个master同下操作。
里面内容结构是:用户名,密码(用户名和密码要保持一致),唯一ID。

  1. echo "admin,admin,1" > /etc/kubernetes/pki/basic_auth_file

进入该目录查看一下发现已经写进去了!
image.png

2、 修改yaml文件

  1. vim /etc/kubernetes/manifests/kube-apiserver.yaml
  2. # 新增
  3. - --basic-auth-file=/etc/kubernetes/pki/basic_auth_file # add

image.png

3、改完后重启

  1. # 这块根据自己master的名字
  2. kubectl get pod -n kube-system | grep kube-apiserver-k8smaster

image.png

4、 创建集群角色绑定

  1. kubectl create clusterrolebinding login-on-dashboard-with-cluster-admin \
  2. --clusterrole=cluster-admin \
  3. --user=admin
  4. kubectl create clusterrolebinding test:anonymous
  5. --clusterrole=cluster-admin
  6. --user=system:anonymous

5、 检查集群角色绑定

  1. kubectl get clusterrolebinding login-on-dashboard-with-cluster-admin

如下所示即可:image.png

6、 转换字符并连接

  1. echo 'admin:admin' | base64
  2. 如图:输入自己的ip即可
  3. curl -k -XGET -H "Authorization: Basic xxx" 'https://10.4.107.207:6443/api'

用curl进行连接:
image.png

7、 用代码获得

  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. // v1 "k8s.io/api/apps/v1"
  6. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  7. "k8s.io/apimachinery/pkg/runtime/schema"
  8. "k8s.io/client-go/dynamic"
  9. // "k8s.io/client-go/kubernetes/scheme"
  10. "k8s.io/client-go/rest"
  11. )
  12. func getConfig() *rest.Config {
  13. config := rest.Config{
  14. Host: "https://10.4.104.169:6443",
  15. // ContentConfig: rest.ContentConfig{
  16. // GroupVersion: &v1.SchemeGroupVersion,
  17. // NegotiatedSerializer: scheme.Codecs.WithoutConversion(),
  18. // },
  19. TLSClientConfig: rest.TLSClientConfig{
  20. Insecure: true,
  21. },
  22. Username: "admin",
  23. Password: "admin",
  24. }
  25. return &config
  26. }
  27. func main() {
  28. // 设置资源组合版本
  29. gvr := schema.GroupVersionResource{Group: "apps", Version: "v1", Resource: "deployments"}
  30. // 获取config对象
  31. config := getConfig()
  32. // 获取动态客户端
  33. dynamicClient, _ := dynamic.NewForConfig(config)
  34. // 获取deployment资源
  35. resStruct, _ := dynamicClient.Resource(gvr).Namespace("default").Get(context.TODO(), "mysql", metav1.GetOptions{})
  36. // 将unstructured序列化成json
  37. j, _ := resStruct.MarshalJSON()
  38. // 打印json
  39. fmt.Println(string(j))
  40. }

测试结果:
image.png
即:使用用户名和密码也可以访问集群内的资源!


以上操作有点问题,参考这个:https://blog.csdn.net/watermelonbig/article/details/79405412?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-79405412-blog-122642205.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-79405412-blog-122642205.pc_relevant_default&utm_relevant_index=2