前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2022-12-23:portainer是docker的web可视化工具。如果根据docker部署去写yaml,默认local是k8s,而不是docker,这不

2022-12-23:portainer是docker的web可视化工具。如果根据docker部署去写yaml,默认local是k8s,而不是docker,这不

原创
作者头像
福大大架构师每日一题
发布2022-12-23 21:46:38
3000
发布2022-12-23 21:46:38
举报

2022-12-23:portainer是docker的web可视化工具。如果根据docker部署去写yaml,默认local是k8s,而不是docker,这不符合需求,需要修改yaml。请问部署在 k3s 中,并且默认local是docker,yaml 文件如何写?

答案2022-12-23:

1.portainer在默认情况下用的是k8s环境,所以需要改成docker环境,根据如下代码块一的go代码可知,把"KUBERNETES_SERVICE_HOST"环境变量设置为空,就会把默认环境变成docker环境。

2.根据命令行参数,给--admin-password一个值,你就不需要创建用户了。

3.--admin-password是一个哈希值,根据如下代码块二的go代码可知,需要将密码转成哈希才行。"moonfdd--moonfdd"转换成哈希是"$2a$10$4m4rYwK/TA8GRkyz4UrZ2e8B4GDG8ZhBkyGawJ05q1zJ7zmLywzmW"。

代码语言:go
复制
// 代码块一
// api/platform/platform.go

const (
	PodmanMode            = "PODMAN"
	KubernetesServiceHost = "KUBERNETES_SERVICE_HOST"
	NomadJobName          = "NOMAD_JOB_NAME"
)

// DetermineContainerPlatform will check for the existence of the PODMAN_MODE
// or KUBERNETES_SERVICE_HOST environment variable to determine if
// the container is running on Podman or inside the Kubernetes platform.
// Defaults to Docker otherwise.
func DetermineContainerPlatform() (ContainerPlatform, error) {
	podmanModeEnvVar := os.Getenv(PodmanMode)
	if podmanModeEnvVar == "1" {
		return PlatformPodman, nil
	}
	serviceHostKubernetesEnvVar := os.Getenv(KubernetesServiceHost)
	if serviceHostKubernetesEnvVar != "" {
		return PlatformKubernetes, nil
	}
	nomadJobName := os.Getenv(NomadJobName)
	if nomadJobName != "" {
		return PlatformNomad, nil
	}

	if !isRunningInContainer() {
		return "", nil
	}

	dockerCli, err := client.NewClientWithOpts()
	if err != nil {
		return "", errors.WithMessage(err, "failed to create docker client")
	}
	defer dockerCli.Close()

	info, err := dockerCli.Info(context.Background())
	if err != nil {
		if client.IsErrConnectionFailed(err) {
			log.Warn().
				Err(err).
				Msg("failed to retrieve docker info")
			return "", nil
		}

		return "", errors.WithMessage(err, "failed to retrieve docker info")
	}

	if info.Swarm.NodeID == "" {
		return PlatformDockerStandalone, nil
	}

	return PlatformDockerSwarm, nil
}
代码语言:go
复制
// 代码块二
// api/cmd/portainer/main.go
	adminPasswordHash := ""
	if *flags.AdminPasswordFile != "" {
		content, err := fileService.GetFileContent(*flags.AdminPasswordFile, "")
		if err != nil {
			log.Fatal().Err(err).Msg("failed getting admin password file")
		}

		adminPasswordHash, err = cryptoService.Hash(strings.TrimSuffix(string(content), "\n"))
		if err != nil {
			log.Fatal().Err(err).Msg("failed hashing admin password")
		}
	} else if *flags.AdminPassword != "" {
		adminPasswordHash = *flags.AdminPassword
	}

yaml如下:

代码语言:yaml
复制
# 用户名:admin
# 密码:moonfdd--moonfdd
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: portainer
  name: portainer
  namespace: moonfdd
spec:
  replicas: 1
  selector:
    matchLabels:
      app: portainer
  template:
    metadata:
      labels:
        app: portainer
    spec:
      containers:
        - env:
            - name: "KUBERNETES_SERVICE_HOST"
              value: ""
          args:
            - "--admin-password"
            - "$2a$10$4m4rYwK/TA8GRkyz4UrZ2e8B4GDG8ZhBkyGawJ05q1zJ7zmLywzmW"
          image: portainer/portainer-ce:alpine
          imagePullPolicy: IfNotPresent
          name: portainer
          securityContext:
            privileged: true
          volumeMounts:
            - mountPath: /var/run/docker.sock
              name: volv
            # - mountPath: /data
            #   name: volv2
      volumes:
        - hostPath:
            path: /var/run/docker.sock
            type: Socket
          name: volv
        # - hostPath:
        #     path: /root/k8s/moonfdd/portainer/data
        #     type: DirectoryOrCreate
        #   name: volv2
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: portainer
  name: portainer
  namespace: moonfdd
spec:
  ports:
    - port: 8000
      protocol: TCP
      targetPort: 8000
      name: 8000-8000
    - port: 9443
      protocol: TCP
      targetPort: 9443
      name: 9443-9443
    - port: 9000
      protocol: TCP
      targetPort: 9000
      name: 9000-9000
  selector:
    app: portainer
  type: NodePort
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com