Kubernetes权威指南 第一章:Kubernetes入门
Kubernetes是什么
- 官网

- 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入门的更多相关文章
- PADSPCB权威指南-第一章 PADS软件系统(部分)(原创)
PADSPCB权威指南-第一章(部分)豆丁地址:http://www.docin.com/p-707128286.html
- Knockout应用开发指南 第一章:入门
2011-11-21 14:20 by 汤姆大叔, 20165 阅读, 17 评论, 收藏, 编辑 1 Knockout简介 (Introduction) Knockout是一个轻量级的UI类 ...
- Javascript权威指南——第一章Javascript概述
示例:javascript贷款计算器 相关技术: 1.如何在文档中查找元素: 2.如何通过表单input元素来获取用户的输入数据: 3.如何通过文档元素来设置HTML内容: 4.如何将数据存储在浏览器 ...
- 第一章 Kubernetes入门
第一章 Kubernetes入门 kubernetes是基于容器技术的分布式架构领先方案,是一个完备的分布式系统支撑平台. kubernetes带来的好处:1)全面拥抱微服务:2)统可以随时随地整体“ ...
- Kettle解决方案: 第一章ETL入门
第一章ETL入门 1.1 OLPT和数据仓库对比 普通的事务系统和商业智能系统(BI)有什么区别? 1个独立的普通事务系统也被称为在线事务处理系统(OLTP) 商业智能系统也常被称为决策支持系统(DS ...
- MySQL----MySQL数据库入门----第一章 数据库入门
第一章 数据库入门 1.1 数据库基础知识 1.1.1 数据库概述 数据不仅包括普通意义上的数字,还包括文字.图像.声音等.也就是说,凡是在计算机中用来描述事物的记录都可称作数据. 数据库的基本特点: ...
- Java Persistence with MyBatis 3(中文版) 第一章 MyBatis入门
本章将涵盖以下话题: ž MyBatis是什么? ž 为什么选择MyBatis? ž MyBatis安装配置 ž 域模型样例 1.1 MyBatis是什么 MyBatis是一个简化和实现了Ja ...
- 《Kubernetes权威指南第2版》学习(二)一个简单的例子
1: 安装VirtualBox, 并下载CentOS-7-x86_64-DVD-1708.iso, 安装centOS7,具体过程可以百度. 2:开启centOS的SSH, 步骤如下: (1) yum ...
- Spirng学习指南-第一章(完)
Spring学习指南 内容提要 Spring框架是以简化J2EE应用程序开发为特定目标而创建的,是当前最流行的Java开发框架. 本书从介绍Spring框架入手,针对Spring4.3和Jav ...
随机推荐
- 阿里巴巴 Kubernetes 应用管理实践中的经验与教训
作者 | 孙健波(阿里巴巴技术专家).赵钰莹 导读:云原生时代,Kubernetes 的重要性日益凸显.然而,大多数互联网公司在 Kubernetes 上的探索并非想象中顺利,Kubernetes 自 ...
- 【java基础之异常】死了都要try,不淋漓尽致地catch我不痛快!
目录 1.异常 1.1 异常概念 1.2 异常体系 1.3 异常分类 1.4 异常的产生过程解析 2. 异常的处理 2.1 抛出异常throw 2.2 Objects非空判断 2.3 声明异常thro ...
- C/c.pp:贪心,二分答案
说是贪心有点牵强. 其次,答案满足单调性,如果在k次操作能完成那么在k+1次操作内也能完成. 因为大不了你就把多的一次对方操作再进行一次就好了. 怎么操作呢? 我们从头扫这个序列,遇到每一个不匹配位置 ...
- [考试反思]0821NOIP模拟测试28:沉默
这次不能把我前面的分数段都列出来了,因为实在太多了. 这次也不能把我后面的分数段列出来了,因为我后面没有了. yxm,mikufun,Pairs170100分第10.50分第29. 我:爆零,倒数第一 ...
- 大数据之路day01_2--记事本与EditPlus编写Hello World并且运行
在上一节我们成功的安装JAVA并且将其环境配置成功,接下来我们来编写第一个java程序——Hello World 1.利用记事本编写代码,利用命令行来编译运行 (1)新建记事本,(文件名).java后 ...
- 1.基础篇之vue入门
为了建立高效团队,很多公司会采用全栈工程师,虽然利弊兼有,对于成本优先的创业团队,肯定是首选,特别是对.net生态圈,大部分都是小公司,就更加重要了.这里记录的是对vue的学习点滴,希望对你有所助力. ...
- C# - VS2019 通过DataGridView实现对Oracle数据表的增删改查
前言 通过VS2019建立WinFrm应用程序,搭建桌面程序后,通过封装数据库操作OracleHelper类和业务逻辑操作OracleSQL类,进而通过DataGridView实现对Oracle数据表 ...
- Net Core Identity 身份验证:注册、登录和注销 (简单示例)
一.前言 一般我们自己的系统都会用自己设置的一套身份验证授权的代码,这次用net core的identity来完成简单的注册.登录和注销. 二.数据库 首先就是创建上下文,我这里简单的建了Users和 ...
- MapReduce任务提交源码分析
为了测试MapReduce提交的详细流程.需要在提交这一步打上断点: F7进入方法: 进入submit方法: 注意这个connect方法,它在连接谁呢?我们知道,Driver是作为客户端存在的,那么客 ...
- php自定义截取中文字符串-utf8版
php自定义截取中文字符串-utf8版 UTF-8的编码范围(utf-8使用1-6个字节编码字符,实际上只使用了1-4字节): 1个字节:00——7F 2个字节:C080——DFBF 3个字符:E08 ...