Kubernetes 기본 사용
in blog on Kubernetes, K8s
참고사이트: https://brunch.co.kr/@sokoban/81
Kubernetes Object
- Namespace: 하나의 물리 클러스터 안에서 여러개의 가상 클러스터를 사용할 수 있으며, 이러한 가상 클러스터는 Namespace 기반으로 나누어 사용 가능함.
- 즉, 클러스터에서 여러개의 앱을 사용하거나 여라명의 사용자가 사용해야 할 때 유용하게 사용 가능함.
kubectl get namespace
NAME STATUS AGE
default Active 12d
kube-node-lease Active 12d
kube-public Active 12d
kube-system Active 12d
kubernetes-dashboard Active 12d
kubectl config current-context
docker-desktop
kubectl config set-context docker-desktop --namespace=kube-system
Context "docker-desktop" modified.
Kubernetes 용어 정리
용어 | 설명 |
---|---|
Deployment | Pod의 설치관리하는 기본요소로서, 실행시의 기본 컨트롤러, Deployment 삭제 시 하부의 Pod도 모두 삭제됨. |
Service | Pod에서 실행 중인 프로세스를 위한 신원(Identity)을 제공하여 서비스 찾기를 통해서 Pod에 고유한 IP주소와 Pod 집합에 대한 단일 DNS명을 부여하여 외부에서 접근할 수 있도록 함. Type = {ClusterIP, NodePort, LoadBalancer, ExternalName} |
Pod | 실제 도커 인스턴스가 떠 있는 단위를 Pod로 지칭 |
Kubernetes 노드 구성
노드 | 설명 |
---|---|
Master | 노드들의 상태를 관리하고 제어, 1대만 구성할 수 있으나 고가용성 서비스라면 3대 이상으로 구성. 장애가 발생하면, 남은 서버 중 한대가 마스터 역할을 함. |
Node (Worker) | Kubelet, kube-proxy, docker 등의 프로세스가 동작하며 마스터노드의 명령을 받아 사용자가 선언한 Pod나 Job을 실행함. 실제 docker 컨테이너가 동작하는 것은 노드에서 동작함. |
Kubernetes 구성 요소
Master Node 구성요소
구성요소 | 설명 |
---|---|
kube-scheduler | 클러스토 내에서 발생하는 파드의 생성에 대한 노드의 자원할당을 선택하는 컴포넌트, 정해놓은 조건에 맞게 빈 노드에 파드를 할당. 할당은 {affinity, anti-affinity, 데이터지역성 등} 다양한 요소를 고려함 |
kube-contoller-manager | 토드 컨트롤러 외에 아래의 다수 컨트롤러를 복잡성을 줄이기 위해서 하나로 구성한 컴포넌트로서 각 컨트롤러는 다음과 같음. </br></br><table><tr><th>종류</th><th>설명</th></tr><tr><td>노드컨트롤러</td><td>노드의 중지에 대한 대응</td></tr><tr><td>래플리켕리션컨트롤러</td><td>전체 레플리케이션 컨트롤러 객체에 대한 파드 숫자 유지</td></tr><tr><td>엔드포인트컨트롤러</td><td>서비스와 파드의 연결</td></tr><tr><td>서비스어카운트 & 토큰컨트롤러</td><td>신규 Namespace에 대한 기본적인 관리</td></tr></table> |
cloud-controller-manager | 클라우드 사업자와 컨트롤러 들을 연결하여 관리하는 역할을 수행</br></br><table><tr><th>종류</th><th>설명</th></tr><tr><td>노드컨트롤러</td><td>노드의 중지 이후 클라우드 상에서 삭제되었는지 판별</td></tr><tr><td>라우트컨트롤러</td><td>클라우드 서비스 상의 네트워크 라우팅 관리</td></tr><tr><td>서비스컨트롤러</td><td>클라우드 제공사업자 서비스의 로드밸런서를 생성, 업데이트 삭재</td></tr><tr><td>볼륨컨트롤러</td><td>클라우드 서비스상의 볼륨을 노드와 연결하거나 마운트</td></tr></table> |
kube-apiserver | 쿠버네티스상에서 이뤄지는 모든 요청은 이를 통해서 각 컴포넌트에 전달되고 실행됨. 외부에서 클라우드를 관리할 수 있는 핵심 API, 수평확장이 가능하므로 요청이 많은 경우 확장할 수 있음. |
etcd | key-value 저장소로서 모든 클러스터의 데이터를 저장하는 저장소 (https://etcd.io) |
Worker Node 구성요소
구성요소 | 설명 |
---|---|
kubelet | 프로세스트로서 실행가능하며 도커를 관리. kube-apiserver와 통신하면서 파드의 생성, 관리, 삭제를 담당함 |
kube-proxy | 개별 노드에서 실행되는 네트워크 프록시로서 파드가 외부와 통신할 수 있게 해주는 등 네트워크 규칙을 관리 |
컨테이너런타임 | 클러스터로서 컨테이너의 실행을 담당하는 것으로서 대표적으로는 Docker가 있으며, containerd와 같은 다른 런타임도 지원. CRI(Container Runtime Interface)을 만족하는 모든 소프트웨어를 지원 함 |
Kubernetes 대시보드 실행
on PowerShell
kubectl
Starting to serve on 127.0.0.1:8001
on Brolwser
http://127.0.0.1:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login
다음과 같은 인증화면이 나옴
토큰값 구하기
kubectl get serviceaccount
NAME SECRETS AGE
attachdetach-controller 0 12d
bootstrap-signer 0 12d
certificate-controller 0 12d
clusterrole-aggregation-controller 0 12d
coredns 0 12d
cronjob-controller 0 12d
daemon-set-controller 0 12d
default 0 12d
deployment-controller 0 12d
disruption-controller 0 12d
endpoint-controller 0 12d
endpointslice-controller 0 12d
endpointslicemirroring-controller 0 12d
ephemeral-volume-controller 0 12d
expand-controller 0 12d
generic-garbage-collector 0 12d
horizontal-pod-autoscaler 0 12d
job-controller 0 12d
kube-proxy 0 12d
legacy-service-account-token-cleaner 0 12d
namespace-controller 0 12d
node-controller 0 12d
persistent-volume-binder 0 12d
pod-garbage-collector 0 12d
pv-protection-controller 0 12d
pvc-protection-controller 0 12d
replicaset-controller 0 12d
replication-controller 0 12d
resourcequota-controller 0 12d
root-ca-cert-publisher 0 12d
service-account-controller 0 12d
service-controller 0 12d
statefulset-controller 0 12d
storage-provisioner 0 12d
token-cleaner 0 12d
ttl-after-finished-controller 0 12d
ttl-controller 0 12d
validatingadmissionpolicy-status-controller 0 12d
vpnkit-controller 0 12d
kubectl get serviceaccount default -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: "2024-11-12T04:24:43Z"
name: default
namespace: kube-system
resourceVersion: "281"
uid: 28bb9d1f-36ab-43f7-a808-e66a15b70f5d
or (< Kubernetes 1.24)
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: "2024-11-12T04:24:43Z"
name: default
namespace: kube-system
resourceVersion: "281"
uid: 28bb9d1f-36ab-43f7-a808-e66a15b70f5d
secrets:
- name: ********
Kubernetes 1.24 하위 버전의 경우, 수신된 secret을 가지고 토큰을 구하면 됨.
kubectl describe secret ********
Kubernetes 1.24 >= 버전의 경우, 직접 토큰을 생성함.
kubectl create token default
eyJhbGciOiJSUzI1NiIsImtpZCI6IjZKc1lXemM1ZDM0UnZwYmZsLWt0bUt2ck5XeFFHUHJqbEhOYVdOdXRKNGsifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzMyNTA2Nzk3LCJpYXQiOjE3MzI1MDMxOTcsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwianRpIjoiMjg2MjNlMWYtZTY0Yy00ZjEyLWE4ODEtNjY0MTAwZWU0NWIyIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJkZWZhdWx0IiwidWlkIjoiMjhiYjlkMWYtMzZhYi00M2Y3LWE4MDgtZTY2YTE1YjcwZjVkIn19LCJuYmYiOjE3MzI1MDMxOTcsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTpkZWZhdWx0In0.bGbAbkgO3fag_GP5F43mPgYrh6D-LlFDSwHCx_vcPshusRfprRpzmMZdsnQtM8coiRDXFFZp22FLxObVUl0sBgtEstGskIatnambntGKt4k8ge34r6OlPr6FjQxWWOjlHxXn-dvewOvQ2Ne3iP_RWJsIhWwV6fjWf6O-vZMH1YosQQ99c-bnIeg4cx3CLGAin1gtmNFzhzvWOgw-IdAdbfbNxuFta81z6HNsgO8lPxom7eygh6a4EgbTKXCtGBw4fZoRqiK6dJKE9GT-59xEpMogu4aUFDeIDwX40VbwDTcQG73e_3dvzZKdF9SYZ09prYu5Y_uN8Y3NEp5t_jQMwg
생성된 토큰을 이용한 접속
kubectl get services --v=7
I1125 11:57:17.822098 27680 loader.go:395] Config loaded from file: C:\Users\황해연\.kube\config
I1125 11:57:17.841223 27680 round_trippers.go:463] GET https://kubernetes.docker.internal:6443/api/v1/namespaces/kube-system/services?limit=500
I1125 11:57:17.841223 27680 round_trippers.go:469] Request Headers:
I1125 11:57:17.841739 27680 round_trippers.go:473] Accept: application/json;as=Table;v=v1;g=meta.k8s.io,application/json;as=Table;v=v1beta1;g=meta.k8s.io,application/json
I1125 11:57:17.841739 27680 round_trippers.go:473] User-Agent: kubectl.exe/v1.31.2 (windows/amd64) kubernetes/5864a46
I1125 11:57:17.863147 27680 round_trippers.go:574] Response Status: 200 OK in 20 milliseconds
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 12d
kubectl api-versions
admissionregistration.k8s.io/v1
apiextensions.k8s.io/v1
apiregistration.k8s.io/v1
apps/v1
authentication.k8s.io/v1
authorization.k8s.io/v1
autoscaling/v1
autoscaling/v2
batch/v1
certificates.k8s.io/v1
coordination.k8s.io/v1
discovery.k8s.io/v1
events.k8s.io/v1
flowcontrol.apiserver.k8s.io/v1
flowcontrol.apiserver.k8s.io/v1beta3
networking.k8s.io/v1
node.k8s.io/v1
policy/v1
rbac.authorization.k8s.io/v1
scheduling.k8s.io/v1
storage.k8s.io/v1
v1
Kubernetes 접근설정 변경
Kubernetes Context 변경
kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://kubernetes.docker.internal:6443
name: docker-desktop
contexts:
- context:
cluster: docker-desktop
namespace: kube-system
user: docker-desktop
name: docker-desktop
current-context: docker-desktop
kind: Config
preferences: {}
users:
- name: docker-desktop
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED
별도, minikube 설치 minikube
minikube start
😄 minikube v1.34.0 on Microsoft Windows 11 Pro 10.0.22631.4460 Build 22631.4460
✨ Automatically selected the docker driver. Other choices: virtualbox, ssh
📌 Using Docker Desktop driver with root privileges
👍 Starting "minikube" primary control-plane node in "minikube" cluster
🚜 Pulling base image v0.0.45 ...
💾 Downloading Kubernetes v1.31.0 preload ...
> preloaded-images-k8s-v18-v1...: 326.69 MiB / 326.69 MiB 100.00% 30.62 M
> gcr.io/k8s-minikube/kicbase...: 487.90 MiB / 487.90 MiB 100.00% 29.64 M
🔥 Creating docker container (CPUs=2, Memory=1963MB) ...
❗ Failing to connect to https://registry.k8s.io/ from inside the minikube container
💡 To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/
🐳 Preparing Kubernetes v1.31.0 on Docker 27.2.0 ...
▪ Generating certificates and keys ...
▪ Booting up control plane ...
▪ Configuring RBAC rules ...
🔗 Configuring bridge CNI (Container Networking Interface) ...
🔎 Verifying Kubernetes components...
▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟 Enabled addons: storage-provisioner, default-storageclass
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://kubernetes.docker.internal:6443
name: docker-desktop
- cluster:
certificate-authority: C:\Users\황해연\.minikube\ca.crt
extensions:
- extension:
last-update: Mon, 25 Nov 2024 12:14:39 KST
provider: minikube.sigs.k8s.io
version: v1.34.0
name: cluster_info
server: https://127.0.0.1:59141
name: minikube
contexts:
- context:
cluster: docker-desktop
namespace: kube-system
user: docker-desktop
name: docker-desktop
- context:
cluster: minikube
extensions:
- extension:
last-update: Mon, 25 Nov 2024 12:14:39 KST
provider: minikube.sigs.k8s.io
version: v1.34.0
name: context_info
namespace: default
user: minikube
name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: docker-desktop
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED
- name: minikube
user:
client-certificate: C:\Users\황해연\.minikube\profiles\minikube\client.crt
client-key: C:\Users\황해연\.minikube\profiles\minikube\client.key
kubectl config use-context minikube
Switched to context "minikube"