为 Kubernetes 配置 TeamCity
感谢 Kubernetes Support 插件,TeamCity 可以在您的 Kubernetes 集群中运行 构建代理。
note
如果您之前使用的是 Helm 构建运行程序,这是外部 Kubernetes Support 插件的一部分,请注意,内置集成并未包含 Helm 运行器。 参阅我们的 升级说明 以获取更多详细信息。
TeamCity 与 Kubernetes 的整合并不依赖于 kubectl
工具,因此您的集群中无需安装它。
确保 TeamCity 用户有权限在 TeamCity 代理使用的 Kubernetes namespace 中执行写操作。
您可能还需要为您的 Kubernetes 用户角色配置以下权限:
Pods:
获取
,创建
,列表
,删除
。部署:
列表
,获取
—— 如果您想要使用部署配置来创建代理 pod。命名空间:
获取
,列表
— 以允许 TeamCity 向您提出服务器上可用的命名空间建议。
这是一个示例,展示如何通过 Kubernetes RBAC 设置所有必需的权限:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: teamcity:manage-agents
rules:
- apiGroups: [""]
resources: ["namespaces"]
verbs: ["list", "get"]
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "create", "list", "delete"]
- apiGroups: ["extensions", "apps"]
resources: ["deployments"]
verbs: ["list", "get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: teamcity:manage-agents
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: teamcity:manage-agents
subjects:
# proper RoleBinding subject depends on your Authentication strategy
# use one of examples below
# if you use OIDC/Certificate auth strategies
- kind: User
name: teamcity
# if you use Service account
- kind: ServiceAccount
name: teamcity
为了与 Kubernetes 建立集成,您需要在 TeamCity 中创建一个专用的云配置文件。 打开所需项目的设置,然后在 Cloud Profiles 部分,点击 Create new profile。
以下表格列出了专门针对 Kubernetes 云配置文件的选项。
选项 | 描述 |
---|---|
Kubernetes API 服务器 URL | 指定 Kubernetes API server 的 URL。 |
证书颁发机构(CA) | 请输入您的集群的 CA 证书 内容。 |
Kubernetes 命名空间 | 指定一个必需的 Kubernetes 命名空间。 留空则使用 默认命名空间。 |
认证策略 | 选择所需的身份验证策略。 根据所选策略的不同,额外选项的集合将会有所变化。 请参考 Kubernetes 文档,了解可用选项的详细信息。
|
在配置完一般的 Kubernetes 设置后,您可以继续添加新的构建代理镜像。
点击 Add image (添加镜像)并配置其选项:
tip
要在 Kubernetes 中运行构建代理,TeamCity 将在您的集群中创建一个专用的 pod。
选择此选项,以基于在您的 Kubernetes 集群中创建的特定 部署配置 运行新的 pod。 如果您正在使用 Kubernetes Dashboard,您可以在 Workloads | Deployments 下找到可用部署的列表。
您可以按照以下步骤,从最新的 TeamCity 代理镜像创建一个简单的部署:
create deployment simpledep --image="jetbrains/teamcity-agent:latest"
deployment.apps/simpledep created
选择此选项可基于任何给定的代理 Docker 镜像运行单个 容器,这些镜像来自 Docker Hub。 您需要指定:
将您自己的 pod 模版以 YAML 格式输入。 当您需要为启动的 pod 指定额外配置时,比如资源请求/限制或凭据,请使用此选项。 这个选项是部署模板规范的替代方案,允许您直接在 TeamCity UI/DSL 中编辑配置。
一个简单模板的示例:
apiVersion: v1
kind: Pod
metadata:
labels:
app: teamcity-agent
spec:
restartPolicy: Never
containers:
- name: teamcity-agent
image: jetbrains/teamcity-agent
resources:
limits:
memory: "2Gi"
要创建和设置 k8s 配置文件和镜像,需要在项目的 功能
组下创建 KubernetesCloudProfile 和 KubernetesCloudImage 类实例。 将镜像 profileId
属性设置为配置文件 iD
值,以将此镜像分配给目标配置文件。
project {
// ...
features {
// ...
kubernetesCloudProfile {
id = "kube-1"
name = "K8S Agents"
description = "EKS"
serverURL = "https://myteamcityserver.com"
terminateIdleMinutes = 30
apiServerURL = "https://123.gr7.eu-west-1.eks.amazonaws.com"
caCertData = "abc"
authStrategy = eks {
accessId = "aws_access_id"
secretKey = "aws_key"
clusterName = "my-k8s-cluster"
}
}
kubernetesCloudImage {
id = "PROJECT_EXT_10"
profileId = "kube-1"
agentPoolId = "21"
agentNamePrefix = "k8s-singlec"
maxInstancesCount = 5
podSpecification = runContainer {
dockerImage = "jetbrains/teamcity-agent"
}
}
kubernetesCloudImage {
id = "PROJECT_EXT_11"
profileId = "kube-1"
agentPoolId = "21"
agentNamePrefix = "k8s-pspec"
maxInstancesCount = 5
podSpecification = customTemplate {
customPod = """
apiVersion: v1
kind: Pod
metadata:
labels:
app: teamcity-agent
spec:
restartPolicy: Never
containers:
- name: teamcity-agent
image: jetbrains/teamcity-agent
resources:
limits:
memory: "2Gi"
""".trimIndent()
}
}
}
}
参见 KubernetesCloudProfile 和 KubernetesCloudImage 获取更多实例和 API 说明。
感谢您的反馈!