Ary's HERE


  • Startseite

  • Archiv

  • Tags

kubernetes tips

Veröffentlicht am 2016-09-02

kubernetes

总体架构

kubernetes集群由2类节点组成:Master和Node。
在Master上运行etcd、API Server、Controller Manager和Scheduler四个组件,后三个负责对集群中所以资源进行管控和调度。
在每个node上运行kubelet、Proxy、Docker Deamon三个组件,负责对节点上的pod的生命周期管理,以实现服务代理。
在所有节点上都可以运行kubectl命令,提供了kubernetes的集群管理工具集。
etcd是高可用的key/value存储系统,用于持久化存储集群中的所有资源对象。
API Server提供了操作etcd的封装接口API,以REST方式提供服务。
可知,kubernetes的各组件功能如下:

API Server

提供资源对象的唯一操作入口

Controller Manager

集群内部的管理控制中心,主要是实现集群的故障检测和恢复的自动化工作

Scheduler

集群调度器,负责pod在节点中的调度分配

kubelet

负责本node节点上的pod的全生命周期管理

Proxy

实现Service的代理及软件模式的负载均衡器

start basic

to know

在kubernetes中,node,pod,rs,rs这些概念都可以被看作是一种资源对象,通过kubernetes提供的kubectl工具或api调用进行操作,并保存在etcd中。

node

Node是kubernetes集群中相对于Master而言的工作主机,可以是一台物理主机,也可以是一台虚拟机。
在每个node上运行用于管理pod的服务-kubelet,并且能够被Master管理,
在node上运行的服务包括kubelet,kube-proxy,docker daemon,
查看node信息:

1
kubectl describe node <node_name>

node 管理

node通常是物理机、虚拟机或云数据提供商提供的资源,说kubernetes创建了一个node,是说node通常是物理机、虚拟机或云数据提供商提供的资源,说kubernetes在内部创建了一个node对象,创建后对其进行一系列健康检查,“Ready”状态后即可用

node controller

node controller是kubernetes Master的一个组件,用于管理node对象,有2个功能:集群范围内的node信息同步,以及单个node的生命周期管理。
node信息同步可以通过kube-controller-manager的启动参数–node-sync-period设置同步的时间周期

node 自注册

kubelet启动参数:

  • –apiservers (地址)
  • –kubeconfig (登陆apiserver的证书)
  • –cloud_provider (云服务商地址,用于获取自身的metadata)
  • –register-node (设置为true时表示自动注册到apiserver)

pod

pod包含多个紧密相关的容器,一个pod可以被一个容器化的环境看作应用层的”logical host”,
一个pod中的多个容器通常是紧耦合的,pod在node上被创建、启动或销毁。

为何封装一层pod?

Docker容器间通信受Docker网络机制的限制,在Docker的世界中,一个容器需要link方式才能访问另一个容器提供的服务,大量容器间的link很麻烦,pod将多个容器组合在一个虚拟的主机内,可以实现容器间仅需要通过localhost就能互相通信。

一个pod中的容器共享一组资源。如下

  • PID命名空间-Pod中的不同应用程序可以看到其他应用程序的进程ID
  • 网络命名空间-Pod中的多个容器能够访问同一个IP和端口范围
  • IPC命名空间-Pod中的多个容器能够使用SystemV IPC或POSIX消息队列进行通信
  • UTS命名空间-Pod的多个容器共享一个主机名
  • Volumes(共享存储卷):Pod中的多个容器可以访问在Pod级别的Volumes

pod 细节

对pod的定义通过json或yaml的配置文件来完成,在spec中包含了对container的定义,
一个pod的生命周期是通过Replication Controller来管理的,包括:通过模板定义,然后分配到一个node上运行,在pod所含容器运行结束后pod也结束。
pod有4种状态:

  • Pending-pod已提交到Master,但其需要的image还不能用,或者Master还在进行调度
  • Running-ok
  • Succeeded-pod运行结束,未被重启
  • Failed-通常是某个容器有问题,被关掉了,或者pod结束,但有容器是以失败状态结束的。

kubernetes为pod设计了一套独特的网络配置,包括:为每一个pod分配一个ip地址,使用pod名作为容器间通信的主机名等

Label

Label以key/value的键值对形式附加到各种对象上,Label定义这些对象的可识别属性,用来进行管理和选择。
在为对象定义好label后,其他对象就可以使用Label Selector来定义其作用的对象了。

2种Label Selector:

  • 基于等式的 (Equality-based)
    eg: name=redis-slave
  • 基于集合的 (Set-based)
    eg: name in (redis-master,redis-slave)

在使用时可以将多个Label进行组合来选择
在Replication ControllerheService的定义中需要在spec.selector中指定Label来确定相关pod

Replication Controller

rc用于定义pod副本的数量,在Master内,Controller Manager进程通过RC的定义来完成pod的创建、监控、启停等操作。
通过RC的定义,kubernetes总是保证集群中运行着用户期望的副本数量(Replica)。
通过对RC的使用,kubernetes实现了应用集群的高可用性,并大大减少了传统运维的压力
在运行时,可以通过修改RC的副本数量,来实现pod的动态缩放(Scaling)。

1
kubectl scale rc redis-slave --replicas=3

但是,删除rc不会删除其pod,需要指定replica为0,然后更新该rc。
客户端工具kubectl提供了stop和delete命令来一次性删除RC和RC控制的全部pod。

Service

在kubernetes里,每个pod被创建时都会被分配一个单独的ip,而一个service可以看做是一组提供相同功能的pod的对外访问接口,service作用于哪些pod是通过label来定义的。
定义一个service后,spec.selector表示该service将包含所有符合条件的pod,
在pod正常启动后,系统将会根据service的定义创建出与pod对应的endpoint对象,以建立起service与后端pod的对应关系。
随着pod的创建,销毁,endpoint对象也将被更新。
endpoint对象主要由pod的ip地址和容器所需监听的端口号组成

ip地址

pod的ip地址是Docker Daemon根据docker0网桥的ip地址段进行分配的,但service的clusterIP地址是kubernetes系统中的虚拟ip地址,由系统动态分配。
service的cluster ip相对与pod的ip地址来说比较稳定,在销毁前都不会变。

外部访问Service

由于service在clusterIP Range池中分配的ip只能在内部访问,需要给这个service提供公共ip
2种type定义对位服务:

  • NodePort
    spec.type=nodePort
    spec.ports.nodePort=80
    这样,在每一个启动了该service下的pod的node上,都会打开一个80端口
  • LoadBalancer
    如果云服务器支持外接负载均衡器,可以通过spec.type=LoadBalancer来定义service,同时需要指定负载均衡器的ip地址(clusterIP)
    当有多个端口需要暴露时,可以通过端口命名来避免endpoint重复。

Volume

Volume是pod中能够被多个容器访问的共享目录,当容器终止或重启时,Volume中的数据也不会丢失。
kubernetes支持多种类型的volume,并且一个pod可以同时使用多个volume。
类型如下:

  • EmptyDir
    在pod被分配到node时创建,初始内容为空,pod中所以容器都能读写,当pod移除后,这些数据也会被永久删除
  • hostPath
    在pod上挂载宿主机上的文件或目录

    用处

    容器应用程序生成的日志文件需永久保存
    需要访问宿主机上docker引擎内部数据结构的容器应用

  • gcePersistentDisk
    表示使用谷歌计算引擎(Google Compute Engine,GCE)上永久磁盘(Persistent Disk,PD)上的文件,内容会被永久保存。
    当pod被删除时,PD只是被卸载,但不会被删除,使用前要先创建一个PD

  • awsElasticBlockStore
    使用Amazon提供的Amazon web Services(AWS)的EBS Volume,并可以挂载到pod中
  • nfs
    使用NFS(网络文件系统)提供的共享目录挂载,需要系统中有一个运行中的NFS系统
  • iscsi
  • glusterfs
  • rbd
  • gitRepo
  • secret
  • persistentVolumeClaim

Namespace

使不同的分组在共享使用整个集群的资源时还能被分别管理

Annotation

是用户定义的附加信息,便于外部工具查找

宏观的看看

发展

由来

kubernetes是一个全新的基于容器技术的分布式架构领先方案,但实际上它是google几十年来大规模应用容器技术的经验积累。
Borg 的一个开源版本。kubernetes提供的解决方案和强大的自动化机制,使得系统后期的运维难度和运维成本大幅度降低。
kubernetes没有语言限制,通过标准的TCP通信协议进行交互。
这是一个完备的分布式系统支撑平台,具有完备的集群管理能力,包括多层次的安全防护和准入机制,多租户应用支撑能力,透明的服务注册和服务发现机制,内建智能负载均衡器,强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制,以及多粒度的资源配额管理能力。
同时还提供了完善的管理工具,包括开发,部署,测试,运维监控。
所以是一个一站式的完备的分布式系统开发和支撑平台。

核心

service是分布式集群机构的核心,service的服务进程目前都基于Socket通信方式对位提供服务,如Redis,Memacache,MySQL,Web Server,或者是实现了某一个具体业务的一个特定TCP Server服务。
一个服务一旦创建就不再变化,只要通过这个固定的虚拟ip就可以访问到。
每一个pod里运行着一个称为pause的容器,其他称为业务容器,这些容器共享pause容器的网络栈和volume挂载卷,彼此之间通信和数据交换更为高效。
只有那些提供服务的一组pod才被映射一个服务。

服务扩容和系统升级

服务扩容涉及资源分配(选择哪个节点进行扩容)、实例部署和启动,在kubernetes中,只需要为扩容的service关联的pod创建一个ReplicationController,则该service的扩容以至于后来的service升级等问题得到解决。
一个rc的定义文件包括:pod的定义、pod需要运行的副本数量(Eplicas)、要监控的目标pod的label。
service升级也通过修改rc来自动完成。

微服务

微服务架构的核心是将一个巨大的单体应用分解为很多小的互相连接的微服务,一个微服务后面可能有多个实例副本在支撑,副本的数量可能会随着系统的负荷变化而进行调整,内嵌的负载均衡起了很大作用。
每个微服务独立开发、升级、扩展,系统具有很高的稳定性和快速迭代进化能力。
kubernetes架构具备超强的横向扩容能力。

使用

起一个本地集群

首先cd进本地的kubernetes文件夹
然后执行

1
hack/local-up-cluster.sh

接着新开一个terminal,然后设置如下

1
2
3
4
export KUBERNETES_PROVIDER=local
cluster/kubectl.sh config set-cluster local --server=http://127.0.0.1:8080 --insecure-skip-tls-verify=true
cluster/kubectl.sh config set-context local --cluster=local
cluster/kubectl.sh config use-context local

这样就可以开始用kubectl来管理查看这个集群了。

browserify

Veröffentlicht am 2016-08-11

ssh

Veröffentlicht am 2016-08-10

#ssh

基本使用

我用ssh做了什么

往docker里放文件

以前不知道还可以这样,每次都很笨的强行复制粘贴,今天宋姐告我,可以用ssh登陆到自己的本地主机,然后把本地主机的文件放上来。

scp

1
scp ary@192.168.53.156:/home/ary/xx.js /home/root/xx.js

如果是传一个文件夹的话

1
scp -f ary@192.168.53.156:/home/ary/xx /home/root/

Asynchronous-何为异步

Veröffentlicht am 2016-08-05

何为异步

异步的存在意义

异步的一般实现

队列

可以创建一个队列,然后给里面加消息,当然也要能给传参数
然后有一个用来接收队列消息
接收到以后处理消息,并删除该消息,
这样一个实现机制一般是循环查看队列里的内容
也可以与之通信
每次加进去后申请处理,类似回调
lalala
这应该类似node的实现机制,有一个事件池

听说php是最好的语言?

Veröffentlicht am 2016-08-03

php你为何这么吊

$

变量就是$加字母
所以在一个php里会看到很多$
有种jquery即视感
一个php文件的格式如下

<?php
    phpinfo()
?>

“.”

“.”可以表示字符串的相加

$a="m";

那么

$a."n" =>"mn"

function(){}

作为一门脚本语言,这方面php和js很像,直接声明

function myfunc(){
  dothings();
}

但有一点不同的是,php的一个全局变量要被子作用域里的函数访问时,要加

global $x;

比较奇特的是,php里只要是不在函数里定义的变量,都是全局的。
所有的全局变量被保存在一个数组中$GLOBALS[index]

用static的话,执行该函数时,里面的变量不会被重新赋值,延用上一次的值,就不需要递归传值了

static $m=0;
$m++;

echo

echo是php里输出东西,用来调试的一个东西
echo后面加变量或直接加字符串都行
尤其在今天的nginx里,
不知道怎么用log_format来格式化我要输出的变量,
直接echo
然后这个变量的值就被扔到response里面了,
也是一个看log偏方

$m=0;
$cars=array("a","b");
echo "m=$m";
echo "car is {$cars[0]}";

读写文件

读取/创建

$myfile = fopen("newfile.txt", "w");

如果这个文件不存在,那么就会创建这样一个文件

写入

$txt = "Bill Gates\n";
fwrite($myfile, $txt);
$txt = "Steve Jobs\n";
fwrite($myfile, $txt);

2次写入不会覆盖,加\n就会把指针指到下一行
但如果这个文件之前有东西,那么这个文件之前的内容会被重写。

读入

fread函数读取打开的文件,第一个参数是文件名,第二个参数规定读多少,如下会全部读进来

fread($myfile,filesize("webdictionary.txt"));

fgets()会从文件读取单行,调用fgets函数后,文件指针会移动到下一行。

$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
echo fgets($myfile);

feof()会检查是否已经到达文件的最后

while(!feof($myfile)) {
echo fgets($myfile) . "<br>";
}

fgetc函数读取单字符

echo fgetc($myfile);

删除文件

unlink函数
如果成功删除就返回true
如果失败就返回false

if (file_exists($myfile)) {
  $result=unlink ($myfile);
  echo $result;
}   

时间戳

time()

随机数

rand(min,max);

转换为string

$mystr=(string)$mystr;

和js的基情

今天在做php发邮件的时候(是的,这个还没做完),老大说可以用escape来做,一查发现卧槽这是js的方法啊,一查卧槽php和js还可以交互的,同是脚本,不过网上的例子都很丑

<script type="text/javascript">
  function myfunc(){
    alert("i'm js");
  }
</script>

<?php echo "<script type="text/javascript>myfunc()</script>"?>

听老朱一说才恍然大悟,这其实不能算正经交互,“这个原理是服务器解析php代码渲染成html代码”,“等js跑的时候php已经结束工作了”,“已经到网页交给浏览器了”,“这就跟用eval()运行js代码一样丑陋”,一波吐槽以后,搞明白了,果然语言之间交互还是不那么容易的

传说中的vim~

Veröffentlicht am 2016-08-01

linux下初体验

敲命令之入门篇

首先安装:

1
sudo apt-get install vim

新建文件

1
vim file.file

跳转到第n行

1
:n + [enter]

进入编辑模式

1
i

保持退出

1
:wq + [enter]

跳转

字节间移动

k   上移
j   下移
h   左移
l   右移

较大范围移动

ctrl+f    page down
ctrl+b    page up

更大范围移动

*        光标停在某一处时,按*键继续寻找下一个该单词
#        原理同上,寻找上一个
g_       到本行最后一个非空字符

相对于屏幕中

2H    移动到屏幕的第2行
M     移动到屏幕中间
3L    移动到倒数第3行

行内移动

w   右移到下一个字的开头
e   左移到末尾
b   左移到前一个字的开头
0   左移到本行开始
$   右移到本行末尾
^   移动到本行第一个非空字符串

搜索匹配

/mail   正向搜素
n       下一个mail出现的位置
N       上一个mail出现的位置
?mail   反向搜索

替换&删除

dd    删除所在行
3dd   剪切3行内容,去除空隙
5db   删除左侧的5个字
3dw   删除右侧的3个字
x     删除当前字符

复制&粘贴

p     粘贴到光标后面
P     粘贴到光标前面
yy    复制当前行
5yy   复制5行内容

撤销&重复

u     撤销前一条命令
.     重复前一条命令

命令模式

talk with me

Veröffentlicht am 2016-07-28

day note

2016-07-28

实习风波也告一段落,从开始的百姓网不过,然后趣医、阿里体育的各种奇怪offer,其实无感
真的是因缘分在微博上认识到晗姐,进入微博hr的视野,顺利通过以后,感觉是不是要在北京开始新人生了,虽然还是选择了安逸的我,会不会被以后的自己笑懦弱呢?
起码眼前的小日子,让我舍不得了吧,,
现在是很舒服,但是相对来说,一晚上突击通过的笔试面试,还是会心有不安
每每做php,或者跑docker不顺利,都会怀念玩js的日子
进来时想着做数据挖掘,到现在天天看nginx日志,算不算落差也不知道
总是会有一点小想法,想折腾~
多思考人生总是有好处的
就算想不明白以后的路该怎么走
也能明白现在的路还该不该继续往下走
怕做前端委屈了自己的远大包袱,但其实做大数据也还是个程序员
万事开头难,有一个好的开始不是那么容易的
趁年轻多尝试罢,总要走过一遍的

nginx

Veröffentlicht am 2016-07-28

try to get the point

how it works?

基本路由映射文件

orders

关掉所有nginx进程

1
/usr/sbin$ killall nginx

启动nginx服务

1
/usr/sbin$ nginx

查看当前的nginx进程

1
/usr/sbin# ps -aux|grep nginx

errors

作为一个新手,也不例外遇到了很多神奇的bug-

failed to open stream:Permission denied in

导致这种情况发生有2种可能
第一种,目标文件的路径不对或者文件不存在
这个是比较误导的情况,首先应该检查这种情况是否出现,只需更正路径即可
第二种,就是字面意思权限问题
这段代码所在文件没有权限做你想做的事情,无论读或者写,要做的就是给你的代码文件或当前目录更高的权限:

1
chmod 777 file

777的意思是一个权限代码,可读可写可创建,一般都够了。

catch idea

Veröffentlicht am 2016-07-28

lighting the World

technology

so what can we do on github

grab the websites?
with python?
talk with ary?
apis & data network

new life

note everywhere

开始可以只是一个插件,比如运行在浏览器端,一个指令,就出现一个窗口,可以编辑的窗口,看到什么东西,想到什么东西,放上去,等会再拿出看特方便,
point在方便,
或许可以做成一个app的形式,但一个app就感觉失去了方便的优势
可以多个平台串联起来
如果做大

a better man

Master road ==;

Veröffentlicht am 2016-07-24

Master

[复习日常]

正在进行中

  • 单词
  • 高数
  • 概率论
  • 数据结构&算法

每日打卡

2016-07-24

  • G : 和宝宝开始复习数学啦,宝宝对我很不满意 ==,我在看概率论,宝宝在看高数,来本部以后第一次来图书馆。
  • G : 宝宝想着要买礼物,我得问问。
  • G : 把概率论第二章看完去瞄一眼高数。
  • G : 把第二章看完啦,去瞄一眼高数。

2016-07-25

  • G : 难过的一天,要保持游泳的好习惯🏊
  • G : 回来好好复习。

2016-07-28

  • 几天没写,不太好
  • 想着做一个爬虫,爬各种技术文章,巴拉巴拉…
  • 或者把之前那个人工智能的做深,加入神经网络

Plan

[Math]

高数

到7月底之前都要复习完前3章

概率论

到7月底之前都要复习完前4章

线性代数

[CS]

数据结构&算法

组成原理

系统结构

[English]

单词

每天的单词进度要跟上

听力

刷题

作文模版

[政治]

zzzZZ

1…345
Ary

Ary

42 Artikel
© 2017 Ary
Erstellt mit Hexo
Theme - NexT.Mist