4、Minikube实战:启动Minikube集群。部署一个Nginx应用。暴露服务并访问。
好,咱们现在开始动手了。
前面讲了那么多理论,什么Pod、Service、Deployment,说实话,光看概念容易晕。我个人习惯是,先跑起来一个东西,再回头理解那些概念,会轻松很多。
这一节,我们就用Minikube在本地搭一个Kubernetes集群。然后部署一个Nginx,再把它暴露出来,让你能在浏览器里访问到。整个过程,我估计15分钟就能搞定。
4.1 启动Minikube集群
首先,你得确保Minikube已经装好了。如果还没装,去官网下个二进制文件,或者用包管理器装一下,都很简单。
启动集群,就一行命令:
minikube start
嗯,这里要注意。我第一次用Minikube的时候,直接敲了这行命令,结果等了半天没反应。后来发现,它默认会去下载一个ISO镜像,网络不好的话会很慢。
minikube start --image-mirror-country=cn
或者直接指定阿里云的镜像:
minikube start --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
启动成功后,你会看到类似这样的输出:
😄 minikube v1.32.0 on Ubuntu 20.04
✨ Automatically selected the docker driver
👍 Starting control plane node minikube in cluster minikube
🔥 Creating docker container (CPUs=2, Memory=2200MB) ...
🐳 Preparing Kubernetes v1.28.3 on Docker 24.0.7 ...
🔗 Configuring bridge CNI (Container Networking Interface) ...
🌟 Enabled addons: default-storageclass, storage-provisioner
🏄 Done! kubectl is now configured to use "minikube" cluster
看到那个「🏄 Done!」了吗?说明集群已经跑起来了。
你可以用 kubectl get nodes 检查一下节点状态:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 2m v1.28.3
只有一个节点,因为Minikube是单节点集群。不过对于学习和测试来说,完全够用了。
4.2 部署一个Nginx应用
集群起来了,接下来我们部署一个Nginx。说白了,就是让Kubernetes帮我们跑一个Nginx容器。
最直接的方式,用 kubectl create deployment 命令:
kubectl create deployment nginx-demo --image=nginx:latest
这条命令的意思是:创建一个名为 nginx-demo 的Deployment,使用 nginx:latest 镜像。
你可以用 kubectl get deployments 看看部署状态:
kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-demo 1/1 1 1 10s
READY 显示 1/1,说明Pod已经成功运行了。
再深入一点,看看Pod的情况:
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-demo-7c79c4bf97-8kq2x 1/1 Running 0 20s
如果你想看更详细的信息,可以用 kubectl describe pod <pod-name>。我曾经在生产环境排查问题时,全靠这个命令看Pod的事件日志,定位问题特别快。
4.3 暴露服务并访问
Pod跑起来了,但你现在还访问不了它。为什么呢?因为Pod默认是在集群内部网络里的,外部网络根本看不到它。
这时候就需要Service出场了。Service的作用,说白了就是给Pod提供一个稳定的访问入口。
我们用 kubectl expose 命令来创建一个Service:
kubectl expose deployment nginx-demo --type=NodePort --port=80
这里我用了 --type=NodePort,意思是把Service暴露在节点的某个端口上。这样,你就能通过 节点IP:端口 来访问Nginx了。
查看Service:
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5m
nginx-demo NodePort 10.96.123.45 <none> 80:30080/TCP 10s
看到 80:30080/TCP 了吗?意思是:集群内部的80端口,映射到了节点的30080端口。
那怎么访问呢?用Minikube的话,有个更简单的方法:
minikube service nginx-demo
这条命令会自动打开浏览器,跳转到Nginx的欢迎页面。如果你用的是远程服务器,它会给你一个URL。
minikube service 会通过一个隧道来访问。如果遇到打不开的情况,试试 minikube tunnel 命令,它会创建一个网络隧道,把Service暴露到宿主机上。
打开浏览器,你应该能看到Nginx的默认欢迎页面:
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working.
看到这个页面,恭喜你,你的第一个Kubernetes应用部署成功了!
4.4 核心逻辑流程图
为了让你更直观地理解整个过程,我画了一张流程图:
4.5 清理资源
实验做完了,记得清理一下,别占着资源。我个人习惯是,每次实验完都清理干净,免得后面搞混。
# 删除 Service
kubectl delete service nginx-demo
# 删除 Deployment
kubectl delete deployment nginx-demo
# 停止 Minikube 集群
minikube stop
如果你想彻底删除Minikube创建的所有东西,可以用:
minikube delete
这个命令会把整个虚拟机(或容器)都删掉,干干净净。
minikube stop 就行。下次用 minikube start 启动,之前部署的应用还在。但如果你用 minikube delete,那就一切归零了。
好了,这一节的内容就到这儿。你亲手部署了一个Nginx,也理解了Deployment、Pod、Service这几个核心概念是怎么配合工作的。接下来,你可以试试部署其他应用,比如一个简单的Python Web服务,或者一个Redis缓存。动手试试,比看十遍文档都管用。
公众号:蓝海资料掘金营,微信deep3321