728x90
쿠버네티스 입문을 요약한 내용입니다.
3.1 Kubectl
3.1.1 설치
3.1.2 기본 사용법
kubectl [command] [type] [name] [flags]
- command: 자원에 실행하려는 동작, create, get, delete 등을 사용할 수 있습니다.
- type: 자원 타입, pod, service, ingress 등을 사용할 수 있습니다.
- name: 자원 이름
- flag: 부가적으로 설정할 옵션을 입력
간단한 에코 서버를 동작시키는 예제 실습
- echoserver 라는 이름의 파드를 하나 생성
- $ kubectl run echoserver --generator=run-pod/v1 --image="k8s.gcr.id/echoserver:1.10" --port=8080 ## k8s v1.18 이후에서 생성하기 $ kubectl run echoserver --image="k8s.gcr.io/echoserver:1.10" --port=8080
- 파드에 접근할 때 필요한 echoserver라는 이름의 서비스 생성
- $ kubectl expose po echoserver --type=NodePort
- echoserver 상태를 확인하기
- NAME: 파드의 이름을 표시
- READY: 파드의 준비 상태를 표시1/1이면 파드가 생성되었고 사용할 준비가 끝났다는 뜻
- 0/1 이면 현재 파드는 생성되었으나 사용할 준비가 되지 않았다는 뜻
- STATUS: 파드의 현재 상태를 표시Terminating: 컨테이너 접속 중
- ContainerCreating: 컨테이너 생성 중
- Running: 파드가 실행 중
- RESTARTS: 해당 파드가 몇 번 재시작했는지를 표시
- AGE: 파드를 생성한 후 얼마나 시간이 지났는지 표시
- $ kubectl get pods NAME READY STATUS RESTARTS AGE echoserver 1/1 Running 0 7m40s my-nginx-pod 1/1 Running 2 3d20h
- 서비스 실행 상태 확인
- NAME: 서비스의 이름 표시
- TYPE: 서비스 타입
- CLUSTER-IP: 현재 클러스터 안에서 사용된는 IP
- EXTERNAL-IP: 클러스터 외부에서 접속할 때 사용하는 IP로 현재는 별도로 생성하지 않았으므로 <none>
- PORT(S): 해당 서비스에 접속하는 포트 표시
- AGE: 자원을 생성한 후 얼마나 시간이 지났는지 표시
- </aside>
- $ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE echoserver NodePort 10.105.134.81 <none> 8080:30183/TCP 5m42s kubernetes ClusterIP 10.96.0.1 <none>
- echoserver에 접근할 수 있도록 로컬 컴퓨터로 포트포워딩
- $ kubectl port-forward svc/echoserver 8080:8080 Forwarding from 127.0.0.1:8080 -> 8080 Forwarding from [::1]:8080 -> 8080 Handling connection for 8080 Handling connection for 8080
- http://localhost:8080/ 접속
- !https://s3-us-west-2.amazonaws.com/secure.notion-static.com/bd041e5f-e043-49e4-9b19-3d6da4333694/_2021-06-18__2.58.59.png
- 다른 셸을 추가하여 curl http://localhost:8080 명령 실행
- $ curl <http://localhost:8080> Hostname: echoserver Pod Information: -no pod information available- Server values: server_version=nginx: 1.13.3 - lua: 10008 Request Information: client_address=127.0.0.1 method=GET real path=/ query= request_version=1.1 request_scheme=http request_uri=http://localhost:8080/ Request Headers: accept=*/* host=localhost:8080 user-agent=curl/7.64.1 Request Body: -no body in request-
- echoserver의 실행 중 로그를 수집할 때는 kubectl logs -f 파드 이름 명령 실행
- 시간, HTTP 버전, 웹 브라우져와 운영체제 버전 등의 정보를 알 수 있음
$ kubectl logs -f echoserver Generating self-signed cert Generating a 2048 bit RSA private key .................................................................................................................................+++ ....................................................................................................................................+++ writing new private key to '/certs/privateKey.key' ----- Starting nginx 127.0.0.1 - - [18/Jun/2021:05:54:27 +0000] "GET / HTTP/1.1" 200 1129 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36" 127.0.0.1 - - [18/Jun/2021:05:54:27 +0000] "GET /favicon.ico HTTP/1.1" 200 1083 "<http://localhost:8080/>" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36" 127.0.0.1 - - [18/Jun/2021:06:01:39 +0000] "GET / HTTP/1.1" 200 416 "-" "curl/7.64.1"
- 실습했던 파드 삭제 kubectl delete pod 파드 이름
- $ kubectl delete pod echoserver pod "echoserver" deleted
- 실습했던 서비스 삭제 kubectl delete service 서비스 이름
- $ kubectl delete service echoserver service "echoserver" deleted
3.1.3 POSIX/GUN 스타일의 명령 작성 규칙
- kubectl은 기본적으로 POSIX/GNU 스타일의 명령 작성 규칙을 따름
- -과 함께 사용하는 옵션은 다일 알파벳/숫자 문자 인자는 짧은 옵션
- 일부 옵션은 이자를 필요로 함
- —과 함께 사용하는 옵션은 알파벳 두 글자 이상으로 구성한 긴 옵션
- — 이후에 작성하는 인자가 있다면 쿠버네티스 관련 옵션들을 모두 옵션을 종료???
$ kubectl -n default exec my-pod -c my-container -- ls /
- -n default: -n 네임스페이스를 지정하는 옵션
- 짧은 옵션은 -n, 긴 옵션은 —namespace
- default는 default 네임스페이스를 뜻함
- exec my-pod: my-pod라는 이름의 파드에 해당 명력을 실행(필수 인자)
- -c my-container: 컨테이너를 지정하는 옵션
- 짧은 옵션은 -c, 긴 옵션은 —containe
- 파드 안에 여러 개 컨테이너가 실행되었을 때 특정 컨테이너를 지정
- — ls /: 쿠버네티스 관련 옵션들을 모두 종료한다는 뜻
- — 이후 컨테이너에서 실행할 명령을 설정 할 수 있음
3.1.4 플래그
- kubectl은 플래그는 모든 명령에서 사용할 수 있는 전역 플래그와 개별 명령에서만 사용할 수 있는 개별 플래그로 구분
- 전역 플래그는 kubectl options, 명령별 플래그는 명력 각각의 도움마에서 확인
- -h(—help): kubectl [command] —help 형태로 사용
- -v [log level]: 명령을 실행하는 과정의 로그를 출력하거나 로그 래벨을 설정
3.1.5 Kubeconfig 환경 변수
- kubectl은 기본적으로 $HOME/.kube/config 파일에서 클러스터, 인증, 컨텍스트 정보를 읽음
- 클러스터 구성 정보를 kubeconfig라고 칭함
- 클러스터에서 사용할 수 있는 자원들은 kubectl api-resources 명령으로 확인 가능
- SHORTNAMES: 자원의 단축 이름
- APIGROUP: 함께 노출되는 자원 집합
- NAMESPACED: 특정 네임스페이스에 속하는 지원인지
- KIND: 객체 스키마
- —kubeconfig 옵션으로 다른 설정 파일을 지정 할 수 있음
- 다중 클러스터에 다른 인증/클러스터 정보로 접근할때 사용
$ kubectl -kubeconfig-AWSconfig get pods $ kubectl -kubeconfig-GCPconfig get pods
- kubectl 은 bash, Z 셸에서의 자동 완성을 공식적으로 지원
- # bash 셸 echo `source <(kubectl completion bash)` >>~/.bashrc # Z 셸 echo `source <(kubectl compleion zsh)` >>~/.zshrc
- kubectl은 단순히 명령을 실행하는 것뿐만 아니라, 셸 스크립트의 일부분으로 사용하여 클러스터의 많은 동작을 자동화 할수 있습니다.
- 클러스터 노드들의 내부 IP 정보를 얻을 수 있다.
- $ kubectl get nodes -o wide --no-headers | awk '{print $6}' 192.168.65.4
- 명령의 출력 결과를 JSON 포멧으로 지정하고 json 파일을 다루는데 유요한 jq를 이요해서 원하는 값을 얻을 수 있다.(단, jq가 설치되어 있어야함)<aside> ❓ 잘 안됨...
- </aside>
- kubectl get nodes -o json | jq -r '.items[].status.addresses[] | select(.type=="InternalIP") | .address)'
- JSON 템플릿으로 지정하기<aside> ❓ 잘 안됨...
- </aside>
- kubectl get nodes -o jsonpath='.items[].status.addresses[] | select(.type=="InternalIP") | .address)'
$ kubectl api-resources
NAME SHORTNAMES APIVERSION NAMESPACED KIND
bindings v1 true Binding
componentstatuses cs v1 false ComponentStatus
configmaps cm v1 true ConfigMap
endpoints ep v1 true Endpoints
events ev v1 true Event
limitranges limits v1 true LimitRange
namespaces ns v1 false Namespace
nodes no v1 false Node
persistentvolumeclaims pvc v1 true PersistentVolumeClaim
persistentvolumes pv v1 false PersistentVolume
pods po v1 true Pod
podtemplates v1 true PodTemplate
replicationcontrollers rc v1 true ReplicationController
resourcequotas quota v1 true ResourceQuota
secrets v1 true Secret
serviceaccounts sa v1 true ServiceAccount
services svc v1 true Service
mutatingwebhookconfigurations admissionregistration.k8s.io/v1 false MutatingWebhookConfiguration
validatingwebhookconfigurations admissionregistration.k8s.io/v1 false ValidatingWebhookConfiguration
customresourcedefinitions crd,crds apiextensions.k8s.io/v1 false CustomResourceDefinition
apiservices apiregistration.k8s.io/v1 false APIService
controllerrevisions apps/v1 true ControllerRevision
daemonsets ds apps/v1 true DaemonSet
deployments deploy apps/v1 true Deployment
replicasets rs apps/v1 true ReplicaSet
statefulsets sts apps/v1 true StatefulSet
tokenreviews authentication.k8s.io/v1 false TokenReview
localsubjectaccessreviews authorization.k8s.io/v1 true LocalSubjectAccessReview
selfsubjectaccessreviews authorization.k8s.io/v1 false SelfSubjectAccessReview
selfsubjectrulesreviews authorization.k8s.io/v1 false SelfSubjectRulesReview
subjectaccessreviews authorization.k8s.io/v1 false SubjectAccessReview
horizontalpodautoscalers hpa autoscaling/v1 true HorizontalPodAutoscaler
cronjobs cj batch/v1 true CronJob
jobs batch/v1 true Job
certificatesigningrequests csr certificates.k8s.io/v1 false CertificateSigningRequest
leases coordination.k8s.io/v1 true Lease
endpointslices discovery.k8s.io/v1 true EndpointSlice
events ev events.k8s.io/v1 true Event
ingresses ing extensions/v1beta1 true Ingress
flowschemas flowcontrol.apiserver.k8s.io/v1beta1 false FlowSchema
prioritylevelconfigurations flowcontrol.apiserver.k8s.io/v1beta1 false PriorityLevelConfiguration
ingressclasses networking.k8s.io/v1 false IngressClass
ingresses ing networking.k8s.io/v1 true Ingress
networkpolicies netpol networking.k8s.io/v1 true NetworkPolicy
runtimeclasses node.k8s.io/v1 false RuntimeClass
poddisruptionbudgets pdb policy/v1 true PodDisruptionBudget
podsecuritypolicies psp policy/v1beta1 false PodSecurityPolicy
clusterrolebindings rbac.authorization.k8s.io/v1 false ClusterRoleBinding
clusterroles rbac.authorization.k8s.io/v1 false ClusterRole
rolebindings rbac.authorization.k8s.io/v1 true RoleBinding
roles rbac.authorization.k8s.io/v1 true Role
priorityclasses pc scheduling.k8s.io/v1 false PriorityClass
csidrivers storage.k8s.io/v1 false CSIDriver
csinodes storage.k8s.io/v1 false CSINode
csistoragecapacities storage.k8s.io/v1beta1 true CSIStorageCapacity
storageclasses sc storage.k8s.io/v1 false StorageClass
volumeattachments storage.k8s.io/v1 false VolumeAttachment
3.2 디플로이먼트를 이용해 컨테이너 실행하기
- 쿠버네티스를 이용해 컨테이너를 실행하는 방법은 크게 2가지가 있음
- kubectl run 명령으로 직접 컨테이너를 실행
- 템플릿으로 컨테이너를 실행
- YAML 형식으로 되어 있어 버전 관리가 되는 장점이 있음
3.2.1 kubectl run으로 컨테이너 실행하기
- 디플로이먼트를 사용해 nginx 컨테이너 실행
- kubectl run 명령 다음에 생성하려는 디플로이먼트 이름을 입력
- —image 옵션에 실행한 컨테이너 이미지 입력
- —port 옵션은 해당 컨테이너가 사용할 포트
- $ kubectl run nginx-app --image nginx --port=80 pod/nginx-app created # 아래 명령이 맞는거 아닌가? $ kubectl create deployment nginx-app --image=nginx
- nginx 컨테이너가 제대로 실행 됬는지 확인
- $ kubectl get pods NAME READY STATUS RESTARTS AGE my-nginx-pod 1/1 Running 82 146d nginx-app 1/1 Running 0 17m nginx-app-d6ff45774-8x4jp 1/1 Running 0 32s
- 디플로이먼트 상태를 확인
- $ kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE nginx-app 1/1 1 1 74s # 네임스페이스를 지정하지 않고 전부 보기 $ kubectl get deployments --all-namespaces NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE ingress-nginx ingress-nginx-controller 1/1 1 1 143d kube-system coredns 2/2 2 2 149d
- 디플로이먼트를 이용해 실행 중인 파드 갯수를 늘리기
- $ kubectl scale deploy nginx-app --replicas=2 deployment.apps/nginx-app scaled
- 파드 갯수 확인
- $ kubectl get pods NAME READY STATUS RESTARTS AGE my-nginx-pod 1/1 Running 82 146d nginx-app 1/1 Running 0 20m nginx-app-d6ff45774-8x4jp 1/1 Running 0 3m4s nginx-app-d6ff45774-gj5vw 1/1 Running 0 64s
- 디플로이먼트 확인
- $ kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE nginx-app 2/2 2 2 4m52s
- 디플로이먼트 삭제
- $ kubectl delete deployment nginx-app deployment.apps "nginx-app" deleted
3.2.2 템플릿으로 컨테이너 실행하기
- 디플로이먼트 설정이 담긴 템플릿(yaml 파일)로 컨테이너를 실행하는 방법
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
labels:
app: nginx-app
spec:
replicas: 1
selector:
matchLabels:
app: nginx-app
template:
metadata:
labels:
app: nginx-app
spec:
containers:
- name: nginx-app
image: nginx
ports:
- containerPort: 80
- 실행
$ kubectl apply -f nginx-app.yaml
deployment.apps/nginx-app created
- 상태 확인
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-app-6b4fc78cbf-qhtk9 1/1 Running 0 13m
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-app 1/1 1 1 13m
3.3 클러스터 외부에서 클러스터 안 앱에 접근하기
- nginx-app을 80포트로 설정하고 실행하였지만 localhost에서 접속하면 사이트에 연결할 수 없다는 메시지만 볼수 있을 뿐이다.
- 쿠버네티스 내부에서 사용하는 네트워크가 분리가 되어 있어 외부에서 접근하려고 하면 쿠버네티스의 서비스를 사용해야함
- 서비스 타입에는 ClusterIP, NodePort, LoadBalancer, ExteralName이 있음
- 서비스 하나에 모든 노드의 지정된 포트를 할당하는 NodePort를 설정
$ kubectl expose deployment nginx-app --type=NodePort
service/nginx-app exposed
- 서비스 확인
- 80:32592/TCP 쿠버네티스 내부의 80포트가 32592라는 외부 포트와 연결되어 있다는 뜻
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
echoserver NodePort 10.104.85.191 <none> 8080:31031/TCP 101m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 149d
nginx-app NodePort 10.99.85.244 <none> 80:32592/TCP 95s
- 컨테이너 명령으로 좀더 상세한 내용을 확인 할 수 있다.
$ kubectl describe service
Name: nginx-app
Namespace: default
Labels: app=nginx-app
Annotations: <none>
Selector: app=nginx-app
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.99.85.244
IPs: 10.99.85.244
LoadBalancer Ingress: localhost
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32592/TCP
Endpoints: 10.1.1.224:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
- http://localhost:32592/ 접속하면 nginx 기본 페이지로 이동
728x90
'Kubernetes > 쿠버네티스 입문' 카테고리의 다른 글
쿠버네티스 설치하기 (1) | 2023.11.21 |
---|---|
쿠버네티스 소개 (0) | 2023.11.21 |