Kubernetes

K8s + GKE 과정 정리

설정

편리하게 사용하기 위해 미리 설정을 해두면 이후에 매 번 입력할 필요가 없다. 사실 이 부분은 k8s 설정이 아니라 GCP 전체 설정.

$ gcloud config set project PROJECT
$ gcloud config set compute/zone asia-northeast3-c

조회는 $ gcloud config list

GKE

인증

인증(생성을 gcloud로 할 경우 자동으로 인증되므로 생략 가능)

$ gcloud container clusters get-credentials polls-cluster

킅러스터 생성은 콘솔에서 하는게 편하다. Autopilot이라고 대부분 자동화한 클러스터도 지원한다.

Deploy

  • kubectl외에도 Kuberbernetes Engine > Workloads에서 DEPLOY 제공.

  • Deployment details에서 ACTIONS > Expose에서는 서비스 노출(Load Balancer 타입이면 외부 접속 가능)도 가능하다.

  • GKE에서 사용하는 pod은 K8s가 기본으로 사용하는 pod과 함께 kube-system namespace에 배포된다. GKE에서는 fluentbit, gke-metrics-agent, stackdriver 등이 있다. Istio는 istio-system에 배포된다. 그런데 Kiali 같은건 직접 istio-system에 배포한 건지, 자동으로 거기로 설치된건지 확인이 필요하다.

  • Cloud Run에서 사용하던 이미지를 배포하면 PORT 환경 변수 오류가 발생한다. 다음과 같이 YAML 수정이 필요하다.

    spec:
      containers:
      - env:
        - name: PORT
          value: "8080"
    
  • cluster에 적용은,

    $ kubectl apply -f redis-leader-deployment.yaml
    $ kubectl apply -f redis-leader-service.yaml
    

    이렇게 kubectl로 Console(터미널이 아니라 GKE 콘솔) 사용하지 않고 yaml 적용으로 바로 pod/service 적용 가능하다. 예전 DKOS v3도 이런식으로 yaml 적용으로 했던 기억. 물론 yaml은 하나의 파일로 합칠 수도 있다.

    기본 VM 3대에 pod가 골고루 배치. 이 부분도 DKOS 동일. $ kubectl scale deployment frontend --replicas=5 하면 pod가 늘어난다. 물론 node를 함께 늘려줘야 의미가 있다. VM 증설은 Cluster에서 ADD NODE POOL로 가능. 해보니까 원래 디폴트는 n1-standard-1 새롭게 추가한건 e2-medium이다. 기존 노드를 EDIT 하면 동일 구성으로 늘릴 수 있다. VM 하나를 다 차지하면서도 CPU requested 661 mCPU, Memory 346.03 MB 라고만 표시된다. 나머지 리소스는 언제 쓴다는 것인지 궁금.

    기본 quotas가 8로 잡혀 있다. GPU로 마찬가지로 요청해서 늘리는 구조인듯.

    $ kubectl get no
    

    노드 삭제는 kubectl에서 하거나 콘솔에서 terminate 하면 깔끔하게 정리된다. pod 전체를 삭제하는건 $ kubectl delete -f polls.yaml 이렇게 yaml로 하거나 $ kubectl delete deployment polls 이렇게 깔끔하게 deployment 단위로 정리 가능.

Services & Ingress

ClusterIP (default)로 expose하면 당연히 외부에서는 접근할 수 없다. 같은 네트워크 대역에서도 접속이 안된다. cluster 내에서만 접속 가능한 Internal 용도다. Ingress 설정을 하려면 NodePort, 바로 외부 오픈은 LoadBalancer로 설정.

ClusterIP는 pod 내에서 다음과 같이 조회를 시도할 수 있다.

$ kubectl get pods
$ kubectl exec -it [POD-NAME] -- sh
$ apk add --no-cache curl
$ curl "http://[CLUSTER-IP]:80"

LoadBalancer는 각 클라우드의 기능을 이용한다. 원래 K8s 자체는 <pending>으로 진행되지 않음.

LoadBalancer로 설정시 방화벽 0.0.0.0에 80포트 등을 오픈하는 정책이 자동으로 추가된다고 함. 확인이 필요하다.

Ingress는 Services 상위 개념. 트래픽을 Ingress의 도메인이 받아서 TLS 지원 하고, path based routing으로 각 Service에 연결한다. Ingress는 헬스 체크도 진행하는데, 로그인 처리로 루트를 302로 처리했더니 헬스 체크에서 실패한다. 임의로 헬스 체크를 다른 경로로 지정 후에야 unhealthy 상태가 사라지고 정상적으로 연결 가능. Ingress만 문제가 생기는 것으로 봐서 LoadBalancer는 HTTP Status 헬스 체크는 없는 것으로 보인다.

기타 명령

$ kubectl api-resources

조회 가능한 resources 목록. shortnames도 확인할 수 있다. 다음과 같이 조회를 shortnames로 가능.

$ kubectl get no
$ kubectl get svc
$ kubectl get po
$ kubectl get deploy

상태 변경 조회

$ kubectl get pod --watch
# kubectl get pod -l app=wordpress --watch

--watch 옵션을 부여하면 상태가 변경될때 다시 출력된다. 특정 앱만 지정하려면 -l 옵션으로 부여. $ watch -n 1 [CMD]보다 매 번 껌뻑임 없이 변경될때만 출력해주어 편리하다.

Tutorial

GKE Tutorial 과정 유익하다.

  • Deploying a containerized web application
    Go로 multi-stage builds 결과물을 kubectl, console 모든 방식으로 보여준다. console 만으로도 충분히 배포 가능. 새 버전 배포는 rolling update로 하는 방식을 보여준다.
  • Create a Guestbook with Redis and PHP
    redis-leader / redis-follower 구조로 read가 많을때 효율적. PHP에서 get은 redis-follower에 요청을, set은 redis-leader로 요청을 하는 댓글창을 만든다. 내부 시스템은 ClusterIP 설정 만으로. 내부적으로 kube-dns가 동작한다.
  • Deploying WordPress on GKE with Persistent Disks and Cloud SQL
    코드 전혀 없이 공식 이미지로 설치 배포 과정을 보여줌. Cloud SQL MySQL 생성. PV 사용을 보여준다. 그런데 사이트 접속이 상당히 늦다. static file 조차도 느린걸 보면 네트워크 문제로 보이는데, 원인 파악은 하지 못함. 위에 redis/php 예제는 엄청 빠른데 왜 느린지 의문.
  • Deploying Memcached on Google Kubernetes Engine
    이건 helm 사용하는 부분에서 명령이 동작하지 않아서 시도하다가 중간에 그만둠. 가이드에서 helm 버전이 2.x으로 옛날 버전이다. helm을 사용하면 복잡한 yaml에서 해방될 수 있다고 하나 아직 익숙하지 않다.
  • Running Django on Google Kubernetes Engine
    Cloud SQL에서 PostgreSQL를 사용하고, Cloud SQL Proxy를 이용해 로컬에서도 테스트가 가능하도록 한다. 최종 서비스는 Django로 구성해 gunicorn으로 서비스 하고 static 파일은 별도로 GCS에 public으로 서비스하도록 구성한다. ADD NODE POOL도 함께 실험해봤는데, 문제 없이 잘 된다. 그런데 kubectl apply -f polls.yamlDoes not have minimum availability 오류 발생. CloudSQL 인증을 해야 실행된다. 오류가 마치 리소스 부족인것 처럼 명확하지 않아 원인을 찾는데 시간을 많이 소모함.
    $ kubectl create secret generic cloudsql \
    --from-literal=username=poll-user \
    --from-literal=password=poll-user
    

    삭제할때는,

    $ kubectl delete secret cloudsql
    

Istio on GKE

A service mesh, like the open source project Istio, is a way to control how different parts of an application share data with one another.

Tutorial 참고1 여타 설정 제외하고 가능한 default로 시도해봄.

$ gcloud beta container clusters create demo-cluster \
    --addons=Istio --istio-config=auth=MTLS_PERMISSIVE \
    --num-nodes=4

설치 여부 조회

$ kubectl get svc -n istio-system
$ kubectl get po -n istio-system

Last Modified: 2021/09/24 02:41:30

is a collection of Papers I have written.
© 2000 - Sang-Kil Park Except where otherwise noted, content on this site is licensed under a CC BY 4.0.
This site design was brought from Distill.