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

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

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

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

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

结果: deployment.apps/nginx-app created

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

适合 Kubernetes 初学者的一些实战练习(一)(上)使用命令行 kubectl describe pods 查看 pod 明细:

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

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

把 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 消息。

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

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

kubectl describe service nginx-app

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

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

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

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

kubectl logs nginx-app-f75d46bd9-q6c76

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

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

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

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

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

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

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

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

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

kubectl create service nodeport jerry-nginx-1982 --tcp 80:80

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

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

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

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

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

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

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

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

再打开同名service:

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

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

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

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

kubectl create service nodeport test --tcp 80:80

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

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

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

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