IT七剑客 IT七剑客
首页
wresource
郭霖
孤寒者
IT邦德
沉默王二
老麦
stackoverflow
GitHub (opens new window)
首页
wresource
郭霖
孤寒者
IT邦德
沉默王二
老麦
stackoverflow
GitHub (opens new window)
  • 从零开始写 k8s 发布工具(一)

  • 从零开始写 k8s 发布工具(二)

    • 模仿 kubectl create 创建 Deployment 样例
      • 安装 client-go API
      • 定义 Kustz Config
      • 拼凑 Deployment API
        • 公共标签
      • 文件解析
      • 测试
    • 从零开始写 k8s 发布工具 - 2.2. 定义字符串创建 Service
    • 解析 URL 为 Ingress
    • 使用 kustomize 管理所有 k8s 文件
    • 使用 cobra 实现 kustz 命令
  • 从零开始写 k8s 发布工具(三)

  • 从零开始写 k8s 发布工具(四)

  • istio的环境准备

  • istioVirtualService

  • 老麦 Go
  • 从零开始写 k8s 发布工具(二)
老麦
2023-01-31
目录

模仿 kubectl create 创建 Deployment 样例

# 2.1. 模仿 kubectl create 创建 Deployment 样例

logo

为了简单, 我们假定所管理的 Deployment 都是 单容器 的。

首先参考 kubectl create 命令

$ kubectl create deployment my-dep --image=busybox --replicas 1 --dry-run=client -o yaml
1

# 安装 client-go API

访问 client-go https://github.com/kubernetes/client-go

$ go get k8s.io/client-go@v0.25.4
1

这里直接选用最新版本 v0.25.4。 对于其他版本的兼容, 留在以后再做。

# 定义 Kustz Config

参考 kubectl create 命令, 创建配置文件 kustz.yml 结构如下

# kustz.yml
namespace: demo-demo
name: srv-webapp-demo

service:
  name: nginx
  image: docker.io/library/nginx:alpine
  replicas: 2

1
2
3
4
5
6
7
8
9

在 service 中添加了 name 字段, 这是在 kubectl create 命令中没有的。 后者直接使用了镜像名称作为 name 的值。

由于我们的设计只有一个容器, 这里也可以 省略或使用默认值。 这里增加字段 完全是为了展示凑 API。

在 /pkg/kustz/kustz.go 中创建 Config, 对应所有字段。

type Config struct {
	Name      string  `json:"name"`
	Namespace string  `json:"namespace"`
	Service   Service `json:"service"`
}

type Service struct {
	Name     string `json:"name"`
	Image    string `json:"image"`
	Replicas int32  `json:"replicas"`
}
1
2
3
4
5
6
7
8
9
10
11

# 拼凑 Deployment API

从这个标题就可以看出来, 这里就就没什么难度了, 就是把 kustz.Config 中的所有字段全部放在 Deployment API 中。

为 kustz.Config 添加 KubeDeployment 方法, 在 /pkg/kustz/k_deployment.go 中。

func (kz *Config) KubeDeployment() *appv1.Deployment {
	return &appv1.Deployment{
		TypeMeta: metav1.TypeMeta{
			Kind:       "Deployment",
			APIVersion: "apps/v1",
		},
		ObjectMeta: metav1.ObjectMeta{
			Name:      kz.Name,
			Namespace: kz.Namespace,
			Labels:    CommonLabels(*kz),
		},
		Spec: appv1.DeploymentSpec{
			Replicas: &kz.Service.Replicas,
			Template: kz.KubePod(),
			Selector: &metav1.LabelSelector{
				MatchLabels: CommonLabels(*kz),
			},
		},
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

可以看到, 拼凑主要由 3 部分, 都是很熟悉的字段。

  1. TypeMeta: Deployment 的信息申明
  2. ObjectMeta: 应用服务 的信息申明
  3. Spec: 就是具体信息了。

如果你看的够仔细,可以在 Spec 中发现 Template 字段就开始 套娃 了。

KubeDeployment 中调用了 /pkg/kustz/k_pod.go 中的 KubePod 方法。

func (kz *Config) KubeDeployment() *appv1.Deployment {
	return &appv1.Deployment{
		Spec: appv1.DeploymentSpec{
			// ... 省略
			Template: kz.KubePod(),
		},
	}
}
1
2
3
4
5
6
7
8

KubePod 中调用了 /pkg/kustz/k_container.go 中的 KubeContainer 方法。

func (kz *Config) KubePod() corev1.PodTemplateSpec {
	return corev1.PodTemplateSpec{
		// ... 省略
		Spec: corev1.PodSpec{
			Containers: kz.KubeContainer(),
		},
	}
}
1
2
3
4
5
6
7
8

最后, 在 KubeContainer 方法中, 创建了最里面的 container 信息。

func (kz *Config) KubeContainer() []corev1.Container {
	if kz.Service.Name == "" {
		kz.Service.Name = kz.Name
	}

	// ...省略
	return []corev1.Container{c}
}
1
2
3
4
5
6
7
8

前面我们说到过 kz.Service.Name 为了展示 API 的拼凑。 为了以后使用方便, 这里我们设置其默认值为应用服务名 kz.Name 。

# 公共标签

在 Kubernetes 中, 不同 API 之间的关系都是通过 标签选择 关联的。 为了方便, 在 /pkg/kustz/common.go 中使用函数 CommonLabels() 创建公共标签, 方便关联。

# 文件解析

细心的你可以已经发现了, 明明配置文件用的是 yaml 格式, 但是在 Config 中的标签却是 json:"name"。

这里只是为了 单纯 为了保障 yaml 库一致, 在 /pkg/kubeutils/yaml.go 中使用了 sigs.k8s.io/yaml 库而已, 这个库可以兼容 json, yaml 标签。

# 测试

进入 kustz, 执行命令

$ go test -v .

$ kubectl create deployment srv-webapp-demo --image=nginx -n demo-demo --dry-run=client -o  yaml 
1
2
3

对比二者内容, 基本上完全一样了。

编辑 (opens new window)
上次更新: 2023/02/05, 02:48:13
kustz 介绍和设计思想
从零开始写 k8s 发布工具 - 2.2. 定义字符串创建 Service

← kustz 介绍和设计思想 从零开始写 k8s 发布工具 - 2.2. 定义字符串创建 Service→

最近更新
01
Coding 102 Writing code other people can read
02-26
02
Kotlin Flow响应式编程,StateFlow和SharedFlow
02-05
03
Kotlin Flow响应式编程,操作符函数进阶
02-05
更多文章>
Theme by Vdoing | Copyright © 2022-2023 IT七剑客 | MIT License
  • 闽ICP备2021006579号-4
  • 闽公网安备 35012102500470号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式