Skip to main content

Actions Runner Controller ์˜ค๋ฅ˜ ๋ฌธ์ œ ํ•ด๊ฒฐ

Actions Runner Controller ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

๋กœ๊น…

์ปจํŠธ๋กค๋Ÿฌ, ์ˆ˜์‹ ๊ธฐ ๋ฐ ์‹คํ–‰๊ธฐ๋ฅผ ํฌํ•จํ•˜๋Š” Actions Runner Controller(ARC) ๋ฆฌ์†Œ์Šค๋Š” ํ‘œ์ค€ ์ถœ๋ ฅ(stdout)์— ๋กœ๊ทธ๋ฅผ ์”๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์ €์žฅํ•˜๋Š” ๋กœ๊น… ์†”๋ฃจ์…˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐ ๋””๋ฒ„๊น…์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๋˜๋Š” GitHub๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋กœ๊น… ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฆฌ์†Œ์Šค ๋ ˆ์ด๋ธ”

๋ ˆ์ด๋ธ”์€ ์ปจํŠธ๋กค๋Ÿฌ, ์ˆ˜์‹ ๊ธฐ ๋ฐ ์‹คํ–‰๊ธฐ Pod๋ฅผ ํฌํ•จํ•˜๋Š” Actions Runner Controller์—์„œ ๋งŒ๋“  ๋ฆฌ์†Œ์Šค์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ ˆ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ณ  ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ Pod

์ปจํŠธ๋กค๋Ÿฌ Pod์— ๋‹ค์Œ ๋ ˆ์ด๋ธ”์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

app.kubernetes.io/component=controller-manager
app.kubernetes.io/instance=<controller installation name>
app.kubernetes.io/name=gha-runner-scale-set-controller
app.kubernetes.io/part-of=gha-runner-scale-set-controller
app.kubernetes.io/version=<chart version>

์ˆ˜์‹ ๊ธฐ Pod

๋‹ค์Œ ๋ ˆ์ด๋ธ”์€ ์ˆ˜์‹ ๊ธฐ Pod์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

actions.github.com/enterprise= # Will be populated if githubConfigUrl is an enterprise URL
actions.github.com/organization= # Will be populated if githubConfigUrl is an organization URL
actions.github.com/repository= # Will be populated if githubConfigUrl is a repository URL
actions.github.com/scale-set-name= # Runners scale set name
actions.github.com/scale-set-namespace= # Runners namespace
app.kubernetes.io/component=runner-scale-set-listener
app.kubernetes.io/part-of=gha-runner-scale-set
app.kubernetes.io/version= # Chart version

์‹คํ–‰๊ธฐ Pod

๋‹ค์Œ ๋ ˆ์ด๋ธ”์€ ์‹คํ–‰๊ธฐ Pod์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

actions-ephemeral-runner= # True | False
actions.github.com/organization= # Will be populated if githubConfigUrl is an organization URL
actions.github.com/scale-set-name= # Runners scale set name
actions.github.com/scale-set-namespace= # Runners namespace
app.kubernetes.io/component=runner
app.kubernetes.io/part-of=gha-runner-scale-set
app.kubernetes.io/version= # Chart version

์ปจํŠธ๋กค๋Ÿฌ ๋ฐ ์‹คํ–‰๊ธฐ ์ง‘ํ•ฉ ์ˆ˜์‹ ๊ธฐ์˜ ๋กœ๊ทธ ํ™•์ธ

๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ Pod์˜ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Bash
kubectl logs -n <CONTROLLER_NAMESPACE> -l app.kubernetes.io/name=gha-runner-scale-set-controller

๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹คํ–‰๊ธฐ ์ง‘ํ•ฉ ์ˆ˜์‹ ๊ธฐ์˜ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Bash
kubectl logs -n <CONTROLLER_NAMESPACE> -l auto-scaling-runner-set-namespace=arc-systems -l auto-scaling-runner-set-name=arc-runner-set

master ๋ถ„๊ธฐ์˜ ์ฐจํŠธ ์‚ฌ์šฉ

master ๋ถ„๊ธฐ ๋Œ€์‹  ์ตœ์‹  ๋ฆด๋ฆฌ์Šค์˜ ์ฐจํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. master ๋ถ„๊ธฐ๋Š” ๋งค์šฐ ๋ถˆ์•ˆ์ •ํ•˜๋ฉฐ master ๋ถ„๊ธฐ์˜ ์ฐจํŠธ ๊ฐ€ ์ง€์ •๋œ ์‹œ๊ฐ„์— ์ž‘๋™ํ•˜๋„๋ก ๋ณด์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ: ์ˆ˜์‹ ๊ธฐ Pod

์ปจํŠธ๋กค๋Ÿฌ Pod๊ฐ€ ์‹คํ–‰ ์ค‘์ด์ง€๋งŒ ์ˆ˜์‹ ๊ธฐ Pod๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ๋จผ์ € ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋กœ๊ทธ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ์—†๊ณ  ์‹คํ–‰๊ธฐ ์ง‘ํ•ฉ ์ˆ˜์‹ ๊ธฐ Pod๊ฐ€ ์•„์ง ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ปจํŠธ๋กค๋Ÿฌ Pod๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์˜ Kubernetes API ์„œ๋ฒ„์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋ก์‹œ๊ฐ€ ๊ตฌ์„ฑ๋˜์—ˆ๊ฑฐ๋‚˜ Istio์™€ ๊ฐ™์ด ์ž๋™์œผ๋กœ ์‚ฝ์ž…๋˜๋Š” ์‚ฌ์ด๋“œ์นด ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ปจํŠธ๋กค๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ(๊ด€๋ฆฌ์ž)์—์„œ Kubernetes API ์„œ๋ฒ„๋กœ์˜ ํŠธ๋ž˜ํ”ฝ์„ ํ—ˆ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ž๋™ ์Šค์ผ€์ผ๋ง ์‹คํ–‰๊ธฐ ์ง‘ํ•ฉ์„ ์„ค์น˜ํ–ˆ์ง€๋งŒ ์ˆ˜์‹ ๊ธฐ Pod๊ฐ€ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์€ ๊ฒฝ์šฐ, ์ œ๊ณตํ•œ githubConfigSecret๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€, ์ œ๊ณตํ•œ githubConfigUrl์ด ์ •ํ™•ํ•œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub API์— ARC ์ธ์ฆ ๋ฐ Actions Runner Controller๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰๊ธฐ ํ™•์žฅ ์ง‘ํ•ฉ ๋ฐฐํฌ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์ทจ์†Œ๋œ ์›Œํฌํ”Œ๋กœ ์‹คํ–‰ ํ›„ ์‹คํ–‰๊ธฐ Pod๊ฐ€ ๋‹ค์‹œ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

์›Œํฌํ”Œ๋กœ ์‹คํ–‰์ด ์ทจ์†Œ๋˜๋ฉด ๋‹ค์Œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • ์ทจ์†Œ ์‹ ํ˜ธ๋Š” ์‹คํ–‰๊ธฐ์— ์ง์ ‘ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
  • ์‹คํ–‰๊ธฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋˜์–ด ์‹คํ–‰๊ธฐ Pod๋„ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์Œ ํด๋ง์—์„œ ์ˆ˜์‹ ๊ธฐ๊ฐ€ ์ทจ์†Œ ์‹ ํ˜ธ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์‹คํ–‰๊ธฐ๊ฐ€ ์‹ ํ˜ธ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ์‹œ๊ธฐ์™€ ์ˆ˜์‹ ๊ธฐ๊ฐ€ ์‹ ํ˜ธ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ์‹œ์  ์‚ฌ์ด์— ์•ฝ๊ฐ„์˜ ์ง€์—ฐ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํ–‰๊ธฐ Pod๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์ˆ˜์‹ ๊ธฐ๋Š” ์ƒํƒœ์— ๋”ฐ๋ผ ์›ํ•˜๋Š” ์ˆ˜์˜ ์‹คํ–‰๊ธฐ์™€ ์ผ์น˜ํ•˜๋„๋ก ์ƒˆ ์‹คํ–‰๊ธฐ๋ฅผ ๋ถˆ๋Ÿฌ ์˜ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜์‹ ๊ธฐ๋Š” ์ทจ์†Œ ์‹ ํ˜ธ๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉด ์‹คํ–‰๊ธฐ ์ˆ˜๋ฅผ ์ค„์ด๋Š” ์กฐ์น˜๋ฅผ ์ทจํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ˆ˜์‹ ๊ธฐ๋Š” ์›ํ•˜๋Š” ์‹คํ–‰๊ธฐ ์ˆ˜๋กœ ์ถ•์†Œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๋™์•ˆ, ์—ฌ๋ถ„์˜ ์‹คํ–‰๊ธฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜: Name must have up to n characters

ARC๋Š” ํŠน์ • ๋ฆฌ์†Œ์Šค์˜ ์ƒ์„ฑ๋œ ์ด๋ฆ„์„ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋ ˆ์ด๋ธ”๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์š”๊ตฌ ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ARC๋Š” ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ 63์ž๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค ์ด๋ฆ„์˜ ์ผ๋ถ€๊ฐ€ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์ •์˜๋˜๋ฏ€๋กœ ARC๋Š” ์„ค์น˜ ์ด๋ฆ„ ๋ฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž ์ˆ˜์— ์ œํ•œ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

Error: INSTALLATION FAILED: execution error at (gha-runner-scale-set/templates/autoscalingrunnerset.yaml:5:5): Name must have up to 45 characters

Error: INSTALLATION FAILED: execution error at (gha-runner-scale-set/templates/autoscalingrunnerset.yaml:8:5): Namespace must have up to 63 characters

์˜ค๋ฅ˜: Access to the path /home/runner/_work/_tool is denied

์˜๊ตฌ ๋ณผ๋ฅจ๊ณผ ํ•จ๊ป˜ Kubernetes ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜๋Š” ์‹คํ–‰๊ธฐ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉ์ž์™€ ํ•จ๊ป˜ ์‹คํ–‰ ์ค‘์ด๊ณ  ์ด๋กœ ์ธํ•ด ํƒ‘์žฌ๋œ ๋ณผ๋ฅจ๊ณผ ๊ถŒํ•œ์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ž‘์—… ์ค‘ ํ•˜๋‚˜๋ฅผ ๋”ฐ๋ฅด๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • securityContext.fsGroup๋ฅผ ์ง€์›ํ•˜๋Š” ๋ณผ๋ฅจ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. hostPath ๋ณผ๋ฅจ์€ ์ด ์†์„ฑ์„ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ local ๋ณผ๋ฅจ ๋ฐ ๊ธฐํƒ€ ์œ ํ˜•์˜ ๋ณผ๋ฅจ์€ ์ด ์†์„ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰๊ธฐ์˜ GID์™€ ์ผ์น˜ํ•˜๋„๋ก ์‹คํ–‰๊ธฐ Pod์˜ fsGroup๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ํฌํ•จํ•˜๋„๋ก gha-runner-scale-set helm ์ฐจํŠธ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. VERSION๋ฅผ, ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋ฒ„์ „์˜ actions-runner ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    YAML
    template:
      spec:
        securityContext:
          fsGroup: 123
        containers:
          - name: runner
            image: ghcr.io/actions/actions-runner:latest
            command: ["/home/runner/run.sh"]
    
  • ์‹คํ–‰๊ธฐ Pod์˜ securityContext๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด initContainers๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ‘์žฌ๋œ ๋ณผ๋ฅจ์˜ ์†Œ์œ ๊ถŒ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    YAML
    template:
      spec:
        initContainers:
          - name: kube-init
            image: ghcr.io/actions/actions-runner:latest
            command: ["sudo", "chown", "-R", "1001:123", "/home/runner/_work"]
        volumeMounts:
          - name: work
            mountPath: /home/runner/_work
        containers:
          - name: runner
            image: ghcr.io/actions/actions-runner:latest
            command: ["/home/runner/run.sh"]
    

์˜ค๋ฅ˜: failed to get access token for GitHub App auth: 401 Unauthorized

GitHub App์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ํ† ํฐ์„ ์–ป์œผ๋ ค๊ณ  ํ•  ๋•Œ 401 Unauthorized ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์€ NTP(๋„คํŠธ์›Œํฌ ์‹œ๊ฐ„ ํ”„๋กœํ† ์ฝœ) ๋“œ๋ฆฌํ”„ํŠธ์˜ ๊ฒฐ๊ณผ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Kubernetes ์‹œ์Šคํ…œ์ด NTP ์„œ๋ฒ„์™€ ์ •ํ™•ํ•˜๊ฒŒ ๋™๊ธฐํ™”๋˜๊ณ  ์žˆ์œผ๋ฉฐ ์ƒ๋‹นํ•œ ์‹œ๊ฐ„ ๋“œ๋ฆฌํ”„ํŠธ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ์‹œ๊ฐ„์ด GitHub์˜ ์‹œ๊ฐ„๋ณด๋‹ค ๋Šฆ๋‹ค๋ฉด ์—ฌ์œ ๊ฐ€ ์กฐ๊ธˆ ์žˆ๊ฒ ์ง€๋งŒ ํ™˜๊ฒฝ ์‹œ๊ฐ„์ด ๋ช‡ ์ดˆ ์ด์ƒ ๋น ๋ฅด๋‹ค๋ฉด GitHub App์„ ์‚ฌ์šฉํ•  ๋•Œ 401 ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋Ÿฌ๋„ˆ ๊ทธ๋ฃน ์ œํ•œ

ํ•˜๋‚˜์˜ ๋Ÿฌ๋„ˆ ๊ทธ๋ฃน์—์„œ ์ตœ๋Œ€ 10,000๊ฐœ์˜ ์ž์ฒด ํ˜ธ์ŠคํŒ… ๋Ÿฌ๋„ˆ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ œํ•œ์— ๋„๋‹ฌํ•˜๋ฉด ์ƒˆ ์‹คํ–‰๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ Apache-2.0 ๋ผ์ด์„ ์Šค์—์„œ https://github.com/actions/actions-runner-controller/๋กœ๋ถ€ํ„ฐ ์ผ๋ถ€ ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Copyright 2019 Moto Ishizawa

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.