k8s容器入门
降低虚拟机造成的物理主机资源浪费,提高物理主机的利用率,并能提供像虚拟机一样狼好的应用程序隔离运行环境,人们把这种轻量型的虚拟机,称为容器。YAML仍为一种标记语言为了强调这种语言是以数据为中心,而不是以标记语言为重点YAML是一个可读性高,用来表达数据序列的格式命名空间作用:多租户情况下,实现资源隔离属于逻辑隔离属于管理边界不属于网络边界可以针对每个namespace做资源配额。
一、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 :声明式更新控制器,用于发布无状态应用。针对RS的更高层次的封装。,提供了更丰富的部署相关的功能。
优点:后端可以无限扩容 - ReplicaSet(RS):副本集控制器,用于对pod进行副本规模扩大或裁剪,用于发布无状态应用。动态更新POD副本数,可以通过selector来选择对哪些pod生效。
- StatefulSet:有状态副本集,用于发布有状态应用
优点:持续稳定,可以保留IP不变
主要特点:稳定的持久化存储,稳定的网络标志,有序部署有序扩展,有序收缩有序删除
组成:Headless Service(对于有状态服务的DNS管理)、volumeClaimTemplate(用于创建持久化卷的模板) - 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
【2】通过kubectl命令应用资源清单文件创建(建议)
更多推荐
所有评论(0)