์ด ๋ฌธ์„œ๋Š” GitHub ์ €์žฅ์†Œ์— ์žˆ๋Š” Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์ ํŠธ๋ฅผ Docker Image๋กœ ๋นŒ๋“œํ•˜๊ณ , SoftLayer Baremetal์— ์„ค์น˜๋œ CoreOS ์ƒ์— Docker Container๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๊ณผ์ •์— ๋Œ€ํ•˜์—ฌ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.


Step 1. Baremetal ์„œ๋ฒ„ ์ฃผ๋ฌธ


CoreOS๋Š” Docker ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๊ธฐ์— ์ตœ์ ํ™” ๋œ ๊ฒฝ๋Ÿ‰ Linux ๋ฐฐํฌํŒ์ž…๋‹ˆ๋‹ค. SoftLayer์—์„œ๋Š” Debian์ด๋‚˜ CentOS ์™ธ์—๋„ CoreOS๋ฅผ ๊ธฐ๋ณธ ์šด์˜์ฒด์ œ๋กœ์„œ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
SoftLayer ์›น์‚ฌ์ดํŠธ(http://control.softlayer.com)์— ์ ‘์†ํ•˜์—ฌ Baremetal ์„œ๋ฒ„๋ฅผ ์ฃผ๋ฌธํ•ฉ๋‹ˆ๋‹ค. ์šด์˜์ฒด์ œ๋Š” CoreOS๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

[Baremetal Server๋ฅผ ์„ ํƒ]

Cap 2017-02-28 16-04-24-393

[Operation System์„ CoreOS๋กœ ์„ ํƒ]

2

[์ฃผ๋ฌธ์‚ฌํ•ญ ํ™•์ธ]

3
๋งˆ์ง€๋ง‰ ํ™”๋ฉด์—์„œ ์„œ๋ฒ„์˜ ๊ธฐํƒ€ ์ŠคํŽ™์ •๋ณด ๋ฐ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๊ณ  ์„œ๋ฒ„ ๋ฐฐํฌ๋ฅผ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

SoftLayer ํฌํ„ธ(https://control.softlayer.com/)์˜ Devices > Device List ๋ฉ”๋‰ด์— ์ ‘์†ํ•˜์—ฌ ์ฃผ๋ฌธํ•œ Baremetal ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ ‘์† ์ •๋ณด๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
ํฌํ„ธ ํ™”๋ฉด์—์„œ๋Š” ๊ณ„์ •์˜ Username์ด root๋กœ ํ‘œ์‹œ๋˜์ง€๋งŒ ssh๋กœ ์ ‘์† ์‹œ์—๋Š” core๋กœ ์ž…๋ ฅํ•˜์—ฌ ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.


Step 2. ์›๊ฒฉ ์ œ์–ด ์„ค์ •

Bluemix์—์„œ CoreOS ์„œ๋ฒ„๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์›๊ฒฉ ์ œ์–ด ์„ค์ •์„ ํ•ฉ๋‹ˆ๋‹ค.
Docker์˜ ์›๊ฒฉ ์ œ์–ด๋Š” TLS๋ฅผ ํ†ตํ•œ TCP ์†Œ์ผ“์„ ํ†ตํ•˜์—ฌ ์ด๋ฃจ์–ด์ง€๋Š”๋ฐ ํด๋ผ์ด์–ธํŠธ์˜ ์ธ์ฆ์€ TLS ๊ณ„์ธต์—์„œ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋ฅผ ํ†ตํ•˜์—ฌ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

  • ์ธ์ฆ์„œ ์ƒ์„ฑ
  • ์•„๋ž˜์™€ ๊ฐ™์ด docker ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ƒ์„ฑํ•œ ์ธ์ฆ์„œ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. Docker ๋ช…๋ น์€ root๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํŽธ์˜์ƒ ์•„๋ž˜์™€ ๊ฐ™์ด sudo su ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ ํ›„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    [su_note note_color=”#f0f0ef”] $ sudo su
    $ mkdir /etc/docker
    $ openssl req -x509 -newkey rsa:4096 -keyout ca.key -out ca.cer -days 365 -nodes
    $ cp ca.cer /etc/docker/
    [/su_note]

    Cap 2017-02-28 10-41-55-036

  • ์„œ๋ฒ„ ์ธ์ฆ์„œ ์ƒ์„ฑ
  • ์„œ๋ฒ„์˜ ๊ฐœ์ธํ‚ค(server.key)์™€ ์„œ๋ช… ์š”์ฒญ(server.csr) ์ƒ์„ฑ

    [su_note note_color=”#f0f0ef”] $ openssl req -out server.csr -new -newkey rsa:2048 -nodes -keyout server.key
    [/su_note]

    ์„œ๋ช… ์š”์ฒญ์— ๋Œ€ํ•ด ์ธ์ฆ๊ธฐ๊ด€ ์ธ์ฆ์„œ๋กœ ์„œ๋ช…ํ•˜์—ฌ ์„œ๋ฒ„ ์ธ์ฆ์„œ(server.cer) ์ƒ์„ฑ ๋ฐ ์„œ๋ฒ„ ์ธ์ฆ์„œ ๋ณต์‚ฌ
    [su_note note_color=”#f0f0ef”] $ echo subjectAltName = IP:์„œ๋ฒ„IP์ฃผ์†Œ > extfile.cnf
    $ openssl x509 -req -in server.csr -CA ca.cer -CAkey ca.key -out server.cer -days 365 โ€“CAcreateserial -extfile extfile.cnf
    $ cp server.* /etc/docker
    [/su_note]

  • ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ ์ƒ์„ฑ
  • Bluemix DevOps์—์„œ ์‚ฌ์šฉํ•  ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค

    [su_note note_color=”#f0f0ef”] $ openssl req -out client.csr -new -newkey rsa:2048 -nodes -keyout client.key
    [/su_note]

    ์„œ๋ช… ์š”์ฒญ์— ๋Œ€ํ•ด ์ธ์ฆ๊ธฐ๊ด€ ์ธ์ฆ์„œ๋กœ ์„œ๋ช…ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ(client.cer) ์ƒ์„ฑ
    [su_note note_color=”#f0f0ef”] $ openssl x509 -req -in client.csr -CA ca.cer -CAkey ca.key -out client.cer -days 365 -CAcreateserial
    [/su_note]

    ์œ„์™€ ๊ฐ™์ด ๋งŒ๋“ค์–ด์ง„ ์ธ์ฆ์„œ ์ •๋ณด๋Š” Bluemix DevOps์— ์ ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • Docker ์„œ๋น„์Šค์˜ TCP ์†Œ์ผ“ ์„ค์ •
  • ๊ธฐ๋ณธ์ ์œผ๋กœ CoreOS์˜ Docker ์„œ๋น„์Šค๋Š” Unix ์†Œ์ผ“์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. TCP ์†Œ์ผ“์„ Unix ์†Œ์ผ“์œผ๋กœ ๋ฐ”์ธ๋”ฉ ํ•ด์ฃผ๋Š” ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์™ธ๋ถ€์—์„œ TCP ์†Œ์ผ“์„ ํ†ตํ•˜์—ฌ Docker๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    [su_note note_color=”#f0f0ef”] $ vi /etc/systemd/system/docker-tls-tcp.socket
    [/su_note] [su_note] [Unit]

    Description=Docker Secured Socket for the API

    [Socket]

    ListenStream=8443
    BindIPv6Only=both
    Service=docker.service

    [Install]

    WantedBy=sockets.target
    [/su_note]

    8443๋ฒˆ ํฌํŠธ๊ฐ€ docker.service์— ์ •์˜๋œ /var/run/docker.sock Unix ์†Œ์ผ“์— ์—ฐ๊ฒฐ๋˜๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    ์„ค์ •ํ•œ ๋‚ด์šฉ์ด ์ ์šฉ๋˜๋„๋ก ์•„๋ž˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    [su_note note_color=”#f0f0ef”] $ systemctl enable docker-tls-tcp.socket
    $ systemctl stop docker
    $ systemctl start docker-tls-tcp.socket
    $ systemctl start docker
    [/su_note]

  • Docker TLS ์ธ์ฆ ์„ค์ •
  • ์ด์ „ ๊ณผ์ •์—์„œ ๋งŒ๋“ค์–ด์ง„ ์†Œ์ผ“์— ๋Œ€ํ•ด Docker๊ฐ€ TLS๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    ์œ„์™€ ๊ฐ™์€ ์„ค์ •์„ ํ†ตํ•˜์—ฌ Docker๋Š” ca.cer๋กœ ์„œ๋ช…๋œ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋งŒ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    [su_note note_color=”#f0f0ef”] $ mkdir /etc/systemd/system/docker.service.d
    $ vi /etc/systemd/system/docker.service.d/10-tls-verify.conf
    [/su_note] [su_note] [Service]

    Environment=”DOCKER_OPTS=−−tlsverify −−tlscacert=/etc/docker/ca.cer −−tlscert=/etc/docker/server.cer −−tlskey=/etc/docker/server.key”
    [/su_note]

    ๋ณ€๊ฒฝ ๋‚ด์—ญ์ด ์ ์šฉ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    [su_note note_color=”#f0f0ef”] $ systemctl daemon-reload
    $ systemctl restart docker.service
    [/su_note]

    Cap 2017-02-28 16-42-08-282


    Step 3. Bluemix DevOps ๊ตฌ์„ฑ

    Bluemix DevOps Toolchain ํŽ˜์ด์ง€(https://console.ng.bluemix.net/devops/toolchains)์— ์ ‘์†ํ•˜์—ฌ Toolchain์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • Toolchain ์ƒ์„ฑ
  • ๋„๊ตฌ ์ฒด์ธ ์ž‘์„ฑ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ๋„๊ตฌ ์ถ”๊ฐ€ ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•œ ๋’ค์— ์‚ฌ์šฉ์ž ์ž์ฒด ๋„๊ตฌ ์ฒด์ธ ๋นŒ๋“œ ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜์—ฌ Toolchain์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    4

  • GitHub ์ €์žฅ์†Œ ์—ฐ๊ฒฐ
  • ๋„๊ตฌ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ Toolchain์— GitHub ๋„๊ตฌ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    5

    ๋งŒ๋“ค์–ด์ง„ Toolchain ํŽ˜์ด์ง€์—์„œ ๋„๊ตฌ ์ถ”๊ฐ€ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ ์œ„์™€ ๊ฐ™์ด GitHub์„ ์„ ํƒํ•˜๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    GitHub ๊ณ„์ •์ด Bluemix ๊ณ„์ •์— ์—ฐ๋™๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ ์—ฐ๋™ ๊ณผ์ •์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    [su_note]
       ์ €์žฅ์†Œ ์œ ํ˜• :   ๊ธฐ์กด(existing)
       ์†Œ์Šค ์ €์žฅ์†Œ URL :   https://github.com/jkkim-infrasoft/my-spring-petclinic
    [/su_note]

  • Delivery Pipeline ๋„๊ตฌ ์ถ”๊ฐ€
  • Toolchain์— Delivery Pipeline ๋„๊ตฌ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    6

    ์ง€๊ธˆ๊นŒ์ง€์˜ ์„ค์ • ๊ฒฐ๊ณผ๋กœ Toolchain์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ชจ์Šต์ด ๋ฉ๋‹ˆ๋‹ค.

    7

  • ํŒŒ์ดํ”„๋ผ์ธ ์Šคํ…Œ์ด์ง€ ๊ตฌ์„ฑ
  • ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ, ์ด๋ฏธ์ง€ ๋นŒ๋“œ, ์ปจํ…Œ์ด๋„ˆ ๋ฐฐ์น˜ ์ด 3๊ฐœ์˜ ์Šคํ…Œ์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    1. ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ์Šคํ…Œ์ด์ง€
    GitHub์— ์ €์žฅ๋˜์–ด์žˆ๋Š” ์˜ˆ์ œ ํ”„๋กœ์ ํŠธ๋ฅผ Maven์œผ๋กœ ๋นŒ๋“œํ•˜์—ฌ Artifact ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‹จ๊ณ„ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    [์ž…๋ ฅ ํƒญ ์„ค์ •]

    8

    [su_note] Git URL : https://github.com/jkkim-infrasoft/my-spring-petclinic
    [/su_note]

    [์ž‘์—… ํƒญ ์„ค์ •]

    9

    ๋นŒ๋“œ ์‰˜ ๋ช…๋ น :
    [su_note] #!/bin/bash
    export JAVA_HOME=$JAVA8_HOME
    mvn -B package
    cp Dockerfile $ARCHIVE_DIR/
    [/su_note]

    2. ์ด๋ฏธ์ง€ ๋นŒ๋“œ ์Šคํ…Œ์ด์ง€
    ์ด์ „ ์Šคํ…Œ์ด์ง€์—์„œ ๋นŒ๋“œํ•œ Artifact๋ฅผ Dockerfile์˜ ์„ค์ •์„ ์‚ฌ์šฉํ•˜์—ฌ Docker ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก Docker ์ด๋ฏธ์ง€๋กœ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ ๋œ ์ด๋ฏธ์ง€๋Š” Bluemix Private Registry์— Push ๋ฉ๋‹ˆ๋‹ค.

    [์ž…๋ ฅ ํƒญ ์„ค์ •]

    11

    [์ž‘์—… ํƒญ ์„ค์ •]

    12

    ์ด๋ฏธ์ง€ ์ด๋ฆ„ :
    [su_note] my-spring-petclinic
    [/su_note] ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋นŒ๋” ์œ ํ˜•์„ IBM Container Service๋กœ ์„ ํƒํ–ˆ์„ ๋•Œ ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง€๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    3. ์ปจํ…Œ์ด๋„ˆ ๋ฐฐ์น˜ ์Šคํ…Œ์ด์ง€
    ์ด์ „ ์Šคํ…Œ์ด์ง€์—์„œ ๋นŒ๋“œํ•œ ์ด๋ฏธ์ง€๋ฅผ CoreOS์˜ Docker ์ปจํ…Œ์ด๋„ˆ์— ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ ์Šคํ…Œ์ด์ง€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    [์ž…๋ ฅ ํƒญ ์„ค์ •]

    13

    [์ž‘์—… ํƒญ ์„ค์ •]

    14

    15

    ๋ฐฐ์น˜์ž ์Šคํฌ๋ฆฝํŠธ
    [su_note note_color=”#f0f0ef”] #!/bin/bash

    export DOCKER_CERT_PATH=”/tmp/cert/”
    export DOCKER_HOST=”$TARGET”
    export DOCKER_TLS_VERIFY=”1″
    export DOCKER_API_VERSION=1.22

    mkdir -p “$DOCKER_CERT_PATH”

    echo “$CA” > “$DOCKER_CERT_PATH/ca.pem”
    echo “$CERT” > “$DOCKER_CERT_PATH/cert.pem”
    echo “$KEY” > “$DOCKER_CERT_PATH/key.pem”

    docker login -u “$(echo $TOOLCHAIN_TOKEN | cut -d ‘ ‘ -f 1)” \
    -p “$(echo $TOOLCHAIN_TOKEN | cut -d ‘ ‘ -f 2)|$PIPELINE_ORGANIZATION_ID” \
    “$CCS_REGISTRY_HOST”
    docker pull “$IMAGE_NAME”

    docker kill “$CONTAINER_NAME” || true
    docker rm “$CONTAINER_NAME” || true
    docker run -d -p “$PORT:$PORT” –name “$CONTAINER_NAME” -t “$IMAGE_NAME”
    [/su_note] ์„ค์ •ํ•œ ๋ฐฐ์น˜์ž ์œ ํ˜•์€ IBM Containers on Bluemix์ด์ง€๋งŒ, ์œ„์˜ ๋ฐฐ์น˜์ž ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•˜์—ฌ ์‹ค์ œ๋กœ๋Š” SoftLayer Baremetal์˜ CoreOS๋กœ ๋นŒ๋“œ ๋œ ์ด๋ฏธ์ง€๊ฐ€ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.
    ์„ค์ •๊ฐ’ ์ค‘ ๋Œ€์ƒ, ์กฐ์ง, ์˜์—ญ, ๋ฐฐ์น˜ ์ „๋žต์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    ํ™˜๊ฒฝ ํŠน์„ฑ์˜ CA, CERT, KEY ํ•ญ๋ชฉ์€ ํ…์ŠคํŠธ ์˜์—ญ ํŠน์„ฑ์œผ๋กœ ์ง€์ •ํ•˜๊ณ  TARGET ํ•ญ๋ชฉ์€ ํ…์ŠคํŠธ ํŠน์„ฑ์œผ๋กœ ์ง€์ •ํ•˜์—ฌ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    CA, CERT, KEY๋Š” ๊ฐ๊ฐ ์•ž ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑํ•œ ์ธ์ฆ์„œ ํŒŒ์ผ ์ค‘ ca.cer, client.cer, client.key์˜ ํŒŒ์ผ ๋‚ด์šฉ์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    TARGET ํ•ญ๋ชฉ์€ CoreOS ์„œ๋ฒ„์˜ IP ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•˜๊ณ  tcp://AAA.BBB.CCC.DDD:8443 ํ˜•ํƒœ๋กœ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    [ํ™˜๊ฒฝํŠน์„ฑ ํƒญ ์„ค์ •]

    16

    [์™„์„ฑ๋œ ์Šคํ…Œ์ด์ง€]

    17

    ๊ฐ ์Šคํ…Œ์ด์ง€์˜ ์‹œ์ž‘ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์Šคํ…Œ์ด์ง€๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    ์„ธ ๊ฐœ์˜ ์Šคํ…Œ์ด์ง€๊ฐ€ ๋ชจ๋‘ ์‹คํ–‰ ์™„๋ฃŒ๋˜๋ฉด CoreOS๊ฐ€ ์„ค์น˜๋œ IP ์ฃผ์†Œ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ์›นํŽ˜์ด์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    [Baremetal ์„œ๋ฒ„์—์„œ ๊ตฌ๋™๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ์Šต]

    18