Kubernetes 기본 사용

쿠버네티스 기본 내용

참고사이트: https://brunch.co.kr/@sokoban/81

app_deployment

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 용어 정리

용어설명
DeploymentPod의 설치관리하는 기본요소로서, 실행시의 기본 컨트롤러, Deployment 삭제 시 하부의 Pod도 모두 삭제됨.
ServicePod에서 실행 중인 프로세스를 위한 신원(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, 수평확장이 가능하므로 요청이 많은 경우 확장할 수 있음.
etcdkey-value 저장소로서 모든 클러스터의 데이터를 저장하는 저장소 (https://etcd.io)

Worker Node 구성요소

구성요소설명
kubelet프로세스트로서 실행가능하며 도커를 관리. kube-apiserver와 통신하면서 파드의 생성, 관리, 삭제를 담당함
kube-proxy개별 노드에서 실행되는 네트워크 프록시로서 파드가 외부와 통신할 수 있게 해주는 등 네트워크 규칙을 관리
컨테이너런타임클러스터로서 컨테이너의 실행을 담당하는 것으로서 대표적으로는 Docker가 있으며, containerd와 같은 다른 런타임도 지원. CRI(Container Runtime Interface)을 만족하는 모든 소프트웨어를 지원 함

k8s_components

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

다음과 같은 인증화면이 나옴

k8s_dashboard_auth

토큰값 구하기

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

생성된 토큰을 이용한 접속

k8s_dashboard_login

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 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"

© 2018. All rights reserved.

Powered by Hydejack v8.4.0