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.185的CLUSTER-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: NodePort和nodePort: 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. maven项目部署到tomcat方法

    今天记录下,maven项目部署到服务器的过程 1.首先在ide中里将自己的maven项目打包 mvn clean install 2. 看是否需要修改war包的名字,如果要修改,就用命令 mv xxx ...

  2. 命令行代理神器 proxychains

    因为某些原因,我们需要在命令行下载一些国外的资源,这个时候如果使用 wget,curl,或者 aria2c 的时候,往往又没有速度.这个时候我们需要使用代理来进行加速. 我本地搭的有 ss,但 ss ...

  3. 7.22 NOIP模拟7

    又是炸掉的一次考试 T1.方程的解 本次考试最容易骗分的一道题,但是由于T2花的时间太多,我竟然连a+b=c都没判..暴力掉了40分. 首先a+b=c,只有一组解. 然后是a=1,b=1,答案是c-1 ...

  4. 手机信号G、E、O、3G代表什么意思?

    G指GPRS,是2.5G网络,属于GSM网络,也就是说这项技术位于第二代(2G)和第三代(3G)移动通讯技术之间,GPRS的传输速率可提升至56甚至114Kbps,已经将2017年确定为关闭GSM网络 ...

  5. 欧拉路&&欧拉回路

    T1是欧拉路板子,但我不会,直接爆炸.. 这玩意就是个dfs,但我以前一直以为欧拉路只能$O(nm)$求 今天才知道可以$O(n+m)$ 欧拉路判定: 无向:起点终点为奇度点,其余偶度 有向:起点终点 ...

  6. 关于Set和Map数据结构的一点学习

    关于js的Set和Map结构的学习和记录 对阮一峰老师的ES6入门和网上有关资料的的一点学习和记录 1.Set数据结构 Set构造函数的参数是一个可遍历( iterator)对象 Set中的成员值是唯 ...

  7. 20190630A(贪心)

    题目描述 约翰留下他的N只奶牛上山采木.他离开的时候,她们像往常一样悠闲地在草场里吃草.可是,当他回来的时候,他看到了一幕惨剧:牛们正躲在他的花园里,啃食着他心爱的美丽花朵!为了使接下来花朵的损失最小 ...

  8. MATLAB基本使用及SIMULINK建模仿真实验

    MATLAB基本使用及SIMULINK建模仿真实验 这是我总结的操作方法: 1 )  M脚本文件的编写 1.新建M-file: 2.输入指令: 3.保存(注意:保存路径需要与工作路径一致) 2 )在S ...

  9. python 读取文件路径

    python 读取文件路径 一定要用绝对路径不能用相对路径 不然读取不出来 <pre>img = cv.imread("F:\\wef\\wef\\jiaoben\\e\\1.j ...

  10. 008.Kubernetes二进制部署Nginx实现高可用

    一 Nginx代理实现kube-apiserver高可用 1.1 Nginx实现高可用 基于 nginx 代理的 kube-apiserver 高可用方案. 控制节点的 kube-controller ...