클라우드 + DevOps/Kubernetes (k8s)

Kubernetes 실습 :: 포드(pod) 관리 - imperative syntax 포드 명령형

gamjadori 2024. 4. 19. 16:56
728x90

<Kubernetes 실습 :: imperative syntax 포드 명령형 실습 1>

1. 명령어로 yaml 파일 제작

  • 이름이 myweb2이고 Nginx 이미지를 사용하는 새로운 Pod를 생성
  • Pod에 라벨 app=myweb1을 부여한 다음, 해당 Pod를 YAML 파일로 출력
  • 포트 80을 지정
  • --dry-run=client: Pod를 생성하기 전에 시뮬레이션을 수행
ubuntu@k8s-master:~$ kubectl run myweb2 --image=nginx:1.25.3-alpine --port=80 --labels "app=myweb1" --dry=run=client -o yaml > myweb2-pod.yaml

 

2. yaml 파일 제작 확인

<myweb2-pod.yaml 내용>

  • Nginx 컨테이너를 실행하며, 포트 8000을 열어서 클라이언트의 요청을 수신
  • Pod는 항상 실행되며, 클러스터의 DNS 구성을 사용하여 DNS를 해결
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    app: myweb1
  name: myweb1
spec:
  containers:
  - image: nginx:1.25.3-alpine
    name: myweb2
    ports:
    - containerPort: 8000
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

 

3. pod 파일 실행

PS C:\Users\admin\Desktop\k8s-pods> kubectl apply -f myweb2-pod.yaml
pod/myweb2 created

 

<확인> kubectl get po -o wide

 

4. 서비스 생성

  • 클러스터의 다른 서비스나 외부 클라이언트가 이 서비스를 사용하여 Pod에 액세스 가능
  • Pod의 포트 8002를 통해 노출되며, 이 포트는 Pod의 포트 80으로 전달
PS C:\Users\admin\Desktop\k8s-pods> kubectl expose pod myweb2 --name=myweb2-svc --port-8002 --target-port=80
sverice/myweb2-svc exposed

 

<확인> kubectl get po,svc -o wide로 확인

  • (다른 실습) 선언한 서비스를 파일로도 저장
PS C:\Users\admin\Desktop\k8s-pods> kubectl expose pod myweb2 --name=myweb2-svc --port-8002 --target-port=80 -o yaml > myweb2-svc.yaml
sverice/myweb2-svc exposed

<myweb2-svc.yaml>

apiVersion: v1
kind: Service
metadate:
  creationTimestamp: "2024-02-19T03:25:02Z"
  labels:
    app: myweb1
  name: myweb3-svc
  namespace: default
  resourceVersion: "174623"
  uid: 758f57a1-b396-4c48-d93d-45fc204b6061
spec:
  clusterIP: 10.108.161.226
  clusterIPs:
  - 10.108.131.226
  internalTrafficPolicy: SingleStack
  ports:
  - port: 8002
    protocol: TCP
    targetPort: 80
  selector:
    app: myweb1
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

 

<imperative syntax 포드 명령형 실습 2>

1. MySQL 포드 파일 제작

<mysql56-pod.yaml>

  • MySQL 5.7 버전의 Pod를 정의
  • 포트 3306을 열어 MySQL 데이터베이스에 액세스
  • 루트 비밀번호: k8spass#으로 설정
apiVersion: v1
kind: Pod
metadata:
  name: mysql57-pod
  labels:
    type: mysql57
spec:
  containers: 
  - name: mysql57-container
    image: mysql:5.7
    ports:
    - containerPort: 3306
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "k8spass#"

<제작 확인>

 

2. mysql56-pod.yaml 적용

PS C:\Users\admin\Desktop\k8s-pods> kubectl apply -f mysql-pod.yaml
pod/mysql57-pod created
  • kubectl get po -o wide로 제작 확인

 

3. 포드 실행

  • 컨테이너에서 대화형 셸을 실행
PS C:\Users\admin\Desktop\k8s-pods> kubectl exec -it mysql57-pod --bash
bash-4.2# mysql -u root -p

 

<MySQL 연결 확인 간단 실습>

  • 테이블을 만들어 정보를 입력한 후, 연동이 되었는지 확인

mysql> create database k8sdb;
Query OK, 1 row affected (0.00 sec)
>> k8sdb라는 이름의 데이터 베이스 생성

mysql> create table products (prod_id int, prod_name varchar(20));
Query OK, 0 rows affected (0.03 sec)
>> products라는 이름의 테이블을 생성하고 
칼럼 prod_id 생성 (정수형)
칼럼 prod_name 생성 (길이가 20인 문자열)

mysql> insert into products values (100, 'kubernetes');
Query OK, 1 rows affected (0.02 sec)
>> prod_id가 100이고 prod_name이 'kubernetes'인 레코드 생성

mysql> insert into products values (200, 'hangaram');
Query OK, 1 rows affected (0.01 sec)
>> prod_id가 200이고 prod_name이 'hangaram'인 레코드 생성

mysql> select * from products;

<결과 확인>

 

4. MySQL 서비스 선언

<mysql-svc.yaml 제작>

apiVersion: v1
kind: Service
metadata:
  name: mysql-svc
spec:
  selector:
    type: mysql57
  ports:
  - port: 13306
    targetPort: 3306
  externalIPs:
  - 192.168.56.103
  • externalIPs는 kubectl po -o wide로 포드가 생성된 노드 확인 후 작성

 

5. mysql-svc.yaml 서비스 선언

PS C:\Users\admin\Desktop\k8s-pods> kubectl apply -f mysql-svc.yaml
service/mysql-svc created

<mysql 포드 및 서비스 생성 확인>

 

<VsCode로 MySQL 접속 확인해서 연동 확인>

  • ssh와 MySQL에 모두 정보 입력해야 함

A. SSH 서버 타입 입력

  • Host: 포드가 생성된 노드 IP 입력
  • password: ubuntu

 

B. MySQL 서버 타입 입력

  • Host: 192.168.56.103
  • Password: k8spass#

>> Connet 버튼 누르면 성공 팝업 표시

SHOW DATABAES;
USE k8sdb;
SELECT * FROM products;