kubernetes笔录

2018-12-13  本文已影响0人  davisgao

1.Etcd的容量

集群的节点数的多少除了要顾及性能压力外,还要考虑etcd的存储容量。可以反向的从内存大小去推断一个集群中能够支持的节点数目,以及缓存大小(此处的缓存值反序列化缓存大小)。官方的建议是120G的主机可以支持2000个节点,由此推断,每个节点的容量大概在60M左右,但是随着版本的更新,存入Etcd的数据和结构可能发生变化,该值也是需要调整的。

  序列化缓存大小计算:
  TargetRAMMB 为主机内存大小
  clusterSize := s.GenericServerRunOptions.TargetRAMMB / 60
  DeserializationCacheSize = 25 * clusterSize < 1000 ? 1000 :25 * clusterSize 

2.controller-manager

2.gc掉孤儿pod:pod上的node信息不在当前可调度的节点上,即没有和有效node绑定

   ```
   func (gcc *PodGCController) gcOrphaned(pods []*v1.Pod) {
    glog.V(4).Infof("GC'ing orphaned")
  // We want to get list of Nodes from the etcd, to make sure that it's as fresh as possible.
  nodes, err := gcc.kubeClient.CoreV1().Nodes().List(metav1.ListOptions{})
  if err != nil {
    return
  }
  nodeNames := sets.NewString()
  for i := range nodes.Items {
    nodeNames.Insert(nodes.Items[i].Name)
  }

  for _, pod := range pods {
    if pod.Spec.NodeName == "" {
        continue
    }
    if nodeNames.Has(pod.Spec.NodeName) {
        continue
    }
    glog.V(2).Infof("Found orphaned Pod %v assigned to the Node %v. Deleting.", pod.Name, pod.Spec.NodeName)
    if err := gcc.deletePod(pod.Namespace, pod.Name); err != nil {
        utilruntime.HandleError(err)
    } else {
        glog.V(0).Infof("Forced deletion of orphaned Pod %s succeeded", pod.Name)
    }
  }
}

3.gc掉没有调度成功的pod:表现在pod的NodeName为空,主要由于资源等条件不满足

func (gcc *PodGCController) gcUnscheduledTerminating(pods []*v1.Pod) {
    glog.V(4).Infof("GC'ing unscheduled pods which are terminating.")

    for _, pod := range pods {
        if pod.DeletionTimestamp == nil || len(pod.Spec.NodeName) > 0 {
            continue
        }

        glog.V(2).Infof("Found unscheduled terminating Pod %v not assigned to any Node. Deleting.", pod.Name)
        if err := gcc.deletePod(pod.Namespace, pod.Name); err != nil {
            utilruntime.HandleError(err)
        } else {
            glog.V(0).Infof("Forced deletion of unscheduled terminating Pod %s succeeded", pod.Name)
        }
    }
}
  //删除在删除队列中的Node
  go wait.Until(gc.runAttemptToDeleteWorker, 1*time.Second, stopCh)
   //删除孤儿Node
  go wait.Until(gc.runAttemptToOrphanWorker, 1*time.Second, stopCh)

3.kubelet中的GarbageCollect


4.实际上即便是kube-apisever自身和etcd通讯也是infomers的接口,只是本身的连接是通过回环网卡实现的。

client, err := internalclientset.NewForConfig(genericConfig.LoopbackClientConfig)
if err != nil {
    lastErr = fmt.Errorf("failed to create clientset: %v", err)
    return
}

kubeClientConfig := genericConfig.LoopbackClientConfig
sharedInformers = informers.NewSharedInformerFactory(client, 10*time.Minute)

5.Informer封装了对apiserver的事件监听处理操作包括AddFunc,UpdateFunc,DeleteFunc。


6.node的亲和与反亲和

有nodeAffinity和nodeSelector两种方式去控制的。

nodeSelector是必须要满足的情况。

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    disktype: ssd

nodeAffinity有两种类型


6.在大规模场景下的API Server优化


7.什么样的容器需要放在一个Pod中

前者依赖后者关系非常紧密的:


8.sidecar的应用场景


9.configmap的限制大小为1M(时间上是ETCD的要求),manifest无法使用


10.PV和PVC

PV分为静态和动态,静态需要预先创建


11.debug的调试方式、

12.Pod中的容器是如何共享namespace

实际上容器共享并不是共享所有内容如UTC只共享主机名称

func modifyHostOptionsForContainer(nsOpts *runtimeapi.NamespaceOption, podSandboxID string, hc *dockercontainer.HostConfig) {
    sandboxNSMode := fmt.Sprintf("container:%v", podSandboxID)
    hc.NetworkMode = dockercontainer.NetworkMode(sandboxNSMode)
    hc.IpcMode = dockercontainer.IpcMode(sandboxNSMode)
    hc.UTSMode = ""

    if nsOpts.GetNetwork() == runtimeapi.NamespaceMode_NODE {
        hc.UTSMode = namespaceModeHost
    }
}

主要步骤如下

13.QOS

14.Informer 关键逻辑解析

https://blog.csdn.net/chaosj/article/details/83831623

15.Request和Limit对应Cgroups的实现

15.Node的异常和恢复

在kubelet停止后,statefulset的pod会变成nodelost,接着就变成unknown,但是不会重启,然后等kubelet起来后,statefulset的pod才会recreate。
原文

上一篇 下一篇

猜你喜欢

热点阅读