본문 바로가기

프로젝트 & TIL/일별 공부 기록 (백엔드 스쿨)

71일차 - 쿠버네티스 NodePort, MariaDB, 포트 포워딩

NodePort

- 클라이언트 IP + 외부 포트

  • kubectl expose deployment/webserver-hello --type="NodePort" --port 8080 --target-port=80 --name=webserver-hello-node-port : NodePort 서비스 연결
  • kubectl edit service webserver-hello-node-port > sessionAffinity: None에서 ClientIP로 수정
  • kubectl get service webserver-hello-node-port -o yaml : 수정되었는지 확인
  • 서비스IP:8080 : 접속되는지 확인
  • NCP > ACG 설정 > 0.0.0.0/0 IP, 30000-32767 포트를 추가해준다.
  • 크롬에서 http://공인IP:할당받은_포트번호 : 외부에서도 접속되는지 확인

서비스는 라벨을 통해 파드를 찾는다.

  • kubectl get service 서비스_이름 -o yaml : selector 항목 조회
  • kubectl get pods -o json : labels 항목 조회

MariaDB 설치

  • mkdir -p /kube/mariadb-1 : 폴더 생성
  • cd /kube/mariadb-1 : 폴더로 이동
  • echo -n '비밀번호' | base64 : 비밀번호를 base64 인코딩
  • vi mariadb-1.yaml : 아래와 같이 입력
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mariadb-1-deployment
spec:
  selector:
    matchLabels:
      app: mariadb-1
  template:
    metadata:
      labels:
        app: mariadb-1
    spec:
      nodeSelector: # 추가
        kubernetes.io/hostname: k8s-1-002 # k8s-1-002 노드에 MariaDB 파드 생성
      containers:
      - image: mariadb:10.11
        name: mariadb-1
        ports:
        - containerPort: 3306
          name: mariadb-1
        volumeMounts: # 마운트
        - name: vol
          mountPath: /etc/mysql/conf.d
          subPath: etc/mysql/conf.d
        - name: vol
          mountPath: /var/lib/mysql
          subPath: var/lib/mysql
        - name: vol
          mountPath: /run/mysqld
          subPath: run
        env:
        - name: TZ
          value: "Asia/Seoul"
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mariadb-1-secret
              key: password
      volumes:
      - name: vol
        hostPath:
          path: /data/k8s-1-002/mariadb-1 # path 지정
          type: DirectoryOrCreate # 위의 path에 해당하는 폴더가 없으면 만들어준다.

---

apiVersion: v1
kind: Service # 서비스도 바로 생성
metadata:
  name: mariadb-1-service
spec:
  ports:
  - port: 3306
  selector:
    app: mariadb-1

---

apiVersion: v1
kind: Secret
metadata:
  name: mariadb-1-secret
data:
  password: # base64 인코딩한 비밀번호 입력
  • kubectl apply -f mariadb-1.yaml : 입력한 내용 적용
  • kubectl exec -it MariaDB_파드_이름 -- mysql -u root -p : 비밀번호 입력하면 MariaDB에 접속됨
  • GRANT ALL PRIVILEGES ON *.* TO 사용자명@`%` IDENTIFIED BY '비밀번호'; : 계정 생성
  • exit

내 서비스 도메인으로 포워딩

- 포워딩 준비 작업

  • mkdir -p /data/k8s-1-001/nginx-proxy-manager-1/data/nginx/custom
  • echo "resolver 127.0.0.1  valid=10s;" > /data/k8s-1-001/nginx-proxy-manager-1/data/nginx/custom/server_proxy.conf
  • echo "resolver 127.0.0.1  valid=10s;" > /data/k8s-1-001/nginx-proxy-manager-1/data/nginx/custom/server_stream.conf

  

  • MariaDB 접속 > CREATE DATABASE nginx; : nginx DB 생성
  • mkdir -p /kube/nginx-proxy-manager-1 : 폴더 생성
  • cd /kube/nginx-proxy-manager-1 : 폴더로 이동
  • vi nginx-proxy-manager-1.yaml : 아래와 같이 입력
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-proxy-manager-1-deployment
spec:
  selector:
    matchLabels:
      app: nginx-proxy-manager-1
  template:
    metadata:
      labels:
        app: nginx-proxy-manager-1
    spec:
      nodeSelector: # 추가
        kubernetes.io/hostname: k8s-1-001 # k8s-1-001 노드에 파드 생성
      tolerations:
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
      containers:
      - image: jc21/nginx-proxy-manager:latest
        name: nginx-proxy-manager-1
        ports:
        - containerPort: 3306
          hostPort: 3306
        - containerPort: 443
          hostPort: 443
        - containerPort: 80
          hostPort: 80
        - containerPort: 81
          hostPort: 81
        env:
        - name: TZ
          value: "Asia/Seoul"
        - name: DB_MYSQL_HOST
          value: "mariadb-1-service"
        - name: DB_MYSQL_PORT
          value: "3306"
        - name: DB_MYSQL_USER
          value: "lldjlocal"
        - name: DB_MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mariadb-1-secret
              key: password
        - name: DB_MYSQL_NAME
          value: "nginx"
        volumeMounts:
        - name: vol
          mountPath: /data
          subPath: data
        - name: vol
          mountPath: /etc/letsencrypt
          subPath: etc/letsencrypt
      - image: "janeczku/go-dnsmasq:release-1.0.7" # 포워딩을 위해 추가해주어야 함
        name: dnsmasq
        args:
          - --listen
          - "127.0.0.1:53"
          - --default-resolver
          - --append-search-domains
          - --hostsfile=/etc/hosts
          - --verbose
      volumes:
      - name: vol
        hostPath:
          path: /data/k8s-1-001/nginx-proxy-manager-1
          type: DirectoryOrCreate
  • kubectl apply -f nginx-proxy-manager-1.yaml : 위 내용 적용
  • curl k8s-1-001:81 : 접속 확인
  • 크롬에서 http://내_서비스_도메인:81 접속하여 NPM 뜨는지 확인
  • NPM 로그인하여 3306 포트를 올바른 서비스로 토스하도록 설정