클러스터 명령줄 엑세스 복사하여 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
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으로 설정하고 아까 그 복사붙여넣기 해서 다시 연결
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로 해 공유할 수 있도록 함
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
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
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가 사용
노드 당 한개
형식
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
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
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
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컨테이너로 접속된다.