Magicode logo
Magicode
0
3 min read

[Kubernetes] GitHubからYAMLを取得して、デプロイを実行するPodを作成する

本記事は、Kubernetesの話です。

GitHubからYAMLを取得して、それを kubectl apply でデプロイするコマンドを実行するPodを作成します。

実現する方法

次の流れで進めていきます。

  1. git, kubectl コマンドを実行できるDockerイメージを作成する
  2. このイメージをDocker Hubにプッシュしておく
  3. GitHubの認証情報を格納したSecretをデプロイする
  4. 1で作成したイメージをもとにPodを作成する

ここではDocker Hubとしていますが、適宜ご自身の最適なコンテナレジストリに置き換えていただければと思います。

Dockerイメージを作成する

Dockerfileを作成します。

FROM alpine:latest

# install curl, yq, git
RUN apk update
RUN apk add --no-cache curl yq git

# install kubectl
RUN apk add --no-cache --virtual=build-deps wget \
  && wget https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl \
  && mv kubectl /usr/local/bin/kubectl \
  && chmod +x /usr/local/bin/kubectl \
  && apk del build-deps

ENTRYPOINT ["/usr/local/bin/kubectl"]
CMD [""]

ビルドします。

docker build -t kubectl-alpine:${TAG} .
docker tag kubectl-alpine:${TAG} ${DOCKERHUB_USER}/kubectl-alpine:${TAG}

Docker Hubにプッシュします。

docker login -u ${DOCKERHUB_USER}
docker push ${DOCKERHUB_USER}/kubectl-alpine:${TAG}

Secretを作成する

ユーザ名、アクセストークンは、それぞれbase64でエンコードした文字列を指定します。

apiVersion: v1
kind: Secret
metadata:
  name: git-access
  namespace: default
type: Opaque
data:
  username: GIT_ACCOUNT_BASE64
  password: GIT_ACCESS_TOKEN_BASE64

Podを作成する

下のYAMLをデプロイします。

apiVersion: v1
kind: Pod
metadata:
  name: busybox-date
spec:
  containers:
  - name: busybox
    image:${DOCKERHUB_USER}/kubectl-alpine:${TAG}
    env:
    - name: GIT_BRANCH
      value: "master"
    - name: GIT_REPOSITORY
      value: "github.com/sample.git"
    - name: SECRET_USERNAME
      valueFrom:
        secretKeyRef:
          name:git-access
          key: username
    - name: SECRET_ACCESS_TOKEN
      valueFrom:
        secretKeyRef:
          name:git-access
          key: password
    args:
    - |
      git clone -b $(GIT_BRANCH) https://$(SECRET_USERNAME):$(SECRET_ACCESS_TOKEN)@$(GIT_REPOSITORY) files
      kubectl apply -f files/$(RESOURCE_PATH) -n $(NAMESPACE)

Discussion

コメントにはログインが必要です。