发布一个k8s部署视频:https://edu.csdn.net/course/detail/26967

课程内容:各种k8s部署方式。包括minikube部署,kubeadm部署,kubeasz部署,rancher部署,k3s部署。包括开发测试环境部署k8s,和生产环境部署k8s。

腾讯课堂连接地址https://ke.qq.com/course/478827?taid=4373109931462251&tuin=ba64518

第二个视频发布  https://edu.csdn.net/course/detail/27109

腾讯课堂连接地址https://ke.qq.com/course/484107?tuin=ba64518

介绍主要的k8s资源的使用配置和命令。包括configmap,pod,service,replicaset,namespace,deployment,daemonset,ingress,pv,pvc,sc,role,rolebinding,clusterrole,clusterrolebinding,secret,serviceaccount,statefulset,job,cronjob,podDisruptionbudget,podSecurityPolicy,networkPolicy,resourceQuota,limitrange,endpoint,event,conponentstatus,node,apiservice,controllerRevision等。

第三个视频发布:https://edu.csdn.net/course/detail/27574

详细介绍helm命令,学习helm chart语法,编写helm chart。深入分析各项目源码,学习编写helm插件

第四个课程发布:https://edu.csdn.net/course/detail/28488

本课程将详细介绍k8s所有命令,以及命令的go源码分析,学习知其然,知其所以然

 

加qq群,请联系:


————————————————

type ClusterInfoOptions struct {//cluster-info结构体
	genericclioptions.IOStreams

	Namespace string

	Builder *resource.Builder
	Client  *restclient.Config
}
//创建clusterinfo命令
func NewCmdClusterInfo(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command {
	o := &ClusterInfoOptions{//初始化结构体
		IOStreams: ioStreams,
	}

	cmd := &cobra.Command{//创建cobra命令
		Use:     "cluster-info",
		Short:   i18n.T("Display cluster info"),
		Long:    longDescr,
		Example: clusterinfoExample,
		Run: func(cmd *cobra.Command, args []string) {
			cmdutil.CheckErr(o.Complete(f, cmd))//准备
			cmdutil.CheckErr(o.Run())//运行
		},
	}
	cmd.AddCommand(NewCmdClusterInfoDump(f, ioStreams))//添加dump子命令
	return cmd
}
//准备运行
func (o *ClusterInfoOptions) Complete(f cmdutil.Factory, cmd *cobra.Command) error {
	var err error
	o.Client, err = f.ToRESTConfig()//获取restConfig
	if err != nil {
		return err
	}

	cmdNamespace := cmdutil.GetFlagString(cmd, "namespace")//获取namespace
	if cmdNamespace == "" {
		cmdNamespace = metav1.NamespaceSystem//如果namespace为空则用kube-system
	}
	o.Namespace = cmdNamespace//设置Namespace

	o.Builder = f.NewBuilder()//设置builder
	return nil
}
//运行
func (o *ClusterInfoOptions) Run() error {
	// TODO use generalized labels once they are implemented (#341)
	b := o.Builder.
		WithScheme(scheme.Scheme, scheme.Scheme.PrioritizedVersionsAllGroups()...).
		NamespaceParam(o.Namespace).DefaultNamespace().
		LabelSelectorParam("kubernetes.io/cluster-service=true").
		ResourceTypeOrNameArgs(false, []string{"services"}...).
		Latest()//构造result对象
	err := b.Do().Visit(func(r *resource.Info, err error) error {// visit result对象
		if err != nil {
			return err
		}
		printService(o.Out, "Kubernetes master", o.Client.Host)//打印kube master 服务

		services := r.Object.(*corev1.ServiceList).Items//把obj转service List
		for _, service := range services {//遍历service
			var link string
			if len(service.Status.LoadBalancer.Ingress) > 0 {//如果service有loadBlancer
				ingress := service.Status.LoadBalancer.Ingress[0]//获取loadblancer的ingress
				ip := ingress.IP//获取ip
				if ip == "" {
					ip = ingress.Hostname// 如果ip为空,则用hostname
				}
				for _, port := range service.Spec.Ports {//遍历service的ports
					link += "http://" + ip + ":" + strconv.Itoa(int(port.Port)) + " "
				}
			} else {
				name := service.ObjectMeta.Name//获取service的Name

				if len(service.Spec.Ports) > 0 {//如果service有ports
					port := service.Spec.Ports[0]//获取第一个port

					// guess if the scheme is https
					scheme := ""
					if port.Name == "https" || port.Port == 443 {//设置schema
						scheme = "https"
					}

					// format is <scheme>:<service-name>:<service-port-name>
					name = utilnet.JoinSchemeNamePort(scheme, service.ObjectMeta.Name, port.Name)//拼接名称
				}

				if len(o.Client.GroupVersion.Group) == 0 {//判断是否有group,拼接link
					link = o.Client.Host + "/api/" + o.Client.GroupVersion.Version + "/namespaces/" + service.ObjectMeta.Namespace + "/services/" + name + "/proxy"
				} else {
					link = o.Client.Host + "/api/" + o.Client.GroupVersion.Group + "/" + o.Client.GroupVersion.Version + "/namespaces/" + service.ObjectMeta.Namespace + "/services/" + name + "/proxy"

				}
			}
			name := service.ObjectMeta.Labels["kubernetes.io/name"]//从标签获取name
			if len(name) == 0 {//如果name为空,则用service的name
				name = service.ObjectMeta.Name
			}
			printService(o.Out, name, link)//打印服务
		}
		return nil
	})
	o.Out.Write([]byte("\nTo further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.\n"))//输出提示
	return err

	// TODO consider printing more information about cluster
}

//打印服务
func printService(out io.Writer, name, link string) {
	ct.ChangeColor(ct.Green, false, ct.None, false)//设置颜色
	fmt.Fprint(out, name)//打印服务名称
	ct.ResetColor()//c重置颜色
	fmt.Fprint(out, " is running at ")//打印
	ct.ChangeColor(ct.Yellow, false, ct.None, false)//设置颜色
	fmt.Fprint(out, link)//打印连接
	ct.ResetColor()//重置颜色
	fmt.Fprintln(out, "")
}

 

 

 

 

 

 

 

 

 

 

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐