Kubernetes 源码 (6) kube-scheduler

Submitted by Lizhe on Wed, 07/08/2020 - 03:08

 

Scheduler 是以一种 多人负责同一工作,然后基于投票激活一个主工作节点 的方式运作的。

领导者选举机制可以保证高可用性,但是正常工作的Scheduler节点只有一个,其他节点作为候选节点处于阻塞状态。

在领导者节点因某些原因而退出后,其他候选节点则通过选举机制竞选,成为新领导的节点将接替原来节点的工作。

 

选举机制是通过分布式锁来实现的,

  1. 分布式锁依赖于 Etcd 上的一个 key,key 的操作都是原子操作,将 key 作为分布式锁,它有两种状态——存在和不存在。

  2. key(分布式锁)不存在时:多节点中的一个节点成功创建该 key(获得锁)并写入自身节点的信息,获得锁的节点被称为领导者节点。领导者节点会定时更新(续约)该 key 的信息。

  3. key(分布式锁)存在时:其他节点处于阻塞状态并定时获取锁,这些节点被称为候选节点。候选节点定时获取锁的过程如下:定时获取 key 的数据,验证数据中领导者租约是否到期,如果未到期则不能抢占它,如果已到期则更新 key 并写入自身节点的信息,更新成功则成为领导者节点。

Kubernetes 源码 (5) 最小化启动

Submitted by Lizhe on Tue, 07/07/2020 - 06:06

这里将尝试使用之前编译完的源码来构建一个最小化启动的集群

20200707020919

要运行一个最小级别的 Kubernetes 至少要包括如下三个基本组件:

  1. kubelet:在集群中每个节点上运行的代理,负责容器真正运行的核心组件
  2. kube-apiserver:Kubernetes 控制平面的组件,提供资源操作的唯一入口
  3. 容器运行时(Docker)

 

我们创建一个 minik8s 的文件夹用来实验

拷贝 kubectl 和 kubelet 两个可执行二进制文件到这个文件夹中,然后创建一个 pods 文件夹

Kubernetes 源码 (4) kube-apiserver

Submitted by Lizhe on Thu, 07/02/2020 - 09:07

kube-apiserver 负责对外暴露管理用的Restful 服务。它是几乎所有其他组件沟通的主要桥梁。

参考下面 Pod 资源创建流程如下:

  1. 使用 Kubectl 工具向 Api Server 发起创建 Pod 资源请求
  2. Api Server 验证请求并将其保存到 Etcd
  3. Api Server 基于Watch机制通知scheduler
  4. Scheduler 根据调度算法为Pod资源对象选择最优节点并通知Api Server
  5. Api Server 将最优节点保存到 Etcd
  6. Api Server 通知该节点上的 kubelet
  7. Kubelet 调用docker环境
  8. Kubelet 将状态报告至 Api Server
  9. Api Server 保存容器状态到 Etcd

由此可见,Api Server 是一切动作交互的桥梁

 

kube-apiserver的启动流程如下

Kubernetes 源码 (3) 万事开头难 Kubectl

Submitted by Lizhe on Thu, 07/02/2020 - 02:49

 

kubectl 命令应该是使用 k8s 的人接触最多的命令了,我们从它开始,

这里我使用的是 vscode , 在debug 配置文件中

 

{

    // Use IntelliSense to learn about possible attributes.

    // Hover to view descriptions of existing attributes.

    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387

    "version": "0.2.0",

    "configurations": [

        {

            "name": "Launch",

            "type": "go",

            "request": "launch",

            "mode": "auto",

Kubernetes 源码 (2) 万物皆有入口

Submitted by Lizhe on Thu, 07/02/2020 - 01:46

 根据 Go语言项目标准项目结构

/cmd

该项目的主程序.

每个程序目录的名字应该和可执行文件的名字保持一致 (比如 /cmd/myapp).

不要在程序目录中放太多代码. 如果你觉得这些代码会被其他项目引用, 那它们应该被放在 /pkg 目录中. 如果这些代码不能被重用, 或者说你不希望别人重用这些代码, 那么就把它们放在 /internal 目录中. 你也许会惊讶于别人使用你代码的方式, 所以一定要保持你的意图足够明确!

一般来说一个足够小的 main 函数, 用于引入并执行 /internal/pkg 下的代码就足够了.

下面我们来看看cmd

Rasa 3 NLU

Submitted by Lizhe on Sat, 06/27/2020 - 02:22

The first piece of a Rasa assistant is an NLU model. NLU stands for Natural Language Understanding, which means turning user messages into structured data. To do this with Rasa, you provide training examples that show how Rasa should understand user messages, and then train a model by showing it those examples.

Run the code cell below to see the NLU training data created by the rasa init command:

1

cat data/nlu.md

 

 

lizhe@ubuntu:~/rasa_workspace$ cat data/nlu.md

## intent:greet

- hey

- hello

- hi

Rasa 2 New project

Submitted by Lizhe on Fri, 06/26/2020 - 07:23

The first step is to create a new Rasa project. To do this, run:

1 rasa init --no-prompt

The rasa init command creates all the files that a Rasa project needs and trains a simple bot on some sample data. If you leave out the --no-prompt flag you will be asked some questions about how you want your project to be set up.

 

This creates the following files:

Rasa 1 install

Submitted by Lizhe on Fri, 06/26/2020 - 07:18

Quick Installation

pip3 install rasa

 

1. Create a New Project

rasa init --no-prompt

 

2. View Your NLU Training Data

cat data/nlu.md

 

3. Define Your Model Configuration

cat config.yml

 

4. Write Your First Stories

## story1

Istio 16 熔断

Submitted by Lizhe on Thu, 06/25/2020 - 10:54

熔断的概念这里就不提了,主要是为了how而不是why

apiVersion: networking.istio.io/v1alpha3

kind: DestinationRule

metadata:

  name: flaskapp-desrule 

  namespace: lizhe 

spec: 

  host: flaskapp-service

  trafficPolicy:

    connectionPool:

      tcp:

        maxConnections: 1

      http:

        http1MaxPendingRequests: 1

        maxRequestsPerConnection: 1