本系列记录了笔者在初次接触和学习Kubernetes时所做的一些练习。在这里分享一下自己的Kubernetes学习过程,希望对广大Kubernetes初学者有所帮助。练习1-如何在Kubernetes中创建Nginx应用程序使用命令行kubectlrun--image=nginxnginx-app--port=80创建一个名为nginx-app的应用程序结果:deployment.apps/nginx-appcreated使用命令运行kubectlgetpods查看创建结果,状态为已经运行:使用命令行kubectldescribepods查看pod详情:记下podid:nginx-app-f75d46bd9-q6c76使用这个podid执行一些命令:kubectlexecnginx-app-f75d46bd9-q6c76psauxkubectldescribepodnginx-app-f75d46bd9-q6c76kubectllogsnginx-app-f75d46bd9-q6c76练习2-如何在Kubernetes中创建Nginx服务在之前的练习中,我们创建了一个pod使用kubectl命令行,但是在kubernetes中,Pod的IP地址会随着Pod的重启而改变,所以使用Pod的IP地址来访问我们部署的nginx应用是不合适的。Kubernetes中推荐的方式是使用Service来消费nginx服务。Service为一组Pod提供统一的入口,并为它们提供负载均衡和服务发现支持。使用如下命令行创建基于pod的服务:kubectlexposedeploymentnginx-app--type=NodePort--port=80Receiveservice/nginx-appexposedmessage。使用命令行获取创建成功服务的详细信息:kubectldescribeservicenginx-app使用http://:32624访问nginx应用:见上图说明访问nginx成功。使用命令行查看nginx访问日志:kubectllogsnginx-app-f75d46bd9-q6c76练习3-Kubenetes中Pod和ServiceBinding的实现在上一个练习中,我们介绍了如何创建Kubernetespod和service,使用命令kubectl跑步。本文介绍另一种方式来了解Kubernetes中的Pod与对应的服务是如何绑定的。首先使用以下命令行创建名为jerry-nginx-1982的部署:kubectlcreatedeploymentjerry-nginx-1982--image=nginx然后使用命令行kubectlgetdeployment获取创建的部署:然后使用同名,类型为nodeport.kubectlcreateservicenodeportjerry-nginx-1982--tcp80:80创建完成后,使用命令行kubectlgetsvc获取名称jerry-nginx-1982。对外暴露的端口号:31954:那么就可以通过这个端口号访问nginx服务器:那么这两个同名的pod和service是怎么关联的呢?首先打开kubernetesdashboard,找到之前创建的pod:详细信息是:jerry-nginx-1982-67cb658cb8-9hl99然后打开同名服务:再打开这个服务中的pod,发现是jerry-nginx-1982-67cb658cb8我们在前面找到-9hl99,说明pod和services是通过名称关联的。我们可以直接创建一个名为test的服务,而不是为其预先创建一个名为test的pod来做一个反面测试:kubectlcreateservicenodeporttest--tcp80:80service服务创建成功后,打开服务,发现没有Assignanypod:这个结果和我们的预测是一致的。Exercise4-使用Kubernetes中的作业计算pi后的2000位使用Kubernetes中的作业(job),我们可以轻松的进行一些耗时的操作。新建job.ymal文件:定义一个Kubernetes作业,名称为pi,类型为job,容器名称为pi,镜像为perl,执行的perl命令为printbpi(2000):完整内容这个ymal文件的:apiVersion:batch/v1kind:Jobmetadata:name:pispec:template:metadata:name:pispec:containers:name:piimage:perlcommand:["perl","-Mbignum=bpi","-w??le","printbpi(2000)"]restartPolicy:Never使用命令kubectlcreate-f导入这个yaml文件并创建一个新的job:之后在Kubernetes的dashboard中可以看到新创建的job:pod对应的状态作业是WaitingContainerCreating:后来,它的状态从Running变成了Terminated:Completed,总共耗时14分钟。在pod的事件日志中,可以看到大部分时间花在了下载perl镜像上:点击dashboard上的logs按钮,可以看到2000位pi的计算结果:Exercise5-ConfigMap在Kubernetes中的用途,顾名思义,ConfigMap就是用来保存键值对的配置数据,可以用来保存单个属性,也可以用来保存一个配置文件。ConfigMap类似于Kubernetes的另一个概念secret,不同的是ConfigMap主要用于存储不包含敏感信息的明文字符串。创建方法:kubectlcreateconfigmapspecial-config--from-literal=i042416=jerry上面的命令行创建了一个名为special-config的键值对,键为i042416,值为jerry接下来,希望能用到这个keyasi042416值“jerry”被定义为pod中的环境变量。这是我的yaml文件:apiVersion:v12kind:Pod3metadata:4name:jerry-config-pod5spec:6containers:7-name:test-container8image:http://gcr.io/google_containers/busybox9command:["/bin/sh","-c","env"]10env:11-name:JERRY_NAME12valueFrom:13configMapKeyRef:14name:special-config15key:i04241616restartPolicy:Never可以看到第15行被引用了我的ConfigMap的key:i042416使用create-f导入下面的yaml文件新建一个pod:创建完成后可以看到configMap的key已经在pod详情页显示为环境变量了:因为我的yamlfilepod中指定的脚本是/bin/sh-cenv,所以最后会打印出容器中的所有环境变量,同时也会显示我们在ConfigMap中定义的i042416的值jerry:这个定义环境变量方式和SAP云平台的CloudFoundry环境中定义环境变量的方式非常相似秩序。CloudFoundry环境变量一览表:https://docs.run.pivotal.io/d...CF_INSTANCE_ADDRCF_INSTANCE_GUIDCF_INSTANCE_INDEXCF_INSTANCE_IPCF_INSTANCE_INTERNAL_IPCF_INSTANCE_PORTCF_INSTANCE_PORTSDATABASE_URLHOMELANGMEMORY_LIMITPORTPWDTMPDIRUSERVCAP_APP_PORTVCAP_APPLICATIONVCAP_SERVICES当使用cfpush命令将本地应用部署到SAP云平台的CloudFoundry环境下时,某些环境变量会自动被系统写Enterthecorrespondingvalue,thisbehaviorhasthesamelogicasABAP'ssy-sysidisautomaticallysettothecurrentsystemID.Forexample,theapprouterwillredirectuseraccessrequeststotheXSUAAinstance.TheXSUAAinstancenamedefinedbyapprouterinmanifest.ymlisxsuaa-jerry-demo.TheidofthisXSUAAwillbeautomaticallywrittenintotheenvironmentvariableVCAP_SERVICESbytheSAPcloudplatformatruntime:SummaryThisarticleintroducestheactualsituationofeachKubernetespractitioner.Stepsthatarealmostalwaysusedinwork:createDeploymentandService,andexplaintheimplementationofPodandServicebindingthroughpracticalexamples,andintroducethetime-consumingoperationofusingKubernetesJobtocalculatepi.IhopeitwillbehelpfulforKubernetesbeginners.