5 Commits

Author SHA1 Message Date
eGovFrameSupport
469d8dd7be Update RoleRepository.java 2024-12-17 17:24:20 +09:00
eGovFrameSupport
d3bd11d1af Update StatisticsRepository.java 2024-12-17 17:23:35 +09:00
overpassion
32e2b79015 Merge pull request #30 from junhyeongkim2/README
README.md, README-en.md 디렉토리 구조 수정
2024-10-08 16:54:42 +09:00
jun
65544c4d07 README.md, README-en.md 디렉토리 구조 수정 2024-10-01 19:12:29 +09:00
yongfire38
f082637aac Fix: contribution branch 반영 2024-05-27 17:44:12 +09:00
34 changed files with 353 additions and 541 deletions

View File

@@ -0,0 +1,35 @@
name: 개발가이드 수정 요청 Requesting changes to the development guide
description: 개발가이드 수정 요청하는 템플릿입니다. Template for requesting changes to the dev guide.
title: "[Guide]: "
labels: ["guide"]
assignees:
- overpassion
body:
- type: markdown
attributes:
value: |
시간을 내어 개발가이드 수정 요청을 작성해 주셔서 감사합니다. Thank you for taking the time to fill out a DevGuide correction request. (공유하고 싶은 기술문서나 노하우는 github wiki에 남겨 주세요. If you have any documentation or know-how you'd like to share, please leave it on our github wiki.)
- type: input
id: url
attributes:
label: 개발가이드 URL Dev Guide URL
description: 수정해야할 개발가이드 URL을 적어 주세요. Please write down the dev guide URL that needs to be modified.
placeholder: Example) https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte4.1:fdl:aop:aspectj
validations:
required: true
- type: textarea
id: where-to-amend
attributes:
label: 수정 대상 내용 What to fix
description: 수정해야할 대상 내용을 기입해 주세요. Fill in what you need to fix.
placeholder: 수정해야할 대상은 다음과 같습니다. Here's what you'll need to modify
validations:
required: true
- type: textarea
id: amendment
attributes:
label: 수정 문구 Corrective Wording
description: 어떻게 수정되어야 하는지 적어주세요. Please write down how it should be fixed.
placeholder: 다음과 같이 수정되어야 합니다. It should be modified as follows
validations:
required: true

View File

@@ -3,7 +3,7 @@ description: 오류 내용을 이슈로 등록하는 템플릿입니다. Templat
title: "[Bug]: "
labels: ["bug", "triage"]
assignees:
- rukegithub
- overpassion
body:
- type: markdown
attributes:

View File

@@ -1,9 +1,9 @@
name: 기능 요구 Feature Request
description: 기능 요구 이슈로 등록하는 템플릿입니다. Suggest a new feature for improving eGovFrame.
name: 기능 요구 및 의견 Feature Request
description: 기능 요구나 기타 의견을 이슈로 등록하는 템플릿입니다. Suggest an idea for improving eGovFrame.
title: "[기능요구(Feature)]: "
labels: ["feature"]
assignees:
- rukegithub
- overpassion
body:
- type: markdown
attributes:

View File

@@ -1,55 +0,0 @@
name: 발전 방안 제안 Improvement Plan
description: 발전 방안을 이슈로 등록하는 템플릿입니다. Suggest a new plan for improving eGovFrame.
title: "[발전 방안 제안(Improvement Plan)]: "
labels: ["Improvement"]
assignees:
- yongfire38
body:
- type: markdown
attributes:
value: |
시간을 내어 의견을 작성해 주셔서 감사합니다. Thank you for taking the time to fill out a request.
- type: input
id: idea-name
attributes:
label: 아이디어명 Idea Name
validations:
required: true
- type: textarea
id: idea-summary
attributes:
label: 아이디어 요약 Idea Summary
description: 과제 내용을 300자 이내로 간결하게 요약 및 정의해 주세요 Please summarize and define your content in 300 characters or less
placeholder: 예) 게시판 첨부기능 추가 Example) Adding a bulletin board attachment
validations:
required: true
- type: textarea
id: suggestion-background
attributes:
label: 제안배경 Suggestion Background
description: 아이디어를 제안하게 된 배경 및 필요성을 기술해 주세요. Please describe the background and need for the idea.
placeholder: 아이디어를 제안하게 된 배경은 다음과 같습니다. The background to suggesting the idea is as follows.
validations:
required: true
- type: textarea
id: expectations
attributes:
label: 기대효과 Expectations
description: 아이디어의 실현 가능성과 예상되는 기대효과를 제시하여 주세요. Please describe the expected impact and outcome of the idea.
placeholder: 해당 아이디어의 기대효과는 다음과 같습니다. Here are the expected effects of this idea.
validations:
required: false
- type: textarea
id: free-writing
attributes:
label: 자유기술 Free Writing
description: 추가 기재하고 싶은 항목 및 내용을 자유롭게 기재하여 주세요. Please feel free to add anything else you'd like to include.
validations:
required: false
- type: textarea
id: reference
attributes:
label: 참고문헌 Reference
description: 참고문헌이 있는 경우 작성하여 주세요. If you have references, please include them.
validations:
required: false

View File

@@ -96,25 +96,25 @@ This is the training source code for the Microservices Architecture (MSA) templa
│ │ └─ingress
│ └─portal
│ └─ingress
─environments
├─configmaps
├─databases
│ └─mysql
│ └─init
├─jenkins
├─logging
│ └─elk
│ ├─elasticsearch
│ ├─kibana
│ │ └─ingress
│ └─logstash
├─nfs
├─rabbitmq
│ └─ingress
├─storage
├─vagrant
└─zipkin
└─ingress
─environments
├─configmaps
├─databases
│ └─mysql
│ └─init
├─jenkins
├─logging
│ └─elk
│ ├─elasticsearch
│ ├─kibana
│ │ └─ingress
│ └─logstash
├─nfs
├─rabbitmq
│ └─ingress
├─vagrant
│ └─zipkin
└─ingress
└─storage
```
### Contents

View File

@@ -96,25 +96,25 @@
│ │ └─ingress
│ └─portal
│ └─ingress
─environments
├─configmaps
├─databases
│ └─mysql
│ └─init
├─jenkins
├─logging
│ └─elk
│ ├─elasticsearch
│ ├─kibana
│ │ └─ingress
│ └─logstash
├─nfs
├─rabbitmq
│ └─ingress
├─storage
├─vagrant
└─zipkin
└─ingress
─environments
├─configmaps
├─databases
│ └─mysql
│ └─init
├─jenkins
├─logging
│ └─elk
│ ├─elasticsearch
│ ├─kibana
│ │ └─ingress
│ └─logstash
├─nfs
├─rabbitmq
│ └─ingress
├─vagrant
│ └─zipkin
└─ingress
└─storage
```
### 디렉토리 설명

View File

@@ -3,6 +3,7 @@ package org.egovframe.cloud.apigateway.api;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@@ -24,7 +25,6 @@ import java.util.Locale;
* 수정일 수정자 수정내용
* ---------- -------- ---------------------------
* 2021/08/10 jaeyeolkim 최초 생성
* 2024/09/24 이백행 컨트리뷰션 이클립스 문제(Problems) 해결
* </pre>
*/
@Slf4j

View File

@@ -6,6 +6,8 @@ import org.springframework.boot.web.error.ErrorAttributeOptions;
import org.springframework.boot.web.reactive.error.DefaultErrorAttributes;
import org.springframework.boot.web.reactive.error.ErrorAttributes;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.web.reactive.function.server.ServerRequest;
@@ -29,7 +31,6 @@ import java.util.Map;
* 수정일 수정자 수정내용
* ---------- -------- ---------------------------
* 2021/07/16 jaeyeolkim 최초 생성
* 2024/09/24 이백행 컨트리뷰션 이클립스 문제(Problems) 해결
* </pre>
*/
@Slf4j

View File

@@ -1,76 +1,76 @@
server:
port: 8000
spring:
application:
name: apigateway
cloud:
gateway:
routes:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/user-service/**
filters:
- RemoveRequestHeader=Cookie
- RewritePath=/user-service/(?<segment>.*), /$\{segment}
- id: portal-service
uri: lb://PORTAL-SERVICE
predicates:
- Path=/portal-service/**
filters:
- RewritePath=/portal-service/(?<segment>.*), /$\{segment}
- id: board-service
uri: lb://BOARD-SERVICE
predicates:
- Path=/board-service/**
filters:
- RewritePath=/board-service/(?<segment>.*), /$\{segment}
- id: reserve-item-service
uri: lb://RESERVE-ITEM-SERVICE
predicates:
- Path=/reserve-item-service/**
filters:
- RewritePath=/reserve-item-service/(?<segment>.*), /$\{segment}
- id: reserve-check-service
uri: lb://RESERVE-CHECK-SERVICE
predicates:
- Path=/reserve-check-service/**
filters:
- RewritePath=/reserve-check-service/(?<segment>.*), /$\{segment}
- id: reserve-request-service
uri: lb://RESERVE-REQUEST-SERVICE
predicates:
- Path=/reserve-request-service/**
filters:
- RewritePath=/reserve-request-service/(?<segment>.*), /$\{segment}
- id: openapi
uri: http://localhost:${server.port}
predicates:
- Path=/v3/api-docs/**
filters:
- RewritePath=/v3/api-docs/(?<segment>.*), /$\{segment}/v3/api-docs
default-filters:
- name: GlobalFilter
args:
preLogger: true
postLogger: true
discovery:
locator:
enabled: true
# config server actuator
management:
endpoints:
web:
exposure:
include: refresh, health, beans, info
info:
app:
name: Spring Cloud Gateway
description: API 라우팅 및 보안, 모니터링/메트릭 등의 기능을 간단하고 효과적인 방법으로 제공
swagger-ui: http://localhost:8000/webjars/swagger-ui/index.html?configUrl=/v3/api-docs/swagger-config
messages:
directory: ${user.dir}/msa-attach-volume/messages
server:
port: 8000
spring:
application:
name: apigateway
cloud:
gateway:
routes:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/user-service/**
filters:
- RemoveRequestHeader=Cookie
- RewritePath=/user-service/(?<segment>.*), /$\{segment}
- id: portal-service
uri: lb://PORTAL-SERVICE
predicates:
- Path=/portal-service/**
filters:
- RewritePath=/portal-service/(?<segment>.*), /$\{segment}
- id: board-service
uri: lb://BOARD-SERVICE
predicates:
- Path=/board-service/**
filters:
- RewritePath=/board-service/(?<segment>.*), /$\{segment}
- id: reserve-item-service
uri: lb://RESERVE-ITEM-SERVICE
predicates:
- Path=/reserve-item-service/**
filters:
- RewritePath=/reserve-item-service/(?<segment>.*), /$\{segment}
- id: reserve-check-service
uri: lb://RESERVE-CHECK-SERVICE
predicates:
- Path=/reserve-check-service/**
filters:
- RewritePath=/reserve-check-service/(?<segment>.*), /$\{segment}
- id: reserve-request-service
uri: lb://RESERVE-REQUEST-SERVICE
predicates:
- Path=/reserve-request-service/**
filters:
- RewritePath=/reserve-request-service/(?<segment>.*), /$\{segment}
- id: openapi
uri: http://localhost:${server.port}
predicates:
- Path=/v3/api-docs/**
filters:
- RewritePath=/v3/api-docs/(?<segment>.*), /$\{segment}/v3/api-docs
default-filters:
- name: GlobalFilter
args:
preLogger: true
postLogger: true
discovery:
locator:
enabled: true
# config server actuator
management:
endpoints:
web:
exposure:
include: refresh, health, beans, info
info:
app:
name: Spring Cloud Gateway
description: API 라우팅 및 보안, 모니터링/메트릭 등의 기능을 간단하고 효과적인 방법으로 제공
swagger-ui: http://localhost:8000/webjars/swagger-ui/index.html?configUrl=/v3/api-docs/swagger-config
messages:
directory: ${user.dir}/msa-attach-volume/messages

View File

@@ -1,33 +1,33 @@
server:
port: 0 # random port
spring:
application:
name: board-service
jpa:
hibernate:
ddl-auto: none
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL57Dialect
storage_engine: innodb
format_sql: true
default_batch_fetch_size: 1000
show-sql: true
servlet:
multipart:
enabled: true
max-file-size: 10MB
max-request-size: 50MB
# config server actuator
management:
endpoints:
web:
exposure:
include: refresh, health, beans, info
info:
app:
name: Board Service
description: 게시판관리, 게시물관리, 첨부파일관리 기능을 제공
server:
port: 0 # random port
spring:
application:
name: board-service
jpa:
hibernate:
ddl-auto: none
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL57Dialect
storage_engine: innodb
format_sql: true
default_batch_fetch_size: 1000
show-sql: true
servlet:
multipart:
enabled: true
max-file-size: 10MB
max-request-size: 50MB
# config server actuator
management:
endpoints:
web:
exposure:
include: refresh, health, beans, info
info:
app:
name: Board Service
description: 게시판관리, 게시물관리, 첨부파일관리 기능을 제공

View File

@@ -1,9 +1,8 @@
package org.egovframe.cloud.discovery;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
/**
* org.egovframe.cloud.discovery.SecurityConfig
@@ -21,11 +20,10 @@ import org.springframework.security.web.SecurityFilterChain;
* 수정일 수정자 수정내용
* ---------- -------- ---------------------------
* 2021/06/30 jaeyeolkim 최초 생성
* 2024/09/23 이백행 컨트리뷰션 이클립스 문제(Problems) 해결
* </pre>
*/
@EnableWebSecurity // Spring Security 설정들을 활성화시켜 준다
public class SecurityConfig {
public class SecurityConfig extends WebSecurityConfigurerAdapter {
/**
* 스프링 시큐리티 설정
@@ -33,8 +31,8 @@ public class SecurityConfig {
* @param http
* @throws Exception
*/
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.headers().frameOptions().disable()
@@ -44,7 +42,6 @@ public class SecurityConfig {
.anyRequest().authenticated()
.and()
.httpBasic();
return http.build();
}
}

View File

@@ -1,18 +1,18 @@
spring:
application:
name: reserve-check-service
server:
port: 0
# config server actuator
management:
endpoints:
web:
exposure:
include: refresh, health, beans, info
info:
app:
name: Reserve Check Service
description: 예약시스템 기능 중 예약확인, 예약승인/취소 기능을 제공
spring:
application:
name: reserve-check-service
server:
port: 0
# config server actuator
management:
endpoints:
web:
exposure:
include: refresh, health, beans, info
info:
app:
name: Reserve Check Service
description: 예약시스템 기능 중 예약확인, 예약승인/취소 기능을 제공

View File

@@ -1,18 +1,18 @@
spring:
application:
name: reserve-item-service
server:
port: 0
# config server actuator
management:
endpoints:
web:
exposure:
include: refresh, health, beans, info
info:
app:
name: Reserve Item Service
description: 예약시스템 기능 중 예약지역, 예약물품 관리 기능을 제공
spring:
application:
name: reserve-item-service
server:
port: 0
# config server actuator
management:
endpoints:
web:
exposure:
include: refresh, health, beans, info
info:
app:
name: Reserve Item Service
description: 예약시스템 기능 중 예약지역, 예약물품 관리 기능을 제공

View File

@@ -1,18 +1,18 @@
spring:
application:
name: reserve-request-service
server:
port: 0
# config server actuator
management:
endpoints:
web:
exposure:
include: refresh, health, beans, info
info:
app:
name: Reserve Request Service
description: 예약시스템 기능 중 예약신청 기능을 제공
spring:
application:
name: reserve-request-service
server:
port: 0
# config server actuator
management:
endpoints:
web:
exposure:
include: refresh, health, beans, info
info:
app:
name: Reserve Request Service
description: 예약시스템 기능 중 예약신청 기능을 제공

View File

@@ -30,7 +30,6 @@ import java.util.Collections;
* 수정일 수정자 수정내용
* ---------- -------- ---------------------------
* 2021/06/30 jaeyeolkim 최초 생성
* 2024/09/25 이백행 컨트리뷰션 이클립스 문제(Problems) 해결
* </pre>
*/
@RequiredArgsConstructor
@@ -48,8 +47,7 @@ public class CustomOAuth2UserService implements OAuth2UserService<OAuth2UserRequ
*/
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
// OAuth2UserService delegate = new DefaultOAuth2UserService();
OAuth2UserService<OAuth2UserRequest, OAuth2User> delegate = new DefaultOAuth2UserService();
OAuth2UserService delegate = new DefaultOAuth2UserService();
OAuth2User oAuth2User = delegate.loadUser(userRequest);
// 현재 로그인 진행 중인 서비스를 구분하는 코드(구글 or 네이버..)

View File

@@ -26,10 +26,6 @@ import java.io.Serializable;
*/
@Getter
public class SessionUser implements Serializable {
/**
*
*/
private static final long serialVersionUID = -6319235143325686744L;
private String userName;
private String email;

View File

@@ -70,9 +70,6 @@ public class AuthorizationService extends AbstractService {
* @return Page<AuthorizationListResponseDto> 페이지 인가 목록 응답 DTO
*/
public Page<AuthorizationListResponseDto> findPage(RequestDto requestDto, Pageable pageable) {
if (log.isDebugEnabled()) {
log.debug("requestDto={}", requestDto);
}
return authorizationRepository.findPage(requestDto, pageable);
}

View File

@@ -807,51 +807,51 @@ public class UserService extends AbstractService implements UserDetailsService {
return user.orElse(null);
}
// /**
// * 소셜 사용자 엔티티 조회
// * 등록되어 있지 않은 경우 사용자 등록
// *
// * @param providerCode 공급자 코드
// * @param providerId 공급자 id
// * @param email 이메일
// * @param userName 사용자 명
// * @return UserLoginRequestDto 사용자 로그인 요청 DTO
// */
// private UserResponseDto getAndSaveSocialUser(String providerCode, String providerId, String email, String userName) {
// User user = findSocialUser(providerCode, providerId);
//
// // 이메일로 조회
// // 공급자에서 동일한 이메일을 사용할 수 있고
// // 현재 시스템 구조 상 이메일을 사용자 식별키로 사용하고 있어서 이메일로 사용자를 한번 더 검색한다.
// if (user == null) {
// user = userRepository.findByEmail(email).orElse(null);
//
// // 공급자 id로 조회되지 않지만 이메일로 조회되는 경우 공급자 id 등록
// if (user != null) {
// user.setSocial(providerCode, providerId);
// }
// }
//
// if (user == null) {
// // 사용자 등록
// final String userId = UUID.randomUUID().toString();
// //final String password = makeRandomPassword(); // 임의 비밀번호 생성 시 복호화 불가능
//
// user = User.builder()
// .email(email) // 100byte
// //.encryptedPassword(passwordEncoder.encode(password)) // 100 byte
// .userName(userName)
// .userId(userId)
// .role(Role.USER)
// .userStateCode(UserStateCode.NORMAL.getKey())
// .build();
// user.setSocial(providerCode, providerId);
//
// user = userRepository.save(user);
//
// }
//
// return new UserResponseDto(user);
// }
/**
* 소셜 사용자 엔티티 조회
* 등록되어 있지 않은 경우 사용자 등록
*
* @param providerCode 공급자 코드
* @param providerId 공급자 id
* @param email 이메일
* @param userName 사용자 명
* @return UserLoginRequestDto 사용자 로그인 요청 DTO
*/
private UserResponseDto getAndSaveSocialUser(String providerCode, String providerId, String email, String userName) {
User user = findSocialUser(providerCode, providerId);
// 이메일로 조회
// 공급자에서 동일한 이메일을 사용할 수 있고
// 현재 시스템 구조 상 이메일을 사용자 식별키로 사용하고 있어서 이메일로 사용자를 한번 더 검색한다.
if (user == null) {
user = userRepository.findByEmail(email).orElse(null);
// 공급자 id로 조회되지 않지만 이메일로 조회되는 경우 공급자 id 등록
if (user != null) {
user.setSocial(providerCode, providerId);
}
}
if (user == null) {
// 사용자 등록
final String userId = UUID.randomUUID().toString();
//final String password = makeRandomPassword(); // 임의 비밀번호 생성 시 복호화 불가능
user = User.builder()
.email(email) // 100byte
//.encryptedPassword(passwordEncoder.encode(password)) // 100 byte
.userName(userName)
.userId(userId)
.role(Role.USER)
.userStateCode(UserStateCode.NORMAL.getKey())
.build();
user.setSocial(providerCode, providerId);
user = userRepository.save(user);
}
return new UserResponseDto(user);
}
}

View File

@@ -1,5 +1,6 @@
package org.egovframe.cloud.userservice.api.role;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.egovframe.cloud.userservice.api.role.dto.AuthorizationUpdateRequestDto;
import org.egovframe.cloud.userservice.domain.role.Authorization;

View File

@@ -5,11 +5,14 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.context.MessageSource;
import java.util.Locale;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.TestPropertySource;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@EnableConfigurationProperties

View File

@@ -30,11 +30,6 @@ import java.util.List;
public class RestResponsePage<T> extends PageImpl<T> {
/**
*
*/
private static final long serialVersionUID = -5737360124251098346L;
/**
* Rest 응답 페이지 생성자
*
* @param content 목록

View File

@@ -1,77 +0,0 @@
# Deploy services on Kubernetes
In Kubernetes, the service consists of two components,
1. Environments
2. Applications
And you can choose the storage in the application either NFS or Cinder provided by Openstack(used by [Pasta](http://paas-ta.kr))
# Prerequisites
## Install kustomize
If you are using kubectl 1.14 or later, it embeded kustomize. So please ignore this section.
I recommend that you install the latest version of [kubectl](https://kubectl.docs.kubernetes.io/installation/kubectl/) for your cluster instead of installing kustomize.
Even so, if you want to use kustomize, refer to [official kustomize doc](https://kustomize.io/).
# Deploy service
You must follow deployment order.
## Deploy environments
```sh
$ kustomize build k8s/environments | kubectl apply -f -
```
or if you are using the kubectl only,
```sh
$ kubectl apply -k k8s/environments
```
## Deploy applications
If you want to use NFS as a main storage,
```sh
$ kustomize build k8s/stoage/nfs | kubectl apply -f -
```
or
```sh
$ kubectl apply -k k8s/stoage/nfs
```
In case of using Openstack storage(CINDER) as a main storage,
```sh
$ kustomize build k8s/stoage/openstack | kubectl apply -f -
```
or
```sh
$ kubectl apply -k k8s/stoage/openstack
```
# Shutdown service
Simply apply deployment in reverse order.
If you are using nfs,
```sh
$ kustomize build k8s/environments | kubectl delete -f -
$ kustomize build k8s/stoage/nfs | kubectl delete -f - --wait
```
or
```sh
$ kubectl delete -k k8s/environments
$ kubectl delete -k k8s/stoage/nfs --wait
```
The case of openstack is similar, so it is omitted.

View File

@@ -1,77 +1,77 @@
# Kubernetes에서 서비스 배포
# Deploy services on Kubernetes
Kubernetes에서 서비스는 두 가지 구성 요소로 이루어져 있습니다.
In Kubernetes, the service consists of two components,
1. 환경 (Environments)
2. 애플리케이션 (Applications)
1. Environments
2. Applications
그리고 애플리케이션에서 사용할 스토리지를 선택할 수 있으며, NFS 또는 Openstack이 제공하는 Cinder를 사용할 수 있습니다(이 경우 [PaaS-TA](http://paas-ta.kr)를 사용).
And you can choose the storage in the application either NFS or Cinder provided by Openstack(used by [Pasta](http://paas-ta.kr))
# 사전 준비 {#prerequisites}
# Prerequisites
## kustomize 설치 {#install-kustomize}
## Install kustomize
kubectl 1.14 이상을 사용하고 있다면, kustomize가 내장되어 있으므로 이 섹션을 무시해도 됩니다.
대신 클러스터에서 최신 버전의 [kubectl](https://kubectl.docs.kubernetes.io/installation/kubectl/)을 설치하는 것을 권장합니다.
그럼에도 불구하고 kustomize를 사용하고 싶다면, [공식 kustomize 문서](https://kustomize.io/)를 참고하세요.
If you are using kubectl 1.14 or later, it embeded kustomize. So please ignore this section.
I recommend that you install the latest version of [kubectl](https://kubectl.docs.kubernetes.io/installation/kubectl/) for your cluster instead of installing kustomize.
Even so, if you want to use kustomize, refer to [official kustomize doc](https://kustomize.io/).
# 서비스 배포 {#deploy-service}
# Deploy service
배포 순서를 따라야 합니다.
You must follow deployment order.
## 환경 배포 {#deploy-environments}
## Deployenvironments
```sh
$ kustomize build k8s/environments | kubectl apply -f -
```
혹은 kubectl만 사용하는 경우,
or if you are using the kubectl only,
```sh
$ kubectl apply -k k8s/environments
```
## 애플리케이션 배포 {#deploy-applications}
## Deploy applications
NFS를 메인 스토리지로 사용하려면,
If you want to use NFS as a main storage,
```sh
$ kustomize build k8s/stoage/nfs | kubectl apply -f -
```
혹은
or
```sh
$ kubectl apply -k k8s/stoage/nfs
```
Openstack의 스토리지(CINDER)를 메인 스토리지로 사용하는 경우,
In case of using Openstack storage(CINDER) as a main storage,
```sh
$ kustomize build k8s/stoage/openstack | kubectl apply -f -
```
혹은
or
```sh
$ kubectl apply -k k8s/stoage/openstack
```
## 서비스 종료 {#shutdown-service}
# Shutdown service
단순히 배포 순서를 반대로 적용하면 됩니다.
Simply apply deployment in reverse order.
NFS를 사용하는 경우,
If you are using nfs,
```sh
$ kustomize build k8s/environments | kubectl delete -f -
$ kustomize build k8s/stoage/nfs | kubectl delete -f - --wait
```
혹은
or
```sh
$ kubectl delete -k k8s/environments
$ kubectl delete -k k8s/stoage/nfs --wait
```
Openstack의 경우도 비슷하므로 생략합니다.
The case of openstack is similar, so it is omitted.

View File

@@ -1,19 +0,0 @@
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
labels:
env: production
tier: database
app: mysql
name: mysql-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
persistentVolumeReclaimPolicy: Retain
nfs:
path: /srv/nfs
server: 192.168.56.21

View File

@@ -32,7 +32,7 @@ spec:
- "-c"
- |
set -ex
[[ $HOSTNAME =~ -([0-9]+)$ ]] || exit 1
[[ `hostname` =~ -([0-9]+)$ ]] || exit 1
ordinal=${BASH_REMATCH[1]}
echo [mysqld] > /mnt/conf.d/server-id.cnf
echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf

View File

@@ -0,0 +1,18 @@
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: jenkins-ingress
labels:
env: production
tier: cicd
app: jenkins
name: jenkins-ingress
spec:
rules:
- host: <젠킨스 도메인> # TODO
http:
paths:
- path: /
backend:
serviceName: jenkins
servicePort: 8080

View File

@@ -1,20 +0,0 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: jenkins-ingress
labels:
env: production
tier: cicd
app: jenkins
spec:
rules:
- host: <Jenkins 도메인> # TODO
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: jenkins
port:
number: 8080

View File

@@ -1,4 +0,0 @@
apiVersion: v1
kind: Namespace
metadata:
name: jenkins

View File

@@ -1,19 +0,0 @@
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins-pv
labels:
env: production
tier: cicd
app: jenkins
name: jenkins-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
persistentVolumeReclaimPolicy: Retain
nfs:
path: /srv/nfs
server: 192.168.56.21

View File

@@ -1,15 +0,0 @@
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: jenkins
name: jenkins-role
rules:
- apiGroups: ["networking.k8s.io"]
resources: ["ingresses"]
verbs: ["get", "create", "update", "delete"]
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "create", "update", "delete"]
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "create", "update", "delete", "patch"]

View File

@@ -1,13 +0,0 @@
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: jenkins
name: jenkins-rolebinding
subjects:
- kind: ServiceAccount
name: jenkins
namespace: default
roleRef:
kind: Role
name: jenkins-role
apiGroup: rbac.authorization.k8s.io

View File

@@ -1,4 +1,4 @@
apiVersion: networking.k8s.io/v1
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: kibana-ingress
@@ -6,15 +6,13 @@ metadata:
env: production
tier: logging
app: kibana
name: kibana-ingress
spec:
rules:
- host: <ELK Kibana 도메인> # TODO
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kibana
port:
number: 5601
serviceName: kibana
servicePort: 5601

View File

@@ -1,4 +1,4 @@
apiVersion: networking.k8s.io/v1
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: rabbitmq-ingress
@@ -6,15 +6,13 @@ metadata:
env: production
tier: backend
app: rabbitmq
name: rabbitmq-ingress
spec:
rules:
- host: <RabbitMQ 도메인> # TODO
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: rabbitmq
port:
number: 15672
serviceName: rabbitmq
servicePort: 15672

View File

@@ -1,4 +1,4 @@
apiVersion: networking.k8s.io/v1
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: zipkin-ingress
@@ -6,16 +6,13 @@ metadata:
env: production
tier: backend
app: zipkin
name: zipkin-ingress
spec:
rules:
- host: <Zipkin 도메인> # TODO
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: zipkin
port:
number: 9411
serviceName: zipkin
servicePort: 9411