如何在Kubernetes Pod部署中执行Git克隆

时间:2020-02-23 14:31:47  来源:igfitidea点击:

在今天的文章中,我们将研究如何将应用程序代码克隆到在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