apiVersion: v1
kind: Service
metadata:
  name: elasticsearch-logging
  namespace: kube-system
  labels:
    k8s-app: elasticsearch-logging
spec:
  ports:
  - port: 9200
    protocol: TCP
    targetPort: db
  selector:
    k8s-app: elasticsearch-logging
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: elasticsearch-logging
  namespace: kube-system
  labels:
    k8s-app: elasticsearch-logging
spec:
  replicas: 3
  template:
    metadata:
      labels:
        k8s-app: elasticsearch-logging
    spec:
      containers:
      - name: elasticsearch-logging
        image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.2.4
        resources:
          limits:
            cpu: 1000m
            memory: 2048Mi
          requests:
            cpu: 100m
            memory: 200Mi
        ports:
        - containerPort: 9200
          name: db
          protocol: TCP
        - containerPort: 9300
          name: db
          protocol: TCP
        volumeMounts:
        - name: elasticsearch-logging
          mountPath: /usr/share/elasticsearch/data
        env:
        - name: "NAMESPACE"
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: "NODE_NAME"
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: "CLUSTER_NAME"
          value: "k8s-logs"
        - name: "NUM_SHARDS"
          value: "1"
        - name: "HEAP_SIZE"
          value: "256m"
        - name: "FS_TYPE"
          value: ""
      volumes:
      - name: elasticsearch-logging
        emptyDir: {}

这个示例展示了如何在Kubernetes中部署一个Elasticsearch高可用性集群。它使用Deployment来确保集群的副本数,并且使用Service来暴露集群服务。集群配置通过环境变量来设置,并且使用了emptyDir作为存储卷来保证数据的临时性。这个配置适用于学习和测试,并非生产环境下的推荐配置。在生产环境中,你需要使用外部存储,并且配置更多的安全和监控特性。

2024-08-16



# 示例: Kubernetes 配置文件 kubelet 的部分配置
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
address: "0.0.0.0" # 监听地址,设置为0.0.0.0以允许所有IP访问kubelet
port: 10250 # 端口号,默认为10250
readOnlyPort: 10255 # 只读端口,默认为10255
cgroupDriver: "systemd" # 容器cgroup驱动,根据不同的运行时可能不同
clusterDNS: # DNS服务器的IP地址列表
- "10.96.0.10"
clusterDomain: "cluster.local" # 集群的DNS域
failSwapOn: false # 是否失败,如果系统上的SWAP被启用
hairpinMode: "promiscuous-bridge" # 发送到本机容器的流量从物理网络通过的模式

这个配置文件定义了kubelet的基本设置,包括监听地址、端口号、只读端口、cgroup驱动、DNS设置、是否使用SWAP以及hairpin模式。这些配置对于Kubernetes集群的稳定运行至关重要,因此在配置和维护集群时应当格外注意。

2024-08-16



# 集中式日志记录(Kubernetes 集群之前)
apiVersion: logging.k8s.io/v1beta1
kind: ClusterLogging
metadata:
  name: cluster-logging-intake
spec:
  fluentd:
    baseImage: k8s.gcr.io/fluentd-elasticsearch
    resources:
      limits:
        memory: 200Mi
        cpu: 100m
      requests:
        memory: 100Mi
        cpu: 50m
  logfile:
    storage: 1Gi
 
# 分布式日志记录(Kubernetes 集群内)
apiVersion: logging.k8s.io/v1beta1
kind: ClusterLogging
metadata:
  name: cluster-logging-distributed
spec:
  logStore: elasticsearch
  elasticsearch:
    node:
      resources:
        limits:
          memory: 1Gi
          cpu: 500m
        requests:
          memory: 1Gi
          cpu: 500m
    config:
      cluster.name: ${ELASTICSEARCH_CLUSTER_NAME}
      node.name: "${POD_NAME}.${POD_NAMESPACE}.svc"
      network.host: 0.0.0.0
      discovery.seed_hosts: ${ELASTICSEARCH_SERVICE_ENDPOINT}
 
# 分布式日志记录(Kubernetes 集群外)
apiVersion: logging.k8s.io/v1beta1
kind: ClusterLogging
metadata:
  name: cluster-logging-distributed-external
spec:
  logStore: elasticsearch
  elasticsearchConfig:
    clusterName: ${ELASTICSEARCH_CLUSTER_NAME}
    host: ${ELASTICSEARCH_HOST}
    port: ${ELASTICSEARCH_PORT}

这个代码实例展示了如何使用Kubernetes的ClusterLogging资源来定义集中式和分布式日志记录。它演示了如何为Fluentd日志收集器设置资源限制,以及如何为Elasticsearch设置配置选项。代码还展示了如何引用环境变量以便在不同环境中灵活配置。

2024-08-16

以下是使用KubeKey一键构建KubeSphere多节点Kubernetes集群的步骤和示例代码:

  1. 安装KubeKey:



export KKZONE=cn
curl -sfL https://get-kk.kubesphere.io | sh -
  1. 创建配置文件 config-sample.yaml,并编辑以下内容:



apiVersion: kubekey.kubesphere.io/v1alpha1
kind: Cluster
metadata:
  name: sample
spec:
  hosts:
  - {name: node1, address: "192.168.0.1", internalAddress: "192.168.0.1", user: root, password: Qcloud@123}
  - {name: node2, address: "192.168.0.2", internalAddress: "192.168.0.2", user: root, password: Qcloud@123}
  - {name: node3, address: "192.168.0.3", internalAddress: "192.168.0.3", user: root, password: Qcloud@123}
  roleGroups:
    etcd:
    - node1
    - node2
    - node3
    master:
    - node1
    - node2
    worker:
    - node1
    - node2
    - node3
  controlPlaneEndpoint: "192.168.0.1:6443"
  kubernetes:
    version: v1.17.9
    clusterName: cluster.local
  network:
    plugin: calico
    kubePodsCIDR: 10.233.64.0/18
    kubeServiceCIDR: 10.233.0.0/18
  addons:
[]
  1. 使用KubeKey部署集群:



./kk create cluster -f config-sample.yaml

请根据您的实际网络环境和服务器配置调整上述配置文件。这个过程可能需要一些时间,因为它会下载相关的Docker镜像并在每个节点上安装Kubernetes集群。

注意:在实际操作中,请确保所有节点的时间同步、网络配置(包括防火墙规则、swap分区等)正确无误,并且确保SSH免密登录已经设置好,以便KubeKey能够无缝地在各个节点上执行安装。

2024-08-16

在Kubernetes上部署PyTorch分布式程序通常涉及创建一个Training Job,这可以通过使用Kubernetes的Job或者Helm charts等工具来实现。以下是一个简化的步骤和示例代码:

  1. 准备你的Docker镜像,确保它包含了PyTorch和你的分布式训练代码。
  2. 创建Kubernetes的PyTorch Job配置文件,例如pytorch-job.yaml



apiVersion: kubeflow.org/v1
kind: PyTorchJob
metadata:
  name: pytorch-distributed-demo
spec:
  pytorchReplicaSpecs:
    Master:
      replicas: 1
      template:
        metadata:
          labels:
            pytorch-job-name: pytorch-distributed-demo
            pytorch-job-role: master
        spec:
          containers:
          - name: pytorch
            image: <your-docker-image>
            command: ["python"]
            args: ["train.py"]
            resources:
              requests:
                cpu: "1"
    Worker:
      replicas: 2
      template:
        metadata:
          labels:
            pytorch-job-name: pytorch-distributed-demo
            pytorch-job-role: worker
        spec:
          containers:
          - name: pytorch
            image: <your-docker-image>
            command: ["python"]
            args: ["train.py"]
            resources:
              requests:
                cpu: "1"
  1. 使用kubectl应用配置文件。



kubectl apply -f pytorch-job.yaml
  1. 监控你的PyTorch Job的状态。



kubectl get -w pytorchjobs

确保你的Kubernetes集群已经安装了Kubeflow或者对应的PyTorch Job controller,这样才能正确地运行上述的PyTorch Job。如果你的集群没有安装,你可以参考Kubeflow的官方文档来进行安装和配置。

2024-08-16

在CentOS 7上安装Kubernetes 1.24的步骤如下:

  1. 确保系统已经更新并且安装了必要的依赖:



sudo yum update -y
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  1. 设置Docker的存储驱动为overlay2(Kubernetes 1.24 需要此驱动):



sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "storage-driver": "overlay2"
}
EOF
sudo systemctl restart docker
  1. 安装Kubernetes:



sudo yum install -y kubelet kubeadm kubectl
sudo systemctl enable --now kubelet
  1. 初始化Kubernetes集群(请替换<your-pod-network-cidr>为你选择的网络范围,例如10.244.0.0/16):



sudo kubeadm init --pod-network-cidr=<your-pod-network-cidr>
  1. 设置kubectl的配置文件:



mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. 安装Pod网络插件(例如Flannel):



kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
  1. 检查集群状态:



kubectl get nodes
kubectl get pods --all-namespaces

请注意,这些步骤是基于官方Kubernetes文档和假设你想使用Flannel作为网络插件。如果你有特定的需求或者网络配置,请根据实际情况调整步骤。

2024-08-16

在Kubernetes中,client-go库是一个用于与Kubernetes API服务器交互的Go语言客户端。以下是一个使用client-go创建和删除Pods的简单示例:




package main
 
import (
    "context"
    "flag"
    "fmt"
    "path/filepath"
 
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
    "k8s.io/client-go/util/homedir"
)
 
func main() {
    var kubeconfig *string
    if home := homedir.HomeDir(); home != "" {
        kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
    } else {
        kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
    }
    flag.Parse()
 
    config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
    if err != nil {
        panic(err)
    }
 
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err)
    }
 
    // 创建Pod
    podClient := clientset.CoreV1().Pods("default")
    pod := &v1.Pod{
        ObjectMeta: metav1.ObjectMeta{
            Name: "demo-pod",
        },
        Spec: v1.PodSpec{
            Containers: []v1.Container{
                {
                    Name:  "demo-container",
                    Image: "nginx",
                },
            },
        },
    }
    fmt.Println("Creating pod...")
    _, err = podClient.Create(context.TODO(), pod, metav1.CreateOptions{})
    if err != nil {
        panic(err)
    }
    fmt.Println("Pod created")
 
    // 删除Pod
    fmt.Println("Deleting pod...")
    deletePolicy := metav1.DeletePropagationForeground
    err = podClient.Delete(context.TODO(), "demo-pod", metav1.DeleteOptions{
        PropagationPolicy: &deletePolicy,
    })
    if err != nil {
        panic(err)
    }
    fmt.Println("Pod deleted")
}

这段代码首先解析kubeconfig文件的路径,然后使用提供的配置信息创建一个Kubernetes客户端。接下来,它展示了如何创建一个简单的Pod和如何删除它。这是一个基本的例子,展示了如何使用client-go库与Kubernetes集群交互。

2024-08-15

在Kubernetes中,我们可以使用client-go库来与集群进行交互。以下是使用client-go读取服务列表、创建服务的代码示例。

  1. 读取服务列表:



import (
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)
 
func ListServices(configPath, namespace string) (*v1.ServiceList, error) {
    // 使用kubeconfig文件创建配置
    config, err := clientcmd.BuildConfigFromFlags("", configPath)
    if err != nil {
        return nil, err
    }
 
    // 创建客户端
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        return nil, err
    }
 
    // 获取服务列表
    services, err := clientset.CoreV1().Services(namespace).List(context.TODO(), metav1.ListOptions{})
    if err != nil {
        return nil, err
    }
 
    return services, nil
}
  1. 创建服务:



import (
    v1 "k8s.io/api/core/v1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)
 
func CreateService(configPath, namespace string, service *v1.Service) (*v1.Service, error) {
    // 使用kubeconfig文件创建配置
    config, err := clientcmd.BuildConfigFromFlags("", configPath)
    if err != nil {
        return nil, err
    }
 
    // 创建客户端
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        return nil, err
    }
 
    // 创建服务
    result, err := clientset.CoreV1().Services(namespace).Create(context.TODO(), service, metav1.CreateOptions{})
    if err != nil {
        return nil, err
    }
 
    return result, nil
}

在这两个函数中,我们首先使用kubeconfig文件的路径创建一个配置,然后创建一个客户端用于与Kubernetes集群进行交互。接下来,我们使用客户端调用相应的API来获取服务列表或创建新服务。注意,这里的context和metav1包需要导入,并且这里的代码示例假设你已经有了必要的权限和RBAC配置。

2024-08-15

在Kubernetes中,client-go库是常用的Go语言客户端,用于与Kubernetes集群交互。以下是一个使用client-go库来与Kubernetes集群进行通信的基本示例。

首先,你需要设置KUBECONFIG环境变量,指向你的集群配置文件。




export KUBECONFIG=/path/to/your/kubeconfig

然后,你可以使用client-go库来与集群进行交互。以下是一个简单的Go程序,它会列出默认命名空间下的所有Pods。




package main
 
import (
    "context"
    "fmt"
    "time"
 
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/rest"
)
 
func main() {
    // 使用集群的kubeconfig创建一个新的客户端
    config, err := rest.InClusterConfig()
    if err != nil {
        panic(err.Error())
    }
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err.Error())
    }
 
    // 列出默认命名空间下的所有Pods
    for {
        pods, err := clientset.CoreV1().Pods(metav1.NamespaceDefault).List(context.TODO(), metav1.ListOptions{})
        if err != nil {
            panic(err.Error())
        }
        fmt.Printf("Number of Pods: %v\n", len(pods.Items))
        for _, pod := range pods.Items {
            fmt.Printf(" * %s (%s)\n", pod.Name, pod.Status.Phase)
        }
        time.Sleep(10 * time.Second)
    }
}

这个程序会创建一个Kubernetes客户端,然后无限循环地列出默认命名空间下的所有Pods,并打印它们的状态。

请注意,这个示例假设你的程序有足够的权限与Kubernetes集群进行交互。如果你的程序运行在集群之外,你需要一个有效的kubeconfig文件来配置API服务器的地址和认证信息。rest.InClusterConfig() 函数用于在集群内部的Pod中获取配置,通常通过服务账户自动挂载的。

这只是client-go库与Kubernetes集群交互的一个基本示例。client-go库提供了丰富的API,可以用于执行更复杂的操作,比如创建、更新、删除Pods、Services等Kubernetes资源对象。

2024-08-15

Client-go是Kubernetes的官方Go语言客户端,它提供与Kubernetes集群交互的方法。Informer机制是client-go提供的一种用于监控Kubernetes资源的变化的机制,它可以帮助开发者构建响应式、高效的Kubernetes应用。

以下是一个简单的例子,展示如何使用client-go和Informer机制来监控Kubernetes中的Pods资源变化:




package main
 
import (
    "context"
    "fmt"
    "time"
 
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/apimachinery/pkg/fields"
    "k8s.io/apimachinery/pkg/runtime"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/rest"
    "k8s.io/client-go/tools/cache"
)
 
func main() {
    config, err := rest.InClusterConfig()
    if err != nil {
        panic(err.Error())
    }
 
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err.Error())
    }
 
    watchlist := cache.NewListWatchFromClient(
        clientset.CoreV1().RESTClient(),
        "pods",
        metav1.NamespaceAll,
        fields.Everything(),
    )
 
    store, controller := cache.NewInformer(
        watchlist,
        &corev1.Pod{},
        time.Minute*5,
        cache.ResourceEventHandlerFuncs{
            AddFunc: func(obj interface{}) {
                pod := obj.(*corev1.Pod)
                fmt.Printf("Pod Added: %s\n", pod.Name)
            },
            DeleteFunc: func(obj interface{}) {
                pod := obj.(*corev1.Pod)
                fmt.Printf("Pod Deleted: %s\n", pod.Name)
            },
            UpdateFunc: func(oldObj, newObj interface{}) {
                oldPod := oldObj.(*corev1.Pod)
                newPod := newObj.(*corev1.Pod)
                fmt.Printf("Pod Updated: %s\n", newPod.Name)
            },
        },
    )
 
    stop := make(chan struct{})
    defer close(stop)
    go controller.Run(stop)
 
    // Wait forever
    select {}
}

在这个例子中,我们首先建立了与Kubernetes集群的连接。然后,我们定义了一个ListWatch对象,它负责监听Kubernetes API中的Pods资源。接下来,我们创建了一个Informer,它会启动一个控制器,并且定义了对应的事件处理函数。当Pods有变动时,比如添加、删除或者更新,相应的事件处理函数会被调用。这个例子展示了如何使用Informer机制来监控Kubernetes资源的变化。