[2024.11.02]
7) 'cluster.yml' 파일을 이용한 앤서블 플레이
ansible-playbook \
-i inventory/mycluster/hosts.yaml \
--become --become-user=root \
cluster.yml
앤서블 플레이북을 이용하여 쿠버네티스트를 설치한다
설치 시간은 평균 20~30분 정도 소요된다
8) 설치 정보 확인
만약, kubectl version 명령어 진행 시 kubuctl 명령어가 없다고
출력되면 다시 설치(5번 과정) 해야 한다
또한, kubectl 명령어는 실행되는데,
다음과 같이 master, node1, node2, node3의 상태가
Ready가 아니라 NotReady로 출력되면 다시 설치(5번 과정) 해야 한다
9) 정보 확인 실시
10) Git Hub로부터 실습 파일 복제
11) 쿠버네티스에서 도커 허브 로그인을 위한 secret 생성
kubectl create secret docker-registry mysecret \
--docker-username='도커 허브 아이디' \
--docker-password='도커 허브 패스워드' \
--docker-email='도커 허브 이메일'
12) 서비스 어카운트에 imagePullSecrets, mysecret 시크릿 추가
13) 컨테이너 이미지 다운로드 및 쿠버네티스 클러스터 동작 확인
04. Kubernetes 컨테이너 실행하기
1. kubectl 명령 사용법
1) kubectl 명령 사용법
- https://kubernetes.io/ko/docs/reference/kubectl
# kubectl [CMD] [TYPE] [NAME] [flags]
[CMD]: 자원에 실행할 명령
- https://kubernetes.io/ko/docs/reference/kubectl/#명령어
- Ex) run, create, apply, get, describe, edit, delete
[TYPE]: 자원의 타입
- https://kubernetes.io/ko/docs/reference/kubectl/#리소스-타입
- Ex) nodes, pods, replicationcontrollers, replicasets, deployments, daemonsets, statefulsets, services
[NAME]: 자원의 이름
- Ex) 자원의 이름
[flags]: 옵션
- Ex) --help, -o options
- Ex) # kubectl get pod webserver -o wide
2) kubectl 명령 사용법 예시
2. kubectl 명령 사용법
1) kubectl CMD 사용시 약자 확인
2) [TAB] 자동 완성 기능
# kubectl get d[TAB][TAB]
# kubectl get de[TAB]
# kubectl get deployments.apps
# kubectl [TAB][TAB]
[TAB][TAB]을 두 번 누르게되면 자동 완성 기능을 사용할 수 있다
3) 도움말 기능
# kubectl --help
4) 다른 명령어에 대한 sub 명령 사용법 확인
# kubectl get --help
5) 노드 정보 확인
# kubectl describe nodes master
위 명령어 입력 시 나오는 노드 정보로
현재 master에서 관리하는 노드 정보를 확인할 수 있다
kubectl describe nodes node1 명령을 실시하면 node1에 대한 정보를 상세하게 확인할 수 있다
3. kubectl 명령을 이용한 파드 생성
파드는 하나 이상의 컨테이너를 구성하고 있는 쿠버네티스 리소스이다
1) kubectl 명령을 이용하여 'webserver1' 파드 생성 및 확인
먼저 kubectl 명령을 이용하여 webserver1이라는 파드를 생성한다
쿠버네티스에서는 파드 단위로 나뉘게 된다
화면과 같이 watch라는 옵션을 사용하게 되면 파드에 대한 정보 확인을 실시간으로 출력된다
처음에는 아무것도 뜨지 않지만, mobaXterm으로 실행시키면
CentOS에서 확인 시 node1이 파드가 생긴 것을 확인할 수 있다
파드가 생기는 것은 node1이 될지 2, 3번이 될지 모르기 때문에
이런 식으로 확인할 때에는 본인에게 지정된 파드에서 확인해야 된다
나의 경우 현재 CentOS에서 확인 시 node1번으로 파드가 생겼기 때문에
확인은 node1번에서 진행했다
현재 노드 정보를 확인했을 때 나오는 IP 주소는 파드의 IP이다
해당 IP 주소로 curl로 확인했을 때 현재 생성된 이미지의 nginx를 확인할 수 있다
2) kubectl 명령을 이용하여 'webserver2' 디플로이먼트 3개 생성 및 확인
이번에는 kubectl 명령을 이용하여 webserver2 디플로이먼트 3개를 생성했다
그렇게 되었을 때 현재 실시간으로 Running 상태가 되는 것이 확인된다
describe 명령을 통해
webserver2의 디플로이먼트 3개가 생성된 것도 확인한다
현재 MobaXterm에서도 Running 상태를 확인할 수 있다
3) 파드 정보 확인
curl을 이용하여 다른 파드로 HTTP접속이 되는지 확인한다
직접 node1에서 확인 시 세 개의 파드가 생성되어 있는 상태다
4) 출력 형식 지정
# kubectl get pods webserver1
# kubectl get pods webserver1 -o wide
# kubectl get pods webserver1 -o yaml
# kubectl get pods webserver1 -o json
5) 파드의 컨테이너를 접속하여 웹페이지 변경 및 확인
# kubectl exec 파드_이름 [-c 컨테이너_이름] [flags] -- 컨테이너_명령어 [인자] [옵션]
6) 파드 로그 확인
*-f 옵션을 사용하면 실시간으로 로그를 확인할 수 있음
실시간으로 바뀌는지 확인하기 위해 curl을 통해 다시 접속한다
그럼 CentOS에서 시간 간격을 두고 하나가 더 생긴 것을 확인할 수 있다
7) 포트 포워딩을 이용한 파드 컨테이너 접속
curl을 이용하여 'localhost:8080'으로 HTTP 접속이 되는지 확인한다
확인이 완료되었으면, kubectl port-forward webserver1 8080:80 프로세스를 강제 종료한다
8) deployments.app/webserver2 설정 편집
현재 디플로이먼트의 갯수를 3이 아닌 5로 변경한 상태다
그렇기 때문에 현재 구동 중인 파드의 경우 다섯 개가 된다
실시간 확인 시에도 Running 상태가 되어 있으며
마지막으로 curl을 이용하여 새로 추가된
webserver2 파드로 HTTP 접속이 되는지 확인한다
4. Yaml 파일을 이용한 pod 생성 및 확인
1) 동일한 이름의 파드는 동시에 생성되지 않는다
2) '--dry-run' 옵션과 '-o yaml' 옵션을 이용하여 yaml 파일 생성
3) 'webserver3.yml' 파일 편집
4) 'webserver3.yml' 파일을 이용한 파드 생성 및 확인
5. 쿠버네티스 컨테이너 실행 예제
1) 'kubectl run' 명령을 이용하여 다음 조건에 맞게 Pod를 생성한다
2) 'myweb2.yml' 파일을 제작하여 다음 조건에 맞게 Pod를 생성한다
05. Kubermetes 아키텍처
1. 쿠버네티스 아키텍쳐
1) Control Plane 구성요소
- https://kubernetes.io/docs/concepts/overview/components/#control-plane-components
2) Node 구성 요소
노드는 동작 중인 파드를 유지시키고
쿠버네티스 런타임 환경을 제공하며, 모든 노드 상에서 동작한다
3) 애드온
- https://kubernetes.io/docs/concepts/overview/components/#addons
4) 클러스터에서 API 서버 동작 단계
2. 네임스페이스
네임스페이스는 쿠버네티스 클러스터 하나를
여러 개의 논리적인 단위로 분리하여 사용하는 기능이다
- https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/namespaces
- https://kubernetes.io/docs/tasks/administer-cluster/namespace
1) 여러 개의 네임스페이스를 사용하는 경우
2) 네임스페이스 사용하기
3) 네임스페이스 확인
① 기본적인 네임스페이스를 확인한다
② default 네임스페이스에 존재하는 파드를 확인한다
'kubectl get pods' 명령에서 -n 옵션을 이용하여
네임스페이스를 지정하지 않으면
default 네임스페이스의 리소스를 출력한다
*namespace를 생략하면 'default' namespace가 기본값
③ 'web1-pod.yml' 파일을 제작하여 web1-pod 파드를 생성하고 네임스페이스를 확인한다
apiVersion: v1
kind: Pod
metadata:
name: web1-pod
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
protocol: TCP
파드 생성 시 네임스페이스를 별도로 지정하지 않으면 default 네임스페이스로 생성된다
④ kube-system 네임스페이스로 동작 중인 파드를 확인한다
kube-system 네임스페이스에 포함된 파드들은
쿠버네티스를 운용할 때 필요한 기본적인 파드들이다
4) 네임스페이스 생성
① kubectl 명령을 이용하여 'myns1' 네임스페이스를 생성한다
② yaml 파일을 이용하여 'myns2' 네임스페이스를 생성한다
③ 'web2-pod.yml' 파일을 제작하고 파드 생성시 'myns2' 네임스페이스로 적용한다
apiVersion: v1
kind: Pod
metadata:
name: web2-pod
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
④ 파드를 생성할때 'myns3' 네임스페이스가 적용되는 'web3-pod.yml' 파일을 제작한다
apiVersion: v1
kind: Pod
metadata:
name: web3-pod
namespace: myns3
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
⑤ 'myns4' 네임스페이스와 파드를 동시에 생성 및 적용하는 'web4-pod.yml' 파일을 제작한다
apiVersion: v1
kind: Namespace
metadata:
name: myns4
---
apiVersion: v1
kind: Pod
metadata:
name: web4-pod
namespace: myns4
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
5) 기본 네임스페이스 변경
기본 네임스페이스를 변경하기 위한 context 사용법을 확인한다
kubeconfig 기본 정보 확인을 실시한다
새로운 context을 생성하고 확인한다
cluster와 user는 기본값으로 사용해야 권한에 문제가 발생되지 않는다
기본 정보를 다시 확인 후
기본 context를 새로 생성한 kubernetes-user@cluster.local으로 변경한다
기본 정보를 다시 확인하게 되면
새로 생성된 2개의 context를 발견할 수 있다
kubectl 명령을 이용하여 myns5 네임스페이스를 생성한다
기본 네임스페이스가 myns5으로 변경되었기 때문에
파드를 생성하면 myns5 네임스페이스로 적용된다
-n 옵션 없이 파드 정보를 확인하면,
기본 네임스페이스가 myns5인 파드 정보가 출력된다
default 네임스페이스를 사용하는 파드를 확인할 경우,
-n 옵션을 이용하여 네임스페이스를 지정해야 된다
확인이 완료되었다면,
기존에 사용하던 kubernetes-admin@cluster.local
context로 복원한다
context가 kubernetes-admin@cluster.local으로
복원되면 기본 네임스페이스는 다시 default로 된다
6) 네임스페이스 및 파드 삭제
네임스페이스 목록을 확인하기 전에 myns를 지워 버렸다
default 네임스페이스를 사용하는 파드는
-n 옵션을 사용하지 않고 삭제가 가능하다
하지만, web2-pod, web3-pod 파드를 삭제할 경우에는
-n 옵션과 네임스페이스 이름을 지정해야 된다
web4-pod 파드는 web4-pod.yml 파일을 이용하여
삭제하면 네임스페이스와 파드 리소스를 삭제한다
myns5 네임스페이스를 삭제하면,
네임스페이스에 속해 있는 모든 파드(web5-pod)들이 삭제된다
devns, testns, userns 네임스페이스를 모두 삭제한다
3. 네임스페이스 예제
1) 'kubectl' 명령을 이용하여 다음 조건에 맞게 파드를 생성한다
2) 'yaml' 파일을 제작하여 다음 조건에 맞게 파드를 생성한다
sublime text로 미리 적어 둔 코드를 복사하여
httpd-web1, 2, 3.yaml 파일을 생성한다
그런 다음 네임스페이스를 httpd-ns로 지정하고 httpd-web1, 2, 3를 생성한다
마지막으로 확인하게 되면 세 개의 파드가 생성된 것을 확인할 수 있다
4. YAML 파일
1) YAML 문법
2) JSON 형식과 YAML 형식 비교
- https://www.json2yaml.com/convert-yaml-to-json
3) YAML 파일의 기본 문법
종류 | 설명 |
주석 | #은 주석이다 # POD EXAMPLE apiVersion: v1 kind: Pod #리소스 타입 metadata: |
들여쓰기 | 들여쓰기는 일반적으로 2칸 또는 4칸으로 한다 spec: containers: - name: nginx #컨테이너 이름 image: nginx #컨테이너 이미지 |
데이터 정의 (Scalar 형식) |
Key: Value 형식으로 정의한다 metadata: name: mypod #파드 이름 namespace: devns #네임스페이스 이름 |
배열 정의 (Array 형식) |
배열은 하이픈(-) 로 표시한다 반드시 하이픈(-) 다음은 공백이 한 칸 존재해야 된다 |
참/거짓 | 참/거짓: yes/no, true/false 소문자 형식을 권장한다 study_hard: yes give_up: no hello: Ture world: TRUE manual: False |
숫자 표현 | 정수 또는 실수를 따옴표(") 없이 사용하면 숫자로 인식한다 # Number version: 3.1 # String version: "3.1" |
줄바꿈 | "|": 지시어는 마지막 줄바꿈(\n)을 포함 "|-": 지시어는 마지막 줄바꿈(\n)을 포함 ">": 지시어는 중간에 들어간 줄바꿈을 제외 ">-": 지시어는 중간 및 마지막 줄바꿈을 제외 아래 내용에 마지막 줄이 한 줄(빈 공백 라인) 더 있으므로 복사해서 사용한다 |
5. API 버전
- https://kubernetes.io/docs/reference/using-api
1) API Version
alpha -> beta -> stable
kubernetes Object 정의시 apiVersion 필요하다.
kubernetes가 update하는 API가 있으면 새로운 API가 생성된다.
2) API Ojbect 종류 및 버전
# kubectl api-resources
3) API 확인
apiVersion: apps/v1
kind: Pod
metadata:
name: web
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
protocol: TCP
06. Kubernetes 파드
1. 파드 생성 및 삭제
파드는 컨테이너를 구현하는 쿠버네티스 최소 단위이며,
파드에는 하나 또는 여러개의 컨테이너가 포함된다
1) kubectl 명령을 이용한 파드 생성
2) yaml 파일을 이용한 파드 생성
apiVersion: v1
kind: Pod
metadata:
name: web2
spec:
containers:
- name: nginx-container
image: nginx:1.14
ports:
- containerPort: 80
protocol: TCP
3) 파드 삭제
2. Multi-Container 파드 생성
멀티 컨테이너 파드를 이용하면 하나의 파드에
여러 개의 컨테이너들을 생성 및 관리할 수 있다
Ex) MySQL & MySQL-Express, Mongo & Mongo-Express, WebServer & WebCache
1) multi-container 파드 생성
nginx-container에 셸을 실행하여 index.html 파일 내용을 수정한다
root@multipod:/# apt-get update root@multipod:/
# apt-get -y install curl net-tools
ubuntu-container에 셸을 실행하여 command로 지정한
sleep 86400 프로세스를 확인한다
이후에 위의 명령어를 실행하고
ifconfig를 이용하여 IP 주소를 확인한다
IP 주소로 변경된 메시지 출력 여부를 확인한다
파드의 모든 컨테이너들은 파드의 IP 주소를 사용한다
그렇기 때문에 ubuntu-container에는 웹 서버가 없지만,
파드의 IP:80으로 HTTP 서비스 요청을 실시하게 되면
nginx-container의 80번 포트로 HTTP 서비스 요청을 실시하는 것을 확인할 수 있다
nginx-container에 셸을 실행하여
nginx-container의 IP 주소가 파드의 IP 주소인지 확인한다
IP 주소가 같은 것을 확인했다면,
다음 실습을 위해 현재 multipod를 삭제한다
3. 파드 생명 주기(Pod Lifecycle)
1) 파드 생명 주기
2) 파드 생명 주기 단계
3) 컨테이너 상태
4) 파드 생명 주기 단계 및 컨테이너 상태 확인
윈도우 터미널에서 파드 상태를 모니터링하기 위한 명령을 실행한다
apiVersion: v1
kind: Pod
metadata:
name: web3
spec:
containers:
- name: nginx-container
image: nginx:1.14
ports:
- containerPort: 80
protocol: TCP
기존 터미널에서 web3.yml을 제작하여 web3 파드를 생성한다
CentOS에서 파드 상태 단계를 확인한다
다음으로 파드 생명 주기 단계 및 컨테이너 상태를 확인한다
현재 빨간색 박스를 보면 알 수 있듯이 모두 Running 상태다
동시에 이벤트 부분까지 확인한다
기존 터미널에서 web3 파드를 삭제하고
CentOS에서 파드 상태 단계를 확인하고 Ctrl+C로 종료한다
4. livenessProbe를 이용한 Self-healing Pod 구성
1) Self-healing 기능(Heath Check)
2) Liveness Probe를 이용하여 컨테이너 진단
3) Liveness Probe 동작 3가지 유형
4) LivenessProbe 매개변수
5) Liveness Probe 파드 구성
apiVersion: v1
kind: Pod
metadata:
name: nginx-liveness-pod
spec:
containers:
- name: nginx-container
image: nginx:1.14
ports:
- containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /
port: 80
nginx-liveness-pod.yml 파일을 제작하여
nginx-liveness-pod 파드를 생성한다
- livenessProbe 매개 변수는 별도로 설정하지 않으면 기본값으로 설정된다
- livenessProbe 기본값은 kubectl describe pods 파드_이름 명령을 통해 확인할 수 있다
livenessProbe 설정 내용 및 매개 변수 기본 값을 확인한다
현재 매개 변수 기본 값을 변경하려고 한다
failureThreshold: 3
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 23
매개 변수의 기본 값을 변경했다면
nginx-liveness-pod 파드를 삭제한다
6) smlinux/unhealthy 이미지를 사용한 livenessProbe 파드 구성
CentOS에서 'kubectl get pods -o wide --watch'를 실행하여 실시간으로 상태를 확인한다
apiVersion: v1
kind: Pod
metadata:
name: unhealthy-liveness-pod
spec:
containers:
- name: unhealthy-container
image: smlinux/unhealthy
ports:
- containerPort: 8000
protocol: TCP
livenessProbe:
httpGet:
path: /
port: 8080
먼저 smlinux/unhealthy 이미지를 사용하는
unhealthy-liveness-pod.yml 파일을 제작한다
[참고] smlinux/unhealthy 이미지
- HTTP connection 있을 때마다 내부 서버 오류로
HTTP 500 ERROR를 발생시키는 컨테이너 이미지
smlinux/unhealthy 이미지를 사용하는 파드를 생성한다
CentOS에서도 실시간으로 확인을 진행하고
컨테이너의 liveness 설정 값을 확인한다
60초 정도 후에 파드 상태를 점검하고 윈도우에서 파드의 상태를 실시간으로 확인한다
10~13분 정도 후에 뒤 파드 상태를 점검하고 윈도우에서 파드의 상태를 실시간으로 확인한다
CentOS에서도 확인하게 되면 CrashLoopBackOff가 확인된다
CrashLoopBackOff의 경우 파드 시작과 비정상 종료가 여러 번
반복하여 강제로 종료된 상태다
5. 초기화 컨테이너(init container) 파드 구성
1) 다음 사이트를 참조하여 'init-container-pod.yml' 파일을 제작한다
- https://kubernetes.io/ko/docs/concepts/workloads/pods/init-containers
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
2) 빨간색 부분 동작 내용은 다음과 같다
3) 파랑색 부분 동작내용은 다음과 같다
4) 'init-container-pod.yml' 파일을 이용하여 myapp-pod 파드를 생성한다
5) 'init-container-myservice.yml' 파일을 제작하여 myservice 서비스를 생성한다
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
6) myapp-pod 파드 정보를 확인한다
7) 'init-container-myservice.yml' 파일을 제작하여 mydb 서비스를 생성한다
apiVersion: v1
kind: Service
metadata:
name: mydb
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9377
8) myapp-pod 파드 정보를 확인한다
초기화 컨테이너 2개가 완료되었기 때문에
메인 컨테이너 'myapp-pod가 생성된 것을 확인할 수 있다
9) myapp-pod 파드와 myserver, mydb 서비스를 삭제한다
6. 인프라 컨테이너(infra/pause container)
1) myweb 파드를 실행하고 확인한다
2) node1에서 컨테이너를 확인한다
myweb의 경우 pod를 사용하기 위한 역할이라고 보면 된다
현재 myweb 컨테이너와 myweb의 pause container가 생성되고 동작 중이다
3) master에서 myweb 파드를 삭제한다
master에서 myweb 파드를 삭제하게 되면
4) node1에서 컨테이너를 확인한다
node1에서는 myweb 컨테이너뿐만 아니라
myweb의 pause container도 같이 삭제된 걸 볼 수 있다
7. Static 파드 구성
1) node1에서 /var/lib/kubelet/config.yaml 파일을 확인한다
[root@node1 /root]# ls -l /var/lib/kubelet/config.yaml
-rw-r--r--. 1 root root 1002 2024-10-27 17:51 /var/lib/kubelet/config.yaml
3) node1에서 'nginx.yml' 파일을 생성한다
apiVersion: v1
kind: Pod
metadata:
name: nginx-static-pod
spec:
containers:
- name: nginx-container
image: nginx:1.14
ports:
- containerPort: 80
protocol: TCP
4) master에서 nginx-static-pod 파드가 생성되었는지 확인한다
5) node1에서 'nginx.yml' 파일을 삭제한다
6) master에서 nginx-static-pod 파드가 삭제되었는지 확인한다
강의 소감
오늘은 쿠버네티스의 설치 마무리를 시작으로
순서대로 컨테이너 실행과 아키텍처, 파드를 배우게 되었다
도커를 배울 때는 명령어가 아는 게 조금 있었지만,
현재 쿠버네티스를 배우기 시작하면서 리눅스를 알고 있어도
명령어가 생소해서 익숙해지기까지 오래 걸릴 것 같다
진도를 따라 가는 게 힘들지만 그래도 열심히 복습해야 될 것 같다
출처 - 코리아it아카데미 김정우 강사님 제공
*중간에 나오는 교재의 단편적인 면이 아닌
MobaXterm으로 실행하여 캡처한 것은 모두 본인이 직접 실행해 보고
캡처하여 블로그에 작성하는 것입니다
'멀티 클라우드 인프라(DKR & K8S)' 카테고리의 다른 글
도커 & 쿠버네티스 6 (2) | 2024.11.11 |
---|---|
도커 & 쿠버네티스 4 (0) | 2024.10.28 |
도커 & 쿠버네티스 3 (0) | 2024.10.28 |
도커 & 쿠버네티스 2 (2) | 2024.10.20 |
도커 & 쿠버네티스 1 (1) | 2024.10.20 |