kubernetes系列教程(三)kubernetes快速入门

写在前面

kubernetes中涉及很多概念,包含云生态社区中各类技术,学习成本比较高,k8s中通常以编写yaml文件完成资源的部署,对于较多入门的人来说是个较高的门坎,本文以命令行的形式带领大家快速入门,俯瞰kubernetes核心概念,快速入门。

1.基础概念 1.1集群与节点

kubernetes是一个开源的容器引擎管理平台,实现容器化应用的自动化部署,任务调度,弹性伸缩,负载均衡等功能,cluster是由master和node两种角色组成

master负责管理集群,master包含kube-apiserver,kube-controller-manager,kube-scheduler,etcd组件

node节点运行容器应用,由ContainerRuntime,kubelet和kube-proxy组成,其中ContainerRuntime可能是Docker,rke,containerd,node节点可由物理机或者虚拟机组成。


kubernetes集群概念

1、查看master组件角色

[root@node-1~]

3、查看node节点详情

[root@node-1~]标签和/os=/arch=/hostname=/os=linuxAnnotations:/back-data:{"VtepMAC":"22:f8:75:bb:da:4e"}/back-type:/kube-subnet-manager:/public-ip:10.254.100.103/cri-socket:/var/run//ttl:0/controller-managed-attach-detach:trueCreationTimestamp:Sat,10Aug201917:50:00+0800Taints:noneUnschedulable:false。资源调度能力,MemoryPressure内存是否有压力(即内存不足)PIDPressure磁盘压力地址和主机名InternalIP:10.254.100.103Hostname:node-3Capacity:已分配资源情况cpu:2ephemeral-storage:47438316671hugepages-2Mi:0memory:3778124Kipods:110SystemInfo:ContainerRuntime为docker,版本为18.3.1KubeletVersion:版本PodCIDR:10.244.2.0/24下面是每个pod资源占用情况NamespaceNameCPURequestsCPULimitsMemoryRequestsMemoryLimitsAGE------------------------------------------------------------------kube-systemcoredns-fb8b8dccf-hrqm8100m(5%)0(0%)70Mi(1%)170Mi(4%)26hkube-systemcoredns-fb8b8dccf-qwwks100m(5%)0(0%)70Mi(1%)170Mi(4%)26hkube-systemkube-flannel-ds-amd64-zzm2g100m(5%)100m(5%)50Mi(1%)50Mi(1%)26hkube-systemkube-proxy-x8zqh0(0%)0(0%)0(0%)0(0%)26hAllocatedresources:kubectlrunnginx-app-demo--image=nginx:1.7.9--port=80--replicas=3kubectlrun--generator=deployment/=run-pod//nginx-app-democreated

2、查看应用列表,可以看到当前pod的状态均已正常,Ready是当前状态,AVAILABLE是目标状态

[root@node-1~]kubectldescribedeploymentsnginx-app-demoName:nginx-app-demo命名空间CreationTimestamp:Sun,11Aug201921:52:32+0800Labels:run=nginx-app-demo滚动升级版本号Selector:run=nginx-app-demo副本控制器StrategyType:RollingUpdateRollingUpdate升级策略,即最大不超过25%的podPodTemplate:当前状态TypeStatusReason----------------AvailableTrueMinimumReplicasAvailableProgressingTrueNewReplicaSetAvailableOldReplicaSets:noneNewReplicaSet:nginx-app-demo-7bdfd97dcd(3/3replicascreated)运行事件TypeReasonAgeFromMessage-------------------------NormalScalingReplicaSet3m24sdeployment-controllerScaledupreplicasetnginx-app-demo-7bdfd97dcdto3

4、查看replicasets情况,通过查看可知replicasets副本控制器生成了三个pod

1.查看replicasets列表[root@node-1~]kubectldescribereplicasetsnginx-app-demo-7bdfd97dcdName:nginx-app-demo-7bdfd97dcdNamespace:defaultSelector:pod-template-hash=7bdfd97dcd,run=nginx-app-demoLabels:pod-template-hash=7bdfd97dcd滚动升级的信息,副本树,最大数,应用版本/max-replicas:4/revision:1ControlledBy:Deployment/nginx-app-demo容器模板,继承于deploymentsLabels:pod-template-hash=7bdfd97dcdrun=nginx-app-demoContainers:nginx-app-demo:Image:nginx:1.7.9Port:80/TCPHostPort:0/TCPEnvironment:noneMounts:noneVolumes:noneEvents:kubectlgetpodsNAMEREADYSTATUSRESTARTSAGEnginx-app-demo-7bdfd97dcd-7t72x1/1Running013mnginx-app-demo-7bdfd97dcd-hsrft1/1Running013mnginx-app-demo-7bdfd97dcd-qtbzd1/1Running013m查看pod的详情[root@node-1~]labels名称run=nginx-app-demoAnnotations:noneStatus:RunningIP:10.244.2.4副本控制器为replicasetsContainers:容器的状态条件TypeStatusInitializedTrueReadyTrueContainersReadyTruePodScheduledTrueVolumes:QOS类型Node-Selectors:none事件状态,拉镜像,启动容器TypeReasonAgeFromMessage-------------------------NormalScheduled14mdefault-schedulerSuccessfullyassigneddefault/nginx-app-demo-7bdfd97dcd-7t72xtonode-3NormalPulling14mkubelet,node-3Pullingimage"nginx:1.7.9"NormalPulled14mkubelet,node-3Successfullypulledimage"nginx:1.7.9"NormalCreated14mkubelet,node-3Createdcontainernginx-app-demoNormalStarted14mkubelet,node-3Startedcontainernginx-app-demo
3.访问应用

kubernetes为每个pod都分配了一个ip地址,可通过该地址直接访问应用,相当于访问RS,但一个应用是一个整体,由多个副本数组成,需要依赖于service来实现应用的负载均衡,service我们探讨ClusterIP和NodePort的访问方式。

1、设置pod的内容,为了方便区分,我们将三个pod的nginx站点内容设置为不同,以观察负载均衡的效果

查看pod列表[root@node-1~]kubectlexec-itnginx-app-demo-7bdfd97dcd-7t72x/bin/bash设置站点内容[root@nginx-app-demo-7bdfd97dcd-7t72x:/echoweb2/usr/share/nginx/html/[root@nginx-app-demo-7bdfd97dcd-qtbzd:/kubectlgetpods-owideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATESnginx-app-demo-7bdfd97dcd-7t72x1/1/1/1

3、访问pod的ip,查看站点内容,不同的pod站点内容和上述步骤设置一致。

[root@node-1~]curl[root@node-1~]kubectlexposedeploymentnginx-app-demo--namenginx-service-demo\--port=80\--protocol=TCP\--target-port=80\--typeClusterIPservice/nginx-service-demoexposed

2、查看service的详情,可以看到service通过labels选择器selector自动将pod的ip生成points

查看service列表,显示有两个,kubernetes为默认集群创建的service[root@node-1~]kubectldescribeservicesnginx-service-demoName:nginx-service-demo命名空间Labels:run=nginx-app-demo标签选择器Type:ClusterIP服务的ip,即vip,集群内部会自动分配一个Port:unset80/TCP容器端口points:10.244.1.2:80,10.244.1.3:80,10.244.2.4:80负载均衡调度算法Events:none

3、访问service的地址,可以访问的内容可知,service自动实现了pods的负载均衡,调度策略为轮询,为何?因为service默认的调度策略SessionAffinity为None,即是轮训,可以设置为ClientIP,实现会话保持,相同客户端IP的请求会调度到相同的pod上。

[root@node-1~]curl[root@node-1~]curl

4、ClusterIP原理深入剖析,service后端实现有两种机制:iptables和ipvs,环境安装采用iptables,iptables通过nat的链生成访问规则,KUBE-SVC-R5Y5DZHD7Q6DDTFZ为入站DNAT转发规则,KUBE-MARK-MASQ为出站转发

[root@node-1~]iptables-tnat-LKUBE-SVC-R5Y5DZHD7Q6DDTFZ-nChainKUBE-SVC-R5Y5DZHD7Q6DDTFZ(1references)/00.0.0.0/0/00.0.0.0/0/00.0.0.0/02.查看实际转发的三条链的规则,实际映射到不同的pod的ip地址上[root@node-1~]iptables-tnat-LKUBE-SEP-56SLMGHHOILJT36K-nChainKUBE-SEP-56SLMGHHOILJT36K(1references)/0/00.0.0.0/0tcpto:10.244.1.3:80[root@node-1~]kubectlpatchservicesnginx-service-demo-p'{"spec":{"type":"NodePort"}}'service/nginx-service-demopatched2.确认yaml文件配置,分配了一个NodePort端口,即每个node上都会监听该端口[root@node-1~]自动分配了一个NodePort端口port:80protocol:TCPtargetPort:80selector:run:nginx-app-demosessionAffinity:Nonetype:NodePortkubectlgetservicesNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)/:32416/TCP68m

2、通过NodePort访问应用程序,每个node的地址相当于vip,可以实现相同的负载均衡效果,同时CluserIP功能依可用

1.NodePort的负载均衡[root@node-1~]curlhttp://node-2:32416web1[root@node-1~]curlhttp://node-3:32416web3[root@node-1~]curl[root@node-1~]curl[root@node-1~]netstat-antupl|grep32416tcp600:::32416:::*LISTEN32052/kube-proxy2.查看nat表的转发规则,有两条规则KUBE-MARK-MASQ出口和KUBE-SVC-R5Y5DZHD7Q6DDTFZ入站方向。ChainKUBE-NODEPORTS(1references)/00.0.0.0/0/*default/nginx-service-demo:*/tcpdpt:32416/00.0.0.0/0/*default/nginx-service-demo:*/tcpdpt:324163.查看入站的请求规则链KUBE-SVC-R5Y5DZHD7Q6DDTFZ[root@node-1~]iptables-tnat-LKUBE-SEP-DSWLUQNR4UPH24AX-nChainKUBE-SEP-DSWLUQNR4UPH24AX(1references)/0/00.0.0.0/0tcpto:10.244.1.2:80[root@node-1~]iptables-tnat-LKUBE-SEP-K6G4Z74HQYF6X7SI-nChainKUBE-SEP-K6G4Z74HQYF6X7SI(1references)/0/00.0.0.0/0tcpto:10.244.2.4:80
4.扩展应用

当应用程序的负载比较高无法满足应用请求时,一般我们会通过扩展RS的数量来实现,在kubernetes中,扩展RS实际上通过扩展副本数replicas来实现,扩展RS非常便利,快速实现弹性伸缩。kubernets能提供两种方式的伸缩能力:1.手动伸缩能力scaleup和scaledown,2.动态的弹性伸缩horizontalpodautoscalers,基于CPU的利用率实现自动的弹性伸缩,需要依赖与监控组件如metricsserver,当前未实现,后续再做深入探讨,本文以手动的scale的方式扩展应用的副本数。

Deployments副本扩展

1、手动扩展副本数

[root@node-1~]kubectlgetdeploymentsNAMEREADYUP-TO-DATEAVAILABLEAGEnginx-app-demo4/444133m

3、此时service的情况会怎样呢?查看service详情,新扩展的pod会自动更新到service的points中,自动服务发现

查看service详情[root@node-1~]地址已自动加入SessionAffinity:NoneExternalTrafficPolicy:ClusterEvents:none查看pioints详情[root@node-1~]curl[root@node-1~]curl[root@node-1~]curl[root@node-1~]curl

由此可知,弹性伸缩会自动自动加入到service中实现服务自动发现和负载均衡,应用的扩展相比于传统应用快速非常多。此外,kubernetes还支持自动弹性扩展的能力,即HorizontalPodAutoScaler,自动横向伸缩能力,配合监控系统根据CPU的利用率弹性扩展Pod个数,详情可以参考文档kubernetes系列教程(十九)使用metric-server让HPA弹性伸缩愉快运行

5.滚动升级

在kubernetes中更新应用程序时可以将应用程序打包到镜像中,然后更新应用程序的镜像以实现升级。默认Deployments的升级策略为RollingUpdate,其每次会更新应用中的25%的pod,新建新的pod逐个替换,防止应用程序在升级过程中不可用。同时,如果应用程序升级过程中失败,还可以通过回滚的方式将应用程序回滚到之前的状态,回滚时通过replicasets的方式实现。

滚动更新

1、更换nginx的镜像,将应用升级至最新版本,打开另外一个窗口使用kubectlgetpods-w观察升级过程

[root@node-1~]kubectlgetpods-wNAMEREADYSTATUSRESTARTSAGEnginx-app-demo-7bdfd97dcd-7t72x1/1Running0145mnginx-app-demo-7bdfd97dcd-hsrft1/1Running0145mnginx-app-demo-7bdfd97dcd-j6lgd1/1Running012mnginx-app-demo-7bdfd97dcd-qtbzd1/1Running0145mnginx-app-demo-5cc8746f96-xsxz40/1Ping00s删除旧的pod,替换nginx-app-demo-5cc8746f96-xsxz40/1ContainerCreating00snginx-app-demo-5cc8746f96-s49nv0/1Ping00s更换第二个podnginx-app-demo-5cc8746f96-s49nv1/1Running07snginx-app-demo-7bdfd97dcd-qtbzd1/1Terminating0146mnginx-app-demo-5cc8746f96-txjqh0/1Ping00snginx-app-demo-5cc8746f96-txjqh0/1Ping00snginx-app-demo-5cc8746f96-txjqh0/1ContainerCreating00snginx-app-demo-7bdfd97dcd-j6lgd0/1Terminating014mnginx-app-demo-7bdfd97dcd-j6lgd0/1Terminating014mnginx-app-demo-5cc8746f96-xsxz41/1Running09snginx-app-demo-5cc8746f96-txjqh1/1Running01snginx-app-demo-7bdfd97dcd-hsrft1/1Terminating0146mnginx-app-demo-7bdfd97dcd-qtbzd0/1Terminating0146mnginx-app-demo-5cc8746f96-rcpmw0/1Ping00snginx-app-demo-5cc8746f96-rcpmw0/1Ping00snginx-app-demo-5cc8746f96-rcpmw0/1ContainerCreating00snginx-app-demo-7bdfd97dcd-7t72x1/1Terminating0146mnginx-app-demo-7bdfd97dcd-7t72x0/1Terminating0147mnginx-app-demo-7bdfd97dcd-hsrft0/1Terminating0147mnginx-app-demo-7bdfd97dcd-hsrft0/1Terminating0147mnginx-app-demo-5cc8746f96-rcpmw1/1Running02snginx-app-demo-7bdfd97dcd-7t72x0/1Terminating0147mnginx-app-demo-7bdfd97dcd-7t72x0/1Terminating0147mnginx-app-demo-7bdfd97dcd-hsrft0/1Terminating0147mnginx-app-demo-7bdfd97dcd-hsrft0/1Terminating0147mnginx-app-demo-7bdfd97dcd-qtbzd0/1Terminating0147mnginx-app-demo-7bdfd97dcd-qtbzd0/1Terminating0147m

3、再次查看deployments的详情可知道,deployments已经更换了新的replicasets,原来的replicasets的版本为1,可用于回滚。

[root@node-1~]新的版本号,用于回滚Selector:run=nginx-app-demoReplicas:4desired|4updated|4total|4available|0unavailableStrategyType:RollingUpdateMinReadySeconds:0RollingUpdateStrategy:25%maxunavailable,25%maxsurgePodTemplate:Labels:run=nginx-app-demoContainers:nginx-app-demo:Image:nginx:latestPort:80/TCPHostPort:0/TCPEnvironment:noneMounts:noneVolumes:noneConditions:TypeStatusReason----------------AvailableTrueMinimumReplicasAvailableProgressingTrueNewReplicaSetAvailableOldReplicaSets:noneNewReplicaSet:nginx-app-demo-5cc8746f96(4/4replicascreated)/nginx-app-demoREVISIONCHANGE-CAUSE1none2none查看replicasets列表,旧的包含pod为0[root@node-1~]curl-I:"5d36f361-264"Accept-Ranges:bytes

6、回滚到旧的版本

[root@node-1~]curl-I:"54999765-264"Accept-Ranges:bytes
6.故障迁移

故障迁移

集群中的node节点物理服务器可能会因为各种原因导致机器不可用,如硬件故障,软件故障,网络故障等原因,当发生故障时容器可能会出现不可用,进而影响业务的使用。kubernetes内置已提供了应用的容错能力,通过工作负载Workload如Deployments,StatefulSets来控制,当node节点异常时会自动将其上的pod迁移至其他node节点上,保障应用的高可用。

Kubeadm默认部署的集群,默认当节点异常时,需要5min后才能迁移,因为默认pod中设置了污点容忍tolerations,当检测到节点状态是not-ready或者unreachable时,容忍tolerationSeconds时长300s后才做驱逐,如下是看pod详情中设置的污点容忍信息

tolerations:-effect:NoExecutekey:/not-readyoperator:ExiststolerationSeconds:300-effect:NoExecutekey:/unreachableoperator:ExiststolerationSeconds:300

如下是手动创建的yaml文件,通过调整污点容忍的时长为2s,当节点异常时,其上的pod能够实现快速迁移到其他node节点

apiVersion:apps/v1kind:Deploymentmetadata:labels:run:testname:testspec:replicas:3selector:matchLabels:run:testtemplate:metadata:labels:run:testspec:containers:-image:nginx:1.7.9name:testports:-containerPort:3resources:{}tolerations:-effect:NoExecutekey:/not-readyoperator:ExiststolerationSeconds:2-effect:NoExecutekey:/unreachableoperator:ExiststolerationSeconds:2
写在最后

本文以命令行的方式实践探索kubernetes中涉及的最重要的几个概念:应用部署,负载均衡,弹性伸缩和滚动升级,故障迁移,并以命令行的形式实际操作,读者可以参照文档实现快速入门,后续会大部分以yaml文件的形式部署和kubernets交互。

参考文档

基础概念:

部署应用:

访问应用:

外部访问:

访问应用:

滚动升级:

当你的才华撑不起你的野心时,你就应该静下心来学习

版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。

相关推荐