使用Minikube而无需注册表

时间:2018-05-15 21:49:48

标签: docker kubernetes kubernetes-helm

我遇到了Skaffold,试图简化本地Docker镜像开发。我们基本上希望能够快速迭代图像并使用现有的稳定头盔图版本进行部署。

在文档中说:

https://github.com/GoogleContainerTools/skaffold#installation

  
      
  1. Docker镜像注册表。   您的docker客户端应配置为推送到外部docker   图像存储库。如果您正在使用minikube或Docker for Desktop   群集,您可以跳过此要求。
  2.   

但是,当我尝试运行示例examples/helm-deployment时,它实际上会尝试连接到注册表:

$ skaffold dev
...
The push refers to repository [docker.io/library/skaffold-helm]
b3fb485368bf: Preparing
6f67560e4591: Preparing
d626a8ad97a1: Preparing
WARN[0012] run: build: build step: running push: denied: requested access to the resource is denied

我是否总是需要注册表,即使使用Minikube和Skaffold?

2 个答案:

答案 0 :(得分:5)

使用skaffold,如果要部署到minikube,则不需要任何注册表。默认情况下,它seamlessly puts将图像迷你化,不涉及任何外部注册表。

考虑以下deployment.yaml文件:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: petstore-frontend
  labels:
    app: petstore
    tier: frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: petstore
      tier: frontend
  template:
    metadata:
      labels:
        app: foo
        tier: frontend
    spec:
      containers:
        - name: frontend
          image: petstore/frontend
          imagePullPolicy: Always
          ports:
            - containerPort: 80

请注意,image字段不包含任何标签,因为skaffold会为您注入一个标签。

最小的skaffold.yaml文件如下所示:

apiVersion: skaffold/v1alpha2
kind: Config
profiles:
  - name: minikube
    build:
      artifacts:
        - imageName: petstore/frontend
    deploy:
        manifests:
          - deployment.yaml

在这里,imageName应该与image文件中的deployment.yaml字段值匹配。

现在,您只需运行skaffold run -p minikube,它将构建您的映像,将其放入minikube并应用部署。

但是,在通过Helm图表进行部署时,您还需要指定一些小而重要的内容。

考虑以下deployment.yaml模板(为简洁起见,我省略了一些字段):

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: {{ template "petstore-frontend.fullname" . }}
  labels:
    # <labels>
spec:
  replicas: 1
  selector:
    matchLabels:
      # <labels>
  template:
    metadata:
      labels:
        # <labels>
    spec:
      containers:
        - name: {{ template "petstore-frontend.name" . }}
          image: {{ .Values.image.repository }}{{ if .Values.image.tag }}:{{ .Values.image.tag }}{{ end }}
          imagePullPolicy: Always
          ports:
            - containerPort: 80

重要的是,可以指定不带任何标签的图像,以便skaffold可以为您注入图像。

然后一个skaffold.yaml文件看起来像这样:

apiVersion: skaffold/v1alpha2
kind: Config
profiles:
  - name: minikube
    build:
      artifacts:
        - imageName: petstore/frontend
    deploy:
      helm:
        releases:
          - name: petstore-frontend
            chartPath: charts/petstore-frontend
            values:
              "image.repository": petstore/frontend
            setValues:
              "image.tag": ""

在这里,image.repository应该与imageName部分中的artifacts完全相同,并且image.tag也被设置为空字符串,如上所述。 skaffold注入它。

总而言之,值得一提的是skaffold仍处于alpha状态,因此API可能会发生变化,也许不再需要“技巧”。尽管如此,skaffold已经为快速的应用程序开发和部署提供了很多便利。

我希望这会有所帮助。

答案 1 :(得分:4)

不,您不需要外部注册表。

使用以下命令,您应该能够在主机mac / linux机器上使用docker与minikube VM内的docker守护程序通信:

eval $(minikube docker-env)

docker build

时,图像会直接在迷你管中创建。

FROM Running Kubernetes Locally via Minikube