2019独角兽企业重金招聘Python工程师标准>>>

Kubernetes学习笔记(一) 博客分类: Kubernetes

导语

2015年4月,传闻已久的Borg论文伴随Kubernetes的高调宣传被谷歌首次公开; 
Kubernetes是一个完备的分布式系统支撑平台,具有完备的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制,以及多粒度的资源配额管理能力。同时,Kubernetes还提供了完善的管理工具,这些工具涵盖了包括开发、部署测试、运维监控在内的各个环节。因此,Kubernetes是一个全新的基于容器技术的分布式架构解决方案,并且是一个一站式的完备的分布式系统开发和支撑平台。

一、核心概念


1、Node

Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod。Node上运行着Kubernetes的Kubelet、kube-proxy服务进程,这些服务进程负责Pod的创建、启动、监控、重启、销毁、以及实现软件模式的负载均衡。

Node包含的信息:

  • Node地址:主机的IP地址,或Node ID。
  • Node的运行状态:Pending、Running、Terminated三种状态。
  • Node Condition:…
  • Node系统容量:描述Node可用的系统资源,包括CPU、内存、最大可调度Pod数量等。
  • 其他:内核版本号、Kubernetes版本等。

查看Node信息:

kubectl describe node

2、Pod

Pod是Kubernetes最基本的操作单元,包含一个或多个紧密相关的容器,一个Pod可以被一个容器化的环境看作应用层的“逻辑宿主机”;一个Pod中的多个容器应用通常是紧密耦合的,Pod在Node上被创建、启动或者销毁;每个Pod里运行着一个特殊的被称之为Pause的容器,其他容器则为业务容器,这些业务容器共享Pause容器的网络栈和Volume挂载卷,因此他们之间通信和数据交换更为高效,在设计时我们可以充分利用这一特性将一组密切相关的服务进程放入同一个Pod中。

同一个Pod里的容器之间仅需通过localhost就能互相通信。

一个Pod中的应用容器共享同一组资源:

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

Pod的生命周期通过Replication Controller来管理;通过模板进行定义,然后分配到一个Node上运行,在Pod所包含容器运行结束后,Pod结束。

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

3、Service

在Kubernetes的世界里,虽然每个Pod都会被分配一个单独的IP地址,但这个IP地址会随着Pod的销毁而消失,这就引出一个问题:如果有一组Pod组成一个集群来提供服务,那么如何来访问它呢?Service!

一个Service可以看作一组提供相同服务的Pod的对外访问接口,Service作用于哪些Pod是通过Label Selector来定义的。

  • 拥有一个指定的名字(比如my-mysql-server);
  • 拥有一个虚拟IP(Cluster IP、Service IP或VIP)和端口号,销毁之前不会改变,只能内网访问;
  • 能够提供某种远程服务能力;
  • 被映射到了提供这种服务能力的一组容器应用上;

如果Service要提供外网服务,需指定公共IP和NodePort,或外部负载均衡器;

NodePort 
系统会在Kubernetes集群中的每个Node上打开一个主机的真实端口,这样,能够访问Node的客户端就能通过这个端口访问到内部的Service了

4、Volume

Volume是Pod中能够被多个容器访问的共享目录。

5、Label

Label以key/value的形式附加到各种对象上,如Pod、Service、RC、Node等,以识别这些对象,管理关联关系等,如Service和Pod的关联关系。

6、RC(Replication Controller)

  • 目标Pod的定义;
  • 目标Pod需要运行的副本数量;
  • 要监控的目标Pod标签(Lable);

Kubernetes通过RC中定义的Lable筛选出对应的Pod实例,并实时监控其状态和数量,如果实例数量少于定义的副本数量(Replicas),则会根据RC中定义的Pod模板来创建一个新的Pod,然后将此Pod调度到合适的Node上启动运行,直到Pod实例数量达到预定目标。

二、Kubernetes总体架构

Master和Node

Kubernetes将集群中的机器划分为一个Master节点和一群工作节点(Node)。其中,Master节点上运行着集群管理相关的一组进程etcd、API Server、Controller Manager、Scheduler,后三个组件构成了Kubernetes的总控中心,这些进程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理功能,并且全都是自动完成。在每个Node上运行Kubelet、Proxy、Docker daemon三个组件,负责对本节点上的Pod的生命周期进行管理,以及实现服务代理的功能。

流程 
通过Kubectl提交一个创建RC的请求,该请求通过API Server被写入etcd中,此时Controller Manager通过API Server的监听资源变化的接口监听到这个RC事件,分析之后,发现当前集群中还没有它所对应的Pod实例,于是根据RC里的Pod模板定义生成一个Pod对象,通过API Server写入etcd,接下来,此事件被Scheduler发现,它立即执行一个复杂的调度流程,为这个新Pod选定一个落户的Node,然后通过API Server讲这一结果写入到etcd中,随后,目标Node上运行的Kubelet进程通过API Server监测到这个“新生的”Pod,并按照它的定义,启动该Pod并任劳任怨地负责它的下半生,直到Pod的生命结束。

随后,我们通过Kubectl提交一个新的映射到该Pod的Service的创建请求,Controller Manager会通过Label标签查询到相关联的Pod实例,然后生成Service的Endpoints信息,并通过API Server写入到etcd中,接下来,所有Node上运行的Proxy进程通过API Server查询并监听Service对象与其对应的Endpoints信息,建立一个软件方式的负载均衡器来实现Service访问到后端Pod的流量转发功能。

  • etcd 
    用于持久化存储集群中所有的资源对象,如Node、Service、Pod、RC、Namespace等;API Server提供了操作etcd的封装接口API,这些API基本上都是集群中资源对象的增删改查及监听资源变化的接口。

  • API Server 
    提供了资源对象的唯一操作入口,其他所有组件都必须通过它提供的API来操作资源数据,通过对相关的资源数据“全量查询”+“变化监听”,这些组件可以很“实时”地完成相关的业务功能。

  • Controller Manager 
    集群内部的管理控制中心,其主要目的是实现Kubernetes集群的故障检测和恢复的自动化工作,比如根据RC的定义完成Pod的复制或移除,以确保Pod实例数符合RC副本的定义;根据Service与Pod的管理关系,完成服务的Endpoints对象的创建和更新;其他诸如Node的发现、管理和状态监控、死亡容器所占磁盘空间及本地缓存的镜像文件的清理等工作也是由Controller Manager完成的。

  • Scheduler 
    集群中的调度器,负责Pod在集群节点中的调度分配。

  • Kubelet 
    负责本Node节点上的Pod的创建、修改、监控、删除等全生命周期管理,同时Kubelet定时“上报”本Node的状态信息到API Server里。

  • Proxy 
    实现了Service的代理与软件模式的负载均衡器。

客户端通过Kubectl命令行工具或Kubectl Proxy来访问Kubernetes系统,在Kubernetes集群内部的客户端可以直接使用Kuberctl命令管理集群。Kubectl Proxy是API Server的一个反向代理,在Kubernetes集群外部的客户端可以通过Kubernetes Proxy来访问API Server。

API Server内部有一套完备的安全机制,包括认证、授权和准入控制等相关模块。

三、Hello World


启动Kubernetes

systemctl start etcd systemctl start docker systemctl start kube-apiserver systemctl start kube-controller-manager systemctl start kube-scheduler systemctl start kubelet systemctl start kube-proxy kubectl delete service redis-master //删除原来的Service,Pod、RC命令类似
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

定义RC来创建Pod 
Redis-master-controller.yaml

aipVersion: v1
kind: ReplicationController
metadata:name: redis-masterlabels:name: redis-master
spec:replicas: 1  //确保集群上只有一个Pod实例selector:  //Pod选择器,即监控和管理拥有这些标签的Pod实例name: redis-mastertemplate:  //根据此模板来生成Pod实例metadata:labels:name: redis-master  //Pod的标签,须和Service的Selector匹配spec:containers:- name: masterimage: kubeguide/redis-masterports:- containerPort: 6379

执行命令,将它发布到kubernetes集群中:

kubectl create -f redis-master-controller.yaml

查看命令

kubectl get rc
kubectl get pods

提供Redis服务的Pod已经创建并正常运行了,接下来创建一个与之关联的Service服务 
redis-master-service.yaml

apiVersion: v1
kind: Service
metadata:name:redis-masterlabels:name: redis-master
spec:ports:- port: 6379  //service暴露在cluster ip上的端口,即虚拟端口targetPort: 6379  //Pod上的端口selector:name: redis-master  //哪些Label的Pod属于此服务

执行命令:

kubectl create -f redis-master-service.yaml
kubectl get services

创建成功后会分配IP、端口,但由于IP地址是在服务创建后由Kubernetes系统自动分配的,在其他Pod中无法预先知道某个Service的虚拟IP地址,因此需要一个机制来找到这个服务。为此,Kubernetes巧妙地使用了Linux环境变量,在每个Pod的容器里都增加了一组Service相关的环境变量,用来记录从服务名到虚拟IP地址的映射关系。以redis-master服务为例,在容器的环境变量中会增加如下两条记录

REDIS_MASTER_SERVICE_HOST=10.254.144.74
REDIS_MASTER_SERVICE_PORT=6379

于是,其他应用就可以通过环境变量得到redis-master服务的虚拟IP、端口;

redis-slave-controller.yaml

apiVersion: v1
kind: ReplicatioinController
metadata:name: redis-slavelabels:name: redis-slave
spec:replicas: 2selector:name: redis-slavetemplate:metadata:labels:name:redis-slavespec:containers:- name: slaveimage: kubeguide/guestbook-redis-slaveenv:- name: GET_HOSTS_FROMvalue: envports:- containerPort: 6379

执行命令

kubectl create -f redis-slave-controller.yaml
kubectl get rc
kubectl get pods

为了实现Redis集群的主从数据同步,redis-slave需要知道redis-master的地址,所以在redis-slave镜像的启动命令/run.sh中,其最后的启动命令为:

redis-server --slaveof ${REDIS_MASTER_SERVICE_HOST} 6379

redis-slave-service.yaml

apiVersion: v1
kind: Service
metadata:name: redis-slavelabels:name: redis-slave
spec:ports:- port: 6379selector:name: redis-slave

执行命令:

kubectl create -f redis-slave-service.yaml
kubectl get services

创建web Pod和Service 
frontend-controller.yaml

apiVersion: v1
kind: ReplicationController
metadata:name: frontendlabels:name: frontend
spec:replicas: 3selector:name: frontendtemplate:metadata:labels:name: frontendspec:containers:- name: frontendimage: Kubeguide/guestbook-php-frontendenv: - name: GET_HOSTS_FROMvalue: envports:- containerPort: 80

执行命令

kubectl create -f frontend-controller.yaml kubectl get rc kubectl get pods
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

frontend-service.yaml

apiVersion: v1
kind: Service
metadata:name: frontendlabels:name: frontendspec:type: NodePortports:- port: 80nodePort: 30001  //物理机上的端口selector:name: frontend

执行命令

kubectl create -f frontend-service.yaml kubectl get services http://blog.csdn.net/test103/article/details/55663562

转载于:https://my.oschina.net/xiaominmin/blog/1598596

Kubernetes学习笔记(一)相关推荐

  1. kubernetes学习笔记 (二):k8s初体验

    本文采用本地k8s v1.10.3版本开发,如果还没有搭建可参照 kubernetes学习笔记 (一):搭建本地k8s开发环境进行搭建 搭建本地Docker镜像仓库 docker pull docke ...

  2. Kubernetes学习笔记之Calico CNI Plugin源码解析(一)

    女主宣言 今天小编为大家分享Kubernets Calico CNI Plugin的源码学习笔记,希望对正在学习k8s相关部分的同学有所帮助: PS:丰富的一线技术.多元化的表现形式,尽在" ...

  3. Kubernetes学习笔记-未整理

    Kubernetes学习笔记 标签:Kubernetes 学习笔记 原文:https://github.com/wtysos11/NoteBook/blob/master/微服务/Kubernetes ...

  4. Kubernetes学习笔记

    Kubernetes学习笔记 1.简介 用于自动部署.扩缩和管理容器化应用程序的开源系统,支持自动化部署.大规模可伸缩. 2.架构 2.1.Control Plane 对集群做出全局决策 Contro ...

  5. Kubernetes学习笔记【2年以前的笔记】

    Kubernetes学习笔记 知识储备 熟悉linux基础命令 熟悉docker的基本原理和操作 了解ssl证书工作原理 了解负载均衡工作原理(L4/L7) 了解分布式概念 了解域名解析原理 了解网络 ...

  6. Kubernetes学习笔记之Calico CNI Plugin源码解析(二)

    女主宣言 今天小编继续为大家分享Kubernetes Calico CNI Plugin学习笔记,希望能对大家有所帮助. PS:丰富的一线技术.多元化的表现形式,尽在"360云计算" ...

  7. Kubernetes学习笔记三:Docker安装,Docker使用,编写Dockerfile,制作容器镜像,上传docker镜像

    文章目录 Docker的安装 Docker的使用:docker run命令 查看本地存在的镜像:docker images命令 编写Dockerfile,制作容器镜像 docker build制作镜像 ...

  8. Kubernetes学习笔记二:Namespace,Cgroups 的隔离与应用

    Kubernetes学习系列文章:Kubernetes-博客专栏 今天在学习极客时间专栏:<深入剖析Kubernetes> 第五讲05 | 白话容器基础(一):从进程说开去和第六讲06 | ...

  9. Kubernetes学习笔记一:Docker和Kubernetes的诞生

    Kubernetes学习系列文章:Kubernetes-博客专栏 今天在学习极客时间专栏:<深入剖析Kubernetes> 里面的01 | 预习篇 · 小鲸鱼大事记(一):初出茅庐到04 ...

最新文章

  1. 麻省理工开放官方课程项目!
  2. 9、 root修改普通用户密码
  3. hi3516配置wifi_HISI 3516A移植mt7601u的wifi驱动
  4. 完成MSP430的IAP升级程序(总结)
  5. py 字典添加多个value_# Python 3 # Python 3字典Dictionary(1)
  6. Innodb之监控Buffer pool Load progress
  7. 安装paramiko的方法
  8. char 类型的取值范围
  9. 网易云爬取歌词进行歌词词云可视化
  10. 偏光太阳镜测试图片软件,[专题]真假偏光太阳镜简单、实用辨别方法!
  11. 哇!大开脑洞!“绿协杯”东莞市第六届绿色建筑设计比赛【往期获奖作品回顾上篇】
  12. Maven第5篇:手把手教你搭建私服
  13. StringBuffer之间的比较、String和StringBuffer的比较
  14. 学习笔记,C,n+nn+nnn+nnnn+nnnnn
  15. Momentum and NAG
  16. 苹果震荡:曾经的二号人物、薪资最高的奢侈品“女魔头”、零售SVP离职
  17. SQL Server DeadLock 分析
  18. OSChina 周五乱弹 ——爸妈是真爱,你只是意外。
  19. xv6 6.S081 Lab8: fs
  20. 个人站长做什么站最赚钱

热门文章

  1. 外贸想做好开发客户和地推?就一定要用这个软件!
  2. json里面返回模板输出的html,在JSON响应中返回完整页面的HTML而不是字符串输出...
  3. 父级居中后,并继承子级浮动方法
  4. [bzoj2882]工艺_后缀数组
  5. 批处理命令 For循环命令具体解释!
  6. 移动端前端开发注意点(未完待续)
  7. 【PAT】1009. Product of Polynomials (25)
  8. Web项目中获取SpringBean——在非Spring组件中获取SpringBean
  9. ECsoop 商品列表页属性筛选区品牌以LOGO形式显示
  10. 治标不治本:POI Ptg错误的解决方法