레이블이 yaml인 게시물을 표시합니다. 모든 게시물 표시
레이블이 yaml인 게시물을 표시합니다. 모든 게시물 표시

argocd cli

# argocd cli 를 사용해서 application 을 등록할 수 있다.
# argocd cli 설치
brew install argocd

# argocd 로그인
# 참고로 kubectl(namespace:argocd) 연결 가능한 상태라면 --core 옵션을 사용하면 로그인 필요 없이 argocd api 대신 k8s 와 직접 통신할 수 있다.
argocd login --insecure --username ysoftman --password abc123 argocd.ysoftman.net

#####
# 참고
# http:// 를 붙이면 port 를 찾을 수 없다는에러가 발생한다.
argocd login http://argocd.ysoftman.net
FATA[0000] dial tcp: lookup tcp///argocd.ysoftman.net: unknown port

# 그래서 :80 처럼 포트를 명시하면 colon 이 많다는 에러가 발생한다.
argocd login http://argocd.ysoftman.net:80
FATA[0000] dial tcp: address http://argocd.ysoftman.net:80: too many colons in address

# 관련 이슈가 2년 넘게 오픈되어 있다.
#####

# argocd 에 vecotor application 을 추가해보자.
# repository 추가 및 확인
# --proxy http://ysoftman.proxy.dev:8080 # 필요시에만
argocd repo add https://helm.vector.dev --name vector --type helm
argocd repo list

# repo  삭제시 
# 만약 연결 failed repo 삭제가 안되다면 k8s 에서 해당 repo 를 사용하는 secret 를 삭제해야 한다.
argocd repo rm vector

# (기존에 없다면) project 생성 및 확인
argocd proj create ysoftman
argocd proj list

# application 생성
# --values values.yaml 는 vector helm chart 의 values.yaml
# argocd server / client 버전이 다르면 --values-literal-file(helm > values 설정부분) 에러가 발생한다.
# 비슷한 이슈가 있었다.
# argocd server 2.6.7 을 사용하고 있어 argocd(client)도 같은 버전을 사용하자.
wget https://github.com/argoproj/argo-cd/releases/download/v2.6.7/argocd-darwin-arm64
chmod +x argocd-darwin-arm64
argocd-darwin-arm64 app create vector \
--repo https://helm.vector.dev \
--path vector \
--revision 0.31.1 \
--sync-policy auto \
--dest-namespace vector \
--dest-server https://kubernetes.default.svc \
--helm-chart vector \
--values values.yaml \
--values-literal-file vector_override_values.yaml \
--project ysoftman \
--upsert

# application 상태 보기
argocd app get vector

# application 삭제
argocd app delete vector

# 참고

#####

# argocd troubleshooting
# argocd > app > target revision 을 특정 브랜치로 변경하면 특정브랜치로 됐다가 원래(master)브랜치로 롤백된다.
# app 히스토리를 보면 특정브랜치로 배포는 됐는데 바로 원래(master) 브랜로 다시 배포한 이력이 있다.
# 특정 브랜치의 values.yaml > target revision 를 master 로 설정이 원인으로 master->브랜치 이름으로 변경하면 된다.(master머지시엔 다시 master로 변경)

yq command

# YAML 처리기 yq 사용 예시

# 우선 테스트를 위한 샘플 yaml 파일 생성(주의: 들여쓰기 2칸이어야 함)
rm -f test.yaml
cat << zzz > test.yaml 
contents:
- data:
    id: "apple"
    value: 100
  name: my1
- data:
    name: "lemon"
    value: 200
  name: my2
current: my2
zzz

# yq 로 보기
cat test.yaml | yq
# 또는
yq test.yaml

# current 값보기
cat test.yaml | yq '.current'

# contents > 0번째 원소 보기
cat test.yaml | yq '.contents.[0]'

# contents 원소들중 name == my 로 시작하는 원소들 보기
cat test.yaml | yq '.contents.[] | select(.name == "my*")'

# contents 원소들중 name == my1 인 것의 data > id 보기
cat test.yaml | yq '.contents.[] | select(.name == "my1") | .data.id
# 또는
cat test.yaml | yq '.contents.[] | select(.name == "my1").data.id

k8s deployment or pod serialization

# golang 환경에서 k8s deployment(k8s.io/api/apps/v1 -> Deployment struct) 를 manifest(yaml)로 serialization 할때
# 일반적인 gopkg.in/yaml.v2 패키지를 사용시
yamlDeployment, err := yaml.Marshal(deployment)

# string(yamlDeployment) 결과를 보면
# 다음과 같이 cpu 리소스등의 값이 DecimalSI 포맷이라고만 나오고 정확한 값이 표시되지 않는다.
spec -> template -> spec -> containers -> resources
  limits:
    cpu:
      format: DecimalSI
  requests:
    cpu:
      format: DecimalSI

# pod 나 deployment 는 k8s apimachinery 패키지의 NewYAMLSerializer 를 사용하면 된다.
import k8sJson "k8s.io/apimachinery/pkg/runtime/serializer/json"

e := k8sJson.NewYAMLSerializer(k8sJson.DefaultMetaFactory, nil, nil)
yamlDeployment := new(bytes.Buffer)
err = e.Encode(deployment, yamlDeployment)

# yamlDeployment.String() 결과를 보면 다음과 같이 값이 잘 표시된다.
  limits:
    cpu: 2500m
  requests:
    cpu: "1"

k8s configmap 사용하기

# 젠킨스 빌드 후 버전 정보를 configmap(key-value 데이터 저장하는 오프젝트)을 통해
# 운영 중인 k8s pod 에 전달하려고 한다.

# 우선 pod 또는 deployment(pod 와 replica를 생성하고 제어하는)에
# configmap 볼륨(volumes)을 추가한다.
# 마운트(volumeMounts)를 설정하면 파일로 사용할 수 있다.
# 환경변수(env)를 설정하면 환경변수 값으로 설정돼 사용할 수 도 있다.

# ysoftman-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: ysoftman-test
  name: ysoftman-test-deployment
spec:
  replicas: 1
  revisionHistoryLimit: 0
  selector:
    matchLabels:
      app: ysoftman-test-deployment
  template:
    metadata:
      labels:
        app: ysoftman-test-deployment
    spec:
      containers:
        - name: ysoftman-test
          image: ysoftman.test.com/ysoftman/ysoftman-test
          imagePullPolicy: Always
          ports:
            - containerPort: 443
            - containerPort: 8080
          command: ["./ysoftman-test", "-myopt1=test"]

          # 파일로 configmap 을 사용할 경우
          # 컨테이너에 /configmap 로 configmap 을 마운트
          volumeMounts:
          - name: configmap
            mountPath: "/configmap"
            readOnly: true
          # 환경변수로 설정해 사용할 경우
          env:
              # configmap 로부터 가져와 다음 환경변수이름으로 저장된다.
            - name: ysoftman-version-env
              valueFrom:
                configMapKeyRef:
                  # ysoftman-configmap 을 참조한다.
                  name: ysoftman-configmap
                  # ysoftman-configmap 의 ysoftman-version.json 키의 값을 가져온다.
                  key: ysoftman-version.json
      # configmap 이 있는 볼륨
      volumes:
          # 컨테이너 /configmap 에 마운트될 볼륨 이름
        - name: configmap
          configMap:
            # configmap 이름
            name: ysoftman-configmap


# 적용
kubectl apply -f k8s/ysoftman-deployment.yaml


# 젠킨스 빌드 후 k8s configmap 에 버전 정보 저장
# ysoftman-configmap-template.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: ysoftman-test
  name: ysoftman-test-configmap
data:
  # key : value 로 데이터 설정
  ysoftman-key1: 123
  ysoftman-key2: "lemon_juice"
  
  # value 내용이 많다면
  # x.x 처럼 파일 이름처럼 키이름 설정하고
  # | (literal 스타일로 멀티라인 지정) 지시자�로 value 를 명시하면
  # 컨테이너에서 마운트해 파일로 접근할 수 있다.
  ysoftman.version: |
    aaa = "lemon"
    bbb = 123

  # 내용이 json 인 경우
  ysoftman-version.json: |
    {
      "VersionName":"v1.0.0",
      "VersionTime":"2020-09-01_14:30:10_KST"
    }

  # 버전값 부분을 sed 로 바꿀 수 있도록 유니크한 스트링으로 명시
  ysoftman-version2.json: |
    {
      "VersionName":"__versionname__",
      "VersionTime":"__versiontime__"
    }



# 실제 버전값은 젠킨스의 환경변수로 가지고 있기 때문에
# sed 로 버전값 부분을 변경해서 실제로 적용할 파일을 생성한다.
vn="v1.0.1"
vt="2020-09-02"
sed -e "s/__versionname__/${vn}/g" -e "s/__versiontime__/${vt}/g" < ysoftman-template.yaml > ysoftman-configmap.yaml

# 적용
kubectl apply -f k8s/ysoftman-configmap.yaml

# configmap 업데이트되면 kubelet(k8s 노드에서 동작하는 에이전트)이
# configmap 동기화시간+캐시시간 이후에 pod 에 반영된다.
# 결과 확인
# 이제 pod shell 로 들어가면
# 다음 위치에 파일이 존재한다.
/configmap/ysoftman-version.json

# 환경 변수로도 설정돼 있다.
echo $ysoftman-version-env

# configmap 데이터를 업데이트 하면 볼륨 마운트된 파일 자동으로 갱신되지만
# 환경변수는 deployment 의 env 값 설정 부분을 다시 수행(pod restart)
# 해야 하기 때문에 파일로 접근하는것이 좋다.

# 참고

vscode path wildcard

# vscode 에서 .yml 파일이 위치에 따라 yaml 또는 ansible 로 사용해야 한다.
# **ansible, **roles 이름의 디렉토리내에 있는 .yml, .yaml 경우 ansible 로 지정 할 수 있다.
# 이때 path 에 대한 와일드카드로 **(double asterisk)를 사용한다.
# 파일 연결 및 제외 사용 예시
{
    "files.associations": {
        "**/roles/**/*.yml": "ansible",
        "**/ansible/**/*.yml": "ansible",
        "**/roles/**/*.yaml": "ansible",
        "**/ansible/**/*.yaml": "ansible",
        "*.yml.*": "yaml"
    },
    "files.exclude": {
        "**/.git": true,
        "**/.svn": true
    }
}