环境信息
minikube version: v1.26.0
docker desktop: 4.16.2 (95914)
mac OS: 13.1
表单填写方式部署 nginx
在 dashboard
的右上角有个+
图标,点击后选择从表单创建,填写数据:
应用名称: nginx-form
容器镜像: nginx:latest
pod 的数量: 2
Service: External
端口: 8000, 目标端口: 80, 协议: TCP
点击部署后,集群将会拉取nginx
的最新版本镜像并创建两个 pod
,pod
将内部接口 80
暴露出 8000
。应用名为nginx-form
,deployment
和service
都会明明为 nginx-form
。需要等待几分钟,拉取镜像需要时间。部署成功后,状态将会是running
。
kubernetes service 是将运行在一个或一组 pod 上的网络应用程序公开为网络服务的方法。
kubernetes deployment 检查 pod 的健康状况,并在 pod 中的容器终止的情况下重新启动新的容器。 deployment 是管理 Pod 创建和扩展的推荐方法。
kubernetes pod 是由一个或多个为了管理和联网而绑定在一起的容器构成的组。
使用 yaml 文件的方式部署 nginx
首先要了解一下yaml
语言,因为kubectl
需要的通信都是建立在yaml
语言之上,和web
中的html
一样,是所有运行的基础。
编写yaml
文档有两个小技巧,一个是参考kubernetes
的官方参考文档。
另一个是使用kubectl
命令:
1 | kubectl explain pod |
使用kubectl
例如生成一个模版,输出到一个指定文件中:
1 | kubectl run ngx --image=nginx:alpine --dry-run=client -o yaml > nginx_pod.yaml |
nginx_pod.yaml
1 | apiVersion: v1 # 创建该对象所使用的 Kubernetes API 的版本 |
pod
的关键在于yaml
文件的编写,然后用kubectl
去执行:
1 | # 添加pod |
使用 ConfigMap 配置 Pod
很多应用在其初始化或运行期间要依赖一些配置信息。 大多数时候,存在要调整配置参数所设置的数值的需求。configMap
是kubernetes
的一种机制,可让你将配置数据注入到应用的pod
内部。
例如,创建一个ConfigMap
来导入时区设置:
1 | kubectl create configmap area-timezone --from-file=/usr/share/zoneinfo/Asia/Shanghai |
不创建,以下部署文件执行时会报错: MountVolume.SetUp failed for volume “timezone” : configmap “area-timezone” not found
编辑部署文件
本地编辑一个nginx-deploy.yaml
部署文件。文件中包括 deployment
和 service
的资源声明。nginx-deploy.yaml
部署文件的内容:
1 |
|
部署 nginx
根据yaml
配置文件创建nginx-form
,执行部署命令:
1 | kubectl apply -f nginx-deploy.yaml |
kubectl apply -f <spec.yaml> - 基于文件名或标准输入,将新的配置应用到资源上
检查容器是否正常运行命令:
1 | kubectl get pod |
输出类似于:
1 | NAME READY STATUS RESTARTS AGE |
进入容器
除了通过kubectl get pod
获取容器信息,还可以通过kubernetes dashboard
查看:
获取容器详情:
1 | kubectl describe pod nginx-form-857bd686db-r9tt8 |
输出类似于:
1 | Name: nginx-form-857bd686db-r9tt8 |
进入指定容器命令:
1 | kubectl exec nginx-form-857bd686db-r9tt8 -c nginx-form -it -- /bin/sh |
输出类似于:
1 | # date |
更多exec
信息,请移步官方文档
双破折号 “–” 用于将要传递给命令的参数与 kubectl 的参数分开。
显示有关 service
的信息:
1 | kubectl get services nginx-form |
输出类似于:
1 | NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE |
可以看到 service
对外暴露的端口是 32578
,我们通过 minikube
的 IP + 端口即可访问 nginx
查看当前 minikube
的 IP
地址的命令:
1 | minikube ip |
如果外部IP
地址显示为<pending>
,请等待一分钟再次输入相同的命令。
但因为使用的是minikube
,需要输入minikube service nginx-form
将在浏览器中自动打开nginx-form
应用程序。
成功请求的响应会在浏览器页面展示:
1 | minikube service nginx-form |
输出类似于:
1 | |-----------|------------|------------------------|---------------------------| |
浏览器自动打开http://127.0.0.1:59206/
显示有关 Service 的详细信息:
1 | kubectl describe services nginx-form |
输出类似于:
1 | Name: nginx-form |
可以看到服务有几个端点: 172.17.0.5:80
,172.17.0.6:80
, 这些都是正在运行 nginx-form
应用程序的 Pod
的内部地址。
验证这些是 Pod
地址,请输入以下命令:
1 | kubectl get pods --output=wide |
输出类似于:
1 | NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES |
显示有关 Deployment 的信息:
1 | kubectl get deployments nginx-form |
显示有关 ReplicaSet 对象的信息:
1 | kubectl get replicasets |
ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。 因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性。
清理现场
要删除service
,请输入以下命令:
1 | kubectl delete services nginx-form |
要删除正在运行nginx-form
应用程序的deployment
、replicaSet
和pod
,请输入以下命令:
1 | kubectl delete deployment nginx-form |
以上。