본문 바로가기
Cloud

kubenetes의 기본 실습-1

by tankwoong 2023. 10. 23.
반응형

클러스터 내부 통신을 위한 서비스 (ClusterIP):
클러스터 내부 통신을 위해 서비스를 생성합니다. 이 서비스는 ClusterIP를 사용하여 클러스터 내에서 내부 통신을 지원합니다.


외부 노드 포트 밸런싱을 위한 서비스 (NodePort):
외부 노드 포트 밸런싱을 설정하기 위해 서비스를 생성합니다. NodePort 서비스를 사용하여 외부 트래픽을 클러스터 내부 서비스로 라우팅합니다



대규모 인그레스를 설정하기 위해 Ingress 리소스를 생성합니다. 이 예제에서는 Nginx Ingress Controller를 사용하겠습니다. 

먼저, Ingress Controller를 설치하고 설정해야 합니다

minikube를 시작해줍니다.

mimikube 상태를 확인 합니다.

 

minikube ip를 확인하고, ssh로 로그인해 줍니다.

로그인 해서 docker ps로 상태를 확인하면 여러가지 쿠버네티스 내의 컨테이너들을 볼 수 있습니다.

다시 나가서 kubectl 버전을 확인해 줍니다.

 

디렉터리를 하나 만들고 yml 파일을 만들어 docker compose로 구동해 보겠습니다.

docker-compose.yml


version: "3"

services:
  wordpress:
    image: wordpress:5.5.3-apache
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_PASSWORD: password
    ports:
      - "30000:80"

  mysql:
    image: mysql:5.6
    environment:
      MYSQL_ROOT_PASSWORD: password

구동을 한 뒤 30000번 대역으로 외부에서 접속해주겠습니다.

아래에 보면 접속이 잘 되는 것을 볼 수 있습니다.

이번엔 kubenete를 사용해 wordpress를 실행해보겠습니다.

yml파일을 하나 만들어 주고 아래의 코드를 넣습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
        - image: mariadb:10.7
          name: mysql
          env:
            - name: MYSQL_DATABASE
              value: wordpress
            - name: MYSQL_ROOT_PASSWORD
              value: password
          ports:
            - containerPort: 3306
              name: mysql

---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
        - image: wordpress:5.9.1-php8.1-apache
          name: wordpress
          env:
            - name: WORDPRESS_DB_HOST
              value: wordpress-mysql
            - name: WORDPRESS_DB_NAME
              value: wordpress
            - name: WORDPRESS_DB_USER
              value: root
            - name: WORDPRESS_DB_PASSWORD
              value: password
          ports:
            - containerPort: 80
              name: wordpress

---
apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  type: NodePort
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend

kubectl을 이용해서 적용시킵니다.

ubuntu@ubuntu:~/test$ kubectl apply -f wordpresss-kubenetes.yml 
deployment.apps/wordpress-mysql created
service/wordpress-mysql created
deployment.apps/wordpress created
service/wordpress created

kubectl  get all을 통해 확인을 할 수 있습니다.

ubuntu@ubuntu:~/test$ kubectl get all 
NAME                                   READY   STATUS              RESTARTS   AGE
pod/wordpress-6b75557cc6-gcdjk         0/1     ContainerCreating   0          16s
pod/wordpress-mysql-848dfdb5c5-fjn68   0/1     ContainerCreating   0          16s

NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes        ClusterIP   10.96.0.1       <none>        443/TCP        18d
service/wordpress         NodePort    10.108.154.57   <none>        80:32096/TCP   16s
service/wordpress-mysql   ClusterIP   10.96.206.239   <none>        3306/TCP       16s

NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/wordpress         0/1     1            0           16s
deployment.apps/wordpress-mysql   0/1     1            0           16s

시간이 조금 지나서 다시 확인해보면 상태가 다 Running으로 바뀐 것을 알 수 있습니다.

외부포트 32096으로 접속하면 잘 접속이 되는 것을 확인 할 수 있습니다.

이제 docker compose와 무엇이 다른 지 확인해 보겠습니다. kubectl을 통해 pod를 지우고 

다시 확인하면 다른 pod가 생성됨을 볼 수 있습니다. 

이것이 쿠버네티스의 장점입니다. 지워도 새로운 것으로 다시 만들어 줍니다.

이번엔 pod를 늘려보게씁니다. 아래와 같이 spec부분에 replicas를 설정해주면

아래와 같이 총 5대의 pod가 작동하는 것을 볼 수 있습니다. 

kubectl을 통해 node명을 확인할 수 있습니다.

 

 

 

 

kubectl을 통해 label의 이름을 확인할 수 있습니다.

kubectl describe명령어를 통해 다양한 것을 확인할 수 있는데 Events를 통해서는

어디서 오류가 났는지 확인할 수 있습니다..

log도 확인할 수 있는데 wordpress접속 후 언어 선택하고 들어가면 다양한 로그를 확인할 수 있습니다.

도커 허브에서 가져오기 

도커허브에서 가져오기

ubuntu@ubuntu:~/test$ docker pull myoungseok/echo:v1
ubuntu@ubuntu:~/test$ docker tag myoungseok/echo:v1 cloudwoong/echo:v1
ubuntu@ubuntu:~/test$ docker push cloudwoong/echo:v1

 

컨테이너 구동하기

지우고 echo-app.yml파일 작성하고 확인하기 

apiVersion: v1
kind: Pod
metadata:
  name: echo
  labels:
    app: echo
spec:
  containers:
    - name: app
      image: myoungseok/echo:v1

healthing check -> probe-> http get 

[livenessProbe]

살아있는지 확인하는 경우

/[readinessProbe]

준비가 안됬는데 확인하는 경우

livenessprobe

ubuntu@ubuntu:~/test$ nano livenessprobe.yml
ubuntu@ubuntu:~/test$ kubectl apply -f liveprobeness.yml 
pod/echo-lp created
ubuntu@ubuntu:~/test$ kubectl get po
NAME      READY   STATUS    RESTARTS     AGE
echo-lp   1/1     Running   1 (6s ago)   16s
ubuntu@ubuntu:~/test$ kubectl get po -o wide
NAME      READY   STATUS             RESTARTS     AGE   IP            NODE       NOMINATED NODE   READINESS GATES
echo-lp   0/1     CrashLoopBackOff   2 (5s ago)   30s   10.244.0.27   minikube   <none>           <none>
ubuntu@ubuntu:~/test$ kubectl logs echo-lp
{"level":30,"time":1698029881232,"pid":8,"hostname":"echo-lp","msg":"Server listening at http://0.0.0.0:3000"}
{"level":30,"time":1698029881233,"pid":8,"hostname":"echo-lp","msg":"server listening on http://0.0.0.0:3000"}
ubuntu@ubuntu:~/test$ kubectl get po -o wide
NAME      READY   STATUS    RESTARTS     AGE   IP            NODE       NOMINATED NODE   READINESS GATES
echo-lp   1/1     Running   4 (6s ago)   51s   10.244.0.27   minikube   <none>           <none>

readinessProbe

ubuntu@ubuntu:~/test$ kubectl get po
NAME      READY   STATUS    RESTARTS   AGE
echo-rp   0/1     Running   0          8s
ubuntu@ubuntu:~/test$ kubectl get po -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP            NODE       NOMINATED NODE   READINESS GATES
echo-rp   0/1     Running   0          18s   10.244.0.28   minikube   <none>           <none>

liveness&readiness 구동 

echo-lp-rp.yml

apiVersion: v1
kind: Pod
metadata:
  name: echo-health
  labels:
    app: echo
spec:
  containers:
    - name: app
      image: myoungseok/echo:v1
      livenessProbe:
        httpGet:
          path: /
          port: 3000
      readinessProbe:
        httpGet:
          path: /
          port: 3000

counter-redis만들기 

apiVersion: v1
kind: Pod
metadata:
  name: counter
  labels:
    app: counter
spec:
  containers:
    - name: app
      image: myoungseok/counter-redis:latest
      env:
        - name: REDIS_HOST
          value: "localhost"
    - name: db
      image: redis

다른 것과 다르게 pod안에 2개의 컨테이너가 들어간다.

 

 

db app 둘다 따로따로 들어가서 확인할 수 있다.

ubuntu@ubuntu:~/test$ kubectl logs counter db
ubuntu@ubuntu:~/test$ kubectl exec -it counter -c app -- sh
/app # curl localhost 30000
/app # curl localhost:3000
1
/app # curl localhost:3000
2
/app # curl localhost:3000
3
/app # curl localhost:3000
4
/app # curl localhost:3000
5
/app # telnet localhost:6379
Connected to localhost:6379
keys *
*1
$5
count
get count
$1
5
반응형