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

简介: 适合 Kubernetes 初学者的一些实战练习(一)

本系列记录了笔者刚刚接触并学习 Kubernetes 时动手做过的一些练习,这里分享出自己的 Kubernetes 学习历程,希望对广大 Kubernetes 初学者有所帮助。

练习1 - 如何在 Kubernetes 里创建一个 Nginx 应用

使用命令行 kubectl run --image=nginx nginx-app --port=80 创建一个名为 nginx-app 的应用

结果: deployment.apps/nginx-app created

使用命令行 kubectl get pods 查看创建结果,状态已经为 running

使用命令行 kubectl describe pods 查看 pod 明细:

把 pod id 记下来: nginx-app-f75d46bd9-q6c76

使用该 pod id 可以执行一些命令:

  • kubectl exec nginx-app-f75d46bd9-q6c76 ps aux
  • kubectl describe pod nginx-app-f75d46bd9-q6c76
  • kubectl logs nginx-app-f75d46bd9-q6c76

练习2 - 如何在 Kubernetes 里创建一个 Nginx Service

前一个练习,我们已经使用 kubectl 命令行创建了 Pod,但是在 kubernetes 中,Pod 的 IP 地址会随着 Pod 的重启而变化,因此用 Pod 的 IP 地址来访问我们部署的 nginx 应用不太合适。


Kubernetes 里推荐的方式是用 Service 来消费 nginx 服务。


Service 为一组 Pod 提供一个统一的入口,并为它们提供负载均衡和服务发现支持。


使用如下命令行基于 pod 创建一个 service:

kubectl expose deployment nginx-app --type=NodePort --port=80

收到 service/nginx-app exposed 消息。

使用命令行拿到创建成功的 service 的明细:

kubectl describe service nginx-app

使用 http://<node_id>:32624 访问这个 nginx 应用:

看到上图说明访问 nginx 成功了。

使用命令行查看 nginx 访问日志:

kubectl logs nginx-app-f75d46bd9-q6c76

练习3 - Kubenetes 里 Pod 和 Service 绑定的实现方式

前一个练习,我们介绍了如何创建一个 Kubernetes pod 和 service,使用的方法是命令kubectl run.

本文介绍另一种方式,通过这种方式来学习 Kubernetes 里 pod 和对应的 service 是如何绑定的。

首先使用下面的命令行创建一个名称为 jerry-nginx-1982 的 deployment:

kubectl create deployment jerry-nginx-1982 --image=nginx

然后使用命令行 kubectl get deployment 得到创建好的 deployment:

然后创建一个同名的 service,类型为 nodeport.

kubectlcreate service nodeport jerry-nginx-1982 --tcp 80:80

创建完成后,使用命令行 kubectl get svc 得到名称为 jerry-nginx-1982 对外暴露的端口号:31954:

然后就能通过这个端口号访问nginx server了:

那么这两个同名的 pod 和 service 是如何关联的呢?

首先打开 kubernetes dashboard,找到之前创建的 pod:

其明细为:jerry-nginx-1982-67cb658cb8-9hl99

再打开同名service:

再打开这个 service 里的 pod,发现就是我们前面找到的 jerry-nginx-1982-67cb658cb8-9hl99,说明 pod 和 service 是通过名称关联的。

我们可以做一个 negative 测试,直接创建一个名为 test 的 service,但不给它预先创建名为 test 的 pod:

kubectl create service nodeport test --tcp 80:80

service 创建成功后,打开这个 service,发现里面没有分配任何 pod:

这个结果和我们预测的一致。

练习4 - 使用 Kubernetes 里的 job 计算圆周率后 2000 位

使用 Kubernetes 里的 job(作业),我们可以很方便地执行一些比较耗时的操作。

新建一个 job.ymal 文件:

定义了一个 Kubernetes job,名称为 pi,类型为 job,容器名称为 pi,镜像为 perl,执行的 perl 命令为 print bpi(2000):

这个 ymal 文件的完整内容:

apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
metadata:
name: pi
spec:
containers:
name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never

使用命令 kubectl create -f 导入这个 yaml 文件,创建一个新的 job:

之后在 Kubernetes 的 dashboard 里能看到这个新建的 job:

job 对应的 pod 状态为 Waiting ContainerCreating:

稍后,其状态从 Running 变为了 Terminated:Completed,总共花了 14 分钟。

在 pod 的事件日志里,能看到大部分时间花在了 perl 镜像的下载上:

点击 dashboard 的 logs 按钮,就能看到这个 2000 位圆周率的计算结果:

练习5 - Kubernetes 里的 ConfigMap 的用途

顾名思义,ConfigMap 用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件。

ConfigMap 同 Kubernetes 的另一个概念 secret 类似,区别是 ConfigMap 主要用于保存不包含敏感信息的明文字符串。

创建方式:

kubectl create configmap special-config --from-literal=i042416=jerry

上述命令行创建了一个名为 special-config 的键值对,

key为 i042416, 值为 jerry

接下来我希望用这个 key 为 i042416 的值"jerry"来定义成 pod 里的一个环境变量。

下面是我的 yaml 文件:

apiVersion: v1
2 kind: Pod
3 metadata:
4 name: jerry-config-pod
5 spec:
6 containers:
7 - name: test-container
8 image: http://gcr.io/google_containers/busybox
9 command: [ "/bin/sh", "-c", "env" ]
10 env:
11 - name: JERRY_NAME
12 valueFrom:
13 configMapKeyRef:
14 name: special-config
15 key: i042416
16 restartPolicy: Never

可以看到第 15 行引用了我的 ConfigMap 的 key:i042416

下面使用 create -f 将该 yaml 文件导入,创建一个新的 pod:

创建之后,能在 pod 的明细页面看到 configMap 的 key 已经作为环境变量显示出来了:

因为我 yaml 文件里指定 pod 执行的 script 为 /bin/sh -c env, 因此最后会将容器里所有的环境变量都打印出来,我们定义在 ConfigMap 里的 i042416 的值 jerry 也被显示了出来:

这种定义环境变量的做法和 SAP 云平台 CloudFoundry 环境里定义环境变量的方式很类似。

CloudFoundry环境变量一览表:


https://docs.run.pivotal.io/devguide/deploy-apps/environment-variable.html


CF_INSTANCE_ADDR

CF_INSTANCE_GUID

CF_INSTANCE_INDEX

CF_INSTANCE_IP

CF_INSTANCE_INTERNAL_IP

CF_INSTANCE_PORT

CF_INSTANCE_PORTS

DATABASE_URL

HOME

LANG

MEMORY_LIMIT

PORT

PWD

TMPDIR

USER

VCAP_APP_PORT

VCAP_APPLICATION

VCAP_SERVICES

当使用 cf push 命令将本地应用部署到 SAP 云平台的 CloudFoundry 环境下时,某些环境变量会自动被系统写入相应的值,这个行为同 ABAP 的 sy-sysid 自动被设置为当前系统 ID 具有一样的逻辑。


比如 app router 会把用户访问请求重定向到 XSUAA 实例上。

app router 在 manifest.yml 里定义的 XSUAA 实例名称为 xsuaa-jerry-demo,

在运行时这个 XSUAA 的 id 会被 SAP 云平台自动写入环境变量 VCAP_SERVICES 里:

总结

本文介绍了每一个 Kubernetes 从业者的实际工作中几乎都会使用的步骤:创建 Deployment 和 Service,同时通过实际例子讲解了 Pod 和 Service 绑定的实现方式,介绍了使用 Kubernetes Job 计算圆周率这种费时的操作,希望对 Kubernetes 初学者能有所帮助。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
4月前
|
Kubernetes 监控 调度
Kubernetes Pod调度:从基础到高级实战技巧
Kubernetes Pod调度:从基础到高级实战技巧
198 0
|
5月前
|
Kubernetes Perl 容器
k8s学习-ReplicationController 、ReplicaSet(工作原理、模板、实战)
k8s学习-ReplicationController 、ReplicaSet(工作原理、模板、实战)
40 0
|
5月前
|
Kubernetes Cloud Native 应用服务中间件
云原生|kubernetes 你真的学废了吗---实战k8s 一(jsonpath实战)
云原生|kubernetes 你真的学废了吗---实战k8s 一(jsonpath实战)
67 0
|
4月前
|
存储 Kubernetes 监控
Kubernetes快速进阶与实战:构建可靠的容器化应用平台
Kubernetes快速进阶与实战:构建可靠的容器化应用平台
99 0
|
4月前
|
存储 Kubernetes 安全
Kubernetes Pod配置:从基础到高级实战技巧
Kubernetes Pod配置:从基础到高级实战技巧
154 0
|
5月前
|
Kubernetes Cloud Native 应用服务中间件
云原生|kubernetes 你真的学废了吗---实战k8s 二(命令行创建各类资源)
云原生|kubernetes 你真的学废了吗---实战k8s 二(命令行创建各类资源)
79 1
|
5月前
|
存储 关系型数据库 MySQL
猿创征文|云原生|kubernetes实务---部署MySQL--实战(一)
猿创征文|云原生|kubernetes实务---部署MySQL--实战(一)
53 0
|
5月前
|
Kubernetes Cloud Native 应用服务中间件
【云原生】kubernetes学习之资源(对象)控制器概述---概念和实战(五)
【云原生】kubernetes学习之资源(对象)控制器概述---概念和实战(五)
22 0
|
5月前
|
存储 Kubernetes 安全
k8s学习-持久化存储(Volumes、hostPath、emptyDir、PV、PVC)详解与实战
k8s学习-持久化存储(Volumes、hostPath、emptyDir、PV、PVC)详解与实战
71 0
|
5月前
|
JSON Kubernetes 数据格式
k8s学习-kubectl命令常用选项详解与实战
k8s学习-kubectl命令常用选项详解与实战
61 0

推荐镜像

更多