装修网站怎么建设,城阳区网站建设公司,wordpress 淘宝客插件,什么是网站被黑什么是Docker#xff1f; 假设现在有一个服务场景#xff0c;你是一个程序猿#xff0c;你编写代码实现一个机器人喝水的功能#xff0c;然后你需要将这份代码部署到每个机器人身上#xff0c;你部署的时候需要一个个安装代码所需的依赖包#xff0c;然后运行测试你的代码…什么是Docker 假设现在有一个服务场景你是一个程序猿你编写代码实现一个机器人喝水的功能然后你需要将这份代码部署到每个机器人身上你部署的时候需要一个个安装代码所需的依赖包然后运行测试你的代码是否能够在这台机器上跑起来当然不同的机器人可能环境不一样可能安装的依赖包也不一样包括版本差异、网络不好甚至可能出现功能缺失的情况你为了保证功能正常采用了统一的版本这样部署的时间长、效率也很低。 随着业务的扩展你开发了运动功能、跳舞功能等。你将这些功能部署到机器人上时又需要单独部署三个不同的服务部署的时间成本更高了或者是你将几个小的服务合成一个大的服务如此一来导致服务之间发生冲突的可能性更大了使得机器人整体的性能和稳定性下降。这个时候你可能咬咬牙还能承受但是随着业务做大你又不得不引入数据库、中间件、更多的子模块....... 这时候你就需要借助Docker了Docker是什么正如logo所示集装箱。在Docker中把集装箱叫做容器用户把服务的代码放到容器里面运行因为集装箱有着坚实的箱壁所以每个容器之间被隔离开容器之间再也不会相互干扰了。当然Docker也提供了相应的措施供容器之间做一些必要的通信数据交互、服务请求等 了解k8s首先从整体架构入手k8s是一个比较典型的分布式系统例子主要包含控制节点和用户的工作节点。其中控制节点可以理解为k8s的内置节点是整个k8s的核心负责整个系统的管理和控制。在控制节点中k8s集成了一些核心的组件
用户通过命令行工具kubectl或者Web UI接入k8s集群发送指令控制工作节点的创建、删除、更新等。实际上命令行工具并不是直接操作工作节点的而是通过与api server通信通过api server去操作工作节点。 控制节点中提供了ApiServer、Scheduler、ControllerManager、ETCD以及其他很多辅助组件
ETCDk8s的状态存储数据库高可用键值存储包括集群的配置、Pod和容器的状态、服务和端点的状态、控制器的状态都存在ETCD的一个实例中确保了集群的状态在节点故障或重新启动后仍然可用。
ApiServer资源操作的唯一入口用于接受用户的指令。主要的功能有提供对外接口、省份认证及授权、资源验证及默认值设置、ETCD访问入口、控制的触发与调度、服务发现和负载等功能。其他组件或工作节点必须通过ApiServer访问ETCD
Scheduler资源调度通过ApiServer通过Watch接口监听Pod信息将新创建的Pod分配到合适的工作节点上。主要功能节点选择、资源分配、亲和性和反亲和性等
ControllerManager包含多个控制器每个控制器负责监控和维护集群中的一类资源的状态以确保集群的期望状态和实际状态保持一致。
工作节点是用户建立的每个node也都会被控制节点Master分配一些工作负载当这个node宕机时其上的工作负载会被Master自动转到其他工作节点node上。
解释工作负载指的是k8s集群中运行的容器化程序或服务node1宕机时节点内运行的Pod会被Master自动转移到可用节点node2上。这里转移的其实是Pod
工作节点中有以下组件
Kubelet负责维护容器的生命周期Kubelet可以通过Docker控制Pod的创建、启动、监控、重启、销毁等工作处理Master节点下发到本节点的任务。
KubeProxy负责制定数据转发策略并以守护进程的模式对各个节点Pod信息实时监控并更新转发规则。说白了就是给各个Pod直接通过通信。
Docker提供容器及容器的各种操作。
一些需要知道的东西
1. Pod
k8s集群都是以Pod在运行master节点中的组件也是以Pod的形式运行 Pod创建流程
客户端通过请求ApiServer通过的Restful API支持的数据类型有JSON和YAML或者使用命令行工具kubectl
客户端发起请求后会被ApiServer处理并将Pod的配置信息等存储到ETCD中
资源调度这个过程包括过滤主机-主机打分-主机选择。首先会根据一些Pod指定所需资源量或者标签需求过滤掉一些资源不够的主机调度预算然后根据优化策略给主机打分最后选择评分最高的主机进行binding绑定。这里的主机指的是工作节点最后会在真实的主机部署该工作节点
执行Pod创建确定好主机后Scheduler会调用ApiServer的API创建一个boundpod对象描述在一个工作上绑定运行的所有Pod的信息。运行在每个工作节点中的kubelet会定期与ETCD同步自己的boundpod信息一旦发现该工作节点上运行的boundpod对象没有更新则调用Docker 的API创建、下载、启动Pod内的容器 Pod的状态
在整个生命周期中Pod会出现5种状态
挂起(Pending): ApiServer已经创建了Pod资源对象但它尚未被调度完成或者仍处于下载镜像的过程中
运行中(Running): Pod已经被调度至某节点并且所有容器都已经被kubelet创建完成
成功(Succeeded): Pod中的所有容器都已经成功终止并且不会被重启
失败(Failed): 所有容器都已经终止但至少有一个容器终止失败即容器返回了非0值的退出状态
未知(Unknown): ApiServer无法正常获取到Pod对象的状态信息通常由网络通信失败所导致
创建并运行Podkubectl run podname --imagenginx:1.17.1 --port80 [--namespace dev] 老版本的k8s中run是创建一个Pod控制器通过控制器运行Pod现在是直接创建Pod
查询Podkubectl get pods -n [namespace] [-o wide] #指定命名空间加上-o wide参数后可以看到该Pod所在的节点ip地址等当然通过describe更详细
访问Pod通过查询Pod的ip和暴露的端口可以访问到Pod
Pod删除kubectl delete pod [pod name]
但是往往这样删除是不正确的因为master节点的控制器会监听Pod的状态一旦发现Pod死亡会立即重建这种情况下需要删除Pod控制器之后才能删除Pod当然如果是更高的版本就不会重新创建
首先查询namespace下的控制器kubectl get deploy -n dev
删除该Pod控制器kubectl delete deploy [deploy-name] -n dev
删除控制器后Pod也自动被删除了
2. NameSpace
命名空间是k8s中的一种资源类型用来隔离Pod运行的环境k8s集群启动后会默认创建几个namespace。 一些namespace的解读 master节点会分配到kube-systm中。
创建namespacekubectl create ns [ns name]
查询namespacekubectl get ns
删除namespacekubectl delete ns [ns name] #会先进入一个“删除中”的状态
通过配置文件创建kubectl create -f xxx.yaml
通过配置文件删除kubectl delete -f xxx.yaml 3. Label
以key value的形式附加在各种对象上 Node、Pod、Service
一个资源对象可以定义多个标签
标签通常在资源对象定义时确定yaml文件也可以在对象创建后创建或删除命令行 打标签kubectl label pod podname -n dev keyvalue
可以通过kubectl get pod -n pod --show-labels 查看标签信息
标签更新kubectl label pod podname -n dev keyvalue --overwrite
标签选择器基于等式的、基于集合的
基于等式的kubectl get pods -l keyvalue -n dev --show-labels
基于集合的kubectl get pods -l key in (value1,value2)
标签删除lunectl label pod podname -n dev label_name- 减号
ps可以通过逗号分隔keyvalue来一次创建、筛选标签
4. Deployment
Pod控制器k8s中很少直接控制Pod一般通过Pod控制器来操作。k8s中有很多中pod控制
创建控制器kubectl create deployment deploy-pod --imagexxx --port80 --replicas3
replicase表示副本数量新版本已弃用deployment和pod之间的管理关系通过标签来实现
配置文件创建 查看deploymenytkubectl get deploy -n dev -o wide
删除deploymentkubectl delete deploy deployname -n namespace_name
5. Service
问如果一个Pod宕机了k8s会自动生成一个新的Pod那么原来的Pod的ip地址还能访问吗
答ip地址会改变。
ps这里的ip是k8s集群内部的虚拟ip外部无法访问
Service 提供了同一类标签一样Pod的对外访问接口借助Pod应用也可以实现服务发现和负载均衡也就是端口暴露
创建一个Service通过Service来进行端口映射
对内端口暴露kubectl expose deploy container --nameSreviceName --typeClusterIP --port80 --target-port80 -n namespace
对外端口暴露kubectl expose deploy container --nameSreviceName --typeNodeport --port80 --target-port80 -n namespace
但是最后对外访问时用的还不是80端口 常用的命令 ##查看Pod、node、Service、endpoint等信息 kubectl get [组件名] eg:kubectl get pods #查看有哪些Pod eg:kubectl get pods -n [namespace] [-o wide] #指定命名空间加上-o wide参数后可以看到该Pod所在的节点ip地址等当然通过describe更详细 ##查看资源状态一般用于Pod调度过程中的问题排查 kubectl describe pod [Pod name] kubectl describe ns default #查看ns详情 #查看节点或者Pod资源cpu、内存使用情况 kubectl top [组件名] #进入Pod内部 kubectl exec -it [Pod name] /bin/bash #删除Pod kubectl delete pod [Pod name] #查看容器日志 kubectl logs -f [Pod name] #根据yaml文件创建资源 kubectl apply -f xxx.yaml