当前位置: 首页 > Web前端 > JavaScript

Kubernetes初学者的一些实战练习(三)

时间:2023-03-27 11:44:43 JavaScript

本系列的前两篇文章:Kubernetes初学者的一些实战练习(一)Kubernetes初学者的一些实战练习(二)我们在PracticeinKubernetes中完成了以下内容:Howto在Kubernetes中创建Nginx应用程序如何在Kubernetes中创建Nginx服务在Kubernetes中实现Pod和服务绑定在Kubernetes中使用作业计算2000位后的圆周率在Kubernetes中使用ConfigMap在Linux上使用脚本自动安装Kubernetes包管理器Helmon服务器一个简单的例子了解Kubernetes的三种IP地址类型使用describe命令排查Kubernetespod这篇文章继续通过实战来学习Kubernetes。练习一:通过describe命令了解Kubernetespod的详细属性。我们可以先使用kubectlgetpods命令获取pod列表。例如,如果我们想研究podnginx-storage-pod的细节:使用命令kubectldescribepodnginx-storage-pod>nginx-storage-pod.yaml,将describe命令的输出重定向到一个yaml文件中.用vi打开这个yaml文件:pod的所有属性都可以从这个yaml文件中得知:node:shoot--k8s-train--shacw46-worker-prvfv-z1-7844dc6744-ghd5m/10.250.0.6表示所在节点pod所在,这个节点必须是命令kubectlgetnode:返回的结果之一:Image:表示该pod基于哪个docker镜像。mount:pod使用的持久卷对应的物理文件目录。我的例子是usr/share/nginx/html:这个路径从哪里来?就是我的pod文件的yaml文件中的定义:除了本文的描述外,还可以通过describe命令来详细了解pod的属性,也可以用于pod无法访问时的故障排查正常启动。比如我有一个名为another3的pod,状态一直在CrashLoopBackOff,RESTART次数为12:使用kubectldescribepodanother3查看容器启动的详细信息:Back-offrestartingfailedcontainer查看yaml文件仔细查看pod,发现原因是因为我定义了volume的名称为content-storage,但是没有指定persistentvolumeclaim。当我删除volumes:-name:content-storage时,下图是修改后的yaml文件:重新创建一个名为another3的pod,很快创建成功,状态为running:Exercise2-使用Gardener创建一个Kubernetes集群在谷歌云平台上。Gardener是一个开源项目,github地址在这里。使用Gardener,我们可以在几分钟内在GCP、AWS、Azure或Openstack上构建它在互联网上轻松创建Kubernetes集群。单击新建按钮创建一个集群。这里Infrastructure我选择gcp:创建成功后,状态变为Ready,说明集群已经可用。点击集群名称jerrycls进入集群详情页面,在Access选项卡下获取集群用户名admin和密码。单击仪表板超链接,将弹出输入用户ID和密码的提示。输入admin作为用户名,然后从上面的“访问”选项卡中获取密码。可以进入集群的管理页面。从左下角查看这个集群的三个命名空间:default、kube-public和kube-system:这是Gardener自动分配给我的工作节点:点击kubeconfig获取这个集群的configyaml文件,复制其contents:我使用的操作系统是ubuntu,上面安装了kubectl。进入/home/vagrant/.kube目录,vi编辑配置文件:将Gardener复制的内容粘贴到配置文件中。现在使用kubectlgetns,可以看到Kubernetes集群上的三个命名空间,这与我们之前在dashboard中观察到的一致。使用kubectlgetnode-owide,我看到了一个工作节点,这与我之前在Kubernetes仪表板中观察到的一致。使用命令kubectlrunnginx--image=nginx:1.12.2创建deployment并运行nginx容器:创建deployment后,使用命令行创建服务,将nginx服务对外暴露:kubectlexposedeploymentnginx--type=loadBalancer--port=80--target-port=80使用kubectlgetsvc查看生成的服务,外部访问的IP地址是从EXTERNAL-IP中获取的:35.233.45.209:直接访问这个ip地址在浏览器中看到Nginx的默认主页,说明部署在谷歌云平台上的Kubernetes集群可以正常工作。Exercise3-如何使用Kubernetes的configmap通过环境变量注入pods在Kubernetes官网中提到Kubernetes的一个最佳实践是应用代码和配置信息分离。一种方法是使用Kubernetes1.2中引入的configmap概念。configmap其实就是存放在etcd中的一系列键值对。etcd的官网有这么一句话:etcdisadistributedkey-valuestoredesignedtoreliableandquicklypreserveandprovideaccesstocriticaldata。etcd是用于存储和访问关键数据的高性能分布式键值存储。使用以下命令行创建Kubernetes配置映射:kubectlcreateconfigmaptest-config--from-literal=test.type=unit--from-literal=test.exec=always创建一个名为test-config的键值对,key是test.type,value是unit,key是test.exec,value是always。接下来,我计划创建一个pod来使用这个名为test-config的configmap。创建一个包含以下内容的yaml文件:apiVersion:v1kind:Podmetadata:name:test-configmapspec:containers:-name:test-containerimage:alpine:3.8command:["/bin/sh","-c","env"]env:-name:TEST_TYPEvalueFrom:configMapKeyRef:name:test-configkey:test.type-name:TEST_EXECvalueFrom:configMapKeyRef:name:test-configkey:test.execrestartPolicy:Never这个yaml文件定义的pod是基于docker的imagealpine,执行shell命令/bin/sh-cenv查看环境变量。在env区域,我在pod中注入了一个名为TEST_TYPE的环境变量,取值取自configMap键值对中名为test.type的键的值。kubectlcreate-f创建这个pod:使用命令kubectllogstest-configmap查看pod运行产生的日志,发现在输出的环境变量列表中出现了TEST_TYPE=unit,这个TEST_TYPE就是环境变量的名字我在yaml文件中注入,unit来自configmap中test-config的valueunit。总结本文是本系列的第三篇文章。首先,我学习了如何使用常用命令describe来了解pod属性和排查一些常见故障。然后,通过学习如何使用ConfigMap,我了解了Kubernetes世界中相同的应用程序代码。分离配置信息的最佳实践,终于学会了使用开源项目Gardener在云平台上创建Kubernetes集群的步骤,希望对大家有所帮助。本系列前两篇中包含的练习可以参考之前的文章:本系列前两篇:Kubernetes初学者的一些实战练习(一)Kubernetes初学者的一些实战练习(二)