Kubernetes是什么

  • 官网

https://kubernetes.io/

中文版:https://kubernetes.io/zh/

  • Kubernetes是谷歌十几年大规模容器管理经验的成果
  • 是Borg的一个开源版本
  • 基于容器技术的分布式架构方案

Service简介

  • Kubernetes以Service为核心,Service有如下特征

    • 唯一名称
    • 拥有一个虚拟ip和端口
    • 提供某种远程服务能力
    • 被映射到提供这种服务能力的一组容器应用上

Pod简介

  • Pod运行在Node主机中
  • Pod是Kubernetes管理的最小运行单元
  • 通常一个Node运行上百个Pod
  • 每个Pod有一个特殊的Pause容器,负责网络栈和Volume挂载卷
  • 只有提供服务的那组Pod才会被映射为一个服务

为什么要使用Kubernetes

一旦搭建好Kubernetes环境后,后续对于应用的部署与运维,使用Kubernetes就非常方便了

Hello World

Kubernetes的安装先不讲了

  • 现在要做的事情是

    • 使用Kubernetes部署MySQL与JavaWeb程序
    • JavaWeb可以访问Kubernetes
  • 基本步骤
    • MySQL副本集
    • MySQL Service
    • JavaWeb副本集
    • JavaWeb Service

下面的几个yaml文件在

https://github.com/nbcoolkid/learning/tree/master/k8s

MySQL RC

  • mysql-rc.yaml
apiVersion: v1
# 表名这是一个副本集
kind: ReplicationController
metadata:
# RC的名称,全局唯一
name: mysql
spec:
# 期待的Pod数量
replicas: 1
selector:
app: mysql
# 根据此模板创建Pod副本
template:
metadata:
labels:
# Pod副本拥有的标签,对应RC的Selector
app: mysql
spec:
containers:
- name: mysql
image: registry.cn-hangzhou.aliyuncs.com/sherry/mysql:5.7
ports:
# 容器应用监听的端口号
- containerPort: 3306
# 注入容器内的环境变量
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"

注意这里的yaml文件,不可以有制表符,我们一律使用空格键代替

编写完文件后,使用apply命令做个文件格式检查

➜  k8s git:(master) ✗ kubectl apply -f mysql-rc.yaml
replicationcontroller/mysql created
  • 创建RC
➜  k8s git:(master) ✗ kubectl create -f mysql-rc.yaml
replicationcontroller/mysql created
  • 查看创建结果
➜  k8s git:(master) ✗ kubectl get rc
NAME DESIRED CURRENT READY AGE
mysql 1 1 1 4m17s
  • 查看创建的Pod情况
➜  k8s git:(master) ✗ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-wg9sp 1/1 Running 0 5m16s
  • dashboard

其实通过dashboard,也能看到启动情况

MySQL Service

  • mysql-svc.yaml
apiVersion: v1
kind: Service # 表名这是一个Kubernetes Service
metadata:
name: mysql # Service全局名称
spec:
ports:
- port: 3306 # Service对外提供的端口
selector:
app: mysql # Service对应的Pod拥有此标签,所有拥有此标签的pod都归我管
  • 创建Service
➜  k8s git:(master) ✗ kubectl create -f mysql-svc.yaml
service/mysql created
  • 查看创建结果
➜  k8s git:(master) ✗ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 175m
mysql ClusterIP 10.105.55.185 <none> 3306/TCP 84s

可以发现,MySQL服务被分配了一个值为10.105.55.185CLUSTER-IP,端口为3306

此时,Kubernetes集群中其他创建的Pod就可以通过这个ip+端口进行连接和访问了

这里的ip,是Service创建后由Kubernetes系统自动分配的,

其他Pod无法余弦知道,所以需要有一个服务发现机制来找到这个服务。

现在,我们根据Service的唯一名称获取到ip和端口

JavaWeb RC

  • myweb-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: myweb
spec:
replicas: 2
selector:
app: myweb
template:
metadata:
labels:
app: myweb
spec:
containers:
- name: myweb
image: kubeguide/tomcat-app:v1
ports:
- containerPort: 8080

在Tomcat容器内部,应用将使用环境变量MYSQL_SERVICE_HOST的值连接MySQL,更安全的做法是使用服务的名称mysql进行访问

  • 创建RC
➜  k8s git:(master) ✗ kubectl create -f myweb-rc.yaml
replicationcontroller/myweb created
  • 验证
➜  k8s git:(master) ✗ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-ck4j5 1/1 Running 0 164m
myweb-8dhr9 1/1 Running 0 3m11s
myweb-nm75w 1/1 Running 0 3m11s

JavaWeb Service

  • myweb-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30001
selector:
app: myweb

type: NodePortnodePort: 30001,表明此Service开启了NodePort方式的外网访问模式

  • 启动
➜  k8s git:(master) ✗ kubectl create -f myweb-svc.yaml
service/myweb created
  • 验证
➜  k8s git:(master) ✗ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h47m
mysql ClusterIP 10.105.55.185 <none> 3306/TCP 174m
myweb NodePort 10.101.31.133 <none> 8080:30001/TCP 41s

验证

经过上述步骤,我们通过dashbaord查看到底启动了哪些服务

  • Service

  • RC

  • Pod

我们可以使用 http://虚拟机ip:30001/demo/ 的方式来进行验证访问

那么怎么获取这个虚拟机的ip呢?

我这里使用的是minikube安装的Kubernetes环境,安装后,在虚拟机中的Linux,账号是root,密码为空

然后使用ipconfig|more命令就能看到ip

ok,至此,我们的hello world完毕

基本概念与术语

Kubernetes中的大部分概念,包括Node、Pod、Replication Controller、Service,都可以被看做一种资源对象

几乎所有的资源对象都可以通过kubectl进行增删改查操作,并持久化到etcd中

apiVersion:v1

声明当前这个资源对象归属于v1这个核心API

大部分的资源对象都归属于v1这个核心API

Master

Kubernetes集群的控制节点,一般在生产环境至少部署3台作为高可用

所有的Kubernetes指令都是发给Master,由Master去管理集群中的节点

  • Master上运行着以下核心进程

    • Kubernetes API Server:kube-apiserver,集群控制入口
    • Kubernetes Controller Manager:kube-controller-manager,资源对象管理
    • Kubernetes Scheduler:kube-scheduler,资源调度
  • Master上通常还部署etcd服务,因为Kubernetes里的所有资源对象数据都保存在etcd中

Node

  • 工作节点,运行应用程序
  • Node上运行着以下核心进程
    • kubelet:负责Pod对应容器的创建、启停,与Master的协作,实现集群管理
    • kube-proxy:实现Kubernetes Service的通信,负载均衡的重要组件
    • docker
  • Node可以在Kubernetes运行期间动态加入集群
    • 前提是Node节点已经安装好了上述核心进程
    • 默认情况下,kubelet会向Master注册自己
  • 如果某个Node失联,Master会触发“工作负载大转移”的自动流程

Pod

  • Pod运行在Node上

  • Pod有一个Pause根容器

  • Pod内容器可以和Kubernetes集群中任意的Pod内的容器进行直接通信

  • PodIP+容器端口=Endpoint,代表此Pod内的某个服务的对外通信地址

    • 一般一个应用会暴露两个Endpoint,一个服务端口,一个管理端口
  • 可以配置Pod对资源期望的最低要求和最高要求(CPU、内存)

        resources:
# 设置一个较小的值,符合容器平时工作负载下的资源需求
requests:
# 内存占用,默认单位为字节,一般我们使用Mi,表示兆
memory: "64Mi"
# 以1/1000为最小单位,100m表示0.1个CPU
# 不管是在一个1Core的机器还是8Core的机器上,100m代表的含义都是一样的
cpu: "250m"
# 设置一个较大的值,符合容器峰值负载下的资源需求
# 当容器试图使用超过这个量的资源时,可能被Kubernetes杀掉并重启
limits:
memory: "128Mi"
cpu: "500m"

Label

  • Label是键值对,key和value均由用户自定义
  • 一个Label可以被附加到多个资源上,一个资源可以定义任意数量的Label
  • Label通常在资源定义时确定,也可以在对象创建后动态添加与删除
  • Label定义后,通过 Label Selector(标签选择器)进行查询和筛选
    • Selector有基于等式与基于集合两种
    • name=redis-slave,匹配所有具备
    • name!=redis-slave,匹配所有不具备
    • name in (redis-master,redis-slave)
    • name not in (pho-frontend)
    • 多个表达式之间用,分割
    • 多个表达式之间是AND关系

  • matchLabels与matchExpressions

Replication Controller/Replica Set

  • RC定义内容包括

    • 期待Pod的数量
    • 删选Pod的Label Selector
    • Pod数量不满足时用于创建新Pod的template
  • 一个完整的RC定义案例

确保拥有tier=frontend标签的Pod在Kubernetes集群中始终只有一个副本

  • 删除RC,并不会删除通过该RC创建好的Pod

    • 如果要删除RC对于的Pod,可以设置replicas值为0,然后更新RC
    • kubectl提供stop、delete命令,来一次性删除RC及其对应的Pod
  • 在应用升级的时候
    • 其实就是一个新的容器镜像替代旧版本的过程
    • 通过改变RC中Pod模板的镜像版本,实现滚动升级

Deployment

为了更好的解决Pod的编排问题,Deployment内部使用Replica Set

我们把Deployment当做一次RC的升级即可

Horizontal Pod Autoscaler

HPA用于实现Pod的横向自动扩容

StatefulSet

Service

Kubernetes内部的服务,最终是通过Service暴露出去的

Service整个生命周期内,拥有唯一不变的ip

Job

Volume

  • Volume是Pod中能够被多个容器访问的共享目录
  • Kubernetes中的Volume概念、用途、目的,与Docker中的Volume类似,但又有不同
    • Kubernetes中的Volume定义在Pod中
    • Kubernetes中的Volume与Pod的生命周期相同,与容器不同
    • Kubernetes支持多种文件系统的Volume,如:GlusterFS、Ceph等

Persistent Volume

Namespace

命名空间,一般用于实现多租户的资源个例

Annotation

ConfigMap

本文由博客一文多发平台 OpenWrite 发布!

Kubernetes权威指南 第一章:Kubernetes入门的更多相关文章

  1. PADSPCB权威指南-第一章 PADS软件系统(部分)(原创)

    PADSPCB权威指南-第一章(部分)豆丁地址:http://www.docin.com/p-707128286.html

  2. Knockout应用开发指南 第一章:入门

    2011-11-21 14:20 by 汤姆大叔, 20165 阅读, 17 评论, 收藏,  编辑 1    Knockout简介 (Introduction) Knockout是一个轻量级的UI类 ...

  3. Javascript权威指南——第一章Javascript概述

    示例:javascript贷款计算器 相关技术: 1.如何在文档中查找元素: 2.如何通过表单input元素来获取用户的输入数据: 3.如何通过文档元素来设置HTML内容: 4.如何将数据存储在浏览器 ...

  4. 第一章 Kubernetes入门

    第一章 Kubernetes入门 kubernetes是基于容器技术的分布式架构领先方案,是一个完备的分布式系统支撑平台. kubernetes带来的好处:1)全面拥抱微服务:2)统可以随时随地整体“ ...

  5. Kettle解决方案: 第一章ETL入门

    第一章ETL入门 1.1 OLPT和数据仓库对比 普通的事务系统和商业智能系统(BI)有什么区别? 1个独立的普通事务系统也被称为在线事务处理系统(OLTP) 商业智能系统也常被称为决策支持系统(DS ...

  6. MySQL----MySQL数据库入门----第一章 数据库入门

    第一章 数据库入门 1.1 数据库基础知识 1.1.1 数据库概述 数据不仅包括普通意义上的数字,还包括文字.图像.声音等.也就是说,凡是在计算机中用来描述事物的记录都可称作数据. 数据库的基本特点: ...

  7. Java Persistence with MyBatis 3(中文版) 第一章 MyBatis入门

    本章将涵盖以下话题: ž  MyBatis是什么? ž  为什么选择MyBatis? ž  MyBatis安装配置 ž  域模型样例 1.1 MyBatis是什么 MyBatis是一个简化和实现了Ja ...

  8. 《Kubernetes权威指南第2版》学习(二)一个简单的例子

    1: 安装VirtualBox, 并下载CentOS-7-x86_64-DVD-1708.iso, 安装centOS7,具体过程可以百度. 2:开启centOS的SSH, 步骤如下: (1) yum ...

  9. Spirng学习指南-第一章(完)

    Spring学习指南 内容提要 ​ Spring框架是以简化J2EE应用程序开发为特定目标而创建的,是当前最流行的Java开发框架. ​ 本书从介绍Spring框架入手,针对Spring4.3和Jav ...

随机推荐

  1. python dict(字典)

    补充知识点1: 数据类型的划分:可变数据类型.不可变数据类型 可变数据类型:     元组,bool,int,str      --可哈希 不可变数据类型:  list,dict,set        ...

  2. appium 处理webview

    折腾了一段时间,无论是模拟器还是真机,driver.contexts都只有NATIVE_APP,无奈放弃切换webview,直接查找定位元素 from time import sleep import ...

  3. [考试反思]阶段性总结:NOIP模拟测试7~13

    苟且Rank#1.第二次分机房结束. 得到了喘息一会的权利. 在最后两场考试中大脸skyh慷慨舍弃264分让出Rank#1的故事也十分感人 然而还是有很多东西值得思考. 虽说是反思,但是还是有一些地方 ...

  4. 腾讯新闻构建高性能的 react 同构直出方案

    在腾讯新闻抢金达人活动 node 同构直出渲染方案的总结文章中我们整体了解了下同构直出渲染方案在我们项目中的使用.正如我在上篇文章结尾所说的: 应用型技术的难点不是在克服技术问题,而是在于能够不断的结 ...

  5. 深入理解java虚拟机系列初篇(一):为什么要学习JVM?

    前言 本来想着关于写JVM这个专栏,直接写知识点干货的,但是想着还是有必要开篇讲一下为什么要学习JVM,这样的话让一些学习者心里有点底的感觉比较好... 原因一:面试 不得不说,随着互联网门槛越来越高 ...

  6. 01-MyBatis启动流程分析

    目录 MyBatis简单介绍 启动流程分析 简单总结 附录 MyBatis内置别名转换 参考 MyBatis简单介绍 MyBatis是一个持久层框架,使用简单,学习成本较低.可以执行自己手写的SQL语 ...

  7. PWM呼吸灯

    1.PWM简介       PWM是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调 制,简称脉宽调制.它是利用微处理器的数字输出来对模拟电路进行控 制的一种非常有效的技 ...

  8. python——掌握sorted函数的用法

    看本篇文章的前提是掌握 00函数的基本概念.01函数参数传递方式 可参考本人博客文章 sorted函数 是一个内建函数,接收一个可迭代对象,按照指定类型.指定顺序进行排序,特点是返回一个新的列表,不改 ...

  9. Hadoop4-HDFS分布式文件系统原理

    一.简介 1.分布式文件系统钢结构 分布式文件系统由计算机集群中的多个节点构成,这些节点分为两类: 主节点(MasterNode)或者名称节点(NameNode) 从节点(Slave Node)或者数 ...

  10. nsq (三) 消息传输的可靠性和持久化[二]diskqueue

    上一篇主要说了一下nsq是如何保证消息被消费端成功消费,大概提了一下消息的持久化,--mem-queue-size 设置为 0,所有的消息将会存储到磁盘. 总有人说nsq的持久化问题,消除疑虑的方法就 ...