kubectl源码分析之set selector

喜欢ヅ旅行 2023-02-11 15:27 57阅读 0赞

欢迎关注我的公众号:

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAaHhwamF2YTE_size_8_color_FFFFFF_t_70_g_se_x_16

目前刚开始写一个月,一共写了18篇原创文章,文章目录如下:

istio多集群探秘,部署了50次多集群后我得出的结论

istio多集群链路追踪,附实操视频

istio防故障利器,你知道几个,istio新手不要读,太难!

istio业务权限控制,原来可以这么玩

istio实现非侵入压缩,微服务之间如何实现压缩

不懂envoyfilter也敢说精通istio系列-http-rbac-不要只会用AuthorizationPolicy配置权限

不懂envoyfilter也敢说精通istio系列-02-http-corsFilter-不要只会vs

不懂envoyfilter也敢说精通istio系列-03-http-csrf filter-再也不用再代码里写csrf逻辑了

不懂envoyfilter也敢说精通istio系列http-jwt_authn-不要只会RequestAuthorization

不懂envoyfilter也敢说精通istio系列-05-fault-filter-故障注入不止是vs

不懂envoyfilter也敢说精通istio系列-06-http-match-配置路由不只是vs

不懂envoyfilter也敢说精通istio系列-07-负载均衡配置不止是dr

不懂envoyfilter也敢说精通istio系列-08-连接池和断路器

不懂envoyfilter也敢说精通istio系列-09-http-route filter

不懂envoyfilter也敢说精通istio系列-network filter-redis proxy

不懂envoyfilter也敢说精通istio系列-network filter-HttpConnectionManager

不懂envoyfilter也敢说精通istio系列-ratelimit-istio ratelimit完全手册

加qq交流群,请联系:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h4cGphdmEx_size_16_color_FFFFFF_t_70
——————————————————————————————————————————————-

  1. type SetSelectorOptions struct {//set selector结构体
  2. // Bound
  3. ResourceBuilderFlags *genericclioptions.ResourceBuilderFlags
  4. PrintFlags *genericclioptions.PrintFlags
  5. RecordFlags *genericclioptions.RecordFlags
  6. dryrun bool
  7. // set by args
  8. resources []string
  9. selector *metav1.LabelSelector
  10. // computed
  11. WriteToServer bool
  12. PrintObj printers.ResourcePrinterFunc
  13. Recorder genericclioptions.Recorder
  14. ResourceFinder genericclioptions.ResourceFinder
  15. // set at initialization
  16. genericclioptions.IOStreams
  17. }
  18. func NewSelectorOptions(streams genericclioptions.IOStreams) *SetSelectorOptions {
  19. return &SetSelectorOptions{//初始化结构体
  20. ResourceBuilderFlags: genericclioptions.NewResourceBuilderFlags().
  21. WithScheme(scheme.Scheme).
  22. WithAll(false).
  23. WithLocal(false).
  24. WithLatest(),
  25. PrintFlags: genericclioptions.NewPrintFlags("selector updated").WithTypeSetter(scheme.Scheme),
  26. RecordFlags: genericclioptions.NewRecordFlags(),
  27. Recorder: genericclioptions.NoopRecorder{},
  28. IOStreams: streams,
  29. }
  30. }
  31. //创建set selector命令
  32. func NewCmdSelector(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command {
  33. o := NewSelectorOptions(streams)//初始化结构体
  34. cmd := &cobra.Command{//创建cobra命令
  35. Use: "selector (-f FILENAME | TYPE NAME) EXPRESSIONS [--resource-version=version]",
  36. DisableFlagsInUseLine: true,
  37. Short: i18n.T("Set the selector on a resource"),
  38. Long: fmt.Sprintf(selectorLong, validation.LabelValueMaxLength),
  39. Example: selectorExample,
  40. Run: func(cmd *cobra.Command, args []string) {
  41. cmdutil.CheckErr(o.Complete(f, cmd, args))//准备
  42. cmdutil.CheckErr(o.Validate())//校验
  43. cmdutil.CheckErr(o.RunSelector())//运行
  44. },
  45. }
  46. o.ResourceBuilderFlags.AddFlags(cmd.Flags())//构造资源flag
  47. o.PrintFlags.AddFlags(cmd)//设置打印flag
  48. o.RecordFlags.AddFlags(cmd)//设置record选项
  49. cmd.Flags().String("resource-version", "", "If non-empty, the selectors update will only succeed if this is the current resource-version for the object. Only valid when specifying a single resource.")//设置resource version选项
  50. cmdutil.AddDryRunFlag(cmd)//设置干跑选项
  51. return cmd
  52. }
  53. //准备函数
  54. func (o *SetSelectorOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []string) error {
  55. var err error
  56. o.RecordFlags.Complete(cmd)//record flag complete
  57. o.Recorder, err = o.RecordFlags.ToRecorder()//record flag转recorder
  58. if err != nil {
  59. return err
  60. }
  61. o.dryrun = cmdutil.GetDryRunFlag(cmd)//设置干跑
  62. o.resources, o.selector, err = getResourcesAndSelector(args)//设置resource和selector
  63. if err != nil {
  64. return err
  65. }
  66. o.ResourceFinder = o.ResourceBuilderFlags.ToBuilder(f, o.resources)//设置resorucebuilder
  67. o.WriteToServer = !(*o.ResourceBuilderFlags.Local || o.dryrun)//判断是否写到服务器
  68. if o.dryrun {
  69. o.PrintFlags.Complete("%s (dry run)")
  70. }
  71. printer, err := o.PrintFlags.ToPrinter()//打印选项转printer
  72. if err != nil {
  73. return err
  74. }
  75. o.PrintObj = printer.PrintObj//设置printObj函数
  76. return err
  77. }
  78. func (o *SetSelectorOptions) Validate() error {
  79. if o.selector == nil {//selector不能为空
  80. return fmt.Errorf("one selector is required")
  81. }
  82. return nil
  83. }
  84. //运行
  85. func (o *SetSelectorOptions) RunSelector() error {
  86. r := o.ResourceFinder.Do()//从builder获取result
  87. return r.Visit(func(info *resource.Info, err error) error {//访问result
  88. patch := &Patch{Info: info}//构造patch
  89. CalculatePatch(patch, scheme.DefaultJSONEncoder(), func(obj runtime.Object) ([]byte, error) {//计算patch
  90. selectErr := updateSelectorForObject(info.Object, *o.selector)//更新对象selector
  91. if selectErr != nil {
  92. return nil, selectErr
  93. }
  94. // record this change (for rollout history)
  95. if err := o.Recorder.Record(patch.Info.Object); err != nil {//判断是否更新change-cause注解
  96. klog.V(4).Infof("error recording current command: %v", err)
  97. }
  98. return runtime.Encode(scheme.DefaultJSONEncoder(), info.Object)//obj转json
  99. })
  100. if patch.Err != nil {
  101. return patch.Err
  102. }
  103. if !o.WriteToServer {//如果不写到服务器则打印
  104. return o.PrintObj(info.Object, o.Out)
  105. }
  106. actual, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, types.StrategicMergePatchType, patch.Patch, nil)//应用patch到服务器
  107. if err != nil {
  108. return err
  109. }
  110. return o.PrintObj(actual, o.Out)//打印对象
  111. })
  112. }
  113. //更新对象selector
  114. func updateSelectorForObject(obj runtime.Object, selector metav1.LabelSelector) error {
  115. copyOldSelector := func() (map[string]string, error) {//获取selector
  116. if len(selector.MatchExpressions) > 0 {//不支持matchExpression
  117. return nil, fmt.Errorf("match expression %v not supported on this object", selector.MatchExpressions)
  118. }
  119. dst := make(map[string]string)
  120. for label, value := range selector.MatchLabels {//遍历matchLabels
  121. dst[label] = value//设置labels map
  122. }
  123. return dst, nil//返回labels map
  124. }
  125. var err error
  126. switch t := obj.(type) {//判断对象
  127. case *v1.Service://如果是service
  128. t.Spec.Selector, err = copyOldSelector()//设置selector
  129. default:
  130. err = fmt.Errorf("setting a selector is only supported for Services")
  131. }
  132. return err
  133. }

发表评论

表情:
评论列表 (有 0 条评论,57人围观)

还没有评论,来说两句吧...

相关阅读