[클라우드/K8S 기본(1) - POD(GKE 이용)]

SooYeon Yeon·2022년 9월 13일
0

클라우드 K8S

목록 보기
3/18

GKE 이용한 Kubernetes 실습

클러스터 명령줄 엑세스 복사하여 shell에 붙여넣기

dustndus8@cloudshell:~ (rapa-0901-ysy)$ gcloud container clusters get-credentials mytestcluster --zone asia-northeast2-b --project rapa-0901-ysy
Fetching cluster endpoint and auth data.
kubeconfig entry generated for mytestcluster.
  • 클러스터에 연결 중인 노드 정보 확인
dustndus8@cloudshell:~ (rapa-0901-ysy)$ kubectl get node
NAME                                           STATUS   ROLES    AGE   VERSION
gke-mytestcluster-default-pool-b3369d01-gtnl   Ready    <none>   44m   v1.22.11-gke.400
gke-mytestcluster-default-pool-b3369d01-n9rz   Ready    <none>   44m   v1.22.11-gke.400
gke-mytestcluster-default-pool-b3369d01-qkz5   Ready    <none>   44m   v1.22.11-gke.400
  • 노드 상세 정보 확인 (공인 IP, OS, 커널 버전 등 확인 가능)
dustndus8@cloudshell:~ (rapa-0901-ysy)$ kubectl get node -o wide
NAME                                           STATUS   ROLES    AGE   VERSION            INTERNAL-IP   EXTERNAL-IP    OS-IMAGE             KERNEL-VERSION   CONTAINER-RUNTIME
gke-mytestcluster-default-pool-b3369d01-gtnl   Ready    <none>   44m   v1.22.11-gke.400   10.174.0.4    34.97.47.61    Ubuntu 20.04.4 LTS   5.4.0-1076-gke   docker://19.3.8
gke-mytestcluster-default-pool-b3369d01-n9rz   Ready    <none>   44m   v1.22.11-gke.400   10.174.0.2    34.97.1.232    Ubuntu 20.04.4 LTS   5.4.0-1076-gke   docker://19.3.8
gke-mytestcluster-default-pool-b3369d01-qkz5   Ready    <none>   44m   v1.22.11-gke.400   10.174.0.3    34.97.92.199   Ubuntu 20.04.4 LTS   5.4.0-1076-gke   docker://19.3.8

컨테이너 런타임은 docker로 되어있음

dustndus8@cloudshell:~ (rapa-0901-ysy)$ ls
btstore  README-cloudshell.txt
dustndus8@cloudshell:~ (rapa-0901-ysy)$ mkdir 0901 ; cd 0901
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ touch nginx-pod.yaml

연결이 끊어졌다면 gcloud init으로 설정하고 아까 그 복사붙여넣기 해서 다시 연결

  • pod 생성
kubectl run nginx-pod --image=nginx

nginx-pod는 이름, 이미지는 nginx

외부에서 해당 애플리케이션을 즉시 노출시킬 수 없다. 이를 위해서는 별도의 service object를 이용해야 하며 service의 type으로는 cluster-ip, nodePort, LB(LoadBalancer, 일반적으로 퍼블릭 클라우드에서 활용할 수 있음. on-premise 에서는 metallb를 이용하여 환경구성 가능)

첫번째 포드 만들기

포드를 만들기 위해서는 k8s에서 제공하는 다양한 오브젝트 중 pod를 호출해야한다.

이를 api를 통해 연결하여 생성할 수 있다.

  • 리소스 정보 확인
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl api-resources
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
bindings                                       v1                                     true         Binding
componentstatuses                 cs           v1                                     false        ComponentStatus
configmaps                        cm           v1                                     true         ConfigMap
...
persistentvolumeclaims            pvc          v1                                     true         PersistentVolumeClaim
persistentvolumes                 pv           v1                                     false        PersistentVolume

각 오브젝트에 대한 정보 확인 가능

NAME(오브젝트이름)

SHORTNAMES(줄여 부를 수 있는 이름)

APIVERSION : yaml파일에 API 버전 쓸 때 v1이라고 하면 됨, KIND를 통해 누구의 APIVERSION인 지 확인 가능

NAMESPACED : namespace에 속하는 지

K8S는 namespace에 속하는 오브젝트와 공유되는 오브젝트가 있다.

예를 들어 persistentvolumeclaims는 각자 작성 해야 하는 것이므로 namespace가 필요, 스토리지관리자는 persistentvolumes(영구 볼륨)으로 여러 사람들과 연결해야 하므로 namespace를 false로 해 공유할 수 있도록 함

  • pod에 관한 API 정보 확인
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl api-resources | grep Pod
pods                              po           v1                                     true         Pod
podtemplates                                   v1                                     true         PodTemplate
horizontalpodautoscalers          hpa          autoscaling/v1                         true         HorizontalPodAutoscaler
pods                                           metrics.k8s.io/v1beta1                 true         PodMetrics
poddisruptionbudgets              pdb          policy/v1                              true         PodDisruptionBudget
podsecuritypolicies               psp          policy/v1beta1                         false        PodSecurityPolicy
  • 클러스터에 연결된 node 확인
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get node
NAME                                           STATUS   ROLES    AGE    VERSION
gke-mytestcluster-default-pool-b3369d01-gtnl   Ready    <none>   144m   v1.22.11-gke.400
gke-mytestcluster-default-pool-b3369d01-n9rz   Ready    <none>   144m   v1.22.11-gke.400
gke-mytestcluster-default-pool-b3369d01-qkz5   Ready    <none>   144m   v1.22.11-gke.400
  • namespace 확인
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get ns
NAME              STATUS   AGE
default           Active   147m
kube-node-lease   Active   147m
kube-public       Active   147m
kube-system       Active   147m

해당 4개는 절대 지우지 않아야함

별도로 namespace를 지정하지 않으면 default로 들어가게 됨

kube-system이라는 네임스페이스에 속한 pod가 있는 지 확인

ustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get pod
No resources found in default namespace.
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get pod -n kube-system
NAME                                                      READY   STATUS    RESTARTS   AGE
event-exporter-gke-5479fd58c8-54gr5                       2/2     Running   0          147m
fluentbit-gke-2dhqp                                       2/2     Running   0          146m
fluentbit-gke-dx88g                                       2/2     Running   0          146m
fluentbit-gke-g8d5h                                       2/2     Running   0          146m
gke-metrics-agent-c79pq                                   1/1     Running   0          146m
gke-metrics-agent-l5bmh                                   1/1     Running   0          146m
gke-metrics-agent-tk599                                   1/1     Running   0          146m
konnectivity-agent-64bd666f76-8wwv8                       1/1     Running   0          145m
konnectivity-agent-64bd666f76-dslvz                       1/1     Running   0          145m
konnectivity-agent-64bd666f76-wnwcp                       1/1     Running   0          146m
konnectivity-agent-autoscaler-555f599d94-8nk86            1/1     Running   0          146m
kube-dns-85df8994db-kvvr5                                 4/4     Running   0          145m
kube-dns-85df8994db-qnq7m                                 4/4     Running   0          147m
kube-dns-autoscaler-f4d55555-sddrm                        1/1     Running   0          147m
kube-proxy-gke-mytestcluster-default-pool-b3369d01-gtnl   1/1     Running   0          145m
kube-proxy-gke-mytestcluster-default-pool-b3369d01-n9rz   1/1     Running   0          145m
kube-proxy-gke-mytestcluster-default-pool-b3369d01-qkz5   1/1     Running   0          145m
l7-default-backend-69fb9fd9f9-mggjg                       1/1     Running   0          146m
metrics-server-v0.4.5-fb4c49dd6-q6fdx                     2/2     Running   0          143m
pdcsi-node-2fq6p                                          2/2     Running   0          146m
pdcsi-node-6pkk6                                          2/2     Running   0          146m
pdcsi-node-vvt5x                                          2/2     Running   0          146m

-n : namespace

kube-proxy : worker가 외부연결을 위해 필요한 것

metrics : master가 사용

kube-dns : worker가 사용

노드 당 한개

pod yaml파일 작성

형식

apiVersion: v1 (API 버전)
kind: Pod (포드를 연결하기 위한 것이라는 뜻)
metadata: (간판 데이터)
   name: my-nginx-pod (이름 지정, kubectl run 다음에 쓴 name과 같은 것)
spec: (상세정보)
  containers:
  - name: my-nginx-ctn
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP
  • nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod
spec:
  containers:
  - name: my-nginx-ctn
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP
  • 로그인
}dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: dustndus8
Password:
WARNING! Your password will be stored unencrypted in /home/dustndus8/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ cat /home/dustndus8/.docker/config.json
{
        "auths": {
                "https://index.docker.io/v1/": {
                        "auth": " "
                }
        },
        "credHelpers": {
                "asia.gcr.io": "gcloud",
                "eu.gcr.io": "gcloud",
                "gcr.io": "gcloud",
                "marketplace.gcr.io": "gcloud",
                "staging-k8s.gcr.io": "gcloud",
                "us.gcr.io": "gcloud"
        }
  • 배포하기
kubectl apply -f nginx-pod.yaml
  • pod 정보 확인
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get pod
NAME           READY   STATUS    RESTARTS   AGE
my-nginx-pod   1/1     Running   0          6m49s

READY에 있는것 컨테이너 상태

kubectl get pod -o wide
  • 상세정보 출력
kubectl describe pod my-nginx-pod

Name:         my-nginx-pod
Namespace:    default
Priority:     0
Node:         gke-mytestcluster-default-pool-b3369d01-qkz5/10.174.0.3
Start Time:   Thu, 01 Sep 2022 05:16:00 +0000
Labels:       <none>
Annotations:  <none>
Status:       Running
IP:           10.96.1.4 (이거로 외부 통신은 불가능, 반드시 service를 만들어야 통신 가능)
...
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  7m40s  default-scheduler  Successfully assigned default/my-nginx-pod to gke-mytestcluster-default-pool-b3369d01-qkz5 (마스터에서 일어난 작업)
  Normal  Pulling    7m37s  kubelet            Pulling image "nginx:latest"
  Normal  Pulled     7m29s  kubelet            Successfully pulled image "nginx:latest" in 8.346954015s
  Normal  Created    7m27s  kubelet            Created container my-nginx-ctn (이것들을 kubelet이 한건 아님, kubelet이 전달해줘서 From이 kubelet인 것)
  Normal  Started    7m26s  kubelet            Started container my-nginx-ctn

Scheduled가 먼저 생성(kubectl을 통해 API에 명령을 전달하고 default-scheduler한테 배포하고 worker에게 전달할땐 kubelet으로 전달, worker 런타임에게 전달)

mynginx안에 루트로 접속하기

dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl exec -it my-nginx-pod -- bash
root@my-nginx-pod:/#

shell로 연결

dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl exec -it my-nginx-pod -- bash
root@my-nginx-pod:/# curl http://localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...

지금은 포드로 들어가서 80번 포트로 curl 하면 컨테이너(nginx)의 html 파일이 보이게 됨 (컨테이너의 IP가 아니라 포드의 IP가 있는 것)

컨테이너 하나 더 추가

apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod
spec:
  containers:
  - name: my-nginx-ctn
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP
  - name: my-centos-ctn
    image: centos
    command: ["tail"] # entrypoint role
    args: ["-f", "/dev/null"] #CMD role
  • 지우고 다시 생성
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl delete -f nginx-pod.yaml
pod "my-nginx-pod" deleted
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl apply -f nginx-pod.yaml
pod/my-nginx-pod created
  • 확인
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl get pod
NAME           READY   STATUS    RESTARTS   AGE
my-nginx-pod   2/2     Running   0          66s
  • pod 정보 확인 (컨테이너가 두개 만들어져 있음)
dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl describe pod my-nginx-pod
Name:         my-nginx-pod
Namespace:    default
...
IPs:
  IP:  10.96.1.5
Containers:
  my-nginx-ctn:
    Container ID:   docker://9db803c1cec1149fd820fc0565ec9cf1a9318625e2944da6a283564e44e70a9a
    Image:          nginx:latest
    Image ID:       docker-pullable://nginx@sha256:b95a99feebf7797479e0c5eb5ec0bdfa5d9f504bc94da550c2f58e839ea6914f
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Thu, 01 Sep 2022 05:57:00 +0000
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-w8gsg (ro)
  my-centos-ctn:
    Container ID:  docker://51156dada0f7d067a3b62fd2b0d86e49070df508c568e886908cd21b929d459d
    Image:         centos
    Image ID:      docker-pullable://centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
    Port:          <none>
    Host Port:     <none>
...

pod 안에 컨테이너 중 centos 컨테이너 안에 직접 들어와서 curl localhost를 한다면 ?

dustndus8@cloudshell:~/0901 (rapa-0901-ysy)$ kubectl exec -it my-nginx-pod -c my-centos-ctn -- bash
[root@my-nginx-pod /]# curl http://localhost
<!DOCTYPE html>
<html>
<head>

안에 들어와도 명령어를 진행하더라도 결국 80번 포트로 가기 때문에 nginx 페이지가 뜨게 된다.

pod 안에 있는 자원은 공유되기 때문 localhost는 pod의 IP로 갔다가 80번포트 nginx컨테이너로 접속된다.

0개의 댓글