一、k8s入门
1.什么是容器
降低虚拟机造成的物理主机资源浪费,提高物理主机的利用率,并能提供像虚拟机一样狼好的应用程序隔离运行环境,人们把这种轻量型的虚拟机,称为容器。
2. 容器的管理工具
主要用于容器的创建、启动、关闭、删除等
管理工具:
- docker
- pouch
- LXC、LXD、RKT
3.容器的编排部署工具
容器管理工具可以完成基础管理,应对企业中更复杂的应用部署,需要容器编排管理工具。
编排部署工具:
- docker三剑客(docker machine 、docker compose、docker swarm)
- mesos + marathon
- kubernetes
主要用于管理云平台中多个主机上的容器化应用,k8s的目标是让部署容器化应用建单且高效,提供了应用部署、规划、更新、维护的一种机制。
二、k8s功能、架构
1. k8s功能
可对应用进行自动化的部署、扩容、缩容。
【1】自动装箱
基于容器对应用运行环境的资源配置要求自动部署应用容器
【2】自我修复(自愈能力)
- 当容器失败时,会对容器进行重启
- 当所部署的noda节点有问题时,会对容器进行重新部署和重新调度
- 当容器未通过监控检查时,会关闭此容器
- 直到容器正常运行时,才会提供对外服务
【4】水平扩展
通过简单的指令、用户UI界面或基于CPU等资源的使用情况,对应用当容器进行规模的扩大或剪裁
【5】服务发现
用户不需要使用额外的服务发现机制,就能够基于k8s自身能力实现服务发现和负载均衡
【6】滚动更新
可以根据应用的变化,对应用容器运行的应用,进行一次性或批量更新
【7】版本回退
可以根据应用的部署情况,对应用容器运行应用,进行历史版本即时回退
【8】密匙和配置管理
在不需要重新构建镜像的情况下,可以部署和更新密匙和应用配置,类似热部署
【9】存储编排
- 自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要
- 存储系统可以来自于本地目录、存储网络(NFS、Gluster、Ceph、Cinder等)、公有云存储服务等
2.Node及Pod支持
- Node(节点)数支持:早期100,现在2000
- POd管理支持:早期1000,现在150000
三、k8s集群部署
1.应用部署架构的分类
- 无中心节点架构:GlusterFS
- 有中心节点架构:HDFS、K8S
2. 集群架构节点的角色功能
【1】 master node三个组件
- k8s的控制节点,对集群进行调度管理,接受集群外用户去集群操作请求
- master node 组成(四个组件):控制面
- API Server:通信
- kube-Scheduler:调度 通过调度算法将pod分布到节点(服务器)上
- Cluster State Store(ETCD数据库)/分布式键值存储
- Controller Manger Server :资源
【2】 worker node三个组件:用户面
- 集群工作节点,运行用户业务应用容器1
- worker node组成(三个组件)
- kubelet:worker端的管理工具,负责pod的生命周期、存储、网络管理
- kube proxy :网络代理,设置转发路径 ,负责service的服务发现(此处为内部服务的发现,外部服务的发现为ingress),负载均衡(4层负载)
- Container Runtime(运行时):创建容器的软件
【3】附加组件
- kube - dns
- ingress Controller:为服务提供外网入口(外部服务的发现)
3. k8s部署
集群可用验证
kubbectl get node # 节点状态
kubbectl get cs # 集群状态
四、k8s集群客户端kubectl命令
# 检查集群是否安装
rpm -qa | grep kubetctl
# 获取kubectl帮助
kubectl --help
使用kubectl命令的必要环境:集群链接配置文件
五、k8s集群资源清单文件(yaml)文件书写方法
1.YAML文件的书写格式
【1】YAML文件介绍
- YAML仍为一种标记语言
- 为了强调这种语言是以数据为中心,而不是以标记语言为重点
- YAML是一个可读性高,用来表达数据序列的格式
【2】YAML文件基本语法
- 使用空格作为缩进
- 缩进空格数目不重要,只要是相同层级的元素左侧对齐就行
- 低版本缩进不可以使用TAB键,只能使用空格
- 使用#标识注释,从这个字符一直到行尾,都会被解释器忽略
【3】YAML支持的数据结构
- 对象
- 键值对的集合
- 又称为映射/哈希/字典
- 数组
- 一组按次序排列
- 又称为序列/列表
- 纯量
单个的,不可再分的值:数字、bool、null、时间日期。
在YMAL中,字符串不使用引号,若是字符串中有空格或者特殊字符,可使用单引号或者双引号引起来
2.通过YAML文件实现资源清单描述方法
【1】常用字段
- version:版本,str类型
- kind:资源类型,str类型
- metadata:元数据对象/资源对象,object
- metadata.name:资源对象名称,str
- metadata.namespace:资源对象命名空间,str
- Spec:详细定义资源对象,资源对象描述,object
六、k8s集群namespace(命名空间)
1.介绍
- 命名空间
- 作用:多租户情况下,实现资源隔离
- 属于逻辑隔离
- 属于管理边界
- 不属于网络边界
- 可以针对每个namespace做资源配额
2.查看
kubect get namesapce
说明:
- default :用户创建的pod默认在此命名空间
- kune-public : 所有用户均可访问。包括未认证的用户
- kube-node-lease : kubernetes 集群节点租约状态
- kube-system : kubernetes 集群在使用
3.创建
【1】通过命令创建
kubectl create namespace test
输出:
namespace/test created
【2】通过资源清单创建
1.准备资源清单文件
cat 01-create-ns.yam1
apiVersion: V1
kind: Namespace
metadata:
name;demons1
2. 应用资源清单文件
kubectl apply -f 01-create-ns.yam1
3. 验证是否创建成功
kubectl get namespace
4.删除
【1】通过kubectl直接删除(不建议)
kubectl get namespace
kubectl delete namespace test
【2】通过kubectl命令应用资源清单文件删除(建议)
kubectl get namespace
cat 01-create-ns.yam1
kubectl delete -f 01-create-ns.yam1
七、k8s集群核心概念pod
k8s中不能直接管理容器,k8s集群中最小的调度单位为pod,因此要使用pod来运行应用容器
1. 概念
- k8s中能够调度的最小单元
- pod是容器的集合
2. 查看Pod
kubectl get pod
kubectl get pods
kubectl get pods --namespace default
3. 创建Pod
【1】编写用于 创建pod资源清单文件
4. Pod访问(不建议访问)
知道pod的IP地址
curl 172.xx.xx.xx
5. Pod删除方法
【1】通过kubectl直接删除(不建议)
kubectl delete pods pod1
【2】通过kubectl命令应用资源清单文件删除(建议)
kubectl delete -f 02-create-pod.yam1
八、k8s集群核心概念controller(控制器)
了解pod的删除方法,发现pod的删除很简单,容易误操作,因此,引入另一个概念Controller(控制器),用于在k8s集群中以loop方式监视pod状态,若是发现pod被删除,会重新拉起一个pod,让pod一直保持在用户期望的状态。
1. Controller作用
- 控制器
- 用于对应用运行的资源进行监控
- 当pod出现问题时,会把pod重新拉起,以达到用户期望的状态
2. Controller分类
常见pod控制器:工作服在类型,调用的RC控制器
- Deployment :声明式更新控制器,用于发布无状态应用
有点:后端可以无限扩容 - ReplicaSet(RS):副本集控制器,用于对pod进行副本规模扩大或裁剪,用于发布无状态应用
- StatefulSet:有状态副本集,用于发布有状态应用
优点:持续稳定,可以保留IP不变
主要特点:稳定的持久化存储,稳定的网络标志,有序部署有序扩展,有序收缩有序删除 - DaemonSet:在k8s集群每一个Node上运行一个副本,用于发布监控或日志收集等应用
装在每一个节点上 - Job:运行一次性作业任务
- CronJob:运行周期性作业任务
3. Deplyment控制器作用
- 具有上线部署、滚动升级、创建副本、回滚到以前某一版本(成功/稳定)等功能
4. 创建Depliyment控制器类型应用方法
【1】通过kubectl命令行创建(不建议)
【2】通过kubectl命令应用资源清单文件创建(建议)
5. 删除Depliyment控制器类型应用方法
带有控制器类型的POD不建议直接删除,如果必须删除,请删除控制器的应用名称。(直接删除pod后,POD会被再次拉起)
【1】通过kubectl命令行创建
# 查看应用:
kubectl get depliyment.apps
# 删除应用;
kubectl delete depliyment.apps nginx-app
【2】通过kubectl命令应用资源清单文件创建
九、k8s集群核心概念service
1. service 概念
- 不是实体服务
- 是一条iptables或者ipva的转发规则
2. service作用
- 通过service为pod客户端提供访问POD方法,即客户端访问pod入口
- service通过pod标签与pod进行关联
3. service类型
- ClusterIP:默认,分配一个集群内部可以访问的虚拟IP ,只能内部访问
- NodePort:在每个Node上分配一个端口作为外部访问入口
- LoadBalancer:工作在特定的Cloud Provider上(例如:Googel Cloud、AWS、Openstack)
- ExternalName:表示把集群外部的服务引入到集群内部中来,即实现了集群内部pod和集群外部的服务进行通信
4. service参数
- port:访问service使用的端口
- targetPort:Pod中容器端口
- NodePort:通过Node实现外网用户访问k8s集群内sercvice
5. service创建方法
【1】通过kubectl命令行创建(不建议)
默认创建的service为ClusterIP类型
# 1.创建Deploment类型应用
# 2.验证应用创建情况
get
# 3.创建service
kubectl expose deployment.apps nginx.app1 --typr=ClusterIP --tarrget-poet=80 --port=80
# 4. 查看service
kubectl get service
【2】通过kubectl命令应用资源清单文件创建(建议)
6. service删除方法
【1】通过kubectl命令行创建(不建议)
kubectl delete service nginx-app1