티스토리 뷰
● containerd : runc 를 생성하고 제어
● docker engine : 도커 이미지를 관리하고 컨테이너 실행
● 쿠버네티스는 OCI 만 준수하면 다양하게 사용할 수 있다
● CRI ( container runtime interface )
# 쿠버네티스 버전이 올라가면서 docker 가 빠졌다 ( 도커가 CRI 를 준수 안됨 )
# 컨테이너d 내부에서도 버전이 바뀌면서 더 단순화 되었다
# 쿠버네티스가 1.24 에서 1.29로 올라가면서 cri-dockerd 를 개발했다 ( cri-dockerd는 CRI 준수 )
# 도커의 생태환경이 podman 보다 더 낫기 때문에 docker 를 다시 쓸 수 있게 됐다
## podman : docker 대체할 수 있고 컨테이너 실행 관리 가능
● 쿠버네티스란 리눅스 컨테이너 작업을 자동화해주는 오픈소스 플랫폼
>> 마스터 ( Master ) : 노드 제어 + 전체 클러스터 관리하는 컨트롤러 + 전체적인 제어 관리를 위한 서버
>> 파드 ( pod ) : 1개 이상의 컨테이너의 그룹 ( 컨테이너의 집합 ) + 여러 개의 컨테이너를 묶어서 파드 단위로 관리한다
>> 노드 ( nod ) : 컨테이너가 배포될 물리 서버 또는 가상머신 worker node 라고도 한다
# 쿠버네티스는 파드를 묶어서 관리한다?
# 일반적으로 Master 는 2개로 두고 리더 마스터 서버 + 후보 마스터 서버로 둔다 >> 고가용성 유지
● 파드 네트워크 대역은 10.244.0.0 ~ 10.244.255.255 사이로 설정파일이 정해졌다
[vagrant@ms ~]$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
apache 1/1 Running 0 129m 10.244.2.2 wk2.example.com <none> <none>
apache2 1/1 Running 0 128m 10.244.1.2 wk1.example.com <none> <none>
# run_in_master.sh 설정 파일에 해당 사항이 입력되었다
#! /bin/bash
# This script is only needed in master node
pod_network="10.244.0.0/16"
apiserver_network=$(hostname -i)
# configure pod network and for save token for cluster join
kubeadm init --pod-network-cidr=$pod_network --apiserver-advertise-address=$apiserver_network | tee /home/vagrant/kubeadm_init_output
grep -A 2 'kubeadm join' /home/vagrant/kubeadm_init_output > /home/vagrant/token
▷ 파드 삭제
[vagrant@ms ~]$ kubectl delete pod --all
pod "apache" deleted
pod "apache2" deleted
[vagrant@ms ~]$ kubectl get pod
poddisruptionbudgets.policy pods podtemplates
[vagrant@ms ~]$ kubectl get pods
No resources found in default namespace.
■ 파드 생성시 과정
● kubelet 은 주기적으로 apiserver 에 계속 파드 정보를 알려주고 apiserver 가 etcd 에 계속 정보를 제공하여 etcd 가 파드의 최신 상태를 기록한다
# etcd 는 일종의 데이터베이스라고 생각하자
● 파드가 생성되면 kube-scheduler 가 apiserver 에 상태를 물어보고 apiserver 가 etcd 에 물어보고 다시 apiserver 에 전달하고 apiserver 가 다시 scheduler 에 전달하여 적절하게 node 를 선택한다
▶ kube-proxy / kubelet / containerd-shim 3가지 중 한가지가 작동을 안하면,
>> kubectl get nodes >> NotReady 가 떠서 사용 불가하다
# kube-proxy 가 방화벽 기능
[vagrant@ms ~]$ pgrep -fl proxy
9412 kube-apiserver
9470 kube-controller
10288 kube-proxy
[vagrant@ms ~]$ pgrep -fl container
9246 containerd-shim
9251 containerd-shim
9292 containerd-shim
9308 containerd-shim
9554 kubelet
10201 containerd-shim
10227 containerd-shim
11035 containerd-shim
11046 containerd-shim
18599 containerd
kube-controller-manager
컨트롤러 프로세스를 실행하고 클러스터의 실제 상태를 원하는 사양으로 조정한다.
아래의 컨트롤러들을 구동하는 컴포넌트이다.
- Node Controller : 노드가 다운되었을 때 알림와 대응에 관한 역할을 한다.
- Replication Controller : 지정된 수의 파드들을 유지시켜 주는 역할을 한다.
- Endpoints Controller: 서비스와 파드를 연결시켜 엔드포인트 오브젝트를 만든다.
- Service Account & Token Controllers: 새로운 네임스페이스에 대한 기본 계정과
API 접근 토큰을 생성한다
# 객체는 사용자가 쿠버네티스에 바라는 상태
# 컨트롤러는 객체가 쓸 수 있게 하는 역할
객체는 사용자가 쿠버네티스에 바라는 상태(desired state)를 의미한다.
컨트롤러는 객체가 원래 설정된 상태를 잘 유지할수있게 관리하는 역할
객체에는 포드(pod), 서비스(service), 볼륨(volume), 네임스페이스(namespace)등이 있다
명령어
>> alias 뒤에 옵션 자동완성을 위한 명령어
>> .bashrc 에 등록
alias k='kubectl'
complete -o default -F __start_kubectl k
>> pod 출력
[vagrant@ms ~]$ kubectl get pod nginx -o wide
● Namespace
[vagrant@ms ~]$ k get namespaces
NAME STATUS AGE
default Active 3h35m
kube-flannel Active 3h35m
kube-node-lease Active 3h35m
kube-public Active 3h35m
kube-system Active 3h35m
○ ex> projcect 가 3개가 있다
project1 - 영희 철수 선희
project2 - 길동 호동 재석
project3 - .....
>>> 컨테이너를 볼 수는 있는데 다른 project 팀원은 수정 삭제 등 못한다
>>> 분류해놓을 수 있다
>>> 각각의 권한을 부여해서 사용자를 격리해준다
○ namespace 생성과 삭제
[vagrant@ms ~]$ kubectl create ns project1
namespace/project1 created
[vagrant@ms ~]$ kubectl create namespace projec2
namespace/projec2 created
[vagrant@ms ~]$ kubectl delete ns project1 projec2
namespace "project1" deleted
namespace "projec2" deleted
○ namespace 수정
[vagrant@ms ~]$ kubectl config set-context --current --namespace testns
Context "kubernetes-admin@kubernetes" modified.
>> namespace: testns 로 변경되었다
[vagrant@ms ~]$ kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://192.168.98.10:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
namespace: testns
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED
○ 서비스 계정 생성
[vagrant@ms ~]$ kubectl create serviceaccount younghee
serviceaccount/younghee created
[vagrant@ms ~]$ kubectl create serviceaccount chulsoo
serviceaccount/chulsoo created
[vagrant@ms ~]$ kubectl get sa
NAME SECRETS AGE
chulsoo 0 7s
default 0 3h40m
younghee 0 12s
[vagrant@ms ~]$ kubectl create sa sunhee
serviceaccount/sunhee created
● namespace 파일로 만들기
○ 파일로 만들어서 관리하는게 편하다
>> Namespace 의 버전 확인
[vagrant@ms work]$ kubectl api-resources | grep Namespace
namespaces ns v1 false Namespace
>> metadata 식별자 >> name
[vagrant@ms work]$ cat ns.yml
apiVersion: v1
kind: Namespace
metadata:
name: myns
[vagrant@ms work]$ kubectl apply -f ns.yml
namespace/myns created
[vagrant@ms work]$ kubectl get ns
NAME STATUS AGE
default Active 3h52m
kube-flannel Active 3h52m
kube-node-lease Active 3h52m
kube-public Active 3h52m
kube-system Active 3h52m
myns Active 5s
○ myns namespace 로 변경해서 작업하자
[vagrant@ms work]$ kubectl config set-context --current --namespace myns
Context "kubernetes-admin@kubernetes" modified.
[vagrant@ms work]$ kubectl config view | grep namespace
namespace: myns
▷ namespace 를 수정하는 스크립트
#! /bin/bash
# simple script for emulate command kubens(included kubectx package)
if [ $# -eq 0 ]
then
kubectl get ns
exit
elif [ $# -ge 2 ] || [ "$1" == "--help" ] || [ "$1" == "-h" ]
then
echo -e "Usage:
kubens : list the namespace
kubens <NAME> : change the active namespace
kubens -c : show the current namespace
kubens - : switch to the previous namespace (This option is not work)
"
exit
fi
if [ $1 == "-c" ]
then
ns_name=$(kubectl config view | grep namespace | awk '{print $2}')
if [ $ns_name == "" ]
then
namespace="default"
fi
echo "current namespace: $ns_name"
exit
fi
for ns_name in $(kubectl get ns|awk 'NR != 1 {print $1}')
do
if [ "$1" == "$ns_name" ]
then
kubectl config set-context --current --namespace=$1
exit
else
continue
fi
done
echo "namespace $1 not found"
◇ kubens 파일에 스크립트를 넣어서 /bin 으로 이동후 권한을 준다
[vagrant@ms work]$ vim kubens
[vagrant@ms work]$ sudo mv kubens /bin
[vagrant@ms work]$ sudo chmod 755 /bin/kubens
[vagrant@ms work]$ kubens default
Context "kubernetes-admin@kubernetes" modified.
[vagrant@ms work]$ kubens myns
Context "kubernetes-admin@kubernetes" modified.
◇ kubectx 를 다운받으면 스크립트 파일이 없어도 가능하다
>> 근데 repository 가 없어서 인터넷에서 받아와야 한다
[vagrant@ms work]$ yum list kubectx
CentOS Linux 8 - AppStream 15 MB/s | 8.4 MB 00:00
CentOS Linux 8 - BaseOS 11 MB/s | 4.6 MB 00:00
CentOS Linux 8 - Extras 82 kB/s | 10 kB 00:00
Docker CE Stable - x86_64 338 kB/s | 57 kB 00:00
Extra Packages for Enterprise Linux 8 - x86_64 12 MB/s | 16 MB 00:01
Kubernetes 13 kB/s | 9.9 kB 00:00
Error: No matching Packages to list
'Kubernetes [ 쿠버네티스 ]' 카테고리의 다른 글
Kubernetes ReplicaSet (0) | 2024.03.07 |
---|---|
Kubernetes - pods (0) | 2024.03.07 |
Kubernetes - 일반 계정 admin 권한 주기 [ 참조 치트시트 ] (0) | 2024.03.07 |
Kubernetes 정상 작동 확인 (0) | 2024.03.07 |
Kubernetes 설치 추가 (0) | 2024.03.07 |