在没有注册表的情况下使用Minikube使用Skaffold

mit*_*man 6 docker kubernetes kubernetes-helm

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

在文档中说:

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

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

但是,当我尝试运行示例时,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
Run Code Online (Sandbox Code Playgroud)

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

hyp*_*low 9

使用skaffold,如果要部署到minikube,则不需要任何注册表。默认情况下,它将无缝地将映像放入minikube,而无需任何外部注册表。

考虑以下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
Run Code Online (Sandbox Code Playgroud)

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

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

apiVersion: skaffold/v1alpha2
kind: Config
profiles:
  - name: minikube
    build:
      artifacts:
        - imageName: petstore/frontend
    deploy:
        manifests:
          - deployment.yaml
Run Code Online (Sandbox Code Playgroud)

在这里,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
Run Code Online (Sandbox Code Playgroud)

重要的是要指定不带任何标签的图像,以便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": ""
Run Code Online (Sandbox Code Playgroud)

在这里,image.repository应该是完全一样imageNameartifacts部分,也image.tag被设置为空字符串,因为它是上面所说的,让skaffold注入它。

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

我希望这有帮助。


sil*_*fox 7

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

使用以下命令,您应该能够在主机mac / linux计算机上使用docker,并与minikube VM中的docker守护进程进行通讯:

eval $(minikube docker-env)
Run Code Online (Sandbox Code Playgroud)

并在时直接在minikube中创建图像docker build

通过Minikube本地运行Kubernetes