본문 바로가기
서버구축 (WEB,DB)

Docker와 Kubernetes 환경에 ContainerSSH 구성하는 방법

by 날으는물고기 2023. 8. 28.

Docker와 Kubernetes 환경에 ContainerSSH 구성하는 방법

Docker를 사용하여 ContainerSSH를 구성하는 방법입니다.

 

1. Docker 백엔드 설정

ContainerSSH의 Docker 백엔드는 Docker Engine 버전 1.6 이상을 지원하며, 버전 18.02부터 문제를 해결합니다.

 

2. 기본 설정 구조

Docker 백엔드를 사용하려면 다음과 같은 구성 항목을 구성 파일 또는 구성 서버를 통해 지정해야 합니다.

backend: docker
docker:
  connection:
    <연결 구성 입력>
  execution:
    <실행 구성 입력>
  timeouts:
    <타임아웃 구성 입력>

3. 연결 매개변수 구성

Docker 백엔드는 기본적으로 Docker 소켓에 연결합니다. UNIX 시스템의 경우 기본 위치는 unix:///var/run/docker.sock이며, Windows의 경우 npipe:////./pipe/docker_engine입니다. ContainerSSH는 Docker 소켓에 액세스할 수 있는 권한이 있어야 합니다.

 

Docker 소켓 위치를 host 옵션으로 변경할 수 있습니다:

docker:
  connection:
    host: 127.0.0.1:2375

인증서 인증 없이 Docker를 노출하는 것은 위험하므로 인증서를 생성하고 다음 옵션을 사용하여 ContainerSSH에 전달하는 것이 좋습니다:

docker:
  connection:
    host: <Docker 엔진의 IP 및 포트>
    cert: |
      -----BEGIN CERTIFICATE-----
      <클라이언트 인증서>
      -----END CERTIFICATE-----
    key: |
      -----BEGIN RSA PRIVATE KEY-----
      <클라이언트 키>
      -----END RSA PRIVATE KEY-----
    cacert: |
      -----BEGIN CERTIFICATE-----
      <CA 인증서>
      -----END CERTIFICATE-----

4. 컨테이너 실행 구성

컨테이너 실행 옵션은 다음과 같이 지정할 수 있습니다:

docker:
  execution:
    container:
      image: containerssh/containerssh
      <다른 컨테이너 옵션>
    host:
      <호스트 옵션>
    network:
      <네트워크 옵션>
    platform:
      <플랫폼 옵션>
    containerName: "<컨테이너 이름>"
    <ContainerSSH 전용 옵션>

container, host, network 및 platform 옵션은 Docker API에서 설명하는 설정을 포함합니다.

containerName 옵션은 컨테이너의 이름을 포함합니다. 동일한 이름을 가진 컨테이너가 이미 존재하는 경우 컨테이너 생성이 실패하므로 대부분의 경우 이를 비워두는 것이 좋습니다.

 

5. 기본 컨테이너 구성

기본적인 구성 옵션은 다음과 같습니다:

docker:
  execution:
    container:
      image: containerssh/containerssh
      env:
        - VAR=value
      cmd: 
        - /run/this/command
      user: ubuntu

6. 볼륨 마운트

볼륨은 다음 3가지 방법으로 마운트할 수 있습니다:

  • 바인드 마운트
  • 마운트
  • tmpfs 사용

 

7. 컨테이너 실행 타임아웃 구성

타임아웃 섹션에는 다음과 같은 옵션이 있습니다. 모든 옵션은 시간 단위(예: 60s)를 사용할 수 있으며, 시간 단위 없이 기본값은 나노초입니다.

  • containerStart: 컨테이너 시작을 기다리는 시간
  • containerStop: 컨테이너 정지를 기다리는 시간
  • commandStart: 연결 모드에서 명령 시작을 기다리는 시간
  • signal: 프로세스에 신호를 전달하는 시간
  • window: 창 크기 변경을 기다리는 시간
  • http: 기본 HTTP 호출 완료를 기다리는 시간

 

8. Docker 보안 설정

Docker는 Docker 소켓에 액세스하면 호스트 머신에 대한 권한이 부여되므로 보안 설정이 중요합니다.

  • Docker는 ContainerSSH와 별도의 호스트에서 배포하는 것이 최대한 안전합니다.
  • Docker 소켓을 보안하는 방법은 Docker 문서에서 자세히 설명되어 있습니다. 인증서를 사용하여 Docker 소켓에 접속하는 것이 좋습니다.
  • Docker 소켓을 TCP로 노출할 때는 인증서를 반드시 설정해야 합니다.

 

물론 이상의 내용을 실제로 수행하기 위해서는 실제 환경과 요구 사항에 따라 설정을 조정하고 테스트해야 합니다.

참고 : https://containerssh.io/reference/docker/ 

 

ContainerSSH는 컨테이너 환경에서 SSH 액세스를 제공하는 오픈 소스 도구입니다. Minikube는 로컬 Kubernetes 환경을 실행하기 위한 도구로, ContainerSSH를 Minikube 환경에 구성하려면 다음 단계를 따를 수 있습니다. 이 단계에서는 Ubuntu 기반 이미지를 사용하고 ContainerSSH의 Kubernetes 배포를 생성하는 방법을 설명합니다. 이 작업은 Minikube와 kubectl 명령을 사용하여 수행됩니다.

 

ContainerSSH를 Minikube 환경에 네임스페이스를 사용하여 구성하려면 다음과 같은 단계를 따를 수 있습니다. 이 단계에서는 YAML 파일을 통해 모든 설정을 정의합니다.

 

1. Minikube 시작
Minikube 클러스터를 시작합니다.

minikube start --driver=docker

 

2. 네임스페이스 생성
다음과 같은 containerssh-namespace.yaml 파일을 만듭니다.

apiVersion: v1
kind: Namespace
metadata:
  name: containerssh-namespace

이 파일을 사용하여 네임스페이스를 생성합니다.

kubectl apply -f containerssh-namespace.yaml

 

3. ConfigMap 작성
ContainerSSH 설정을 담은 ConfigMap을 생성합니다. 다음과 같은 containerssh-configmap.yaml 파일을 만듭니다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: containerssh-config
  namespace: containerssh-namespace
data:
  config.yml: |
    listeners:
      ssh:
        address: "0.0.0.0:2222"
    handlers:
      exec:
        command: ["/bin/sh"]

이 ConfigMap을 Kubernetes에 적용합니다.

kubectl apply -f containerssh-configmap.yaml

 

4. Deployment 작성
ContainerSSH를 실행할 Deployment를 생성합니다. 다음과 같은 containerssh-deployment.yaml 파일을 만듭니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: containerssh-deployment
  namespace: containerssh-namespace
spec:
  replicas: 1
  selector:
    matchLabels:
      app: containerssh
  template:
    metadata:
      labels:
        app: containerssh
    spec:
      containers:
      - name: containerssh
        image: containerssh/containerssh:latest
        ports:
        - containerPort: 2222
        volumeMounts:
        - name: containerssh-config
          mountPath: /etc/containerssh
    volumes:
    - name: containerssh-config
      configMap:
        name: containerssh-config

이 Deployment를 Kubernetes에 배포합니다.

kubectl apply -f containerssh-deployment.yaml

 

5. Service 작성
ContainerSSH를 외부에서 액세스할 수 있도록 NodePort 서비스를 생성합니다. 다음과 같은 containerssh-service.yaml 파일을 만듭니다.

apiVersion: v1
kind: Service
metadata:
  name: containerssh-service
  namespace: containerssh-namespace
spec:
  selector:
    app: containerssh
  ports:
  - protocol: TCP
    port: 22
    targetPort: 2222
  type: NodePort

이 서비스를 Kubernetes에 배포합니다.

kubectl apply -f containerssh-service.yaml

 

6. Service 액세스
이제 Minikube에서 ContainerSSH 서비스에 액세스할 수 있습니다. NodePort를 확인하려면 다음 명령을 사용합니다.

minikube service containerssh-service -n containerssh-namespace --url

반환된 URL을 사용하여 SSH 클라이언트를 통해 ContainerSSH에 액세스할 수 있습니다. ContainerSSH는 이제 Minikube 환경에서 containerssh-namespace 네임스페이스 안에서 실행됩니다. 이제 ContainerSSH가 Minikube 환경에 구성되었으며, SSH를 통해 컨테이너로 접근할 수 있습니다. 필요한 경우 SSH 클라이언트를 사용하여 컨테이너에 연결하고 작업할 수 있습니다.

 

기존 ConfigMap을 수정하고 ContainerSSH Pod를 다시 배포하려면 다음 단계를 따릅니다.

 

먼저 현재 실행 중인 ContainerSSH Pod를 삭제합니다.

kubectl delete pod <Pod 이름> -n containerssh-namespace

위 명령에서 <Pod 이름>은 현재 실행 중인 ContainerSSH Pod의 이름입니다.

 

다음으로 수정된 ConfigMap을 다시 적용합니다. ConfigMap을 수정한 YAML 파일을 사용하여 다음 명령을 실행합니다.

kubectl apply -f 수정된-containerssh-configmap.yaml

위 명령에서 수정된-containerssh-configmap.yaml은 수정된 ConfigMap을 정의하는 YAML 파일의 경로입니다.

 

ConfigMap을 다시 적용한 후, Kubernetes는 해당 ConfigMap을 사용하여 ContainerSSH Pod를 자동으로 다시 시작할 것입니다. 새로운 Pod가 시작될 때 수정된 구성이 적용됩니다. 이러한 단계를 따르면 ContainerSSH Pod가 수정된 구성으로 다시 시작됩니다.

 

ConfigMap, Namespace 및 Pod를 모두 제거하려면 다음 단계를 따릅니다. 이 작업은 주의해서 진행해야하며 필요한 경우에만 사용해야 합니다.

 

1. Pod 제거
먼저 실행 중인 ContainerSSH Pod를 제거합니다.

kubectl delete pod -n containerssh-namespace --selector=app=containerssh

 

2. Service 제거
Pod를 제거한 후에는 Service를 제거합니다.

kubectl delete service containerssh-service -n containerssh-namespace

 

3. Deployment 제거
Pod와 Service를 제거한 후, Deployment를 제거합니다.

kubectl delete deployment containerssh -n containerssh-namespace

 

4. ConfigMap 제거
ConfigMap을 삭제합니다.

kubectl delete configmap containerssh-config -n containerssh-namespace

 

5. Namespace 제거
Namespace를 제거합니다. 이 단계에서는 해당 Namespace에 속한 모든 리소스가 제거됩니다. 주의해서 사용하십시오.

kubectl delete namespace containerssh-namespace

위의 단계를 따르면 ConfigMap, Namespace, Pod 및 관련 리소스를 모두 제거할 수 있습니다. 이 작업은 실제로 중요한 환경에서 실행하기 전에 주의해서 검토하고 실행해야 합니다.

 

/etc/containerssh/config.yaml 파일의 내용이 애플리케이션의 설정 스키마와 일치하지 않으면, "field listeners not found in type configuration.AppConfig"와 "field handlers not found in type configuration.AppConfig"와 같은 에러 메시지가 나타납니다.

 

이 에러를 해결하기 위해서 다음 단계를 따라 수행할 수 있습니다.

 

ConfigMap 수정

ConfigMap의 config.yml 필드를 다음과 같이 수정하여 애플리케이션의 설정 스키마에 맞게 설정합니다.

data:
  config.yml: |
    configuration:
      listeners:
        ssh:
          address: "0.0.0.0:2222"
      handlers:
        exec:
          command: ["/bin/sh"]

ConfigMap을 업데이트하고 변경 사항을 적용합니다.

kubectl apply -f your-configmap.yaml

변경된 ConfigMap을 사용하는 Pod를 다시 시작합니다. 이렇게 하면 새로운 설정이 Pod에 적용됩니다.

kubectl rollout restart deployment containerssh -n containerssh

Pod가 다시 시작된 후, 설정이 올바르게 적용되었는지 확인합니다.

 

에러 메시지에서 "field listeners not found"와 같은 내용은 설정 파일에 listenershandlers 필드가 없는 경우 나타납니다. 설정 파일의 구조를 정확하게 따르도록 ConfigMap을 수정하고, 애플리케이션에서 해당 구성이 올바르게 읽히도록 확실히 하세요.

 

ContainerSSH를 외부에서 접근할 수 있도록 하려면 Kubernetes 내에서 실행 중인 ContainerSSH Pod을 외부에 노출하는 Kubernetes Service를 생성해야 합니다. 이렇게 하면 외부에서 SSH 클라이언트를 사용하여 ContainerSSH에 연결할 수 있습니다.

 

ContainerSSH 배포 설정 수정
ContainerSSH의 배포 설정을 업데이트하여 외부에서 액세스할 수 있도록 SSH 포트를 노출합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: containerssh
  namespace: containerssh
spec:
  template:
    spec:
      containers:
        - name: containerssh
          ports:
            - containerPort: 2222 # SSH 포트를 노출합니다.

 

Service 생성
SSH 포트를 노출하는 Kubernetes Service를 생성합니다. 이 Service는 외부에서 ContainerSSH에 접근할 수 있는 방법을 제공합니다.

apiVersion: v1
kind: Service
metadata:
  name: containerssh-service
  namespace: containerssh
spec:
  selector:
    app: containerssh
  ports:
    - protocol: TCP
      port: 22
      targetPort: 2222 # ContainerSSH의 SSH 포트와 매핑합니다.
  type: LoadBalancer # 혹은 NodePort, ClusterIP 등을 선택하여 노출 방식을 설정합니다.

typeLoadBalancer로 설정하면 클라우드 제공업체의 로드 밸런서 서비스를 자동으로 생성하여 외부에서 접근할 수 있도록 합니다. typeNodePort 또는 ClusterIP로 설정하면 외부 IP 또는 로컬 클러스터 IP를 사용하여 접근할 수 있습니다.

 

Service 노출 확인
Service가 어떻게 노출되었는지 확인하려면 다음 명령을 사용하여 Service의 상태 및 외부 IP 주소를 확인합니다.

kubectl get svc containerssh-service -n containerssh

명령을 실행한 후 EXTERNAL-IP 필드에 외부 IP 주소가 표시될 것입니다.

 

외부에서 접속
외부에서 SSH 클라이언트를 사용하여 ContainerSSH에 연결합니다. 아래 명령을 사용하여 ContainerSSH에 연결합니다.

ssh -p 22 username@external-ip

여기서 username은 ContainerSSH에 액세스하기 위한 사용자 이름이며, external-ip는 Service의 외부 IP 주소입니다.

 

이제 ContainerSSH를 외부에서 접근할 수 있도록 설정되었습니다. 필요한 경우 외부에서 SSH 키를 사용하여 인증을 구성하고, 보안을 유지하기 위해 추가적인 조치를 취할 수 있습니다.

728x90

댓글