Created
March 15, 2019 19:10
-
-
Save mikebridge/8e971c4fc62f43d447a905b02f0b0fd2 to your computer and use it in GitHub Desktop.
Example Kubernetes config to deploy TeamCity server + three agents with mssql on azure
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # Kubernetes deployment for teamcity server with three agents, each with mssql/development on azure. | |
| # This assumes a two-node cluster | |
| --- | |
| apiVersion: v1 | |
| kind: PersistentVolumeClaim | |
| metadata: | |
| name: teamcity-server-premium-logs-disk | |
| spec: | |
| accessModes: | |
| # https://docs.microsoft.com/en-us/azure/aks/azure-disks-dynamic-pv | |
| # An Azure disk can only be mounted with Access mode type ReadWriteOnce | |
| - ReadWriteOnce | |
| storageClassName: managed-premium | |
| resources: | |
| requests: | |
| storage: 10Gi | |
| --- | |
| apiVersion: v1 | |
| kind: PersistentVolumeClaim | |
| metadata: | |
| name: teamcity-agent-premium-logs-disk | |
| spec: | |
| accessModes: | |
| - ReadWriteOnce | |
| storageClassName: managed-premium | |
| resources: | |
| requests: | |
| storage: 5Gi | |
| --- | |
| apiVersion: apps/v1 | |
| kind: Deployment | |
| metadata: | |
| name: example-teamcity-server | |
| spec: | |
| strategy: | |
| type: Recreate | |
| selector: | |
| matchLabels: | |
| app: example-teamcity-server | |
| template: | |
| metadata: | |
| labels: | |
| app: example-teamcity-server | |
| teamcity: server | |
| spec: | |
| containers: | |
| - name: example-teamcity-server | |
| image: jetbrains/teamcity-server | |
| imagePullPolicy: Always | |
| ports: | |
| - containerPort: 8111 | |
| volumeMounts: | |
| - name: teamcity-server-datadir-volume | |
| mountPath: "/data/teamcity_server/datadir" | |
| - name: teamcity-server-logs-volume | |
| mountPath: "/opt/teamcity/logs" | |
| volumes: | |
| - name: teamcity-server-datadir-volume | |
| persistentVolumeClaim: | |
| claimName: teamcity-server-premium-datadir-disk | |
| - name: teamcity-server-logs-volume | |
| persistentVolumeClaim: | |
| claimName: teamcity-server-premium-logs-disk | |
| --- | |
| # =========================== | |
| # AGENT 1 | |
| # =========================== | |
| apiVersion: apps/v1 | |
| kind: Deployment | |
| metadata: | |
| name: example-teamcity-mssql-1 | |
| spec: | |
| selector: | |
| matchLabels: | |
| app: example-teamcity-mssql-1 | |
| template: | |
| metadata: | |
| labels: | |
| app: example-teamcity-mssql-1 | |
| teamcity: sql | |
| agentGroup: one | |
| spec: | |
| affinity: | |
| podAffinity: | |
| preferredDuringSchedulingIgnoredDuringExecution: | |
| - weight: 100 | |
| podAffinityTerm: | |
| labelSelector: | |
| matchExpressions: | |
| - key: agentGroup | |
| operator: In | |
| values: | |
| - one | |
| topologyKey: kubernetes.io/hostname | |
| podAntiAffinity: | |
| requiredDuringSchedulingIgnoredDuringExecution: | |
| - labelSelector: | |
| matchExpressions: | |
| - key: agentGroup | |
| operator: In | |
| values: | |
| - two | |
| # - three | |
| topologyKey: kubernetes.io/hostname | |
| containers: | |
| - name: example-teamcity-mssql-1 | |
| image: microsoft/mssql-server-linux:latest | |
| imagePullPolicy: Always | |
| env: | |
| - name: ACCEPT_EULA | |
| value: "Y" | |
| - name: SA_PASSWORD | |
| value: "<mypassword>" | |
| ports: | |
| - containerPort: 1433 | |
| volumeMounts: | |
| - name: mssqldb-volume-1 | |
| mountPath: /var/opt/mssql | |
| resources: | |
| requests: | |
| memory: 2Gi | |
| volumes: | |
| - name: mssqldb-volume-1 | |
| emptyDir: {} | |
| --- | |
| apiVersion: apps/v1 | |
| kind: Deployment | |
| metadata: | |
| name: example-teamcity-agent-1 | |
| spec: | |
| replicas: 1 | |
| selector: | |
| matchLabels: | |
| app: example-teamcity-agent-1 | |
| template: | |
| metadata: | |
| labels: | |
| app: example-teamcity-agent-1 | |
| teamcity: agent | |
| agentGroup: one | |
| spec: | |
| affinity: | |
| podAffinity: | |
| preferredDuringSchedulingIgnoredDuringExecution: | |
| - weight: 100 | |
| podAffinityTerm: | |
| labelSelector: | |
| matchExpressions: | |
| - key: agentGroup | |
| operator: In | |
| values: | |
| - one | |
| topologyKey: kubernetes.io/hostname | |
| podAntiAffinity: | |
| requiredDuringSchedulingIgnoredDuringExecution: | |
| - labelSelector: | |
| matchExpressions: | |
| - key: agentGroup | |
| operator: In | |
| values: | |
| - two | |
| # - three | |
| topologyKey: kubernetes.io/hostname | |
| containers: | |
| - name: example-teamcity-agent-1 | |
| image: exampleregistry.azurecr.io/teamcity_agent:abcdef01 | |
| imagePullPolicy: Always | |
| env: | |
| # TODO: These should be handled in a more kubernetes-style way | |
| # https://kubernetes.io/docs/concepts/services-networking/service/#environment-variables | |
| # (e.g. at TEAMCITY_MSSQL_SERVICE_1_SERVICE_HOST) | |
| - name: DBHOST_OVERRIDE | |
| value: "teamcity-mssql-service-1.default,1433" | |
| - name: SERVER_URL | |
| value: http://teamcity-web-service-internal.default:8111 | |
| - name: MSSQL_URL | |
| value: "teamcity-mssql-service-1.default,1433" | |
| - name: AGENT_NAME | |
| value: agent_1 | |
| - name: ACCEPT_EULA | |
| value: "Y" | |
| volumeMounts: | |
| - name: teamcity-agent1-volume | |
| mountPath: /data/teamcity_agent/conf | |
| volumes: | |
| - name: teamcity-agent1-volume | |
| emptyDir: {} | |
| --- | |
| # =========================== | |
| # AGENT 2 | |
| # =========================== | |
| apiVersion: apps/v1 | |
| kind: Deployment | |
| metadata: | |
| name: example-teamcity-mssql-2 | |
| spec: | |
| replicas: 1 | |
| selector: | |
| matchLabels: | |
| app: example-teamcity-mssql-2 | |
| template: | |
| metadata: | |
| labels: | |
| app: example-teamcity-mssql-2 | |
| teamcity: mssql | |
| agentGroup: two | |
| spec: | |
| affinity: | |
| podAffinity: | |
| preferredDuringSchedulingIgnoredDuringExecution: | |
| - weight: 100 | |
| podAffinityTerm: | |
| labelSelector: | |
| matchExpressions: | |
| - key: agentGroup | |
| operator: In | |
| values: | |
| - two | |
| topologyKey: kubernetes.io/hostname | |
| podAntiAffinity: | |
| requiredDuringSchedulingIgnoredDuringExecution: | |
| - labelSelector: | |
| matchExpressions: | |
| - key: agentGroup | |
| operator: In | |
| values: | |
| - one | |
| # - three | |
| topologyKey: kubernetes.io/hostname | |
| containers: | |
| - name: example-teamcity-mssql-2 | |
| image: microsoft/mssql-server-linux:latest | |
| imagePullPolicy: Always | |
| env: | |
| - name: ACCEPT_EULA | |
| value: "Y" | |
| - name: SA_PASSWORD | |
| value: "<mypassword>" | |
| ports: | |
| - containerPort: 1433 | |
| volumeMounts: | |
| - name: mssqldb-volume-2 | |
| mountPath: /var/opt/mssql | |
| resources: | |
| requests: | |
| memory: 2Gi | |
| volumes: | |
| - name: mssqldb-volume-2 | |
| emptyDir: {} | |
| --- | |
| apiVersion: apps/v1 | |
| kind: Deployment | |
| metadata: | |
| name: example-teamcity-agent-2 | |
| spec: | |
| replicas: 1 | |
| selector: | |
| matchLabels: | |
| app: example-teamcity-agent-2 | |
| template: | |
| metadata: | |
| labels: | |
| app: example-teamcity-agent-2 | |
| teamcity: agent | |
| agentGroup: two | |
| spec: | |
| affinity: | |
| podAffinity: | |
| preferredDuringSchedulingIgnoredDuringExecution: | |
| - weight: 100 | |
| podAffinityTerm: | |
| labelSelector: | |
| matchExpressions: | |
| - key: agentGroup | |
| operator: In | |
| values: | |
| - two | |
| topologyKey: kubernetes.io/hostname | |
| podAntiAffinity: | |
| requiredDuringSchedulingIgnoredDuringExecution: | |
| - labelSelector: | |
| matchExpressions: | |
| - key: agentGroup | |
| operator: In | |
| values: | |
| - one | |
| # - three | |
| topologyKey: kubernetes.io/hostname | |
| containers: | |
| - name: example-teamcity-agent-2 | |
| image: exampleregistry.azurecr.io/teamcity_agent:abcdef01 | |
| imagePullPolicy: Always | |
| env: | |
| # TODO: These should be handled in a more kubernetes-style way | |
| # https://kubernetes.io/docs/concepts/services-networking/service/#environment-variables | |
| - name: DBHOST_OVERRIDE | |
| value: "teamcity-mssql-service-2.default,1433" | |
| - name: SERVER_URL | |
| value: http://teamcity-web-service-internal.default:8111 | |
| - name: MSSQL_URL | |
| value: "teamcity-mssql-service-2.default,1433" | |
| - name: AGENT_NAME | |
| value: agent_2 | |
| - name: ACCEPT_EULA | |
| value: "Y" | |
| volumeMounts: | |
| - name: teamcity-agent2-volume | |
| mountPath: /data/teamcity_agent/conf | |
| volumes: | |
| - name: teamcity-agent2-volume | |
| emptyDir: {} | |
| --- | |
| apiVersion: apps/v1 | |
| kind: Deployment | |
| metadata: | |
| name: example-teamcity-mssql-2 | |
| spec: | |
| replicas: 1 | |
| selector: | |
| matchLabels: | |
| app: example-teamcity-mssql-2 | |
| template: | |
| metadata: | |
| labels: | |
| app: example-teamcity-mssql-2 | |
| teamcity: mssql | |
| agentGroup: two | |
| spec: | |
| affinity: | |
| podAffinity: | |
| preferredDuringSchedulingIgnoredDuringExecution: | |
| - weight: 100 | |
| podAffinityTerm: | |
| labelSelector: | |
| matchExpressions: | |
| - key: agentGroup | |
| operator: In | |
| values: | |
| - two | |
| topologyKey: kubernetes.io/hostname | |
| podAntiAffinity: | |
| requiredDuringSchedulingIgnoredDuringExecution: | |
| - labelSelector: | |
| matchExpressions: | |
| - key: agentGroup | |
| operator: In | |
| values: | |
| - one | |
| # - three | |
| topologyKey: kubernetes.io/hostname | |
| containers: | |
| - name: example-teamcity-mssql-2 | |
| image: microsoft/mssql-server-linux:latest | |
| # image: microsoft/mssql-server-linux:2017-GA | |
| imagePullPolicy: Always | |
| env: | |
| - name: ACCEPT_EULA | |
| value: "Y" | |
| - name: SA_PASSWORD | |
| value: "<mypassword>" | |
| ports: | |
| - containerPort: 1433 | |
| volumeMounts: | |
| - name: mssqldb-volume-2 | |
| mountPath: /var/opt/mssql | |
| resources: | |
| requests: | |
| memory: 2Gi | |
| volumes: | |
| - name: mssqldb-volume-2 | |
| emptyDir: {} | |
| --- | |
| # =========================== | |
| # AGENT 3 | |
| # =========================== | |
| apiVersion: apps/v1 | |
| kind: Deployment | |
| metadata: | |
| name: example-teamcity-agent-3 | |
| spec: | |
| replicas: 1 | |
| selector: | |
| matchLabels: | |
| app: example-teamcity-agent-3 | |
| template: | |
| metadata: | |
| labels: | |
| app: example-teamcity-agent-3 | |
| teamcity: agent | |
| agentGroup: three | |
| spec: | |
| affinity: | |
| podAffinity: | |
| preferredDuringSchedulingIgnoredDuringExecution: | |
| - weight: 100 | |
| podAffinityTerm: | |
| labelSelector: | |
| matchExpressions: | |
| - key: agentGroup | |
| operator: In | |
| values: | |
| - three | |
| topologyKey: kubernetes.io/hostname | |
| podAntiAffinity: | |
| requiredDuringSchedulingIgnoredDuringExecution: | |
| - labelSelector: | |
| matchExpressions: | |
| - key: teamcity | |
| operator: In | |
| values: | |
| - server | |
| topologyKey: kubernetes.io/hostname | |
| containers: | |
| - name: example-teamcity-agent-3 | |
| image: exampleregistry.azurecr.io/teamcity_agent:abcdef01 | |
| imagePullPolicy: Always | |
| env: | |
| # TODO: These should be handled in a more kubernetes-style way | |
| # https://kubernetes.io/docs/concepts/services-networking/service/#environment-variables | |
| # (e.g. at TEAMCITY_MSSQL_SERVICE_1_SERVICE_HOST) | |
| - name: DBHOST_OVERRIDE | |
| value: "teamcity-mssql-service-3.default,1433" | |
| - name: SERVER_URL | |
| value: http://teamcity-web-service-internal.default:8111 | |
| - name: MSSQL_URL | |
| value: "teamcity-mssql-service-3.default,1433" | |
| - name: AGENT_NAME | |
| value: agent_3 | |
| - name: ACCEPT_EULA | |
| value: "Y" | |
| volumeMounts: | |
| - name: teamcity-agent3-volume | |
| mountPath: /data/teamcity_agent/conf | |
| volumes: | |
| - name: teamcity-agent3-volume | |
| emptyDir: {} | |
| --- | |
| apiVersion: apps/v1 | |
| kind: Deployment | |
| metadata: | |
| name: example-teamcity-mssql-3 | |
| spec: | |
| replicas: 1 | |
| selector: | |
| matchLabels: | |
| app: example-teamcity-mssql-3 | |
| template: | |
| metadata: | |
| labels: | |
| app: example-teamcity-mssql-3 | |
| teamcity: mssql | |
| agentGroup: three | |
| spec: | |
| affinity: | |
| podAffinity: | |
| preferredDuringSchedulingIgnoredDuringExecution: | |
| - weight: 100 | |
| podAffinityTerm: | |
| labelSelector: | |
| matchExpressions: | |
| - key: agentGroup | |
| operator: In | |
| values: | |
| - three | |
| topologyKey: kubernetes.io/hostname | |
| podAntiAffinity: | |
| requiredDuringSchedulingIgnoredDuringExecution: | |
| - labelSelector: | |
| matchExpressions: | |
| - key: teamcity | |
| operator: In | |
| values: | |
| - server | |
| topologyKey: kubernetes.io/hostname | |
| containers: | |
| - name: example-teamcity-mssql-3 | |
| image: microsoft/mssql-server-linux:latest | |
| imagePullPolicy: Always | |
| env: | |
| - name: ACCEPT_EULA | |
| value: "Y" | |
| - name: SA_PASSWORD | |
| value: "<mypassword>" | |
| ports: | |
| - containerPort: 1433 | |
| volumeMounts: | |
| - name: mssqldb-volume-3 | |
| mountPath: /var/opt/mssql | |
| resources: | |
| requests: | |
| memory: 2Gi | |
| volumes: | |
| - name: mssqldb-volume-3 | |
| emptyDir: {} | |
| --- | |
| apiVersion: v1 | |
| kind: Service | |
| metadata: | |
| name: teamcity-web-service | |
| spec: | |
| selector: | |
| app: example-teamcity-server | |
| type: LoadBalancer | |
| loadBalancerIP: <my-external-ip> | |
| ports: | |
| - protocol: TCP | |
| port: 80 | |
| targetPort: 8111 | |
| loadBalancerSourceRanges: | |
| # Limit access to my-client-ip | |
| - <my-client-ip>/32 | |
| --- | |
| apiVersion: v1 | |
| kind: Service | |
| metadata: | |
| name: teamcity-web-service-internal | |
| spec: | |
| selector: | |
| app: example-teamcity-server | |
| ports: | |
| - protocol: TCP | |
| port: 8111 | |
| targetPort: 8111 | |
| --- | |
| apiVersion: v1 | |
| kind: Service | |
| metadata: | |
| name: teamcity-mssql-service-1 | |
| spec: | |
| selector: | |
| app: example-teamcity-mssql-1 | |
| ports: | |
| - protocol: TCP | |
| port: 1433 | |
| targetPort: 1433 | |
| --- | |
| apiVersion: v1 | |
| kind: Service | |
| metadata: | |
| name: teamcity-mssql-service-2 | |
| spec: | |
| selector: | |
| app: example-teamcity-mssql-2 | |
| ports: | |
| - protocol: TCP | |
| port: 1433 | |
| targetPort: 1433 | |
| --- | |
| apiVersion: v1 | |
| kind: Service | |
| metadata: | |
| name: teamcity-mssql-service-3 | |
| spec: | |
| selector: | |
| app: example-teamcity-mssql-3 | |
| ports: | |
| - protocol: TCP | |
| port: 1433 | |
| targetPort: 1433 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment