在Kubernetes中动态标记部署图像的实例

95 阅读1分钟

值得注意的是,如果没有为Docker镜像设置一个特定的标签,就很难实现部署回滚。在这个例子中,我们将在每次我们的应用程序有新的更新时对Docker镜像进行标记,将其推送到Docker Hub并部署到Kubernetes。

对镜像进行标记

假设你已经更新了你的应用程序。让我们来构建、标记并推送到Docker Hub:

IMAGE_TAG := $(shell git rev-parse --short HEAD)

.PHONY: docker 
docker:
   docker build -t you/address-finder-go:$(IMAGE_TAG) -f ./docker/go/Dockerfile .
   docker push you/address-finder-go:$(IMAGE_TAG)

如你所见,我们使用了最新的Git提交哈希值作为镜像标签。你也可以使用GitHub发布的版本标签,如v1.0.0 等。我们应该看到终端输出的样子如下:

Successfully built 11416713s43z
Successfully tagged you/address-finder-go:v225062
docker push you/address-finder-go:v225062
The push refers to repository [docker.io/you/address-finder-go]
dd6dc1v214r2: Pushed

部署

我们的部署文件看起来像下面这样。正如你所看到的,我们将图像标签设置为latest ,但现在不用担心。当我们用下面的命令进行部署时,它将被覆盖。如果你感到困惑,你可以去掉latest

apiVersion: apps/v1
kind: Deployment

metadata:
  name: address-finder-deployment
  labels:
    app: address-finder

spec:
  replicas: 1
  selector:
    matchLabels:
      app: address-finder
  template:
    metadata:
      labels:
        app: address-finder
    spec:
      containers:
        - name: go
          image: you/address-finder-go:latest
IMAGE_TAG := $(shell git rev-parse --short HEAD)

.PHONY: k8s-setup
k8s-setup:
   kubectl apply -f deploy/k8s/configmap.yaml
   kubectl apply -f deploy/k8s/deployment.yaml
   kubectl apply -f deploy/k8s/service.yaml

.PHONY: k8s-deploy
k8s-deploy:
   kubectl apply -f deploy/k8s/configmap.yaml
   kubectl set image deployment/address-finder-deployment go=you/address-finder-go:$(IMAGE_TAG)
   kubectl apply -f deploy/k8s/service.yaml

你可以用下面的命令代替kubectl set image ,这样做也是一样的:

kubectl patch deployment address-finder-deployment -p '{"spec":{"template":{"spec":{"containers":[{"name":"go","image":"you/address-finder-go:$(IMAGE_TAG)"}]}}}}'

让我们来设置我们的Kubernetes环境。这是必要的,因为这是第一次的应用程序设置过程。它将使用latest 图像标签:

$ make k8s-setup
kubectl apply -f deploy/k8s/configmap.yaml
configmap/address-finder-config created
kubectl apply -f deploy/k8s/deployment.yaml
deployment.apps/address-finder-deployment created
kubectl apply -f deploy/k8s/service.yaml
service/address-finder-service created

让我们检查一下附加在组件上的图像标签。正如所见,它是latest

$ kubectl describe deployment.apps/address-finder-deployment | grep Image
    Image:        you/address-finder-go:latest

$ kubectl describe replicaset.apps/address-finder-deployment-68dd5b79b8 | grep Image
    Image:        you/address-finder-go:latest

$ kubectl describe pod/address-finder-deployment-68dd5b79b8-24ppp | grep Image
    Image:          you/address-finder-go:latest

我们已经知道,我们的镜像在Docker Hub中被标记为v225062 。这也是我们应用程序的最新提交哈希值,所以让我们部署它:

$ make k8s-deploy
kubectl apply -f deploy/k8s/configmap.yaml
configmap/address-finder-config unchanged
kubectl set image deployment/address-finder-deployment go=you/address-finder-go:v225062
deployment.apps/address-finder-deployment image updated
kubectl apply -f deploy/k8s/service.yaml
service/address-finder-service unchanged

让我们确认一下这些变化:

$ kubectl describe deployment.apps/address-finder-deployment | grep Image
    Image:        you/address-finder-go:v225062

$ kubectl describe replicaset.apps/address-finder-deployment-7887d5f54f | grep Image
    Image:        you/address-finder-go:v225062

$ kubectl describe pod/address-finder-deployment-7887d5f54f-phnf7 | grep Image
    Image:          you/address-finder-go:v225062