Skip to content

Commit

Permalink
기본 설명 진행중.
Browse files Browse the repository at this point in the history
  • Loading branch information
seoyhaein committed May 23, 2022
1 parent a21d191 commit 9c0d6c3
Show file tree
Hide file tree
Showing 11 changed files with 105 additions and 44 deletions.
1 change: 1 addition & 0 deletions CONTAINER.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
## podman pod create --share
### podman 의 pod 에서 namespaces, ipc, net, pid, user, 그리고 uts 가 shared / isolated 된다는 의미?

[참고 - podman pod create 옵션](https://github.com/containers/podman/blob/main/docs/source/markdown/podman-pod-create.1.md)
Expand Down
2 changes: 1 addition & 1 deletion Containerfiles/usage.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
### 여러 dockerfile/containerfile 사용법
### 여러 dockerfile/containerfile 사용법 (seoy)
```
docker build -t api-server:latest . -f dev.Dockerfile
docker build -t api-server:latest . -f stg.Dockerfile
Expand Down
6 changes: 5 additions & 1 deletion INSTALL.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,8 @@ https://github.com/containers/podman/issues/5114

### podman 상태
- podman --remote info
- https://www.redhat.com/sysadmin/container-information-podman
- https://www.redhat.com/sysadmin/container-information-podman

### etc
직접적인 예제 코드는 없고 일단 테스트 코드를 살펴보자 - 3.x 에는 해당 기능이 없다. 최신 버번에서 확인되는데 4.x 를 설치해야하는가???
https://sourcegraph.com/github.com/containers/podman/-/blob/test/e2e/pod_create_test.go?L14
36 changes: 0 additions & 36 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -161,8 +161,6 @@ podman run -d --restart=always --pod new:myapp_pod \
4. github.com/containers/podman/v4/libpod -> libpod.Runtime.NewPod
5. https://github.com/containers/podman/blob/c3d871a3f6cc7a94c5e86782ba63e05cd1d2faeb/pkg/specgen/generate/pod_create.go

#### pod 에서 volume mount 하는 방법 생각해보자.

## podman binding api 정리
먼저, specgen.NewSpecGenerator 함수를 통해서 SpecGenerator 정해준다. 이 SpecGenerator 에 저장된 정보를 통해서 컨테이너를 생성해준다.

Expand Down Expand Up @@ -522,12 +520,6 @@ type ContainerHealthCheckConfig struct {
}
```

### Todo
- 전체적인 싱글머신에서 동작하는 컨테이너 그림 그리기. 병행해서 작업하면서, api 로 뽑아내자.
- 4.x 와 3.x 코드 비교해서 4.x 코드 중심으로 bindins 관련 학습한다. 소스가 업데이트 됨으로 향후 4.x 가 apt install podman 으로 4.x 도 설치 가능하리라 예상.
- types, uitls 는 tent 에서 가져왔다 refactoring 예정.
- pod 관련, volume mount 관련

### tts/pts [참고](https://codedragon.tistory.com/4211)


Expand Down Expand Up @@ -572,31 +564,3 @@ a process:
결국 이 방법도 별도의 프로그램을 만들어줘서 컨테이너가 동작할때 해당 프로그램도 동작을 해야하고 실행파일을 실행될때 해당 실행파일의 process 를 찾고 그 status 를 host 에 넘겨줘야한다.
- 쿠버네틱스는 어떻게 처리하는지 한번 살펴봐야 한다.

#### 테스트 컨테이너 시나리오
1. 먼저 실행파일을 넣어서 dockerfile(containerfile) 을 만들고 이 녀석으로 컨테이너로 만든다.
2. 만들어진 컨테이너를 pod 에 집어 넣는다. (위의 문서 참고하면 run 할때 pod 만들어주고 하는 거 있음.)
3. 그럼, pod 에서 해당 컨테이너의 상태를 확인 한다. (이건 확인해보자.)

여기까지가 손으로 해볼 수 있는 부분이고 이것이 확인이 되면 이후에는 binding 을 통해서 이것을 자동화 할 수 있는 api 를 뽑아야한다.

1. dockerfile 을 특정 정보를 통해서 만들어주기. https://github.com/seoyhaein/dockerfile-generator
2. pod 만들어주면서, build.go 에서 해당 dockerfile 에서 컨테이너 실행시키는 api 만들어 주기

### https://github.com/containers/podman/issues/8181
/dev/shm 일종의 공유 메모리 https://blog.naver.com/ncloud24/221387977381 https://freewin.tistory.com/234


##### 5/15 일 할일 pod 로 연결된 container 들 에서 volume mount 하고
- 그런데 네임스페이스에 마운트도 있다. 이경우 마운트도 share 되는지 확인해보자. 관련 자료 읽어복 해당 내용 파악하자. 그리고 4.x 설치 부분도 살펴보자.
- https://docs.podman.io/en/latest/markdown/podman-pod-create.1.html 여기서 mount 관련해서 찾아보자.
- https://kubernetes.io/ko/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume/

아래 문서 확인.
반드시 내일 전체 읽어보기
https://docs.podman.io/en/latest/markdown/podman-pod-create.1.html

To share a volume, use the --volumes-from option when running the target container. You can share volumes even if the source container is not running. By default, Podman mounts the volumes in the same mode (read-write or read-only) as it is mounted in the source container.


직접적인 예제 코드는 없고 일단 테스트 코드를 살펴보자 - 3.x 에는 해당 기능이 없다. 최신 버번에서 확인되는데 4.x 를 설치해야하는가???
https://sourcegraph.com/github.com/containers/podman/-/blob/test/e2e/pod_create_test.go?L14
17 changes: 17 additions & 0 deletions container-stauts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
## container stauts 확인하기
https://docs.podman.io/en/latest/Reference.html

Podman v2.0 RESTful API 에 집중한다.
Podman v2.0 RESTful API 는 크게 Docker 와 호완이 가능한 api 와 Pod 와 같은 podman 의 고유한 기능을 지원하는 Libpod API 로 구성된다.


### binding 시 api 차원에서 확인해줘야 한다.

### Status 세부 내용
- https://blog.naver.com/alice_k106/221310477844

하지만 위의 status 와 다르게 별도의 healthcheck 기능이 제공된다. 이 부분은 api 설계 또는 이용할때 참고해야한다.
https://docs.podman.io/en/latest/_static/api.html?version=v4.1#operation/ContainerExportLibpod

이게 binding 관련 소스 인듯
https://github.com/containers/podman/blob/main/pkg/bindings/containers/healthcheck.go
3 changes: 3 additions & 0 deletions docerfile-gen.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
### api 로 Dockerfile(Containerfile) 만들기
1. dockerfile 을 특정 정보를 통해서 만들어주기. https://github.com/seoyhaein/dockerfile-generator
2. pod 만들어주면서, build.go 에서 해당 dockerfile 에서 컨테이너 실행시키는 api 만들어 주기
Empty file.
Empty file.
Empty file.
48 changes: 42 additions & 6 deletions podman-pod-create.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ https://docs.podman.io/en/latest/Reference.html
그렇다면, pod 외부에 data 컨테이너를 두고, 이것을 pod 내의 컨테이너가 이러한 데이터를 공유하는 것인가?

### 처리 상황
#### pod crate --volume-from 을 통해서 pod 와 컨테이너간의 volume 공유를 테스트 진행할 예정임.

pod crate --volume-from 을 통해서 pod 와 컨테이너간의 volume 공유를 테스트 진행할 예정임.
먼저 alpine:latest 기준으로 Containerfile 을 제작해주고 자료 확인을 위해서 bash 와 nano 를 설치 해준다.
- 자주 잊어버려서 기억용으로 기록해둔다.

- data.Conatainerfile
```
FROM alpine:latest
Expand Down Expand Up @@ -65,15 +65,51 @@ podman pod inspect poddata
```

### 문제점 인식하기
### 문제점 인식하기 (읽어보기)
- https://docs.oracle.com/en/learn/storage_podman_containers/#using-volumes-with-containers

일단 위와 같이 작성했을 때 mount 가 되지 않는다. 그 이유를 추측해보면, 해당 소스 컨테이너에 volume 이 없다고 판단이 된다.
한번 volume 여부를 살펴보자
_To share a volume, use the --volumes-from option when running the target container.
You can share volumes even if the source container is not running.
By default, Podman mounts the volumes in the same mode (read-write or read-only) as it is mounted in the source container._

from : https://docs.podman.io/en/latest/markdown/podman-pod-create.1.html

상기 내용을 살펴보면 volume 이 만들어지고 소스 컨테이너에서 volume 을 마운트가 되어야 한다는 것을 의미 하는 것 같다.

일단 위와 같이 작성했을 때 mount 가 되지 않는다. 그 이유를 추측해보면, 해당 소스 컨테이너에 volume 이 없다고 판단이 된다.
한번 volume 여부를 살펴보자
```
podman inspect -f '{{.Mounts}}' data
```
살펴보면 null 값이다. 해당 컨테이너에 마운트 된 volume 이 없다.

그리고 volume 이 있는지 확인해보면 volume 이 존재 하지 않는다.

```
podman volume ls
```
만약 volume 을 create 해주면 어떻게 되는지 살펴본다.
아래와 같이 수정해주었다.

```
podman volume create my_vol
# volume 확인
podman volume ls
# volume mount
podman run -d --restart=always -v my_data:/opt/data --name=data -it seoy-data /bin/bash
# 나머지는 동일
podman pod create --name poddata --volumes-from=data
# pod 에 들어갈 컨테이너 생성 및 pod 에 넣기
podman run -it --name=pod-container01 --pod poddata docker.io/library/alpine:latest /bin/sh
```

위와 같이 했을 경우는 정상적으로 컨테이너에서 파일이 공유된다. 하지만, 데이터의 업데이트는 되지 않는다. 즉, volume mount 를 한 후에 마운트된 파일이 업데이트 되면 업데이트는 반영이 안된다.
이것은, issue 인지 아니면 이게 정상 구현 결과인지는 모르겠다.

살펴보면 null 값이다. 만약 volume 을 create 해주면 어떻게 되는지 살펴본다.
### 참고 링크
[참고 1, 메뉴얼](https://docs.podman.io/en/latest/markdown/podman-pod-create.1.html)
36 changes: 36 additions & 0 deletions shared-memory.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
## 공유메모리 (shared memory)

```
df -f
```

먼저, 파일 시스템을 확인해보면 /dev/shm 의 사이즈를 확인 할 수 있다. /dev/shm 은 tmpfs 로 설정되어 있는 것을 확인할 수 있으며 이 디렉토리는 공유 메모리이고 물리 메모리의 반으로 설정되어 있다.

하지만 실제로 점유되고 있는 것은 아니고 사용한 만큼 소모 되는 형태이다. 실제 RAM 에 저장됨으로 reboot 하면 휘발성으로 저장된 데이터는 사라지게 된다.

그리고, 설정한 사이즈를 초과하게 되면 SWAP 영역으로 넘어가게 되고, 과도하게 사용할 경우 시스템이 작동 불능이 될 수 있다. (리부팅해야함.)

### pod 내에서 공유메모리 만들기 (podman-pod-create.md 참고)
```
# pod 를 생성해주면서 volume-from 을 통해서 data container 와 연결 시킨다.
podman pod create --name poddata --volumes-from=data
podman run -d --restart=always --name=pod-container01 docker.io/library/alpine:latest
podman run -d --restart=always --name=pod-container02 docker.io/library/alpine:latest
```
위와 같이 작성했을 때 두 컨테이너는 /dev/shm 에서 데이터를 고유하게 된다.

### 생각할 문제( 초기 메모리 할당 설정의 어려움. 테라 단위로 메모리를 할당할 경우)
클라우드에서 사용할 경우는 메모리가 제한적일 경우, 대용량 메모리를 할당 해야하는 어려움이 있다. 이럴경우 어떻게 해야하는지 파악해야 한다.

swap 영역으로 넘어갈 경우에 대한 스터디도 필요하다.

### 개발에 참고할 내용
기본적으로 휘발성이라는 특징있으며 공유메모리라는 특징을 가지고 있다. 따라서 ㄷ데이터 접근 속도가 빠르고, 컨테이너 상황에서 재사용시 데이터를 쉽게 제거 할 수 있다라는 장점을 가진다.(테스트 해봐야 함.)

유전체 분석시, 레퍼런스 파일이라던지 공용적으로 사용하는 대용량의 파일을 위치시키는 용도로 활용할 생각이다.

### 참고 링크
[참고 1](https://blog.naver.com/ncloud24/221387977381)
[참고 2](https://github.com/containers/podman/issues/8181)

0 comments on commit 9c0d6c3

Please sign in to comment.