开发 k8s 管理平台 - k8sailor 16. 创建 Deployment

简介: 开发 k8s 管理平台 - k8sailor 16. 创建 Deployment

开发 k8s 管理平台 - k8sailor 16. 创建 Deployment

原文地址: https://tangx.in/posts/books/k8sailor/chapter02/16-create-deployment/
tag: https://github.com/tangx/k8sailor/tree/feat/16-create-deployment

使用 kubectl 命令创建如下

kubectl create deployment my-nginx-5 --image=nginx:alpine --replicas=3 --port=80

创建成功后查看结果, 大部分参数为默认参数。

# kgd -o yaml my-nginx-5
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: my-nginx-5 # 根据 deployment 自动匹配名字自动生成
  name: my-nginx-5  # 用户指定
  namespace: default # 用户选择,默认为当前 namespace
spec:
  progressDeadlineSeconds: 600  # 默认值
  replicas: 3   # --replicas
  selector:
    matchLabels:
      app: my-nginx-5
  template:
    metadata:
      labels:
        app: my-nginx-5
    spec:
      containers:
      - image: nginx:alpine     # --image
        imagePullPolicy: IfNotPresent
        name: nginx # 根据镜像名字获取
        ports:      # --port
        - containerPort: 80
          protocol: TCP
# ... 省略 ...
  1. 在使用命令行传递参数的时候只传递了 name, image, replicas, pods
  2. kubectl 根据传递的信息, 自动补全了一些信息

    • 以 name 补全了 labelsapp: my-nginx-5
    • 以 image 生成了 container name; 如果传递多个 相同名称 image 将会报错 container name 冲突。

接下来的工作就真没什么技术含量了, 就是最简单最无脑的拼凑字段。

Annotations 字段中, 也可以夹带很多 私货。 例如, 在 CI 中可以加入很多关于 commit 的信息, 例如 提交人, 提交信息 等。 一切想夹带的都可以放进去。

type CreateDeploymentInput struct {
    Name     string
    Replicas *int32
    Images   []string
}

func CreateDeployment(ctx context.Context, namespace string, input CreateDeploymentInput) (*appsv1.Deployment, error) {
    labels := map[string]string{
        "app": input.Name,
    }
    dep := &appsv1.Deployment{
        ObjectMeta: metav1.ObjectMeta{
            Name:      input.Name,
            Namespace: namespace,
            Labels:    labels,
            // 在 CI 的时候, 可以在这里加上关键的 commit 信息。
            Annotations: map[string]string{
                "manager": "k8sailor",
            },
        },
        Spec: appsv1.DeploymentSpec{
            Replicas: input.Replicas,
            Selector: &metav1.LabelSelector{
                MatchLabels: labels,
            },
            Template: corev1.PodTemplateSpec{
                ObjectMeta: metav1.ObjectMeta{
                    Labels: labels,
                },
                Spec: corev1.PodSpec{
                    Containers: containers(input.Images),
                },
            },
        },
    }
    opts := metav1.CreateOptions{}

    return clientset.AppsV1().Deployments(namespace).Create(ctx, dep, opts)

}

func containers(images []string) []corev1.Container {
    containers := make([]corev1.Container, len(images))
    for i, image := range images {
        container := corev1.Container{
            Image: image,
            Name:  imageName(i, image),
        }

        containers[i] = container
    }

    return containers
}

一个标准的 image 地址类似 docker.io/libray/nginx:1.13-alpine。 其中出现了多种特殊符号。 而 container name 只允许 小写字母, 数字,-, 所以需要改造一下。 为了解决相同镜像冲突的问题, 还在末尾加上了 container 的 id

// image: docker.io/libray/nginx:1.13-alpine
func imageName(i int, image string) string {
    for _, char := range []string{"/", ":", "."} {
        image = strings.ReplaceAll(image, char, "-")
    }
    return fmt.Sprintf("%s-%d", image, i)
}

写下来也发现了一个问题 , 即使要拼凑字段, 也不应该写在一个结构体中。

  1. 本身 k8s 提供的诸多 Workloads 就是对 Pods 的 调度管理 的一层抽象,从而应对不同的场景。
  2. Pod 与 Containers 之间是一个组合关系。 Container 和 InitContainer 本身是一样的, 只是在不同阶段运行的区分。

因此, 更应该将三个 Spec 分开处理, 这样就能更好、更方便的进行组合复用。

  1. 向 Container 的构造函数中传入关键参数, 创建 Container 对象: NewContainerSpec(params)
  2. 向 Pod 的构造函数中传入 关键参数和 container 对象, 创建 Pod 对象: NewPodSpec(params, containers)
  3. 向 Deployment(或其他 Workload) 的构造函数中传入 关键参数和 pod 对象, 创建 Deployment 对象, NewDeploymentSpec(params, pod)
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
12月前
|
Kubernetes 应用服务中间件 nginx
【赵渝强老师】K8s中的Deployment控制器
Kubernetes中的Deployment用于部署无状态应用程序,管理Pod的数量、更新方式和资源限制。通过创建和管理ReplicaSet,Deployment可以实现Pod的自动扩缩容、滚动更新和回滚。本文介绍了Deployment的基本概念,并通过一个具体的示例演示了如何使用Deployment创建、更新和管理Pod。
204 1
|
12月前
|
存储 运维 Kubernetes
云端迁移:备份中心助力企业跨云迁移K8s容器服务平台
本文将简要介绍阿里云容器服务ACK的备份中心,并以某科技公司在其实际的迁移过程中遇到具体挑战为例,阐述如何有效地利用备份中心来助力企业的容器服务平台迁移项目。
|
Kubernetes Docker 微服务
微服务实践k8s&dapr开发部署实验(1)服务调用(一)
微服务实践k8s&dapr开发部署实验(1)服务调用(一)
173 2
|
Kubernetes JavaScript 前端开发
k8s学习--chart包开发(创建chart包)
k8s学习--chart包开发(创建chart包)
650 1
|
12月前
|
存储 Kubernetes 调度
【赵渝强老师】K8s中Deployment控制器与StatefulSet控制器的区别
K8s中的Deployment控制器用于管理无状态应用程序,关注Pod数量、更新方式等;而StatefulSets控制器则管理有状态应用程序,提供持久存储和唯一标识符,适用于需要稳定网络标识符和持久化存储的场景。两者的主要区别在于是否维护状态和顺序。
372 0
|
Kubernetes 容器 Perl
在K8S中,Deployment⽀持扩容吗?它与HPA有什么区别?
在K8S中,Deployment⽀持扩容吗?它与HPA有什么区别?
|
Kubernetes Docker Perl
在K8S中,如果是因为开发写的镜像问题导致pod起不来该怎么排查?
在K8S中,如果是因为开发写的镜像问题导致pod起不来该怎么排查?
|
Kubernetes Docker 微服务
微服务实践k8s&dapr开发部署实验(1)服务调用(二)
微服务实践k8s&dapr开发部署实验(1)服务调用(二)
171 0
|
存储 Kubernetes 网络协议
在K8S中,Deployment和Statefulset有何区别?
在K8S中,Deployment和Statefulset有何区别?
|
Kubernetes API 开发工具
在K8S中,Deployment的升级过程是什么?
在K8S中,Deployment的升级过程是什么?

热门文章

最新文章

推荐镜像

更多