1、Kubernetes容器的探索与实践-徐兴强整体介绍dockerdocker与与KubernetesKubernetes的关系的关系2Kubernetes介绍介绍3KubernetesKubernetes集群部署集群部署14KubernetesKubernetes运维经验运维经验KubernetesKubernetes运维经验运维经验Docker容器与传统虚拟化方式的不同之处?与传统技术对比:接下来我们看两张经典的图:一、从虚拟化角度:图1:dockerdocker与与KubernetesKubernetes的关系的关系传统的虚拟技术:在将物理硬件虚拟成多套硬件后,需要再每套硬件上都部署一个操
2、作系统,接着在这些操作系统上运行相应的应用程序。Docker容器:容器内的应用程序进程直接运行在真实物理机的内核上,Docker引擎将一些各自独立的应用程序和它们各自的依赖打包,相互独立直接运行于宿主机硬件上,同时各个容器也没有自己的内核,显然比传统虚拟机更轻便。注:一个容器包含了完整的运行时环境:除了应用程序本身之外,这个应用所需的全部依赖、类库、其他二进制文件、配置文件等,都统一被打入了一个称为容器镜像的包中二、从部署角度图2:dockerdocker与与KubernetesKubernetes的关系的关系传统部署方式:是将所有应用直接部署在同一个物理机器节点上,这样每个App的依赖都是完
3、全相同的.Docker容器部署:通过部署Container容器的技术来部署应用,全部Container运行在容器引擎上即可。想用Docker,怎么用呢?手动一个一个创建?当然不,故kubernetes技术便出现了,以kubernetes为代表的容器集群管理系统,这时候就该上场表演了。我们用kubernetes去管理Docker集群,即可以将Docker看成Kubernetes内部使用的低级别组件。另外,kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。kuberneteskubernetes介绍介绍-什么是什么是k8sk8sl K8s全称Kubernetes,
4、是目前主流的容器编排系统,提供容器的生命周期管理。l k8s目标:提供一个规范,可以描述业务集群的架构,定义服务的最终状态,使业务系统自动得达到和维持在这个状态。k8s的前世今生Kubernetes特性k8s的前世今生:MESOSAPACHE早期的分布式资源管理框架2019-5Twitter开始使用Kubernetes,剔除MESOSDockerSwarm2019-07阿里云宣布DockerSwarm剔除Google10年容器化基础架构borgGO语言重编Borg-k8srancher官方预测:76%的企业会在三年内采纳Kubernetes作为标准。而且IBM也正在逐渐放弃大机,减弱小机,发力
5、云原生kuberneteskubernetes介绍介绍-特性特性l 自我修复自我修复节点发生故障时,容器会在其他节点重新部署;杀死健康检查失败的容器,在容器未创建成功之前,不让它处理客户端请求,确保线上服务不中断。l 弹性伸缩弹性伸缩为了保证业务在高峰时的可靠性,根据业务使用的CPU、内存资源或其他自定义指标,实现业务的扩容;业务低峰时回收资源,以最小成本运行服务。l 自动部署和回滚自动部署和回滚为了支持业务版本迭代,K8S采用滚动更新策略更新应用,一次更新一个业务Pod,而不是同时删除所有Pod,如果更新过程中出现问题,会回滚更改,确保升级不影响业务。l 服务发现和负载均衡服务发现和负载均衡
6、K8S为多个容器提供一个统一访问入口(内部IP地址和域名),并且负载均衡所有关联的容器,使得用户无需考虑容器IP变化问题。l 秘钥和秘钥和配置管理配置管理管理秘钥数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。l 存储编排存储编排为容器提供挂载存储的服务,支持本地存储,可以对接一些主流网络存储(如NFS、GlusterFS、Ceph)。l 批处理批处理提供一次性任务,定时任务;满足批量数据处理和分析的场景。Kubernetes特性KubernetesKubernetes集群集群架构架构Master和Node1.Ku
7、bernetes将集群中的机器划分为一个Master节点和一群工作节点(Node)。2.Master节点上运行着集群管理相关的一组进程etcd、APIServer、ControllerManager、Scheduler,这些进程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理功能,并且全都是自动完成。3.在每个Node上运行Kubelet、Proxy、Dockerdaemon三个组件,负责对本节点上的Pod的生命周期进行管理,以及实现服务代理的功能MasterMaster组件组件1.1.kube-apiserver kube-apiserver 对外提供API接口
8、,处理所有资源的增删改查和监听操作,并将数据保存在Etcd。所有服务访问统一入口2.2.kube-controller-kube-controller-manager manager-控制器控制器 ControllerManager负责管理各个资源对应的控制器。维持副本期望数目3.3.kube-scheduler kube-scheduler-调度器调度器 负责介绍任务,选择合适的节点进行分配任务,根据调度算法为新创建的Pod选择一个合适节点部署。4.4.etcd etcd 分布式键值存储系统。用于保存k8s资源数据,比如集群状态数据,Pod、Service等API对象,储存K8S集群所有重要
9、信息NodeNode组件组件1.kubelet kubelet管理本机运行的容器,可以创建容器、为Pod挂载数据卷、获取容器和节点状态等功能。直接跟容器引擎交互实现容器的生命周期管理2.kube-proxy负责写入规则至 IPTABLES、IPVS 实现服务映射访问的,具有一定的四层负载均衡功能。KubernetesKubernetes介绍介绍-pod-pod1.Pod是k8s中可部署的最小单位,它可以由单个容器组成,也可以是多个容器。2.Pod在Node上被创建、启动或者销毁;每个Pod里运行着一个特殊的被称之为Pause的容器,其他容器则为业务容器,pause容器有一个ip地址,和一个存储
10、卷,pod中的其他容器共享pause容器的ip地址和存储,这样就做到了文件共享和互信。KubernetesKubernetes介绍介绍-serviceservice在Kubernetes的世界里,虽然每个Pod都会被分配一个单独的IP地址,但这个IP地址会随着Pod的销毁而消失,这就引出一个问题:如果有一组Pod组成一个集群来提供服务,那么如何来访问它呢?Service!一个Service可以看作一组提供相同服务的Pod的对外访问接口,Service作用于哪些Pod是通过LabelSelector来定义的。拥有一个指定的名字(比如my-mysql-server);拥有一个虚拟IP(Cluste
11、rIP、ServiceIP或VIP)和端口号,销毁之前不会改变,只能内网访问;能够提供某种远程服务能力;被映射到了提供这种服务能力的一组容器应用上;如果Service要提供外网服务,需指定公共IP和NodePort,或外部负载均衡器;Service主要用于服务发现。Service有多种类型。主要使用clusterIP和nodeport。clusterIP用于集群内业务通信。Nodeport用于外部访问集群业务。KubernetesKubernetes集群集群架构架构-山东移动山东移动paaspaas容器化容器化目前山东移动已经实现3区crm中间件的容器化。KubernetesKubernete
12、s集群部署集群部署1.配置本地yum源cp/etc/yum.repos.d/CentOS-Media.repo/etc/yum.repos.d/CentOS-Media.repo.bak/本地yum配置文件mkdir/mnt/cdrom/创建用于挂载光盘的目录mount/dev/sr0/mnt/cdrom/挂载catCentOS-Media.repo/etc/resolv.conf/etc/hosts/etc/ansible/hosts/etc/sysctl.confansibleall-mcommand-asysctl-pansibleall-mcommand-ased-is/.*cento
13、s_centos7-swap/#&/g/etc/fstab13.【Master】批量安装telnetansibleall-mcommand-ayuminstall-ytelnetKubernetesKubernetes集群部署集群部署14.【Master】配置iptables对转发数据包进行处理,启用数据包转发cat/etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables=1net.bridge.bridge-nf-call-iptables=1net.ipv4.ip_forward=1EOFsysctl-system/etc/sysc
14、tl.d/k8s.confansiblenode-mcopy-asrc=/etc/sysctl.d/k8s.confdest=/etc/sysctl.d/k8s.confansiblenode-mcommand-asysctl-system/etc/sysctl.d/k8s.conf15.【Master】时间服务配置,几个节点的时间必须保持同步,否则会出现意料不到的结果ansibleall-mcommand-ayuminstall-yntpdateansibleall-mcommand-ansibleall-mcommand-ayuminstall-yntpansibleall-mcomman
15、d-asystemctlenablentpdansibleall-mcommand-asystemctlstartntpdansibleall-mcommand-atimedatectlset-timezoneAsia/Shanghaiansibleall-mcommand-atimedatectlset-ntpyesansibleall-mcommand-ahwclock-hctosysansibleall-mcommand-atimedatectlset-local-rtc0ansibleall-mcommand-ahwclock-showKubernetesKubernetes集群部署集
16、群部署16、安装dockeryuminstall-ydockersystemctlstartdocker&systemctlenabledocker#【Master】配置docker的cgroupdriver、加速器cat/etc/docker/daemon.jsonEOFexec-opts:native.cgroupdriver=systemd,log-driver:json-file,log-opts:max-size:100m,storage-driver:overlay2,storage-opts:overlay2.override_kernel_check=true,registry
17、-mirrors:https:/EOFansiblenode-mcopy-asrc=/etc/docker/daemon.jsondest=/etc/docker/daemon.jsonansibleall-mcommand-asystemctldaemon-reloadKubernetesKubernetes集群部署集群部署批量操作安装节点docker并启动ansiblenode-mcommand-ayuminstall-ydockeransiblenode-mcommand-asystemctlstartdockeransibleall-mcommand-asystemctlenabled
18、ocker17.更新kubernetes源cat/etc/yum.repos.d/kubernetes.repokubernetesname=Kubernetesbaseurl=https:/ kubectlgetdeployment#查看deployment kubectlgetpods-nkube-system#查看kube-system空间下的pod2.创建资源kubectlcreate-f./my-manifest.yaml#从文件创建资源kubectlcreate-f./dir#使用目录下的所有清单文件来创建资源3.编辑资源kubectl edit configmapkubectl
19、edit deploy4.删除资源kubectl delete pod pod-nameKubectl delete-f./my-manifest.yamlKubernetesKubernetes运维经验运维经验kubectllogsmy-pod#输出 pod 的日志(stdout)kubectlexecmy-pod-ls/#在已存在的容器中执行命令(只有一个容器的情况下)kubectlexecmy-pod-cmy-container-ls/#在已存在的容器中执行命令(pod 中有多个容器的情况下)kubectltoppodPOD_NAME-containers#显示指定 pod 和容器的指标
20、度量kubectltopnodemy-node#显示 my-node 的指标度量kubectlcordonmy-node#标记 my-node 不可调度kubectldrainmy-node#清空 my-node 以待维护kubectluncordonmy-node#标记 my-node 可调度kubectlcluster-info#显示 master 和服务的地址kubectltaintnodesfoodedicated=special-user:NoSchedulekubectllogsmy-pod#输出 pod 的日志(stdout)kubectlexecmy-pod-ls/#在已存在的
21、容器中执行命令(只有一个容器的情况下)kubectlexecmy-pod-cmy-container-ls/#在已存在的容器中执行命令(pod 中有多个容器的情况下)kubectltoppodPOD_NAME-containers#显示指定 pod 和容器的指标度量kubectltopnodemy-node#显示 my-node 的指标度量kubectlcordonmy-node#标记 my-node 不可调度kubectldrainmy-node#清空 my-node 以待维护kubectluncordonmy-node#标记 my-node 可调度kubectlcluster-info#显
22、示 master 和服务的地址kubectltaintnodesfoodedicated=special-user:NoScheduleKubernetesKubernetes运维经验运维经验节点notready,通过kubectlgetnodes查看节点状态KubernetesKubernetes运维经验运维经验Pod没有创建成功通过kubectldescribepod查看pod的event信息,能得知Pod当前的运行状态及创建过程中的异常信息。如果pod启动过程有异常,可能是pod内的程序产生了错误,使用kubectllogspod-name查看具体原因。KubernetesKubernetes运维经验运维经验Service域名不能访问(1)首先查看service中有无endpoint(2)进入容器执行nslookup检查域名能否解析(3)查看kube-proxy生成的iptables规则是否正确(4)用tcpdump抓包THANKYOU