架构
从borg到k8s
BorgMaster专门负责请求分发类似大脑,而工作节点是由Borglet负责提供(容器,计算,服务等等),上述都有多个副本3,5,7,9可以防止选举出现双数导致的问题。
提供了多种访问方式,浏览器,命令行,文件------->BrogMaster-------->scheduler(调度器)写入paxos数据库存储,并进行监听,如果发现请求就进入消费环节。
K8S
特点:
轻量级:消耗资源小
开源
弹性伸缩
负载均衡:iptables IPVS
基础概念:什么是pod 控制器类型 K8S网络通讯模式---flannel---pod--etcd
kubernetes: 构建k8s集群
资源清单: 资源 掌握资源清单的语法yaml 编写pod 掌握pod的生命周期
pod控制器:各种控制器的特点及使用定义方式
服务发现:掌握svc原理及其构建方式
存储:掌握多种存储类型的特点,并且能够在不同环境中选择合适的存储方案(工作中自主选择)
-------------------------------------------
kubectl: k8s是命令行端,用来发送客户的操作指令。
API server: 是k8s 集群的前端接口,各种客户端工具以及k8s的其他组件可以通过它管理k8s集群的各种资源。它提供了HTTP/HTTPS RESTful API,即K8S API。是所有服务访问的统一入口。
Scheduler: 负责决定将Pod放在哪个Node上运行。在调度时,会充分考虑集群的拓扑结构,当前各个节点的负载情况,以及应对高可用、性能、数据亲和性和需求。负责介绍任务,选择合适的节点进行分配任务。
Controller Manager: 负责管理集群的各种资源,保证资源处于预期的状态,用来维持副本期望数量。它由多种Controller 组成,包括Replication Controller维护副本数量即期望值,创建删除pod、Endpoints Controller、Namespace Controller、Serviceaccounts Controller等等。
Etcd: 键值对数据库 存储k8s集群所有重要信息(持久化),负责保存k8s集群的配置信息和各种资源的状态信息。当数据发生变化时,etcd会快速的通知k8s相关组件。第三方组件,它有可替换方案 Consul、zookeeper。
Etcd的官方将它定位成一个**可信赖**(天生支持集群化)的**分布式键值存储服务**(k-v结构),能够为整个分布式集群存储一些关键数据,协助分布式集群的正常运转。
V2版本会把所有数据写入到内存中,关机后数据丢失
V3版本会做本地持久化,写入到本地存储。
Kubelet: 它是Node的agent(代理),当Scheduler确定某个Node上运行Pod之后,会将Pod的具体配置信息发送给该节点的kubelet,kubelet会根据这些信息创建和运行容器,并向Master报告运行状态。管理(增删改查)Pod.
kube-proxy: 负责将访问service的TCP/UDP数据流转发到后端的容器。如果有多个副本,kube-proxy会实现负载均衡。
COREDNS: 可以为集群中的SVC创建一个域名IP的对应关系解析
DASEBORD: 给k8s提供一个B/S结构的UI界面。
INGRESS Crontroller:官方只能实现4层负载均衡,它可以实现7层负载均衡。
Pod:k8s集群的最小组成单位。一个Pod内,可以运行一个或多个容器。大多数情况下,一个Pod内只有一个Container容器。
Flannel: 是k8s集群网路方案,可以保证Pod的跨主机通信。第三方解决方案,也有替换方案。
服务分类:
有状态服务:DBMS数据库管理系统(MYSQL)从pod中剔除后,再恢复就会造成数据丢失。
无状态服务:LVS APACHE NGINX
对docker来说更适合运行无状态服务,对k8s来说目标就是可以运行好有状态服务
运行一个例子:
#创建一个deployment资源对象。Pod控制器。 kubectl run test-web --image=httpd --replicas=2
注:k8s 1.15之前的命令
分析各个组件的作用以及架构工作流程:*****
1. kubectl发送部署请求到API server
2. APIserver通知Controller Manager 创建一个Deployment资源。
3. Scheduler执行调度任务,将两个副本Pod分发到node上。
4. node上的kubelet在各自节点上创建并运行Pod。
补充:
1.应用的配置和当前的状态信息保存在etcd中,执行kubectl get pod 时 API server 会从etcd中读取这些数据。
2. flannel会为每个Pod分配一个IP。但此时没有创建Service资源,目前kube-proxy还没有参与进来。
----------------------------------
常见资源对象类型( pod控制器类型)
ReplicationController: 用于确保每个Pod副本在任意时刻都能满足目标数量,简单点来说,它用于保证每个容器或容器组总是运行并且可以访问的:老一代无状态的Pod应用控制器。
ReplicaSet: 新一代的无状态的Pod应用控制器,它与RC的不同之处在于支持的标签选择器不同,RC只支持等值选择器,RS还额外支持基于集合的选择器。
Deployment: 为Pod和Replicaset提供了一个声明式定义(declarative)方法,用来替代以前的ReplicaionController来方便的管理应用。
典型的应用场景:
定义Deployment来创建Pod和ReplicaSet
滚动升级和回滚应用
扩容和缩容
暂停和继续Deployment
DaemonSet: 用于确保每一个节点都运行了某个Pod的一个副本,新增的节点一样会被添加此类Pod,在节点移除时,此类Pod会被回收。
典型的应用场景:
运行集群存储daemon
在node上运行日志收集daemon
在node上运行监控daemon
StatefulSet: 用于管理有状态的持久化应用,如database服务程序,它与Deployment不同之处在于,它会为每一个Pod创建一个独有的持久性标识符,并确保每个Pod之间的顺序性。
典型的应用场景:
稳定的持久化存储
稳定的网络标志
有序部署,有序扩展
有序收缩,有序删除
Job: 用于管理运行完成后即可终止的应用,例如批量处理作业任务,保证一次性任务pod成功结束。
Cronjob:管理基于时间的job,即:
在给定的时间点只运行一次
周期性地在给定时间点运行
Horizontal Pod Autoscaling: 应用的资源使用率通常都有高峰和低谷,削峰填谷,提高集群的整体资源利用率,让service的pod个数自动调整,使pod水平自动缩放。
kubernetes集群命令行
1.kubectl语法格式:
kubectl [command] [TYPE] [NAME] [flags]
(1)command:指定要对资源执行的操作,例如create,get,describe和delete
(2)TYPE:指定资源类型,资源类型是大小写敏感的,开发者能够以单数,复数和缩略的形式。例如:
kubectl get pod pod1 kubectl get pods pod1 kubectl get po pod1
(3)NAME:指定资源的名称,名称也是大小写敏感的。如果省略名称,则会显示所有的资源。例如:
kubectl get pods
(4)flages:指定可选的参数。例如,可用-s或者-server参数指定k8s API server的地址和端口。
2.kubectl获取帮助
kubectl --help
具体查看某个操作的帮助
kubectl get --help
3.kubectl子命令使用分类
基础命令:
create:通过文件名或标准输入创建资源
expose:将资源公开为一个新的服务
run:在集群中运行一个特定的镜像
set:在对象上设置特定的功能
get:显示一个或多个资源
explain:文档参考资料
edit:使用编辑器编辑一个资源
delete:删除资源
部署命令:
rollout: 管理资源的发布
rolling-update: 滚动更新
scale: 扩、缩容
autoscale:自动扩缩容
集群管理命令:
certificate: 修改证书资源
cluster-info:显示集群信息
top: 显示资源(cpu,内存,存储)
cordon: 标记节点不可调度
uncordon: 标记节点可调度
drain: 维护期间下线
taint: 更新污点数
故障诊断和调试命令:
describe: 显示特定资源或资源组的详细信息
logs: 在一个Pod中打印一个容器日志
attach:附加到一个运行的容器
exec:执行命令到容器
port-forward: 转发本地端口到pod
proxy: 运行一个proxy到api server
cp: 复制文件目录到容器
auth:检查授权
高级命令:
apply: 通过文件或标准输入对资源应用配置
patch:使用补丁修改、更新资源的字段
replace:通过文件或标准输入替换一个资源
convert: 不同的api版本之间转换配置文件
设置命令:
label:更新资源上的标签
annotate: 更新资源上的注释
completion: 用于实现kubectl工具自动补全
其他命令:
api-versions: 打印受支持的api版本
config:修改kubeconfig文件(用于访问api,配置认证信息等)
help: 帮助
plugin:运行一个命令行插件
version:打印客户端和服务版本信息
(1)基础命令
kubectl create deployment nginx --image=nginx #创建一个pod控制器 kubectl expose deployment nginx --name=nginx-svc --port=80 --type=NodePort #对外暴露端口 其他主机可以访问 在浏览器中打开http://ip:端口 kubectl get pod,svc,cs #查询pod和详细信息及运行状况 kubectl get pod(deployment) -o wide #输出pod,deployment资源的信息pod资源包含ip地址,deployment包含名称,镜像来源。 kubectl describe pod nginx #查看名字叫nginx的pod的详细信息 ip等 *****
用命令行的方式创建:
//创建Pod控制器,deployment(到k8s:1.18版本,此方式已变为创建Pod资源) kubectl run web --image=nginx --replicas=5 #1.15版本方式,在1.18版本中此方式只会创建一个pod资源 kubectl create deployment web --image=nginx:latest #1.18 版本创建pod控制器方式 #查看控制器情况 kubectl get deployment #查看资源详细信息 kubectl describe deployment web
PS: 查看某种资源对象,没有指定名称空间,默认是在default名称空间。可以加上-n选项,查看指定名称空间的资源。
注意:直接运行创建的Deployment资源对象,是经常使用的一个控制器资源类型,除了deployment,还有rc,rs等Pod控制器,Deployment是一个高级的Pod控制器。
//创建Service资源类型。
kubectl expose deployment web --name=web-svc --port=80 --type=NodePort
//ps:kubectl get service //查看service资源 和暴露端口 其中web-svc 对应的30921是整个k8s集群对外暴露的端口不指定对外暴露端口的情况下,会随机生成端口类似于docker 中的-P 80
[root@docker01 ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4h12m
nginx NodePort 10.108.14.253 <none> 80:32148/TCP 138m
web-svc NodePort 10.97.171.7 <none> 80:30921/TCP 10m
[root@docker01 ~]# crul 192.168.10.170:30921
ps:如果想要外网能够访问服务,可以暴露deployment资源,得到service资源,但svc资源的类型必须为NodePort(大小写必须严格按照要求)。
**服务的扩容与缩容**
kubectl scale deployment web --replicas=8. kubectl edit deployment web #编辑web资源的配置文件
-------------------------------------------
##### 服务升级(变更镜像)与回滚 *****
#删除旧的nginx控制器 kubectl delete deployment nginx #重新创建nginx:1.17的控制器 kubectl create deployment nginx --image=nginx:1.17 kubectl describe pod nginx-... (补全) #升级到nginx:1.18 kubectl set image deployment nginx nginx=nginx:1.18 kubectl describe pod nginx-... (补全) #升级到nginx:latest kubectl set image deployment nginx nginx=nginx:latest kubectl describe pod nginx-... (补全) #回滚 回滚成上次的镜像 kubectl rollout undo deployment nginx
常用命令集合
kubectl run #创建一个deployment或job来管理创建的容器 1.18中 用kubectl create创建deployment资源 kubectl get #显示一个或多个资源,可以使用标签过滤,默认查看当前名称空间的资源 kubectl expose #将一个资源暴露为一个新的kubernetes的service资源,资源包括pod (po), service (svc), replicationcontroller (rc),deployment(deploy), replicaset (rs) kubectl describe #显示特定资源或资源组的详细信息 kubectl scale #可以对Deployment, ReplicaSet, Replication Controller, 或者StatefulSet设置新的值,可以指定一个或多个先决条件 kubectl set #更改现有的应用程序资源 kubectl rollout #资源回滚管理 kubectl delete #删除某个资源 PS: 如果资源状态为Terminating,可以强制删除,比如强制删除某个Pod:kubectl delete po <podName> --grace-period=0 --force
----------------------------------------
## 配置清单(yml、yaml):
常见Yaml文件写法:以及字段的作用
1.语法格式
*通过缩进表示层级关系
*不能使用Tab进行缩进,只能使用空格。(高版本支持缩进我们设置为tab一次缩进2个空格,写法尽量要统一用缩进,或都用空格)
vim /root/.vimrc
set tabstop=2
*一般文件开头缩进两个空格
*字符后面缩进一个空格,比如冒号,逗号等后面
*使用---表示yaml文件开始
*使用#代表注释
2.一级字段作用 5个 (apiVersion、kind、metadata、spec、status)一般只考虑前4个。
apiVersion: api版本信息
apiVersion: v1 //apiserver的版本
kind: 资源对象的类别
kind: Pod //指明创建的资源类型
metadata: 元数据 名称字段必写。
metadata:
name: deploy1 //meatdata字段下必须有name这个二级字段定义名称
["a","b","c"] (字典写法)
- a
- b
- c
spec:用户期望的状态。
spec的例子:只删除pod,deployment会按照spec期望值重新生成pod
[root@master ~]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 20m
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-755c56db9f-hp8w9 1/1 Running 0 9m40s
[root@master ~]# kubectl delete pod nginx-755c56db9f-hp8w9
pod "nginx-755c56db9f-hp8w9" deleted
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-755c56db9f-gjmsr 1/1 Running 0 5s
通过例子可以看到,spec:下面期望有1个副本,删除掉其中一个后,发现还是1个,这时注意一下运行时间发现已经删除掉旧的的,但会根据期望值创建一个新的。维持spec的期望值不变。
status: 资源现在处于什么样的状态。通常创建yaml时不用写,是描述现在的状态的,和spec做对比。
=================================================
可以使用kubectl explain 命令查看我们要写的资源对象的yaml文件怎么写。比如查看deployment资源的话就可以写成:
kubectl explain deploy kubectl explain deployment.metadata #查看deployment下matedata字段的写法帮助
##### 如何快速编写yaml文件
第一种 使用kubectl create命令生成yaml文件,生成过程中并不执行,主要是要生成yaml文件。
第二种 当资源已经部署过了,可以直接使用kubectl get命令导出yaml文件,在此基础上编辑。
第一种:
kubectl create deployment web --image=nginx -o yaml --dry-run > myl.yaml #并不真正执行,只会输出yaml文件。
kubectl apply -f my1.yaml #执行yaml文件生成资源
第二种:
kubectl get deploy nginx -o=yaml --export > my2.yaml
----------------------------------------------------
##### 动手写第一yaml文件
#写第一yaml文件 mkdir /root/yaml vim /root/yaml/deploy1.yaml **Deployment** apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.18 ports: - containerPort: 80
在该例中:
apiVersion API版本
kind 资源类型
metadata 资源元数据
spec 资源规格,期望
replicas 副本数量
selector 标签选择器
template Pod模板
metadata Pod元数据
spec Pod规格
container 容器配置
创建名为 nginx-deployment(由 .metadata.name 字段标明)的 Deployment。
该 Deployment 创建三个(由 replicas 字段标明)Pod 副本。
selector 字段定义 Deployment 如何查找要管理的 Pods。 在这里,你只需选择在 Pod 模板中定义的标签(app: nginx)。 不过,更复杂的选择规则是也可能的,只要 Pod 模板本身满足所给规则即可。
说明: matchLabels 字段是 {key,value} 偶对的映射。在 matchLabels 映射中的单个 {key,value} 映射等效于 matchExpressions 中的一个元素,即其 key 字段是 “key”,operator 为 “In”,value 数组仅包含 “value”。在 matchLabels 和 matchExpressions 中给出的所有条件都必须满足才能匹配。
template 字段包含以下子字段:
Pod 被使用 labels 字段打上 app: nginx 标签。
Pod 模板规约(即 .template.spec 字段)指示 Pods 运行一个 nginx 容器, 该容器运行版本为 1.18 的nginx Docker Hub镜像。
创建一个容器并使用 name 字段将其命名为 nginx。
开始之前,请确保的 Kubernetes 集群已启动并运行。 按照以下步骤创建上述 Deployment
执行yaml文件:
kubectl apply -f deploy1.yaml
##### 更新Deployment
更新 Deployment
你可以通过更新一个新的 YAML 文件来更新 Deployment。下面的 YAML 文件指定该 Deployment 镜像更新为 nginx:latest。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 #使用kubectl apply 命令运行yaml文件。 kubectl apply -f deploy1.yaml ##### //在线命令方式更新 kubectl edit deployment nginx-deployment kubectl get deployments kubectl edit deployment nginx-deployment #把副本数量修改成5个,镜像换成httpd kubectl get deployments kubectl get pod -o wide kubectl get deployment -o wide