如何在Kubernetes Pod部署中执行Git克隆
在今天的文章中,我们将研究如何将应用程序代码克隆到在Kubernetes Container平台中运行的Container中。如果我们将应用程序代码存储在Git版本控制中,并且希望在部署过程中提取最新代码而不重建容器镜像,则这是理想的解决方案。允许我们执行此操作的kubernetes功能是Init Containers。
初始化容器是专用类型的容器,在Pod中的应用程序容器之前运行。这些容器可以包含应用程序镜像中不存在的实用程序或者设置脚本。 Init容器没有什么特别之处,因为可以在Pod规范中与容器数组一起指定它们。
在我们的示例中,我们将部署一个示例nginx容器,该容器的Web应用程序数据是使用Init容器从Git存储库中提取的。请注意,Podcan中有多个运行应用程序的容器,但它也可以有一个或者多个init容器。
我的设置要求
这些是将在此示例中使用的容器图像:alpine/git:作为git pull操作的Init容器运行nginx:运行Nginx Web服务器
会为此测试创建一个演示名称空间:
$kubectl create ns helloworld namespace/helloworld created
我有一个带有Hello World HTML文件的Git存储库:https://github.com/jmutai/hello-world-nginx
创建Kubernetes Pod部署列表
我们将生成一个模板并对其进行修改以添加Init容器。
kubectl run nginx-helloworld --image nginx --restart=Never --dry-run -o yaml >nginx-helloworld-pod.yml
如果要获取Kubernetes部署YAML文件,请运行:
kubectl run nginx-helloworld --image nginx --dry-run -o yaml >nginx-helloworld-deploy.yml
这是我得到的Pod部署文件。
$cat nginx-helloworld-pod.yml apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: nginx-helloworld name: nginx-helloworld spec: containers: - image: nginx name: nginx-helloworld resources: {} dnsPolicy: ClusterFirst restartPolicy: Never status: {}
我将态更新列表文件的内容如下所示。
-- apiVersion: v1 kind: Pod metadata: labels: run: nginx-helloworld name: nginx-helloworld spec: containers: - image: nginx name: nginx-helloworld ports: - containerPort: 80 volumeMounts: - mountPath: "/usr/share/nginx/html" name: www-data initContainers: - name: git-cloner image: alpine/git args: - clone - --single-branch - - - https://github.com/jmutai/hello-world-nginx.git - /data volumeMounts: - mountPath: /data name: www-data volumes: - name: www-data emptyDir: {}
注意执行以下操作:使用名为git-cloner的初始化容器将git仓库克隆到/data/data是名为www-data的卷的装载。这样可以在容器之间共享www数据卷已安装到Nginx容器中的/usr/share/nginx/html中。对于我们克隆的Web数据,它们驻留在默认的根目录中。
让我们应用该文件来创建Kubernetes资源。
$kubectl apply -f nginx-helloworld-pod.yml -n helloworld pod/nginx-helloworld created
确认窗格已创建。
$kubectl get pods -n helloworld
这是一个完整的屏幕截图,其中确认克隆已发生,并且数据已在装入的路径中放置。
使用永久卷声明时,我们会将卷部分更新为以下内容。
volumes: - name: my-pv-storage persistentVolumeClaim: claimName: mypv-claim
清理:
kubectl delete all --all -n helloworld kubectl delete ns helloworld