值得注意的是,如果没有为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