이전 글

쿠버네티스 환경에 Mysql-PHP-Apache 세팅하기 (1) - 로컬 도커 환경으로 먼저 구성해보기

쿠버네티스에 Mysql PHP APACHE 환경을 업로드하기 위해 먼저 내가 직접 도커파일을 만들었다.
이전 글에서 만든 도커파일을 통해 컨테이너 각각 PHP-APACHE와 MYSQL을 올려 로컬 네트워크 상에서
DB와 연동이 되는 것을 확인했다.


K8S 환경

앞선 글에서 말했던 것 처럼 KOREN 넷 챌린지 9기 대회에 참여하면서 대회측에서 제공해주는 여러 클라우드 서비스를 이용해서 개발을 진행했다. 여기서의 쿠버네티스 환경은 KOREN 측에서 제공해주는 컨테이너 오케스트레이션 환경에서 진행했다.

제공받은 K8S 환경 버전은 다음과 같다.

이 버전에서 사용할 수 있는 API 버전은 다음과 같이 조회할 수 있다.

한 가지 어려웠던 점은 쿠버네티스가 v1.5.3으로 상당히 옛날 버전이라, 인터넷에서 찾을 수 있는 자료가 한정적이었던 것 같다.


도커 이미지 파일 도커 허브에 업로드하기

이전에 만들었던 도커 이미지 파일을 쿠버네티스에서 사용하기 위해서는 도커 허브에 업로드 해야 한다. K8S에서 컨테이너를 만들 때 yaml파일 내부의 이미지 칸에 도커 이미지 이름을 작성하게 되는데, 이 때 디폴트로 도커 허브에서 이미지를 찾게 되기 때문이다.

docker login

위 명령어를 통해 터미널에서 도커 허브에 로그인한다.

docker images

위 명령어를 통해서 자신이 아까 만들었던 도커 이미지를 확인할 수 있다.

docker push image-name:version

위 명령어를 통해서 도커 허브에 업로드 할 수 있다.
나는 다음과 같이 두 이미지를 업로드 했다.

docker push dks01972/php:1.1
docker push dks01972/mysql:1.1

이후 나의 도커허브 레포지토리를 들어가보면 이런 식으로 업로드 되어 있다.


K8S에 업로드 하기 위한 yaml파일 작성하기

deploy.yaml 파일을 만든다.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: php
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: php
    spec:
      nodeName: dt-xxhsspa7dv-0-i35favlvveqr-kube-minion-bxnwvoxbtfan
      containers:
        - image: dks01972/php:1.1
          name: apache
          ports:
            - containerPort: 80
              name: php
        - image: dks01972/mysql:1.1
          name: db
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: pass
          ports:
            - containerPort: 3306
              name: php

---

apiVersion: v1
kind: Service
metadata:
  name: service-yml
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30307
  selector:
    app: php

몇 가지만 살펴보자면, 먼저 Deployment 하나와 Service 하나를 만드는 파일이다.
위 부터 순서대로 설명하자면, 먼저 Deployment의 이름은 php이다. replicas 를 1로 설정해서 테스트를 위해 파드 1개만을 생성했다. 이후 label을 app: php 로 설정해주었다.

KOREN에서 연결을 뜷어주었던 노드가 nodeName에 있는 노드인데 (워커노드 1이다.), 다른 노드에 파드가 생성되면 접근 할 수 있는 방법이 없어서 노드를 직접 지정해주었다. 만약 작성하지 않는다면 그냥 K8S가 적절한 노드에 생성한다.

containers 부분에서는 총 2가지 컨테이너를 생성한다. 앞서 로컬에서 도커로 띄운 두 컨테이너를 똑같이 쿠버네티스에 업로드 한다고 생각하면 된다. 먼저 아까 도커허브에 업로드 한 이미지 이름을 정확히 작성해주고, 컨테이너 이름을 작성한다. 이후 사용할 포트인 80 번 포트를 지정해준다. mysql 이미지도 마찬가지로 생성해준 후 env를 설정해주고, 포트를 3306 번으로 생성해주었다.

로컬 환경에서 구성할 때 --link로 생성해 주었던 컨테이너 간 링크는 작성하지 않아도 된다.
K8S는 같은 파드 내부에 있는 컨테이너 끼리는 localhost를 통해서 통신할 수 있기 때문이다.


이후 서비스를 생성한다. 서비스는 노드 포트를 통해서 외부에서 접근할 수 있도록 만들어 주었다. 이렇게 하면 방화벽이 뜷려있는 고정 IP로는 접근이 가능하다. 이후 KOREN측에 문의해서 LoadBalancer도 사용 가능한지 확인해보려고 한다.

노드포트에서 중요한 부분은 포트 번호인데, 우리는 현재 APACHE-PHP 로 접근하는 것이 목표이기 때문에 80번 포트로 접근했다. 그리고 내 컴퓨터에서 접근할 포트로 30307번을 작성해 주었다.

그리고 파드에 서비스를 연결하기 위해 selector를 통해 app: php를 지정해주었다.


yaml파일 apply하기

kubectl apply -f deploy.yaml

위 명령어를 통해 deploy.yaml파일 내부에 있는 내용들을 k8s에 적용한다.

이후 올라간 파드를 describe 해보면 다음과 같은 결과가 나온다.
컨테이너가 생성되는데 시간이 조금 걸리기 때문에 아직 running 상태가 아니라면 기다려야 한다.

이후 노드 포트로 뜷어주었던 노드의 IP:30307 로 내 컴퓨터에서 접근하게 되면, PHP서버가 뜬다.


mysql 서버에 접근해서 테스트용 데이터 업로드

kubectl exec -it pod_name -c container_name bash

위 명령어를 통해서 특정 파드의 특정 컨테이너 bash에 접근할 수 있다.
테스트를 위해서 DB에 직접 접근해서 데이터를 올렸다. 1편에 나왔던 테스트 데이터와 동일하게 올렸다.

mysql -uroot -ppass

mysql> create database mochizuki_test;
mysql> use mochizuki_test;
mysql> create table users (id int auto_increment, name varchar(255), primary key(id));
mysql> insert into users (name) values ('ken'), ('taro'), ('yuki');
mysql> exit

mysql 테스트

이후 로컬에서 했던 것과 같이 users_local.php에 접근하면 다음과 같이 나온다.

만약 여기서 이렇게 DB와 정상적으로 연결이 되지 않으면 users_local.php 파일을 수정한다.
파일 내부의 코드를 일부 가져오자면

$pdo = new PDO('mysql:host=localhost;dbname=mochizuki_test', 'root', 'pass');

이 부분에서 DB와의 연결을 진행하는데, localhost가 127.0.0.~에 매핑되어 있지 않으면 찾지 못하는 것 같다.
localhost를 127.0.0.1로 수정해 주면 연결이 될 것이다.

https://velog.io/@dks01972/K8S-%ED%8A%B9%EC%A0%95-%ED%8C%8C%EB%93%9C-%EB%B0%8F-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%A0%91%EC%86%8D-%EC%8B%9C-%EC%98%A4%EB%A5%98-error-dialing-backend-dial-tcp-lookup-podname-on-IP-no-such-host
다른 네트워크 문제로 작성했던 트러블 슈팅 글인데, 쿠버네티스 내부에서 host를 찾지 못하는 문제에 관한 글이다. 아마 비슷한 문제인 것으로 생각된다.

파드 내부 파일을 어떻게 수정할지 모르겠다면

kubectl cp users_local.php podname:/var/www/html/users_local.php -c container_name

이런 식으로 로컬 파일을 파드 내부 특정 컨테이너 내부의 디렉토리에 복사할 수 있으니 참고하자.


이렇게 K8S에 mysql-apache-php를 올려보았는데, 이를 통해 휴대폰 앱에서 데이터를 받아오고 전송할 예정이다.

 
복사했습니다!