# 사전 준비

## 1. 사전 환경 구성

Weave Flux를 설치하기 위해서 [Helm Chart](../../helm/helm#1.-helm-cli)가 설치되어 있어야 합니다.

```
helm version
```

AWS CodePipeline 및 AWS CodeBuild 모두 도커 이미지 빌드 파이프라인을 만들려면 AWS IAM(액세스 관리)의 service role 이 필요합니다.

이 단계에서는 IAM 역할을 생성하고 CodeBuild 단계에서 Kubectl을 통해 EKS 클러스터와 상호 작용하는 인라인 정책을 추가할 것입니다.

버킷 및 역할을 만듭니다.

```
mkdir ~/environment/gitops_flux
cd ~/environment/gitops_flux

# Use your account number below
ACCOUNT_ID=$(aws sts get-caller-identity | jq -r '.Account')
aws s3 mb s3://eksworkshop-${ACCOUNT_ID}-codepipeline-artifacts

wget https://eksworkshop.com/intermediate/260_weave_flux/iam.files/cpAssumeRolePolicyDocument.json

aws iam create-role --role-name eksworkshop-CodePipelineServiceRole --assume-role-policy-document file://cpAssumeRolePolicyDocument.json 

wget https://eksworkshop.com/intermediate/260_weave_flux/iam.files/cpPolicyDocument.json

aws iam put-role-policy --role-name eksworkshop-CodePipelineServiceRole --policy-name codepipeline-access --policy-document file://cpPolicyDocument.json

wget https://eksworkshop.com/intermediate/260_weave_flux/iam.files/cbAssumeRolePolicyDocument.json

aws iam create-role --role-name eksworkshop-CodeBuildServiceRole --assume-role-policy-document file://cbAssumeRolePolicyDocument.json 

wget https://eksworkshop.com/intermediate/260_weave_flux/iam.files/cbPolicyDocument.json

aws iam put-role-policy --role-name eksworkshop-CodeBuildServiceRole --policy-name codebuild-access --policy-document file://cbPolicyDocument.json

```

## 2. Github 구성

2개의 GitHub repository를 만들 것입니다. 하나는 도커 이미지 빌드를 트리거하는 샘플 애플리케이션에 사용됩니다. 또 다른 방법은 Weave Flux가 클러스터에 배포하는 쿠버네티스 매니페스트를 보관하는 데 사용됩니다. 이는 Kubernetes에 push하는 다른 연속 전개 툴에 비해 pull 기반 방법입니다.

[here](https://github.com/new)를 클릭하여 샘플 응용 프로그램 저장소를 만듭니다.

Repository name 과 Description을 작성하고 아래와 같이 README로 리포지토리 초기화를 확인하고 리포지토리 만들기를 클릭합니다.

<img src="https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhByD5wv8eUbA5ZbUY5%2Fuploads%2FX57Ht26krDaUrltYpgXe%2Fimage.png?alt=media&#x26;token=aff61b5d-b24d-4b15-982c-f035cf9d1a6a" alt="" data-size="original">



다시한번 위 절차를 반복하여 Kubernetes mainfasts repositories 를 생성합니다.

<img src="https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhByD5wv8eUbA5ZbUY5%2Fuploads%2FIDXjvK8RkFuDv66j1WV9%2Fimage.png?alt=media&#x26;token=92c52a14-f64c-4d83-8370-ded172776745" alt="" data-size="original">

이 CodePipeline이 GitHub에서 callback 받을 수 있는 Personal access token을 만들 것입니다. Access token을 만든 후에는 재사용할 수 있으므로 안전한 곳에 저장합니다. 이 단계는 처음 실행할 때나 새 키를 생성해야 할 때만 수행할 수 있습니다.

Github에서 [New personal access page](https://github.com/settings/tokens/new) 를 오픈합니다. passwork를 입력하고 login 후 `Personal access tokens` 를 클릭합니다. `Generate new token` 을 클릭합니다.

<img src="https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhByD5wv8eUbA5ZbUY5%2Fuploads%2FlG6pQxTuCEK54LoDYd2j%2Fimage.png?alt=media&#x26;token=7895ded5-e9ab-41c3-add4-4abfb23651d2" alt="" data-size="original">

아래와 같이 정보를 입력하고 `Generate token` 을 클릭합니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhByD5wv8eUbA5ZbUY5%2Fuploads%2FcujqlzfSu38htHWQS9l7%2Fimage.png?alt=media\&token=eb17e9f0-6aae-442b-adb2-ccdabbb2964c)

발생된 access token을 저장합니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhByD5wv8eUbA5ZbUY5%2Fuploads%2FkMDJuS7cW6QP73Oa3GQs%2Fimage.png?alt=media\&token=1c0012dc-dbd4-4fc2-a5c3-3973f5bebdbf)

## 3. Weave Flux 설치

이제 Helm을 사용하여 Weave Flux를 클러스터에 설치하고 Kubernetes 구성 GitHub repo와 상호 작용할 수 있도록 합니다.

먼저, Flux 사용자 정의 리소스 정의를 설치합니다.

```
kubectl apply -f https://raw.githubusercontent.com/fluxcd/helm-operator/master/deploy/crds.yaml
```

다음 단계에서는 Git 사용자 이름이 필요합니다. 이 정보가 없으면 결과 파이프라인이 예상대로 작동하지 않습니다. 이 값을 다음 명령로 환경 변수로 설정합니다.

```
YOURUSER=<git username>
```

`flux` 네임스페이스를 생성합니다.

```
kubectl create namespace flux
```

Flux chart repo 를 helm에 추가한 후 설치합니다. 아래 `${YOURUSER}` 를 git user name으로 변경합니다.

```
helm repo add fluxcd https://charts.fluxcd.io

helm upgrade -i flux fluxcd/flux \
--set git.url=git@github.com:${YOURUSER}/k8s-config \
--set git.branch=main \
--set registry.pollInterval=1m \
--set git.pollInterval=1m \
--namespace flux

helm upgrade -i helm-operator fluxcd/helm-operator \
--set helm.versions=v3 \
--set git.ssh.secretName=flux-git-deploy \
--set git.pollInterval=1m \
--set chartsSyncInterval=1m \
--set git.branch=main \
--namespace flux

```

필요한 Pod 3개가 설치되어 있는지 확인합니다.

```
kubectl get pods -n flux
```

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhByD5wv8eUbA5ZbUY5%2Fuploads%2FONucItiwRdvlPozu37HZ%2Fimage.png?alt=media\&token=4f7758bd-55e5-485d-8b11-e931599627e0)

GitHub 쓰기 액세스를 허용하는 SSH 키를 얻으려면 fluxctl을 설치해야 합니다. 이를 통해 Flux는 GitHub의 구성이 클러스터에 배포된 구성과 동기화되도록 유지할 수 있습니다.

```
sudo wget -O /usr/local/bin/fluxctl $(curl https://api.github.com/repos/fluxcd/flux/releases/latest | jq -r ".assets[] | select(.name | test(\"linux_amd64\")) | .browser_download_url")
sudo chmod 755 /usr/local/bin/fluxctl

fluxctl version
fluxctl identity --k8s-fwd-ns flux

kubectl get secret flux-git-deploy -n flux --template={{.data.identity}} | base64 -d > ~/.ssh/id_rsa

chmod 600 ~/.ssh/id_rsa
```

제공되는 ssh key 값을 복사하여 Github repo에 배포합니다.

1. URL : github.com/\<username>/settings/profile
2. SSH \&GPG Key 클릭 > New SSH
3. Name : `Flux Deploy Key` 입
4. ssh key 붙어넣기
5. Allow Write Access 클릭 <- Flux를 통해서 repo가 cluster의 현재 상태를 동기화 하는 것을 허용합니다.
6. Add Key 클릭

