前言

  1. 参考书籍:

Kubernetes权威指南:从Docker到Kubernetes实践全接触(第2版)-2016.10-电工-P519-龚正,吴治辉,王伟 等.pdf

  1. 参考博客:
  2. 确定一些信息:

    1. 搭建kubernetes集群,确定版本资源信息

      如 Group: “apps”, Version: “v1”, Resource: “deployments”。

    2. 鉴权注意用户角色绑定的名称空间(namespace),如:default。

    3. 确定deplouments资源的名称。
    4. 用户名密码方式提前在xshell里设置

参考图:获取资源后就可以调方法了!
外部访问api-server的三种方式总结 - 图1

一、 kubeconfig

据说已有!
加载配置文件的代码如下:

  1. func main() {
  2. var kubeconfig *string
  3. // 默认会从~/.kube/config路径下获取配置文件
  4. if home := homeDir(); home != "" {
  5. kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional)absolute path to the kubeconfig file")
  6. } else {
  7. kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
  8. }
  9. flag.Parse()
  10. // 使用k8s.io/client-go/tools/clientcmd加载配置文件并生成config的对象
  11. if config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig); err != nil {
  12. panic(err.Error())
  13. }
  14. }

更:这个得自己研究看看!

二、 service account

集群要求:

  1. 有角色和角色绑定
  2. 用service account 方式绑定
  3. 部署方式:https://www.yuque.com/qiaokate/somwp3/gpl57f

测试步骤:

  1. 设置资源组合版本
  2. 获取config对象
  3. 获取动态客户端dynamicClient
  4. 获取deployment资源
  5. 将unstructured序列化成json
  6. 打印json

代码:

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

更:我的集群若是转json序列会报如下错误!,应该是在集群的apiserver文件中更改配置会这样。
image.png
重新装了一下go环境(实际不需要),又改了配置,就不报错了!
以下是正常结果!
image.png

三、 username/password

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

部署方式:https://www.yuque.com/qiaokate/somwp3/grxqyw

  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. }

测试结果:
外部访问api-server的三种方式总结 - 图4

四、 对比

对比获取的json文件:
image.png
二者是相同的,说明获取资源相同!
这三种访问方式主要区别是认证方法的不同:

kubeconfig https CA认证
service account http token token
username/password http base Username
Password

鉴权使用的都是RBAC(角色及角色绑定)
最安全的应该是https双向认证√