在CSDN学Golang云原生(Kubernetes基础)

一,k8s集群安装和升级

安装 Golang K8s 集群可以参照以下步骤:

  1. 准备环境:需要一组 Linux 服务器,并在每台服务器上安装 Docker 和 Kubernetes 工具。

  2. 初始化集群:使用 kubeadm 工具初始化一个 Kubernetes 集群。例如,以下命令会初始化一个名为 mycluster 的集群:

    $ kubeadm init --apiserver-advertise-address <master-node-ip> --pod-network-cidr=10.244.0.0/16

其中,<master-node-ip> 是 Kubernetes 主节点的 IP 地址。

  1. 部署网络插件:选择合适的网络插件并将其部署到集群中。例如,使用 Calico 网络插件可通过以下命令进行部署:

    $ kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml

  2. 加入工作节点:使用 kubeadm join 命令将工作节点加入集群。例如,以下命令会将某个节点加入到名为 mycluster 的集群中:

    $ kubeadm join <master-node-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

其中,<token><hash> 分别是由主节点生成的 Token 和证书哈希值。

升级 Golang K8s 集群可以参照以下步骤:

  1. 升级控制平面组件:先升级控制平面组件,包括 kube-apiserver、kube-controller-manager 和 kube-scheduler 等。
  2. 升级工作节点组件:再逐一升级工作节点上的组件,包括 kubelet、kube-proxy 和容器运行时等。
  3. 检查升级结果:在升级完成后,需要检查集群中所有节点的状态,并确保它们已经成功升级到指定版本。

注意事项:

  1. 在进行 Golang K8s 集群安装和升级前,需要充分了解 Kubernetes 架构和相关概念,并选择合适的网络插件和存储方案等。
  2. 在使用 kubeadm 初始化集群时需要指定参数并保存相应信息,以便后续加入工作节点或更新控制平面组件时使用。
  3. 在进行 Golang K8s 集群升级时,需要仔细阅读官方文档并按照指导进行操作。建议先在测试环境中进行充分测试并备份数据,以防出现意外情况。

二,flannel网络插件的安装

Flannel 是一个简单和轻量的网络插件,可为 Kubernetes 集群提供基础网络功能。以下是在 Golang 环境中安装 Flannel 网络插件的步骤:

  1. 创建 flannel.yaml 文件,并将以下内容复制到文件中:

    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: kube-flannel-cfg
    namespace: kube-system
    data:
    net-conf.json: |
    {
    "Network": "10.244.0.0/16",
    "Backend": {
    "Type": "vxlan"
    }
    }

    apiVersion: extensions/v1beta1
    kind: DaemonSet
    metadata:
    name: kube-flannel-ds-amd64
    namespace: kube-system
    labels:
    k8s-app: flannel
    spec:
    template:
    metadata:
    labels:
    k8s-app: flannel
    spec:
    hostNetwork: true
    containers:
    - name: kube-flannel-amd64
    image: quay.io/coreos/flannel:v0.14.0-amd64 # 根据实际情况选择版本号或者用latest代替。
    command:
    - /opt/bin/flanneld # 默认启动命令,不要修改。
    args:
    - --ip-masq # 启用 NAT 转发。
    - --kube-subnet-mgr # 如果启用了自动分配 Pod 子网,则必须开启该选项。
    resources:
    requests:
    cpu: 100m # 单节点 CPU 最小配置为100m。
    memory: 50Mi # 单节点内存最小配置为50MB。
    limits:
    cpu: 200m
    memory: 100Mi
    securityContext:
    privileged: true # 设置为特权容器,允许容器使用 iptables 进行 NAT 转发。
    volumeMounts:
    - name: flannel-cfg
    mountPath: /etc/kube-flannel/
    volumes:
    - name: flannel-cfg
    configMap:
    name: kube-flannel-cfg

  2. 使用 kubectl 命令将 flannel.yaml 文件中的内容应用到 Kubernetes 集群中:

    $ kubectl apply -f flannel.yaml

  3. 等待 Flannel DaemonSet 在集群中部署完成后,使用以下命令检查 Flannel 是否正常工作:

    $ kubectl get pods -n kube-system | grep kube-flannel-ds-amd64
    kube-flannel-ds-amd64-xxxxx 1/1 Running 0 xxh xxh <none> <none>

如果看到类似上面的输出信息,则说明 Flannel 已经在集群中成功部署并且正在运行。

注意事项:

  1. 在安装 Flannel 之前需要先准备好 Golang 环境,并确保 Kubernetes 集群已经正确初始化。
  2. 在创建 flannel.yaml 文件时,需要根据实际情况修改网络配置和镜像版本等参数。在选择网络插件时应该综合考虑多个因素,例如性能、可靠性和易用性等。
  3. 在部署 Flannel 之后,应该充分测试集群的网络功能,并且及时更新和修复可能出现的问题。

三,CRI与cri-Dockerd

CRI(Container Runtime Interface)是 Kubernetes 官方提供的一套标准化容器运行时接口,旨在为 Kubernetes 集群提供更加灵活和可扩展的容器管理能力。CRI-Dockerd 是 Docker 公司开发的符合 CRI 规范的容器运行时实现。

下面是 Golang 中使用 CRI-Dockerd 的步骤:

  1. 安装 Docker CE,并确保其版本号在 18.06 或以上。

  2. 安装 CRI-Dockerd 运行时。可以通过以下命令来安装:

    $ curl -s https://raw.githubusercontent.com/kubernetes-sigs/cri-tools/master/scripts/install-docker.sh | sh

  3. 启动 CRI-Dockerd 运行时。可以使用以下命令来启动:

    $ sudo dockerd
    --add-runtime docker-cri=/usr/local/bin/docker-containerd
    --host=unix:///var/run/dockershim.sock
    --default-runtime=docker-cri
    --exec-opt native.cgroupdriver=cgroupfs

其中,--add-runtime 参数指定了 CRI-Dockerd 使用的容器运行时名称和路径,--host 参数指定了连接到 dockershim 的 sock 文件路径,--default-runtime 指定默认的运行时名称,--exec-opt 参数用于配置 cgroup 驱动程序。

  1. 启动 kubelet,并将 runtime-endpoint 参数设置为 CRI-Dockerd 运行时的 sock 文件路径:

    $ sudo kubelet ... --container-runtime remote --runtime-request-timeout 15m
    --container-runtime-endpoint unix:///var/run/dockershim.sock ...

其中,--container-runtime 参数指定了容器运行时类型为 remote,--runtime-request-timeout 指定了容器运行时请求的超时时间。

下面是 Golang 中使用 CRI 的步骤:

  1. 安装 CRI 运行时。可以通过以下命令来安装:

    $ go get -u k8s.io/kubernetes/cmd/kubelet/cri/remote

  2. 启动 kubelet,并将 runtime-endpoint 参数设置为 CRI 运行时的 sock 文件路径:

    $ sudo kubelet ... --container-runtime remote --runtime-request-timeout 15m
    --container-runtime-endpoint unix:///var/run/crio/crio.sock ...

其中,--container-runtime 参数指定了容器运行时类型为 remote,--runtime-request-timeout 指定了容器运行时请求的超时时间。

注意事项:

  1. 在安装和配置 CRI-Dockerd 或 CRI 运行时之前,需要先准备好 Docker CE 和 Kubernetes 集群,并且确保它们都已经正确初始化。
  2. 在选择容器运行时类型和版本号等参数时,应该综合考虑多个因素,例如性能、可靠性和易用性等。
  3. 在部署完成后应该充分测试集群的容器管理功能,并及时更新和修复可能出现的问题。

四,api server 组件

在 Kubernetes 中,API Server 是整个系统的核心组件之一,它为集群内的所有对象提供 RESTful API 接口,并负责管理集群状态、协调各个组件之间的交互和通信等任务。在 Golang 中编写一个自己的 API Server 组件,可以参考以下步骤:

  1. 定义 API 对象

定义需要暴露给用户的 API 对象模型,在 Golang 中使用 struct 来表示。

  1. 实现 RESTful API 接口

使用 net/http 包来实现 RESTful API 接口。可以使用 Gorilla Mux 这样的路由器库来简化路由逻辑。

  1. 实现访问控制

根据具体需求实现访问控制策略,例如基于 RBAC 的权限控制、Token 认证等。

  1. 实现数据存储

根据具体需求选择适当的数据库或存储引擎,并使用相应的 Golang 库来实现数据存储功能。

  1. 编写测试代码

编写单元测试和端到端测试代码,并使用工具对代码进行覆盖率分析和性能测试等。

  1. 集成到 Kubernetes 系统中

将自己编写的 API Server 组件打包成容器镜像,并通过 Kubernetes 集群部署工具(如 Helm)将其部署到集群中。

  1. 监测和维护

通过 Kubernetes 提供的监控和日志系统对 API Server 组件进行实时监测和维护,及时发现和解决问题。

需要注意的是,在编写自己的 API Server 组件之前,需要对 Kubernetes 的架构、API Server 的工作原理以及相应的开发规范有一定了解。同时,还需要熟悉 Golang 的基本语法、网络编程知识和 RESTful API 设计原则等。

五,controller manager组件

在 Kubernetes 中,Controller Manager 是负责运行各种控制器的核心组件之一。控制器是 Kubernetes 中实现自动化管理的核心机制,它们可以监视集群中某些资源对象的状态变化,并根据预设的规则对其进行处理。

下面是实现 Golang Controller Manager 组件的主要步骤:

  1. 定义需要管理的资源对象

通过定义 API 对象模型来描述需要管理的资源对象,在 Golang 中使用 struct 来表示。

  1. 编写控制器逻辑

根据具体需求编写相应的控制器逻辑代码,例如 Pod 控制器、Service 控制器等。控制器通常会包含以下基本操作:

  • 监视指定资源对象或事件流
  • 处理资源对象状态变化或事件
  • 执行相关操作(如创建、更新、删除资源)
  1. 实现与 API Server 的交互

使用 Golang 客户端库(如 client-go)与 API Server 进行交互,获取或更新相关信息。可以使用 Informer 机制来简化访问和监视 Kubernetes API 资源对象。

  1. 实现错误处理和重试机制

针对网络故障或异常情况进行错误处理和重试机制设计,确保系统稳定性和可靠性。

  1. 编写测试代码

编写单元测试和集成测试代码,并使用工具对代码进行覆盖率分析和性能测试等。

  1. 集成到 Kubernetes 系统中

将自己编写的 Controller Manager 组件打包成容器镜像,并通过 Kubernetes 集群部署工具(如 Helm)将其部署到集群中。

  1. 监测和维护

通过 Kubernetes 提供的监控和日志系统对 Controller Manager 组件进行实时监测和维护,及时发现和解决问题。

需要注意的是,在编写自己的 Controller Manager 组件之前,需要对 Kubernetes 的架构、API Server 和控制器机制等有一定了解。同时,还需要熟悉 Golang 的基本语法、并发编程知识和网络编程原理等。

六,Scheduler 组件

在 Kubernetes 中,Scheduler 是负责将 Pod 调度到可用的 Node 上运行的组件。Scheduler 通过监视未调度的 Pod,并选择合适的 Node 并将其绑定到该节点上。

下面是实现 Golang Scheduler 组件的主要步骤:

  1. 定义调度器算法

根据具体需求设计和实现调度器算法,例如默认的、权重优先级、抢占式等。

  1. 实现与 API Server 的交互

使用 Golang 客户端库(如 client-go)与 API Server 进行交互,获取需要进行调度的 Pod 和可用的 Node 等信息。

  1. 执行策略判断和决策

根据定义好的调度器算法对 Pod 进行策略判断和决策,确定最佳的 Node 并将其绑定到该节点上。同时需要考虑诸如资源约束、Pod 亲和性和反亲和性等因素。

  1. 实现错误处理和重试机制

针对网络故障或异常情况进行错误处理和重试机制设计,确保系统稳定性和可靠性。

  1. 编写测试代码

编写单元测试和集成测试代码,并使用工具对代码进行覆盖率分析和性能测试等。

  1. 集成到 Kubernetes 系统中

将自己编写的 Scheduler 组件打包成容器镜像,并通过 Kubernetes 集群部署工具(如 Helm)将其部署到集群中。

  1. 监测和维护

通过 Kubernetes 提供的监控和日志系统对 Scheduler 组件进行实时监测和维护,及时发现和解决问题。

需要注意的是,在编写自己的 Scheduler 组件之前,需要对 Kubernetes 的架构、API Server 和调度器机制等有一定了解。同时,还需要熟悉 Golang 的基本语法、并发编程知识和网络编程原理等。

七,Kubelet组件

在 Kubernetes 中,Kubelet 是运行在每个 Node 上的主要组件之一,负责管理该 Node 上的容器和 Pod。Kubelet 会定期从 API Server 获取需要在该 Node 上运行的 Pod,并通过容器化技术(如 Docker)启动和停止这些容器。

下面是实现 Golang Kubelet 组件的主要步骤:

  1. 实现与 API Server 的交互

使用 Golang 客户端库(如 client-go)与 API Server 进行交互,获取需要在该 Node 上运行的 Pod 和相关信息等。

  1. 管理本地容器

使用 Docker 或其他容器化技术,启动和停止 Pod 中定义的各个容器。同时需要考虑诸如网络连接、存储卷、资源限制等问题。

  1. 实现健康检查机制

针对每个 Pod 和其内部的每个容器,实现健康检查机制以确保它们正常运行。如果发现某个容器或整个 Pod 失效,则应及时采取相应措施进行修复或重建。

  1. 实现资源监测和调节机制

通过监测节点上各个进程和资源利用情况,自动调节 CPU、内存、网络带宽等资源分配策略,并定期汇报给集群中心。

  1. 编写测试代码

编写单元测试和集成测试代码,并使用工具对代码进行覆盖率分析和性能测试等。

  1. 集成到 Kubernetes 系统中

将自己编写的 Kubelet 组件打包成容器镜像,并通过 Kubernetes 集群部署工具(如 Helm)将其部署到集群中。

  1. 监测和维护

通过 Kubernetes 提供的监控和日志系统对 Kubelet 组件进行实时监测和维护,及时发现和解决问题。

需要注意的是,在编写自己的 Kubelet 组件之前,需要对 Kubernetes 的架构、API Server 和调度器机制等有一定了解。同时,还需要熟悉 Golang 的基本语法、并发编程知识和网络编程原理等。

八,proxy组件

在计算机网络中,代理(Proxy)是一种网络服务,它充当客户端和服务器之间的中介。Golang 语言可以轻松实现一个基于 HTTP 协议的代理组件。下面是实现 Golang Proxy 组件的主要步骤:

  1. 创建监听 Socket

使用 Go 标准库 net 监听指定端口上的 TCP 连接。

  1. 处理连接请求

接收客户端发来的连接请求,并将其封装成 HttpRequest 对象,读取其中的 URL 和 Headers 等信息。

  1. 判断是否需要代理

根据 HttpRequest 中请求头部(如 User-Agent、Host)等信息判断该请求是否需要通过代理进行转发。

  1. 向目标服务器发送请求

如果需要代理,则将 HttpRequest 中的数据转发给目标服务器,并将返回结果封装成 HttpResponse 对象。

  1. 返回结果给客户端

将目标服务器返回的 HttpResponse 对象传输回到原始客户端。

  1. 处理异常情况

处理诸如连接超时、HTTP 错误码、非法 URL、内存泄漏等异常情况,保证代理组件稳定运行。

  1. 集成到应用中

将自己编写的 Proxy 组件集成到 Web 应用程序中,以实现更为复杂的功能需求。

需要注意的是,在编写自己的 Proxy 组件之前,需要了解 HTTP 协议和 TCP/IP 基本知识。同时还需要熟悉 Golang 的基本语法、并发编程和网络编程等知识。在实际应用中,还需要考虑代理的负载均衡、安全性、缓存策略等问题。

九,Kubectl命令行操作

使用 Golang 可以编写命令行工具来操作 Kubernetes 集群,其中可以使用 kubectl 命令行工具的 Go 库来实现。

以下是 Golang 实现 Kubectl 命令行操作的主要步骤:

  1. 安装 kubernetes/client-go 包

在 Golang 环境中安装 kubernetes/client-go 包,该包提供了访问 Kubernetes API Server 的客户端库。

go get k8s.io/client-go/...
  1. 使用 kubectl Go 库实现命令行操作

使用 kubectl Go 库来实现命令行操作。例如,下面的代码片段演示如何使用 kubectl Go 库列出所有 Pod,并输出它们的名称和状态:

package main

import (
	"context"
	"fmt"

	"k8s.io/apimachinery/pkg/api/errors"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
)

func main() {
	config, err := clientcmd.BuildConfigFromFlags("", "/path/to/kubeconfig")
	if err != nil {
		panic(err.Error())
	}

	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}

	pods, err := clientset.CoreV1().Pods("").List(context.Background(), metav1.ListOptions{})
	if errors.IsNotFound(err) {
		fmt.Printf("No pods found in the cluster\n")
	} else if statusError, isStatus := err.(*errors.StatusError); isStatus {
		fmt.Printf("Error getting pods: %v\n", statusError.ErrStatus.Message)
	} else if err != nil {
		panic(err.Error())
	} else {
		fmt.Printf("Listing all pods in the cluster:\n")
		for _, pod := range pods.Items {
			fmt.Printf("  %s (%s)\n", pod.GetName(), pod.Status.Phase)
		}
	}
}

以上代码演示了如何使用 Golang 代码操作 Kubernetes 集群,其中使用 kubectl Go 库来列出所有 Pod 的名称和状态。

十,metrics server 监控node和pod

Metrics Server 是 Kubernetes 集群的一个组件,用于收集和暴露各种资源的监控指标。使用 Golang 可以编写 Metrics Server 的客户端程序,来实现对 Node 和 Pod 的监控。

以下是 Golang 实现 Metrics Server 客户端程序的主要步骤:

  1. 安装 k8s.io/client-go

在 Golang 环境中安装 k8s.io/client-go 包,该包提供了访问 Kubernetes API Server 的客户端库。

go get k8s.io/client-go/...
  1. 使用 Heapster Metrics API 获取监控数据

通过访问 Heapster Metrics API 来获取 Node 和 Pod 的监控数据。例如,下面的代码片段演示如何获取 Node 列表和 Pod 列表,并输出其 CPU 和内存使用情况:

package main

import (
    "flag"
    "fmt"
    "time"

    "k8s.io/apimachinery/pkg/api/resource"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/rest"
)

func main() {
	var kubeconfig string
	flag.StringVar(&kubeconfig, "kubeconfig", "", "Path to a kubeconfig file")
	flag.Parse()

	// 初始化 Kubernetes REST Client
	config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
	if err != nil {
		panic(err.Error())
	}
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}

	// 获取所有节点列表并输出 CPU 和内存使用情况
	nodes, err := clientset.CoreV1().Nodes().List(metav1.ListOptions{})
	if err != nil {
		panic(err.Error())
	}
	for _, node := range nodes.Items {
		nodeName := node.GetName()
		metricsClient := clientset.MetricsV1beta1().NodeMetricses()
		metrics, err := metricsClient.Get(nodeName, metav1.GetOptions{})
		if err != nil {
			panic(err.Error())
		}
		cpuUsage := metrics.Usage.Cpu()
		memoryUsage := metrics.Usage.Memory()
		fmt.Printf("Node %s: CPU usage=%s, memory usage=%s\n", nodeName, cpuUsage.String(), memoryUsage.String())
        }

    // 获取所有 Pod 列表并输出 CPU 和内存使用情况
	pods, err := clientset.CoreV1().Pods("").List(metav1.ListOptions{})
	if err != nil {
		panic(err.Error())
	}
	for _, pod := range pods.Items {
        podName := pod.GetName()
        namespaceName:=pod.GetNamespace()
        metricsClient:=clientset.MetricsV1beta1().PodMetricses(namespaceName)
        metrics,err:=metricsClient.Get(podName,metav1.GetOptions{})
        if err!=nil{
            panic(err.Error())
        }
        containers:=metrics.Containers
        for _,container:=range containers{
            cpuUsage:=container.Usage.Cpu()
            memoryUsage:=container.Usage.Memory()

            fmt.Printf("Pod %s in Namespace %s: Container %s - CPU usage=%s, memory usage=%s\n",podName,namespaceName,container.Name ,cpuUsage.String(),memoryUsage.String())

        }

	time.Sleep(10 * time.Second)
}

以上代码演示了如何使用 Golang 代码获取 Node 和 Pod 的监控指标,其中 Heapster Metrics API 在 Kubernetes 1.11 版本后已经被废弃,因此在新版本的 Kubernetes 中需要使用 Metric Server 来获取监控数据。

相关推荐
福大大架构师每日一题1 小时前
22.1 k8s不同role级别的服务发现
容器·kubernetes·服务发现
怪我冷i1 小时前
使用vscode调试wails项目(golang桌面GUI)
vscode·golang
weixin_453965002 小时前
[单master节点k8s部署]30.ceph分布式存储(一)
分布式·ceph·kubernetes
weixin_453965002 小时前
[单master节点k8s部署]32.ceph分布式存储(三)
分布式·ceph·kubernetes
tangdou3690986552 小时前
1分钟搞懂K8S中的NodeSelector
云原生·容器·kubernetes
Lansonli3 小时前
云原生(四十一) | 阿里云ECS服务器介绍
服务器·阿里云·云原生
Dylanioucn4 小时前
【分布式微服务云原生】掌握分布式缓存:Redis与Memcached的深入解析与实战指南
分布式·缓存·云原生
小吴同学(wlx)5 小时前
Golang 进阶3—— 协程&管道
golang
技术卷5 小时前
GO网络编程(三):海量用户通信系统1:登录功能初步
golang·网络编程
later_rql5 小时前
k8s-集群部署1
云原生·容器·kubernetes