Search
Duplicate

전체적인 구조도

위의 전체 구조도에서 price-service, price producer, chat-service, redis, news-service, news-db가 만들어져있음

상세 서비스

1.
가격 서비스
apiVersion: v1 kind: Service metadata: name: price-service spec: ports: - port: 8080 targetPort: 8080 name: client selector: app: price
JavaScript
복사
서비스의 yaml 파일은 위와 같이 작성한다.
외부에 노출할 포트를 정하고, selector에 app: price를 적용한다.
apiVersion: apps/v1 kind: ReplicaSet metadata: name: price spec: # 케이스에 따라 레플리카를 수정한다. replicas: 5 selector: matchLabels: app: price template: metadata: labels: app: price spec: containers: - name: container1 image: {이미지 명} env: # 환경 변수 정의 - name: SERVER_PORT valueFrom: configMapKeyRef: name: price-config # 이 값의 컨피그맵. key: server_port # 가져올 키. # 환경 변수 정의 ... ports: - containerPort: 8080 imagePullSecrets: - name: registry
JavaScript
복사
service에 묶일 pod들을 replicaset으로 만들어놓음
그리고 configmap 에서 필요한 환경변수를 가져오게 설정함
apiVersion: v1 kind: ConfigMap metadata: name: price-config data: server_port : "8080" ...
JavaScript
복사
위와 같이 configmap을 작성한다
2.
producer 서비스
##### priceservice replica set apiVersion: apps/v1 kind: ReplicaSet metadata: name: quote spec: # 케이스에 따라 레플리카를 수정한다. replicas: 1 selector: matchLabels: app: quote template: metadata: labels: app: quote spec: containers: - name: container1 image: {이미지 명} env: # 환경 변수 정의 - name: SERVER_PORT valueFrom: configMapKeyRef: name: quote-config # 이 값의 컨피그맵. key: server_port # 가져올 키. # 환경 변수 정의 ... ports: - containerPort: 8080 imagePullSecrets: - name: registry
JavaScript
복사
매한가지로 replicaset을 작성을 해주고,
apiVersion: v1 kind: Service metadata: name: quote-service spec: ports: - port: 8080 targetPort: 8080 name: client selector: app: quote
JavaScript
복사
pod를 묶어주는 service를 작성한다.
4.
kafka
echo ' apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: version: 3.1.0 replicas: 3 listeners: - name: plain port: 9092 type: internal tls: false - name: tls port: 9093 type: internal tls: true ... ' | kubectl -n kafka apply -f -
JavaScript
복사
kafka는 맨바닥에서부터 구현하지는 않았다.
위의 링크에 들어가보면 어떤식으로 작성해야 kafka 파드를 띄울수 있는지 명시를 해놨기 때문에 그대로 참고해서 운영했다.
5.
redis
채팅을 broadcast하기 위해 redis를 사용한다.
--- apiVersion: apps/v1 kind: StatefulSet metadata: name: redis-cluster spec: podManagementPolicy: OrderedReady # default serviceName: redis-cluster replicas: 3 selector: matchLabels: app: redis-cluster # has to match .spec.template.metadata.labels template: metadata: labels: app: redis-cluster name: redis-cluster ...
JavaScript
복사
위의 yaml 파일 또한 github를 참고했다.
6.
도커 이미지를 pull 하기 위한 secret
apiVersion: v1 kind: Secret metadata: name: registry data: .dockercfg: '' type: kubernetes.io/dockercfg
JavaScript
복사
7.
mongodb
데이터를 저장하기 위해서 mongodb를 선택했다.
apiVersion: v1 kind: PersistentVolume metadata: name: mongo-data spec: accessModes: - ReadWriteOnce capacity: storage: 20Gi hostPath: path: /data/mongo
JavaScript
복사
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc spec: storageClassName: "" accessModes: - ReadWriteOnce volumeName: mongo-data resources: requests: storage: 20Gi
JavaScript
복사
apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: mongo name: mongo spec: replicas: 1 selector: matchLabels: app: mongo strategy: {} template: metadata: creationTimestamp: null labels: app: mongo spec: containers: - image: mongo:5.0.11 name: mongo args: ["--dbpath","/data/db"] livenessProbe: exec: command: - mongo - --disableImplicitSessions - --eval - "db.adminCommand('ping')" initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 6 readinessProbe: exec: command: - mongo - --disableImplicitSessions - --eval - "db.adminCommand('ping')" initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 6 env: - name: MONGO_INITDB_ROOT_USERNAME value: "" # valueFrom: # secretKeyRef: # name: mongo-creds # key: username - name: MONGO_INITDB_ROOT_PASSWORD value: "" # valueFrom: # secretKeyRef: # name: mongo-creds # key: password volumeMounts: - name: "mongo-data-dir" mountPath: "/data/db" volumes: - name: "mongo-data-dir" persistentVolumeClaim: claimName: "pvc"
JavaScript
복사
mongodb를 운영하기 위해 pv와 pvc 그리고 deployment를 이용해서 배포를 했다.
개선해야할점
1.
replicaset을 deployment로 변경하긴해야함
2.
cronjob을 적용하지 못하고 있음
a.
주기적으로 크롤링을 하는 것을 cronjob으로 돌려보려고 했으나 mongodb와의 연결이슈가 있어서 해결하는중에 있음
3.
helm chart를 이용해보면 좋을거같음