[k8s] MSA 실습 1

이정훈·2023년 4월 27일
0

k8s

목록 보기
11/17
post-thumbnail

실습자료 !

RabbitMQ

configmap

apiVersion: v1
kind: ConfigMap
metadata:
  name: rabbitmq-cm
data:
  RABBITMQ_DEFAULT_VHOST: "my_vhost"
  RABBITMQ_DEFAULT_USER: "user"
  RABBITMQ_DEFAULT_PASS: "qwer1234"

deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: rabbitmq-deployment
spec:
  selector:
    matchLabels:
      type: rabbitmq
  replicas: 1
  template:
    metadata:
      labels:
        type: rabbitmq
    spec:
      containers:
      - name: rabbitmq
        image: rabbitmq:latest
        envFrom:
        - configMapRef:
            name: rabbitmq-cm
  • 생성된 파드에서 터미널 접속해서 plugin 해주기
    rabbitmq-plugins enable rabbitmq_management

service

apiVersion: v1
kind: Service
metadata:
  name: rabbitmq-svc
spec:
  selector:
    type: rabbitmq
  ports:
  - port: 5672
    name: message-que
    targetPort: 5672
  - port: 15672
    name: dashboard
    targetPort: 15672
  type: LoadBalancer
  • 5672는 내부에서 작동
  • 15672는 대쉬보드 접속용

admin

configmap

admin-db

apiVersion: v1
kind: ConfigMap
metadata:
  name: admin-db-cm
data:
  MYSQL_ROOT_PASSWORD: 'qwer1234'
  MYSQL_DATABASE: 'admin-db'
  • MYSQL_DATABASE: 'admin-db' 이렇게 설정해주면 db생성할 때 이 환경변수를 사용하면서 admin-db database를 생성해준다.

admin

apiVersion: v1
kind: ConfigMap
metadata:
  name: admin-cm
data:
  DBNAME: "admin-db"
  DBUSER: "root"
  DBPASS: "qwer1234"
  DBHOST: "127.0.0.1"
  DBPORT: "3306"
  RABBITMQURL: "amqp://user:qwer1234@rabbitmq-svc/my_vhost"
  • DBHOST: "127.0.0.1" 파드안에서는 자기들의 로컬호스트 IP를 사용하니깐, 근데 이 친구들은 포트번호로 통신하도록 설정

deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: admin-deployment
spec:
  selector:
    matchLabels:
      type: admin
  replicas: 1
  template:
    metadata:
      labels:
        type: admin
    spec:
      nodeSelector:
        kubernetes.io/hostname: node-01
      containers:
      - name: admin-db
        image: mysql:8.0.32-debian
        volumeMounts:
        - name: admin-db
          mountPath: /var/lib/mysql
        envFrom:
        - configMapRef:
            name: admin-db-cm
      - name: admin
        image: ddarahakit2023/admin:1.0
        startupProbe:
          tcpSocket:
            port: 8000
          initialDelaySeconds: 10
          periodSeconds: 10
        command: ["python", "manage.py", "runserver", "0.0.0.0:8000"]
        volumeMounts:
        - name: admin-path
          mountPath: /app
        envFrom:
        - configMapRef:
            name: admin-cm
      - name: admin-consumer
        image: ddarahakit2023/admin:1.0
        command: ["python", "-u", "consumer.py"]
        volumeMounts:
        - name: admin-path
          mountPath: /app
        envFrom:
        - configMapRef:
            name: admin-cm
      volumes:
      - name : admin-path
        hostPath:
          path: /admin-app
          type: DirectoryOrCreate
      - name : admin-db
        hostPath:
          path: /admin-db
          type: DirectoryOrCreate
  • nodeSelector:
    kubernetes.io/hostname: node-01 지정해 줬다.
  • volum을 한 노드에 설정해 놓고 재실행하더라도 파일들이 변경되지 않으니깐,
  • configmap과 연동될 수 있도록 수정 후, import os를 해줘야한다!
vi /admin-app/consumer.py
	params = pika.URLParameters(os.environ["RABBITMQURL"])
    
vi /admin-app/admin/settings.py
	'NAME': os.environ["DBNAME"],
	'USER': os.environ["DBUSER"],	
    'PASSWORD': os.environ["DBPASS"],
	'HOST': os.environ["DBHOST"],
	'PORT': os.environ["DBPORT"],
    
vi /admin-app/products/producer.py
	params = pika.URLParameters(os.environ["RABBITMQURL"])

service

apiVersion: v1
kind: Service
metadata:
  name: admin-svc
spec:
  selector:
    type: admin
  ports:
  - port: 8000
    targetPort: 8000
  type: LoadBalancer

main

configmap

main-db

apiVersion: v1
kind: ConfigMap
metadata:
  name: main-db-cm
data:
  MYSQL_ROOT_PASSWORD: 'qwer1234'
  MYSQL_DATABASE: 'main-db'

main

apiVersion: v1
kind: ConfigMap
metadata:
  name: main-cm
data:
  DBNAME: "main-db"
  DBUSER: "root"
  DBPASS: "qwer1234"
  DBHOST: "127.0.0.1"
  DBPORT: "3306"
  RABBITMQURL: "amqp://user:qwer1234@rabbitmq-svc/my_vhost"
  MYSQLURL: "mysql://root:qwer1234@127.0.0.1/main-db"
  ADMIN_SVC: "admin-svc"
  • MYSQLURL: "mysql://root:qwer1234@127.0.0.1/main-db"
    통신할 친구들
  • ADMIN_SVC: "admin-svc"
    좋아요 기능을 사용할 친구들

    deployment

    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: main-deployment
    spec:
     selector:
       matchLabels:
         type: main
     replicas: 1
     template:
       metadata:
         labels:
           type: main
       spec:
         nodeSelector:
           kubernetes.io/hostname: node-02
         containers:
         - name: main-db
           image: mysql:8.0.32-debian
           volumeMounts:
           - name: main-db
             mountPath: /var/lib/mysql
           envFrom:
           - configMapRef:
               name: main-db-cm
         - name: main
           image: ddarahakit2023/main:1.3
           startupProbe:
             tcpSocket:
               port: 5000
             initialDelaySeconds: 10
             periodSeconds: 10
           command: ["python", "main.py"]
           volumeMounts:
           - name: main-path
             mountPath: /app
           envFrom:
           - configMapRef:
               name: main-cm
         - name: main-consumer
           image: ddarahakit2023/main:1.3
           command: ["python", "-u", "consumer.py"]
           volumeMounts:
           - name: main-path
             mountPath: /app
           envFrom:
           - configMapRef:
               name: main-cm
         volumes:
         - name : main-path
           hostPath:
             path: /main-app
             type: DirectoryOrCreate
         - name : main-db
           hostPath:
             path: /main-db
             type: DirectoryOrCreate
  • nodeSelector:
    kubernetes.io/hostname: node-02 지정해 줬다.
  • volum을 한 노드에 설정해 놓고 재실행하더라도 파일들이 변경되지 않으니깐,
  • configmap과 연동될 수 있도록 수정 후, import os를 해줘야한다!
vi main-app/consumer.py
	params = pika.URLParameters(os.environ["RABBITMQURL"])
    
vi main-app/main.py
    app.config["SQLALCHEMY_DATABASE_URI"] = os.environ["MYSQLURL"]
    app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
	req = requests.get('http://'+os.environ["ADMIN_SVC"]+':8000/api/user')
    
vi main-app/producer.py  
    params = pika.URLParameters(os.environ["RABBITMQURL"])

vi main-app/requirements.txt
	Werkzeug==0.16.0
	itsdangerous==2.0.1
	Jinja2==3.0.3

service

apiVersion: v1
kind: Service
metadata:
  name: main-svc
spec:
  selector:
    type: main
  ports:
  - port: 5000
    targetPort: 5000
  type: LoadBalancer

  • 데이터를 넣어놔서 연결되어 있는 것을 확인 할 수 있다.admin에서 입력하기 전까지 원래는 아무것도 없다.

  • 확인을 하고 싶지만 RabbiMQ 와 연결이 계속 끊기고 있다..


  • id:9 이 같이 올라간 것을 확인할 수 있다.
  • admin 에서 User 추가해 주고 좋아요가 올라가는 것을 확인
    INSERT INTO products_user VALUES(1);

  • postman으로 실행하였고 main에서 좋아요를 post 여러번 눌러주면 admind에서 likes가 올라간 것을 확인할 수 있다.
profile
싱숭생숭늉

0개의 댓글