kubernetes资源

resource

Deployment

kubectl apply -f https://k8s.io/examples/application/deployment.yaml kubectl describe deployment nginx-deployment

Nodes

tools

  • kubeadm

components

  • kubelet
  • kube-proxy
  • container runtime

Node Capacity

  • 如果是自动注册入cluster,同时提交memory,cpu等node的能力
  • 如果是手动加入,那么需要手动设置
  • 调度器scheduler保证所有容器的资源需求不大于节点的资源能力
  • 总量只是被kubelet管理的容器,不包括直接启动的容器,也不包括其他非kubelet控制的进程(也占资源)

Pods

NAME SHORTNAMES purpose
pods po  
services svc  

k8s的最小管理和调度单元,一个pod中可以有1个或多个容器。这些容器共享网络、存储

Volumes 存储

Persistent Volumes(PV)

Persistent Volumes Claim(PVC)

Service

一组pods提供的服务。在你的集群中,如果有一组pods提供一种服务(比如检索服务),但是pods会不断的更新、销毁后重启拉起,使用这组 服务的其他服务,如何马上切换到最新的pods机器ip上去呢? service解决这样的问题。

  • service –> Pods
  • service –> your own service(like database,不是部署在k8s中的)
  • service –> service(其他的Namespace)
  • 非指向pods的service,需要指定Endpoints(也就是具体的ip和端口),这里需要注意哪些ip是不能指定到Endpoints中的,比如另一个service的虚拟ip

kube-proxy

iptables mode

  • by Linux netfilter (不需要用户态、内核态切换)
  • 可靠性高

IPVS proxy mode

  • call netlink interface to create IPVS rules
  • is based on netfilter hook function. 和iptables相似,工作于内核态,使用了hash表
  • 更低的时延(lower latency),更高的性能(better performance)
  • 支持更高的吞吐量(throughput)
    • rr: round-robin 轮询
    • lc: least connection (smallest number of open connections) 最少链接
    • dh: destination hashing 目的地址hash
    • sh: source hashing 源地址hash
    • sed: shortest expected delay 最小延迟
    • nq: never queue 不进等待队列??

Note: IPVS是一个内核模块,启动kube-proxy之前,确保IPVS可用。

服务发现 Discovering services

  • 环境变量
  • DNS

更好的方式,DNS Server(CoreDNS/kube-dns),原理也是watch k8s的API

* $service_name$.$namespace$

Headless Services

NetworkPolicy

pods之间是否都运行访问呢?

  • ingress
  • egress

网络相关

  • Pod 网络组件,给pod提供网络(CNI),pod之间的网络交互。 Calico
  • DNS ,必须有Pod网络,DNS才能工作
  • NetworkPolicy 网络的ACL
  • Calico,a networking and network policy provider.

k8s组件

  • worker node(nodes/worker machines)
  • Pods

控制面的组件

  • Master Nodes
    • kube-apiserver, 水平扩展,可部署多个
    • etcd, 保存持久化数据
    • kube-scheduler,监听没有指定具体node的Pod新建需求,调度选择一个node给这个新pod。
      • 资源需求
      • 硬件/软件/策略限制/亲和性/反亲和性/数据位置/工作负载/
    • kube-controller-manager。 本质上是多个controller,为了降低复杂度,编译成了一个二进制执行文件,并单进程运行。
      • Node controller:node节点宕机(下线)通知
      • Replication controller : 维持pods的数量
      • Endpoints controller: 加入的services和pods
      • 服务Account & Token 控制器:给新的命名空间创建默认的账号和访问tokens
  • worker Nodes
    • kubelet
    • kube-proxy
    • Container runtime
      • Docker
      • containerd
      • CRI-O
      • 其他的一个对CRI的实现(只要实现Container Runtime Interface标准的都可以)

插件 Addons

利用k8s的资源(DaemonSetEnsures, Deployment等等)来实现计算特性,这些都是集群的特性,所以放在kube-system的命名空间里。

  • DNS
  • Web UI(Dashboard)
  • 容器资源监控
  • 集群级别的日志

k8s APIserver

暴露http的接口。终端用户、集群中的不同部分、其他一些组件

kubectl

API如何兼容老版本

spec 和 status

申明式

Controllers

在k8s中,控制器不断循环观察集群的状态。每个控制器都不断将当前的集群状态逼近期望的状态

NAME SHORTNAMES purpose
ReplicaSet rs maintain a stable set of replica Pods running at any given time
ReplicationController rc a specified number of pod replicas are running at any one time
Deployments deploy provides declarative updates for Pods and ReplicaSets. 部署升级
HorizontalPodAutoscaler hpa  

CRD(Custom Resource Definition)

  • 定义一个yaml文件
    • kind: CustomResourceDefinition
    • 其他信息
  • $kubectl api-resources 可以看到自定义的资源类型 doc

创建CRD的过程

  1. 创建CRD, 让k8s‘认识’我们自定义的API对象
  2. 编写基础代码,使用代码工具生成controller之外的代码
  3. 编写controller代码
  4. 编译代码
NAME SHORTNAMES APIGROUP NAMESPACED KIND
nodes no   false Node
pods po   true Pod
crontabs ct stable.example.com true CronTab

docker

docker instructions

  • cpu
  • cpushare
  • cpuset

Ingress


vim的buffer windows tab

Buffers Windows Tabs 说明
  :split [filename] :tabnew Open a new
:e [filename] vsplit [filename] :tabedit [filename] Edit the file with the provided name
:b[num]     Open buffer number N(as shown in ls)
:bn   gt Go to next
:bp   gT Go to Previous
:ls   :tabs list
  Ctrl+w+h/j/k/l   switch windows
  Ctrl+w+w   switch windows
:bd     delete the current buffer, error if there are unwritten changes
:bd!     deletes the current buffer, no error if there are unwritten changes
:q :q   quit

vim开发环境

ctags

  • 使用ctrl+] 跳到方法定义或实现的地方 # cscope也提供
  • 输入一个”对象“时 foo. or foo-> 自动提示 # cscope不提供

使用方式

ctags -R #将源文件(.c .cpp), 构建成tag文件

  • 使用ctrl+]跳到方法定义或实现的地方,ctrl+t返回
  • :tag tag1 直接跳到对应的tag
  • vim -t main 直接vim打开对应的tag文件,并将光标跳转到对应的行位置

cscope

Cscope

cscope特性

  • 像ctags一样 ctrl+],使用 set cscopetag
  • 还提供当前方法,被调用的地方,可以跳转到调用位置
  • 搜索
    • 文本
    • 正则
    • 文件
    • 函数及调用函数

      使用方式

      cscope -Rbq ## 产生对应的文件,供vim使用

golang 开发插件

vim-go

  • vim-go github
  • vim-go requires at least Vim 8.0.1453 or Neovim 0.4.0.

    主要功能

    本身go命令有很多功能,比如:go doc fmt / go doc fmt.Print,将一些功能直接添加到vim中。

  • 编译: Build/Install/Test/TestFUnc go build/ go install /go test /go testfunc
  • 运行: Run 当前文件 go run
  • 语法高亮 & 代码折叠
  • 调试工具 delve(:GoDebugStart)
  • gopls工具集合
  • :GoDef 跳到定义的地方(变量、方法定义)
  • vim 里面支持的Ctrl+],原理是vim的tag(:help tag),我们可以添加很多的tag,比如,一个程序里的方法名就可以是一个tag,但是生效之前,你必须生成tag(tag和文件的关系),可以使用ctags来生成这个tags。要返回原来标签的位置使用Ctrl+T or Ctrl+O
  • go源文件支持的’ctrl+]’不是tags来支持,但是要使用:tag tag1,这里是根据tags文件来定位的
  • 文档 :GoDoc or :GoDocBrowser
  • 依赖包引入 :GoImport :GoDrop
  • 其他
      :GoRename
      :GoCoverage
      :GoAddTags  :goRemoveTags
      :GoLint  :GoVet  :GoErrCheck
      source analysis tools  guru     :GoImplements   :GoCallees   :GoReferrers
    

使用方法

  • :GoInstallBinaries 安全vim-go依赖的一些工具 完整的文档地址doc/vim-go.txt. vim中使用 :help vim-go.

添加go相关的tags

修改ctags配置 ~/.ctags

--langdef=Go
--langmap=Go:.go
--regex-Go=/func([ \t]+\([^)]+\))?[ \t]+([a-zA-Z0-9_]+)/\2/d,func/
--regex-Go=/var[ \t]+([a-zA-Z_][a-zA-Z0-9_]+)/\1/d,var/
--regex-Go=/type[ \t]+([a-zA-Z_][a-zA-Z0-9_]+)/\1/d,type/

怎样生成tags

  • ctags -R

tags文件格式

可以认为是tag对应文件及位置的关系(tag1–>file1.line20)。然后就可以直接跳转到对应的位置。

StringUtils StringUtils.cpp /^    StringUtils::StringUtils()$/;"    f   class:lang3::StringUtils
StringUtils StringUtils.h   /^    class StringUtils{$/;"    c   namespace:lang3
 _LANG3_STRINGUTILS_ StringUtils.h   2;" d
isBlank StringUtils.cpp /^    bool StringUtils::isBlank(const std::string &text){$/;"   f   class:lang3::StringUtils
 isEmpty StringUtils.cpp /^    bool StringUtils::isEmpty(const std::string &text){$/;"   f   class:lang3::StringUtils
isNotBlank  StringUtils.cpp /^    bool StringUtils::isNotBlank(const std::string &text){$/;"    f   class:lang3::StringUtils
isNotEmpty  StringUtils.cpp /^    bool StringUtils::isNotEmpty(const std::string &text){$/;"    f   class:lang3::StringUtils
lang3   StringUtils.cpp /^namespace lang3{$/;"  n   file:
lang3   StringUtils.h   /^namespace lang3{$/;"  n
main    StringUtils.cpp /^int main(){$/;"   f
~StringUtils    StringUtils.cpp /^    StringUtils::~StringUtils()$/;"   f   class:lang3::StringUtils
CLIF_argument_struct    traceroute-2.1.0/libsupp/clif.h /^struct CLIF_argument_struct {$/;" s
CLIF_call_func  traceroute-2.1.0/libsupp/clif.c /^int CLIF_call_func (CLIF_option *optn, char *arg) {$/;"   f

最小工具集

  • tag相关

    展示、查找、索引tag

插件 说明
taglist 标签列表,主要是展示函数列表、字段等
  • 文件浏览及buffer浏览相关

    展示、查找、索引 文件(file&folder)

插件 说明
minibufexpl 文件打开后(buffer),展示文件名
bufexplorer 展示buffer相关信息
winfileexplorer.vim 文件浏览器
  • Windows相关

    需要区分清楚Buffers Windows Tabs

插件 说明
winmanager 管理windows的布局,如何放上面这些插件,如将taglist放左上,fileexplorer放左下

kubelet功能

安装

### 使用kubeadm 先安装三个执行程序(组件)

  • kubeadm
  • kubelet
  • kubectl

    master 上使用 kubeadm 初始化, 使用kubeadm将当前node节点join到这个集群中

(图中没有kubeadm)

kubernetes组件

  • API Server(工作于master node中),所有管控面的入口
  • scheduler,调度器,通过和api server交互和调度算法,将pod调度到node上
  • controller manager,各种controller集合,将deployment、replicaset中的期望结果变成现实(执行并达到期望结果)
  • kubelet(work node上),监听获取master的指令,将node上的信息提交给master
  • kube-proxy,主要是数据平台的数据出入口

kubelet是node上的重要组件

每个node上有一个kubelet

kubelet的主要功能

  • 创建pod
  • 监视pod
  • 挂载volums
  • 运行容器
  • 周期执行探针
  • 下载pod的secret
  • 上报pod状态
  • 上报node状态

创建pod功能

  • 通过读取文件来创建pod,比如static pod
  • 通过启动参数中的url,获取到pod定义文件
  • 通过apiserver获取pod的定义文件

virtual kubelet解决的问题

有的情况,并不想将一个node(物理机或者虚拟机)直接变为一个集群中的一个node。比如,有10台物理机的集群,想把这个10台物理机的集群,作为一个node加入到k8s的集群中,那么virtual kubelet(virtal node)就能派上用场

云厂商怎样使用vk

https://github.com/virtual-kubelet/virtual-kubelet

  • 主要场景,就是serverless 容器


汇编语言之寄存器

计算机体系结构

CPU

Linux C编程一站式学习

计算过程中暂存数据

寄存器 64位 32位 16位 说明
累加寄存器 RAX EAX AX 通用寄存器
基址寄存器 RBX EBX BX 通用寄存器
计数寄存器 RCX ECX AX 通用寄存器
数据寄存器 RDX EDX DX 通用寄存器
堆栈基指针 RBP EBP BP base point 指针变址寄存器
堆栈顶指针 RSP ESP SP stack point 指针变址寄存器
  RSI ESI SI 指针变址寄存器
  RDI EDI DI 指针变址寄存器
  r8      
  r9      
  r10      
  r11      
  r12      
  r13      
  r14      
  r15      

IP寄存器:指令指针寄存器(Instruction Pointer Register),指向代码段下一条指令的位置。

寄存器 64位 32位 16位 说明
IP寄存器 RIP EIP IP 指向代码段下一条指令

段寄存器。每个进程都分代码段和数据段,为了指向不同进程的地址空间。

寄存器 64位 32位 16位 说明
Code Segment Register CS   CS 代码段寄存器,代码在内存中的位置
Data Segment Register DS   DS 数据段寄存器,数据在内存中的位置
Stack Register SS   SS 栈寄存器,后进先出的数据结构
  ES   ES  
  fs      
  gs      
  eflags     计算过程中产生的标志位

如果运算中需要加载内存中的数据,需要通过DS找到内存中的数据,加载到通用寄存器中。CS、DS都存放这一个段的起始地址。代码的偏移量在IP寄存器中,数据段的偏移量会放在通用寄存器中。

《趣谈Linux操作系统》

寻址方式

  • 直接寻址(Direct Addressing Mode)。只使用ADDRESS_OR_OFFSET寻址,例如movl ADDRESS, %eax把ADDRESS地址处的32位数传送到eax寄存器。

  • 变址寻址(Indexed Addressing Mode) 。上一节的movl data_items(,%edi,4), %eax就属于这种寻址方式,用于访问数组元素比较方便。

  • 间接寻址(Indirect Addressing Mode)。只使用BASE_OR_OFFSET寻址,例如movl (%eax), %ebx,把eax寄存器的值看作地址,把内存中这个地址处的32位数传送到ebx寄存器。注意和movl %eax, %ebx区分开。

  • 基址寻址(Base Pointer Addressing Mode)。只使用ADDRESS_OR_OFFSET和BASE_OR_OFFSET寻址,例如movl 4(%eax), %ebx,用于访问结构体成员比较方便,例如一个结构体的基地址保存在eax寄存器中,其中一个成员在结构体内的偏移量是4字节,要把这个成员读上来就可以用这条指令。

  • 立即数寻址(Immediate Mode)。就是指令中有一个操作数是立即数,例如movl $12, %eax中的$12,这其实跟寻址没什么关系,但也算作一种寻址方式。

  • 寄存器寻址(Register Addressing Mode)。就是指令中有一个操作数是寄存器,例如movl $12, %eax中的%eax,这跟内存寻址没什么关系,但也算作一种寻址方式。在汇编程序中寄存器用助记符来表示,在机器指令中则要用几个Bit表示寄存器的编号,这几个Bit也可以看作寄存器的地址,但是和内存地址不在一个地址空间。

    Linux C编程一站式学习