Pod
如果在生产环境中运行的都是独立的单体服务,那么 Container (容器) 也就够用了,但是在实际的生产环境中,维护着大规模的集群和各种不同的服务,服务之间往往存在着各种各样的关系。而这些关系的处理,才是手动管理最困难的地方。
Pod 是我们将要创建的第一个 k8s 资源,也是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。在了解 pod
和 container
的区别之前,我们可以先创建一个简单的 pod 试试,
我们先创建 nginx.yaml
文件,编写一个可以创建 nginx
的 Pod。
# nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx-container
image: nginx
其中 kind
表示我们要创建的资源是 Pod
类型, metadata.name
表示要创建的 pod 的名字,这个名字需要是唯一的。 spec.containers
表示要运行的容器的名称和镜像名称。镜像默认来源 DockerHub
。
我们运行第一条 k8s 命令 kubectl apply -f nginx.yaml
命令来创建 nginx
Pod。
接着通过 kubectl get pods
来查看 pod 是否正常启动。
最后通过 kubectl port-forward nginx-pod 4000:80
命令将 nginx
默认的 80
端口映射到本机的 4000
端口,打开浏览器或者 curl
来访问 http://127.0.0.1:4000
, 查看是否成功访问 nginx
默认页面!
kubectl apply -f nginx.yaml
# pod/nginx-pod created
kubectl get pods
# nginx-pod 1/1 Running 0 6s
kubectl port-forward nginx-pod 4000:80
# Forwarding from 127.0.0.1:4000 -> 80
# Forwarding from [::1]:4000 -> 80
kubectl exec -it
可以用来进入 Pod 内容器的 Shell。通过命令下面的命令来配置 nginx
的首页内容。
kubectl exec -it nginx-pod -- /bin/bash
echo "hello kubernetes by nginx!" > /usr/share/nginx/html/index.html
kubectl port-forward nginx-pod 4000:80
最后可以通过浏览器或者 curl
来访问 http://127.0.0.1:4000
, 查看是否成功启动 nginx
和返回字符串 hello kubernetes by nginx!
。
Pod 与 Container 的不同
回到 pod
和 container
的区别,我们会发现刚刚创建出来的资源如下图所示,在最内层是我们的服务 nginx
,运行在 container
容器当中, container
(容器) 的本质是进程,而 pod
是管理这一组进程的资源。
所以自然 pod
可以管理多个 container
,在某些场景例如服务之间需要文件交换(日志收集),本地网络通信需求(使用 localhost 或者 Socket 文件进行本地通信),在这些场景中使用 pod
管理多个 container
就非常的推荐。而这,也是 k8s 如何处理服务之间复杂关系的第一个例子,如下图所示:
Pod 其它命令
我们可以通过 logs
或者 logs -f
命令查看 pod 日志,可以通过 exec -it
进入 pod 或者调用容器命令,通过 delete pod
或者 delete -f nginx.yaml
的方式删除 pod 资源。这里可以看到 kubectl 所有命令。
kubectl logs --follow nginx
kubectl exec nginx -- ls
kubectl delete pod nginx
# pod "nginx" deleted
kubectl delete -f nginx.yaml
# pod "nginx" deleted
最后,根据我们在 container
的那节构建的 hellok8s:v1
的镜像,同时参考 nginx
pod 的资源定义,你能独自编写出 hellok8s:v1
Pod 的资源文件吗。并通过 port-forward
到本地的 3000
端口进行访问,最终得到字符串 [v1] Hello, Kubernetes!
。
hellok8s:v1
Pod 资源定义和相应的命令如下所示:
# hellok8s.yaml
apiVersion: v1
kind: Pod
metadata:
name: hellok8s
spec:
containers:
- name: hellok8s-container
image: guangzhengli/hellok8s:v1
kubectl apply -f hellok8s.yaml
kubectl get pods
kubectl port-forward hellok8s 3000:3000
关于启动失败
如果查看Pod的状态为 ErrImagePull 或者 ImagePullBackOff
NAME READY STATUS RESTARTS AGE
hellok8s 0/1 ImagePullBackOff 0 22m
尝试切换为当前环境的docker-env, 删除pod, 然后重新构建镜像即可
eval $(minikube docker-env)