RAG를 활용한 LLM Application 개발

Introducing RAG를 활용한 LLM Application 개발 !!

RAG를 활용한 LLM Application 개발 is space .

Contents

Table of Contents

NoTitleRemarks
0환경설정pyenv 환경셋팅
1실습실습

Learning

Table of Learning

| No | 구분 | Title | Day | Remarks | | –: | :—: | :—————————————–: | :——–: | :—— | | 1 | 강의 | pyenv 기본다지기 | 2021.07.10 | * 도커기본 다지기
* 쿠버네티스 간단하게 맛보기 | | 2 | 강의 | 쿠버네티스의 시작 | 2021.07.17 | * Pod 생성 및 Kubectl 사용법
* Annotation/Namespace
* Liveness Porbes | | 3 | 강의 | 쿠버네티스로 서비스하기 | 2021.07.24 | * Deployment
* Service
ClusterIP
NodePort
LoadBalancer
Ingress | | 4 | 강의 | 쿠버네티스 고급 설정 | 2021.07.31 | * Readiness Probe
* Volume
* ConfigMap
* Secret | | 5 | 강의 | 쿠버네티스 가용성 개선 및 보안 | 2021.08.07 | * StatefullSet
* 리소스 제어
* 계정/인증 및 보안 | —

Get Started

1. pyenv 설치

  • PowerShell
Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"
$ pyenv install 3.13.2
$ pyenv global 3.13.2
$ pyenv install 3.10.11
$ mkdir inflearn-llm-application
$ cd inflearn-llm-application
$ pyenv local 3.10.11
$ python -m venv .venv

2. 구글 클라우드 무료계정


Practice

1. pyenv 기본 다지기(7/10)

① pyenv Image 만들기

# pyenv ps 실행중인 container 환경 보기
$ pyenv ps
# pyenv ps -a 실행된것 까지 다 확인 가능
$ pyenv ps -a

$ pyenv run --name datetest centos date
# pyenv stop  container id or name으로 stop 가능
$ pyenv stop mysqltest1

② pyenv로 Mysql 띄우기

$ pyenv run --name mysqltest1 -e MYSQL_ROOT_PASSWORD=mypass1q -d mysql:5.7.34

# pyenv logs 컨테이너 로그 메시지 보기
$ pyenv logs mysqltest1

# pyenv inspect 컨테이너 정보 보기
$ pyenv inspect mysqltest1

③ pyenv container를 다른 pc 환경으로 전달할때.

(기술적 가능, 쿠버네티스에서 함)

# container attach 사용하지 말아아 함.
$ pyenv attach 컨테이너 이름/id
# container -detatch 로 빠져 나와야 함.

# pyenv exec 특정 container에 명령어를 전달 하는 기능
$ pyenv exec -it 233abf0483fe /bin/bash

# 컨테이너 변경사항 커밋 
# pyenv commit
$ pyenv commit -a shpimit@nate.com 233abf0483fe datetest2

④ pyenv Volume

# Host OS에서 가지고 있는 volume
$ pyenv volume create -name myvolume
$ pyenv volume ls
$ pyenv run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

# 새로 만든 volume은 컨테이너 삭제 해도 사라지지 않는다.
$ pyenv volume create data_vol

⑤ pyenv Network

$ pyenv network ls
# Port Forwaring
$ pyenv run --name mysqltest2 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=mypass1q -d mysql:5.7.34
Go to Contents

2. 쿠버네티스의 시작(7/17)

① pyenv TAG 이름 변경

# image id로 tag 이름 변경하기
pyenv tag f78ebc0dce57 shpimit/date:latest

pyenv export는 layer를 합쳐서, save는 layer를 그대로..`

② 우분투 14.04를 기반으로 nginx 서버를 설치한 도커 이미지를 생성하는 예제

  • pyenvfile 만들기
# 어떤 이미지를 기반으로 할지 설정. <이미지 이름>:<태그> 형식
FROM ubuntu:14.04
# 메인테이너 정보                                              
MAINTAINER Foo Bar foo@bar.com
RUN apt-get update
# RUN으로 셸 스크립트 혹은 명령 실행
RUN apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
RUN chown -R www-data:www-data /var/lib/nginx
# 호스트와 공유할 디렉터리 목록
VOLUME ["/data", "/etc/nginx/site-enabled", "/var/log/nginx"]
# 다음 CMD에서 설정한 실행 파일이 실행될 디렉터리
WORKDIR /etc/nginx
# 컨테이너가 시작되었을 때 실행할 실행 파일 또는 스크립트
CMD ["nginx"]
# 노출할 포트 번호
EXPOSE 80
EXPOSE 443
  • 이미지 빌드

windows오 mac은 build된 파일은 볼수 없음. 오로지 linux에서마 보임
그 이유는 windows/mac 은 pyenv를 vm 위에서 돌림

pyenv build -t nginx:0.1 .
# pyenv와 관련된 상세를 보는것 inspect 명령어
pyenv inspect nginx:0.1
  • 이미지 실행
pyenv run --name shpimit-nginx -d -p 8081:80 -v D:\document:/data nginx:0.1

③ Go web 만들기

  • main.go 파일 만들기
package main

import (
	"fmt"
	"os"
	"log"
	"net/http"
)
func handler(w http.ResponseWriter, r *http.Request){
	name, err := os.Hostname()
	if err != nil {
		panic(err)
	}

	fmt.Fprintln(w,"hostname:", name)
}
func main() {
  fmt.Fprintln(os.Stdout,"Starting GoApp Server......")
	http.HandleFunc("/",handler)
	log.Fatal(http.ListenAndServe(":8080",nil))
}
  • pyenvfile 만들기
FROM golang:1.11-alpine AS build

WORKDIR /src/
COPY main.go go.* /src/
RUN CGO_ENABLED=0 go build -o /bin/demo

FROM scratch
COPY --from=build /bin/demo /bin/demo
CMD ["/bin/demo"]
  • Container Image 생성
pyenv build -t goapp .
  • Container Image start
pyenv run --name goapp-project -p 8080:8080 -d goapp
  • 프로세서 상세 정보 출력
pyenv inspect goapp-project
  • pyenv 허브 양식에 맞게 tag 수정하기
pyenv tag goapp shpimit/goapp
  • 도커 허브에 이미지 업로드 하기
pyenv login
pyenv push shpimit/goapp
  • 도커 허브의 이미지로 컨테이너 실행
pyenv run --name goapp-shpimit -p 8080:8080 -d shpimit/goapp
  • Default pyenvfile이 아닌 다른 pyenv file 사용할때
pyenv build -t shipimit/nginx -f pyenvfile_nginx

④ MySql과 WordPress 의 컨테이너 버전을 이용하여 wordpress 블로그 만들기

  • Word press
pyenv run --name wordpress-sun -p 8080:80 -d wordpress
pyenv run --name sun-workdpress -p 8082:80 -e WORDPRESS_DB_HOST=192.168.0.10:3307 -e WORDPRESS_DB_USER=wordpressuser -e WORDPRESS_DB_PASSWORD=123 -e WORDPRESS_DB_NAME=wordpressdb -d wordpress
pyenv run --name wordpress-sun -p 8080:80 -d wordpress
pyenv run --name sun-workdpress1 --link mysql3:mysql3 -p 8082:80 -e WORDPRESS_DB_HOST=mysql3:3306 -e WORDPRESS_DB_USER=wordpressuser -e WORDPRESS_DB_PASSWORD=123 -e WORDPRESS_DB_NAME=wordpressdb -d wordpress
pyenv run --name some-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 -d mysql
pyenv run --name sun-mysql -p 3307:3306 -e MYSQL_DATABASE=wordpressdb -e MYSQL_USER=wordpressuser -e MYSQL_PASSWORD=123 -e MYSQL_ROOT_PASSWORD=123 -d mysql 
  • 로그 보기
pyenv logs d105ee3a9dba

⑤ 쿠버네티스 환경

  • Project 만들기 → Kubernetes API 사용하기
  • 클러스터 이름 : sunk8s
  • 영역 : asia-northeast3-a

  • gcloud init
  1. 구글 클라우드 ….. 내 컴퓨터 연결
  2. Log in
  3. 허용하면 oauth2 연동이 되는것임
  4. 구글 클라우드 내 프로젝트 선택
gcloud init
# Create a new configureation 선택
  • gcloud 연결

구글 클라우드 연결에 있는 주소 copy

# gcloud container clusters get-credentials sunk8s --zone asia-east1-a --project eminent-booking-320104
gcloud container clusters get-credentials sunk8s --zone asia-northeast3-a --project sunproject-322214
kubectl get node
  • 쿠버네티스 동작 원리

ETCD → Controller Manager → Scheduler → ETCD → VM선택
5개 5 != 3 판단 노드가 어디 여유?
nodeSelector : 가 있는 부분 ssd: “true” 라고 되어 있는데만 pod을 생성하기도 함.

kubelet : api 서버와 통신하는것이고 모든것중에 핵심(HOST에 떠 있음.) container start/stop
kube-proxy : Network 담당, 가 vm당 1개만 올라가는것, vm 컨테이너끼리 통신하는것 관리 라우팅 테이블이라고 생각해도 됨.
CNI : 맨밑단에서 network을 연결해주는것.

kubectl api-resources
kubectl explain pod
  • Pod

쿠버네티스 작은 단위, 컨테이너의 모음짐( 1개의 Pod 안에 1개의 Container 95%). 배포단위
Pod안에서 container들은 network을 공유

  • Pod 설정보기
kubectl get pod myapp-pod -o yaml
kubectl get po myapp-pod -o json
  • Pod yml 파일로 만들기
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    name: myapp-pod
spec:
  containers:
  - name: myapp-pod
    image: nginx
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
    ports:
      - containerPort: 80
  • 쿠버네티스에 pod 만들기
kubectl apply -f Podtest.yml
kubectl get po --show-labels
kubectl get pod -L env
  • Lable을 이용한 필터링 조회
kubectl get pod -l env=prod
  • Pod : 컨테이너가 오류가 났을때… 재시작
  • 컨트롤러 : Pod 가 오류가 났을때 갯수를 유지하는것
  • 서비스 : 네트워크 환경을 제공, 컨트롤러에 access 및 Pod 에 엑세스

  • 컨트롤러 : Replication Controller, ReplicaSet → Pod의 갯수를 조정
  • 스케줄러 : 몇번 Node에 여유가 있어, 거기에 생성해
  • etcd : 상태 정보를 내부에 저장

  • selector : selector는 몇개의 pod가 이이쓴ㄴ지… label은 만드는 조회 조건,

  • Replication Controller : label 조건이 and 로만.. 오래된것
$ kubectl get rc
  • 특정 Pod 삭제하고 변화 확인하기
kubectl delete pod goapp-rc-2sdc5
  • Pod 라벨을 변경해보기
kubectl label pod goapp-rc-mwflw app=goapp-exit --overwrite
$ kubectl edit rc goapp-rc
  • 명령어를 통한 스케일링
kubectl scale rc goapp-rc --replicas=5
  • Replication Controller 와 POD 모두 삭제
kubectl delete rc goapp-rc
  • Replication Controller 만 삭제. POD 는 그대로 유지
kubectl delete rc goapp-rc --cascade=false
  • ReplicaSet : 연산조건이 in 등 다양하게 가능. 즉 서로 다른 label을 관리
kubectl get rs --show-labels
  • 디버깅이 필요할때
k pod rc-nginx-s5pax app=nginx2 --overwrite

replica=0으로 바꾸고.. 새로replica=3를 주면 새로운 스펙으로 되지만 다운타임이 발생

  • Delpoyment Deloyment : application을 배포할 목적으로 만들어진 컨트롤러
  • 무중단 배포 가능(RollingUpdate)
  • rollout : replicaset 자체를 바꾸어 주는것…
  • maxSurge : 몇개씩 rollingupdate를 해야 하는지… 5에 50%라면 반올림3개
  • maxUnavailable : 몇개가 최소운영을 되어야 하는지 %

  • DemonSet
  • Node에서 하나만 돌아야 하는 application : 기본적인 set
  • 해당 노드에서 로그에서 발행되는 로그를 다른쪽으로 전달 해야 하는것
  • replicas가 의미가 없음으로…무조건 node별로 1개, 1나의 node에 1나만
  • brew install watch
kubectl get pod,rs,deploy
kubectl --record deployment.apps/nginx-deployment set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1

kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1 --record

  • 롤아웃
kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.10 --record
  • 롤아웃 히스토리 확인
kubectl rollout history deployment/nginx-deployment
  • 롤백
kubectl rollout undo deployment/nginx-deployment
kubectl rollout undo deployment nginx-deployment --to-revision 3
  • Deployment ScaleOut
kubectl edit deploy nginx-deployment
kubectl scale deploy nginx-deployment --replicas=4
# 롤아웃 확인
kubectl rollout status deployment.v1.apps/nginx-deployment
# deployment 상세 확인
kubectl describe deploy nginx-deployment

kubectl label node gke-sunk8s-default-pool-e20fb63d-2rrb disk=ssd


kubectl get jobs/pi
kubectl describe jobs/pi
  • Job
  • 작업이 종료될때 : File 전송, DB 백업
  • 비정상 종료시 다시 실행
  • 정상 종료시 종료

  • CronJava
  • Job 보다는 CornJob 사용 마치 Replicaset 대신 Deployment 사용
  • 만약 한번만 작업하게 해야 한다면…concurrencyPoloy: Forbid
  • 특정 node에서만 돌게 하려면…nodeselector
$ k get jobs.batch
$ k describe cronjabs.batch
kubectl api-resources
kubectl explain 오브젝트 = 해당 오브젝트의 상세 메뉴얼
  • Statefull controller
  • pod의 영속성을 가져온다.

  • 윈도우도 wsl 설치후 zsh- autocomplete을 사용하면 자동완성을 쓸수있어요!
  • metric : 수치값 좌표값, 뭔가 측정할수 있는 값
  • 어떤것을 기준으로 측정 할것인가
  • scale out- 수집을 해서 기준점이 되는것.

  • 해당 테스트
  • 모든 명령어 –dry-run -o yml

  • HPA(Horizontal Pod Autoscaler)
  • 자동 동적으로 autoscale 한다.
  • 반드시 resource가 있어야 동작한다.
kubectl autoscale deployment 디플로이명 --cpu-percent=59 --min=1 --max=8
kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=1 --max=8
kubectl get hpa nginx-deployment -o wide
Kubectl describe hpa nginx-deployment
kubectl get hpa nginx-deployment
  • Pod가 여려개일외 외부에…서스하기
  • Service에는 여러개의 ClusterIp, NodePort, Load Balancer, Headoff

  • clusterIP
  • 쿠버네티스 클러스터 안에서만 움직이는 대표ip s/w Load Balancer(사설ip)

SVC : selector 정보만 같다면.. v1 v2 : deploy v2 v2 : deploy

  • NodePort : 외부에서 접근할수 있도록
  • ClusterIP를 baset로 깔고 간다.
  • nodeport : 클러스터의 worker node 포트
  • VM ip : 30080 → CuseterIP :포트
  • Test용도로만 사용함.
  • 일반적으로 클러스터 port 와 target port를 …동일하게 가져간다.

  • LoadBalancer
  • 클라우드 벤더에서만 제공해주어야 가능
  • Nodeport와 클라우드 벤터 자체 s/w Loadbalancer를 연결해서 사용하는것.

  • Headless
  • ClusterIP를 None을 셋팅하면….
  • StatefulSet과 연결하여 특정 도메인에만 보내야 할때. 고유DNS
gcloud container clusters list
#ERROR: (gcloud.container.clusters.list) The required property [project] is not currently set.
#It can be set on a per-command basis by re-running your command with the [--project] flag.

#You may set it for your current workspace by running:

gcloud config set project projects/mytestproject
# gcloud container clusters list  구글 cloud shell에서 실행 
gcloud compute disks create --size=10GiB --zone asia-east1-a  mongodb
# 삭제
# gcloud compute disks delete mongodb --zone asia-east1-a

kubectl exec -it mongodb -- mongo
exit
kubectl describe sc standard
gcloud compute disk-types list | grep asia-east1-a
pyenv build -t shpimit/nodejs:sfs .
pyenv login
pyenv push shpimit/nodejs:sfs
curl http://34.81.127.111
curl -X POST -d "hi, my name is shpimit-1" 34.81.127.111
curl -X POST -d "hi, my name is shpimit-2" 34.81.127.111
curl -X POST -d "hi, my name is shpimit-3" 34.81.127.111
curl -X POST -d "hi, my name is shpimit-4" 34.81.127.111
kubectl scale statefulset nodejs-sfs --replicas=1
kubectl get pods #Pod가 삭제된 것을 확인
kubectl get pvc  #pvc 존재 여부 확인 
kubectl get pv
kubectl scale statefulset nodejs-sfs --replicas=2
  • Ingress
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.46.0/deploy/static/provider/cloud/deploy.yaml
kubectl get pods -n ingress-nginx \
  -l app.kubernetes.io/name=ingress-nginx --watch

curl http://34.81.127.111
  • Configmap
pyenv CMD 는 3가지 형태로 사용 가능 합니다.

CMD [ "실행파일" , "파라메터1" , "파라메터2" ] → 실행파일 형태
CMD [ "파라메터1" , "파라메터2"] → ENTRYPOINT 의 디펄트 파라메터
CMD command 파라메터1 파라매터2 → 쉘 명령어 형태

pyenv build -t shpimit/fortune:args .
pyenv push shpimit/fortune:args
pyenv run -it shpimit/fortune:args
pyenv run -it shpimit/fortune:args 15

pyenv build -t shpimit/fortune:env .
pyenv push shpimit/fortune:env
pyenv run -it shpimit/fortune:env

kubectl create configmap fortune-config --from-literal=sleep-interval=7
kubectl get cm fortune-config -o yaml
kubectl create -f ./config-fortune-mapenv-pod.yml
kubectl describe cm fortune-config

kubectl create configmap fortune-config --from-file=config-dir
kubectl apply -f ./config-fortune-mapvol-pod.yml
kubectl exec -it nginx-configvol bash

curl -H "Accept-Encoding: gzip" -I 10.0.2.25:8080
# reload 로 변경 사항 컨테이너에 알리기
kubectl  exec nginx-configvol -c web-server -- nginx -s reload
kubectl apply -f ./config-fortune-mapvol-pod2.yml
  • Secret
openssl genrsa -out https.key 2048
openssl req -new -x509 -key https.key -out https.cert -days 360 -subj '/CN=*.acron.com'

kubectl create secret generic fortune-https --from-file=https.key --from-file=https.cert
kubectl create cm fortune-config --from-file=./config
kubectl apply -f ./secret-pod.yaml
kubectl port-forward fortune-https 8443:443 &
curl https://localhsot:8443 -k
  • Namespace
  • 똑같은 환경으로 개발/운영 분리된 영역에서 서비스를 진행함.
  • Namespace = development/ test/ production
  • SaaS 서비스를 똑같은 서비스를 A고객/B고객/C고객에게 서비스 └ 똑같은 소스를 다른곳 배포로 하여 멀티tenant
  • 쿠버네티스 내부적으로 보안적으로 분리
kubectl get ns
kubectl get pod --namespace kube-system
kubectl get pod -n 
kubectl config set-context $(kubectl config current-context) --namespace <Namespace-Name>
kubectl config set-context $(kubectl config current-context) --namespace kube-system
kubectl config current-context
kubectl apply -f first-namespace.yml
kubectl get ns
kubectl run testpod --image=nginx -n first-namespace
kubectl config set-context $(kubectl config current-context) --namespace first-namespace
kubectl get pods
kubectl config set-context $(kubectl config current-context) --namespace default

  • Service Account
  • 쿠버네티스는 기본적으로 User Account를 사용하지 않는다. Service Account를 지원함
  • 쿠버네티스 바깥에서 클러스터 vendor에서 제공하는 IAM에서 인증받고, 인증서를 기반으로 움직임.
  • Service Account: 쿠버네티스 API를 호출할때 인증하는 Account → 그냥 계정
  • Service Account는 Namespace를 벗어날수 없다.
  • 쿠버네티스는 동사와 목적어(Object: pod 등)가 있다.

  • RBAC(Role-Based Access Control)
  • Role : 동사와 목적어를 조합
  • Role Binding : 해당 Service Account 와 Role을 매핑한 Object
  • 클러스터 롤바인딩 / 클러스터 롤 / 클러스터 수준 리소스
kubectl --kubeconfig=./new_config get pods
kubectl create sa apiuser
kubectl get sa
kubectl get sa --all-namespaces
# 서비스 어카운트의 token secret 얻기
kubectl describe sa apiuser
# Tokens:              apiuser-token-4cdtn
kubectl describe secrets apiuser-token-4cdtn
# kubectl get secrets apiuser-token-xmdc2 -o jsonpath='{.data.token}' | base64 -d 명령어를 통해 data.token 부분만 바로 얻어올수도 있습니다.
# GKE server IP는 ~/.kube/kubeconfig 파일 안에서 확인 가능합니다.
curl -k  https://130.211.242.89/api/v1/namespaces/default/pods/  -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IlIwUmVuNFd2cUJGMGZ1aWRUWHN2c2EtQnVUWU1rZ2hNSTE1OGthaXl2RkUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImFwaXVzZXItdG9rZW4tNGNkdG4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiYXBpdXNlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjdlYWMzMWE0LTRjNmQtNDMwNC05YmM4LWE2Y2I1OTA3MDA1OSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmFwaXVzZXIifQ.Wnlpp6LAKUM3zqi2qV5MSjwFxfD2PyVSJ11iccJrz31NDSjV3tpvljCnunYZO2TNXIdEis9BKEOzX8ONfIrcV6Kh2esrohuR6YAsbYaUE7PQgi9-_JN5WyR-fPqCZT1_H_q0q0woG2UIy7cJ3gwy1xRV9ni4w8qJUMRsl1uYqLgh4q0q7w0UpKxw-9zwcXhGcwPzKSYoTBsSExn9TJ2tdIOkuhAg2NGL1_SnXDIFjb-sQyK9fxvIyGI1Nlcd_BoSQBrUR1waK6fYagH76UWyCfdB6gZ9vwD6cizSEqQAP6Gf3Vrw1I6kQ2MvJIo9iWdusAt7CY48U6m_yTmBMxNW3A"
  • 서비스어카운트 전용 kubeconfig 파일 배포
  • kubeconfig 파일을 위한 certificate-authority-data 얻기
kubectl apply -f role.yml
kubectl apply -f rolebinding.yml
# -o out파일 포맷을 바꾸어주는것.  특정 구조체만 뽑아내는것
kubectl get secrets apiuser-token-4cdtn  -o jsonpath='{.data.ca\.crt}'

  • kubeconfig 파일을 위한 token 얻기
kubectl get secrets apiuser-token-4cdtn  -o jsonpath='{.data.token}' | base64 -d
kubectl --kubeconfig=./new_config get pods
# Skaffold 샘플 소스 다운
git clone https://github.com/chungsju/skaffold-nodejs.git
# kubernetes-manifests/hello.deployment.yaml 파일의 컨테이너 image: chungsju/skaffold-nodejs 이미지 이름을 각자의 pyenv hub repository이름으로 변경
# Skaffold dev
  • Helm
  • 다른 사람들이.. service/secret 등이 구성되어 있는것을 가져다가 쓰겠다.
  • 우리 회사에서 쓰고 있는것을 기존에 짜져 있던것을 value값만 바꾸어서 사용한다.
  • value_prod.yml, value_dev.yml, value_usera.yml
  • heml install <릴리스이름> → 인스터스 명 < 차트이름>
helm install my-wordpress bitnami/wordpress
helm status my-wordpress
helm create
helm version
# Helm 차트 리포지토리 추가
helm repo add bitnami https://charts.bitnami.com/bitnami
# 리포지토리 업데이트
helm repo update
# mysql helm 검색
helm search repo mysql
# 피키지 메타 정보 보기
helm show chart bitnami/mysql
# mysql helm 차트 설치 및 Deployment
helm install myhelm-test-mysql bitnami/mysql
helm ls
# helm 차트 uninstall
helm list
helm uninstall myhelm-test-mysql
# wordpress의 username과 패스워드를 셋팅한 상태로 helm Chart 구성
helm install helm-wordpress bitnami/wordpress --set wordpressUsername=myuser,wordpressPassword=mypassword
# helm 릴리스에 설정된 값 확인
helm get values helm-wordpress
# 접속 IP 얻기
kubectl get svc --namespace default helm-wordpress --template ""
  • CI/CD
  • skaffold : yml 파일로 qlco

  • GitOps
  • Git을 Ops해서 오퍼레이션 하겠다.

  • ArgoCD 설치하기
# helm repository 설정
helm repo add argo https://argoproj.github.io/argo-helm
# install ArgoCD
helm install sun-argo-cd argo/argo-cd --set server.service.type=LoadBalancer
kubectl -n default get secret argocd-initial-admin-secret -o jsonpath="{.data.password}"
# 패스워드 알아내는 법 까먹었을때
helm status sun-argo-cd
helm uninstall sun-argo-cd argo/argo-cd --set server.service.type=LoadBalancer
  • Base64 문자열 변환
  • id/암호 : admin / APBcOvossXZQvZpf

  • ISTIO
  • Dedicated infrastructure : Service Discovery / Load Balancing / Failure Recovery / Metrics and Monitoring
  • 투명한 언어 독립적
  • Envoy Proxy를 사이드카로 제공
  • 보안/인증서를 신경쓰지 않아도 된다.
  • Pilot : 정책
  • Citadel : 인증서
  • Mixer : 네트워크 Envoy proxy가 control plane에 보고

  • Istio Gateway : Ingress와 유사한…
  • Istio Virtual Service : Routing Service . L7 http 헤더정보를 보고 Routing
  • L7, Circuit Breaker, Tracing 관리

  • Prometheus : 시계열 DB, Istio와 서비스 매쉬 어플리케이션의 메트릭스 저장
  • Grafana : Peometheus와 연계된 대쉬보드 제공
  • Kiali : Envoy관측에 따른 서비스 매쉬 스트럭처 및 토폴리지 제공
  • Jaeger : end to end distribued tracing system

  • DetinationRule : pod를 찾아가는 subsets Service를 pod의 label 정보를 이용하여 분배

  • -c : Concurrent 사용자

  • 강사님 Hands-on 1.10.1
  • 나는 1.10.3
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
unable to recognize "samples/bookinfo/networking/bookinfo-gateway.yaml": no matches for kind "Gateway" in version "networking.istio.io/v1alpha3"
unable to recognize "samples/bookinfo/networking/bookinfo-gateway.yaml": no matches for kind "VirtualService" in version "networking.istio.io/v1alpha3"
istioctl install --set profile=demo -y
# uninstall 하고 싶을때  istioctl x uninstall --purge
kubectl label namespace default istio-injection=enabled
kubectl label namespace default istio-injection=disabled --overwrite
kubectl label namespace default istio-injection= --overwrite
# injection이 활성화된 네임스페이스에서 향후 생성되는 Pod에는 Istio Envoy 사이드카가 자동으로 구동됨
kubectl label namespace default istio-injection=enabled --overwrite
# kubectl label namespace default istio-injection=enabled --overwrite
# kubectl label namespace istiosun istio-injection=enabled
# kubectl config set-context $(kubectl config current-context) --namespace istiosun
# kubectl config set-context $(kubectl config current-context) --namespace default
# kubectl get namespace -L istio-injection
# kubectl get pods -n istio-system
kubectl apply -f samples/addons
#위에 문제가 되어 삭제 해야 할때   아래 문제는   kubectl get pods -n istio-system 로 kiali pod가 다 뜨고 나서 하면 사람짐.
# unable to recognize "samples\\addons\\kiali.yaml": no matches for kind "MonitoringDashboard" in version "monitoring.kiali.io/v1alpha1"
# 여러번 하니까  설치 됨
# kubectl delete -f samples/addons --ignore-not-found
  • 샘플 어플리케이션 설치
# 서비스와 디플로이먼트 설치
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
# 다른 로드 밸런스가 떠 있으면 잘 안된다.
# Gateway 및 VirtualService 설치
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
# DestinationRule 설치
kubectl apply -f samples/bookinfo/networking/destination-rule-reviews.yaml
# Istio Gateway 외부 주소 확인
kubectl get service istio-ingressgateway -n istio-system

kubectl port-forward service/istio-ingressgateway 8091:80
# kiali 대쉬보드
istioctl dashboard kiali
# Grafana 대쉬보드
istioctl dashboard grafana
# Jaeger 대쉬보드
istioctl dashboard jaeger
# 가중치 기반 라우팅
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
kubectl get virtualservice reviews -o yaml
# 컨텐츠 기반 라우팅
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
kubectl get virtualservice reviews -o yaml
# circuit breaker 테스트
kubectl apply -f samples/httpbin/httpbin.yaml
# Circuit Beaker를 위한 DestinationRule 파일 생성 및 적용
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: httpbin
spec:
  host: httpbin
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 1
      http:
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1
    outlierDetection:
      consecutive5xxErrors: 1
      interval: 1s
      baseEjectionTime: 3m
      maxEjectionPercent: 100

  • DestinationRule 적용 확인
kubectl get destinationrule httpbin -o yaml
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
...
spec:
  host: httpbin
  trafficPolicy:
    connectionPool:
      http:
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1
      tcp:
        maxConnections: 1
    outlierDetection:
      baseEjectionTime: 3m
      consecutive5xxErrors: 1
      interval: 1s
      maxEjectionPercent: 100

  • 샘플 타겟을 호출할 Client Pod 생성
kubectl apply -f samples/httpbin/sample-client/fortio-deploy.yaml
  • Client Pod에서 동시 접속 부하 발생
kubectl exec "$FORTIO_POD" -c fortio -- /usr/bin/fortio load -c 2 -qps 0 -n 30 -loglevel Warning http://httpbin:8000/get

Reference

https://github.com/chungsju/CloudNative/blob/main/K8S%20Istio.md

Go to Contents