주:
- 이 자습서에서는 Oracle Cloud에 액세스해야 합니다. 무료 계정에 등록하려면 Oracle Cloud Infrastructure Free Tier 시작하기를 참조하십시오.
- Oracle Cloud Infrastructure 자격 증명, 테넌시 및 구획에 예제 값을 사용합니다. 실습을 완료했으면 이러한 값을 자신의 클라우드 환경과 관련된 값으로 대체하십시오.
보안 애플리케이션 개발을 위해 Oracle Cloud Infrastructure Kubernetes Engine을 통해 SSH 터널링 활용
소개
Ali Mukadam의 도움으로 OKE와 SSH 터널링을했을 때 나는 그것을 "마법"이라고 불렀습니다.
그는 다음 메시지와 함께 나에게 응답 :
"당신은 그것을 마법이라고 불렀고, 다른 사람들은 그것을 과학이라고 불렀습니다. 내가 있는 곳은 하나이고 같은 곳이다."
원래 인용은 토르 영화에서:
"당신의 조상은 그것을 마법이라고 불렀지만 당신은 그것을 과학이라고 부릅니다. 나는 그들이 하나이고 같은 땅에서 왔습니다."
이 마법은 무엇인가?
최신 애플리케이션 개발에서는 특히 Oracle Cloud Infrastructure Kubernetes Engine(OCI Kubernetes Engine 또는 OKE)과 함께 작업할 때 로컬 및 클라우드 기반 리소스 간의 연결을 보호하는 것이 필수적입니다. SSH 터널링은 OKE 클러스터에 안전하게 접속할 수 있는 간단하면서도 강력한 방법을 제공하므로 개발자는 공용 인터넷에 노출되지 않고 리소스를 관리하고 상호 작용할 수 있습니다. 이 사용지침서에서는 OKE를 사용하여 SSH 터널링을 설정하는 방법과 개발자가 이 접근 방식을 워크플로우에 통합하여 보안 및 효율성을 향상시키는 방법에 대해 알아봅니다. 초기 구성부터 모범 사례에 이르기까지 OKE 기반 애플리케이션에서 SSH 터널링을 효과적으로 활용하는 데 필요한 모든 것을 다룹니다.
다음 이미지는 서로 다른 두 응용 프로그램을 터널링하는 SSH의 전체 트래픽 플로우를 보여줍니다.
목표
- 보안 애플리케이션 개발을 위해 OKE에서 SSH 터널링을 활용합니다.
작업 1: OKE에 Kubernetes 클러스터 배치(배스천 및 운영자 인스턴스 사용)
OKE에 Kubernetes 클러스터가 배치되어 있는지 확인합니다.
-
OKE에 Kubernetes 클러스터를 배치하려면 다음 방법 중 하나를 사용합니다.
-
Oracle Cloud Infrastructure Kubernetes Engine을 사용하여 Terraform을 사용하여 Kubernetes 클러스터 배포: Terraform을 사용하여 OKE에 단일 Kubernetes 클러스터를 배포합니다.
-
Terraform을 사용하여 OKE를 사용하여 여러 OCI 리전에 여러 Kubernetes 클러스터를 배포하고 RPC를 사용하여 전체 메시 네트워크 생성: Terraform을 사용하여 OKE의 여러 리전에 여러 Kubernetes 클러스터를 배포합니다.
-
작업 1: 새 Kubernetes 클러스터 생성 및 구성요소 확인: 빠른 생성 모드를 사용하여 OKE에 Kubernetes 클러스터를 배치합니다.
-
작업 1: OKE를 사용하여 Kubernetes 클러스터 배치: 사용자 정의 생성 모드를 사용하여 OKE에 Kubernetes 클러스터를 배치합니다.
이 사용지침서에서는 Oracle Cloud Infrastructure Kubernetes Engine을 사용하여 Terraform과 함께 Kubernetes 클러스터 배포를 OKE의 기본 Kubernetes 클러스터로 사용하여 SSH 터널을 사용하여 localhost를 사용하여 OKE에 배포된 컨테이너 기반 애플리케이션에 접근하는 방법에 대해 설명합니다.
OCI OKE 환경을 빠르게 검토해 단계를 설정해 보겠습니다.
-
-
VCN(가상 클라우드 네트워크)
OCI 콘솔에 로그인하여 네트워킹 및 가상 클라우드 네트워크로 이동합니다.
-
이름이 oke인 VCN을 검토합니다.
-
oke VCN을 누릅니다.
-
-
서브넷
VCN 세부정보 페이지로 이동합니다.
- 서브넷을 누릅니다.
- 배치된 서브넷을 검토합니다.
-
게이트웨이
VCN 세부정보 페이지로 이동합니다.
- 인터넷 게이트웨이를 누릅니다.
- 생성된 인터넷 게이트웨이를 검토합니다.
- NAT 게이트웨이를 누릅니다.
- 생성된 NAT 게이트웨이를 검토합니다.
- 서비스 게이트웨이를 누릅니다.
- 생성된 서비스 게이트웨이를 검토합니다.
- Security Lists를 누릅니다.
- 생성된 보안 목록을 검토합니다.
-
노드 풀
개발자 서비스 및 컨테이너 및 아티팩트로 이동합니다.
- Kubernetes 클러스터(OKE)를 누릅니다.
- oke 클러스터를 누릅니다.
- 노드 풀을 누릅니다.
- 노드 풀을 검토합니다.
-
인스턴스
컴퓨트 및 인스턴스로 이동합니다.
- 인스턴스를 누릅니다.
- Kubernetes Worker 노드 배치를 검토합니다.
- 배스천 호스트 배치를 검토합니다.
- Kubernetes Operator 배포를 검토합니다.
-
다음 이미지는 이 자습서의 나머지 콘텐츠에 대한 시작점의 전체 개요를 보여줍니다.
-
다음 그림은 이전 그림의 단순화된 뷰를 보여 줍니다. 이 자습서의 나머지 부분에서는 이 그림을 사용합니다.
작업 2: Kubernetes 클러스터에 NGINX 웹 서버 배치
운영자는 인터넷에서 직접 액세스할 수 없으며 Bastion 호스트를 통과해야 합니다.
-
이 자습서에서는 Ali Mukadam에서 제공하는 SSH 스크립트를 사용하여 단일 SSH 명령을 사용하여 운영자에 연결합니다. 이 스크립트 및 연결 방법은 작업 4: 배스천 및 연산자를 사용하여 연결 확인에서 제공됩니다. 이 자습서 뒷부분에서 이 스크립트가 필요하므로 이 스크립트를 사용해야 합니다.
-
Kubernetes 운영자에 대한 SSH 세션을 설정합니다.
-
kubectl get nodes
명령을 사용하여 활성 작업자 노드를 검토합니다. -
활성 작업자 노드를 모두 검토합니다.
-
-
컨테이너 내부에서 실행 중인 샘플 NGINX 응용 프로그램을 만들려면 연산자에 다음 코드를 사용하여
modified2_nginx_ext_lb.yaml
라는 YAML 파일을 만듭니다.YAML 파일에는 세 개의 복제본이 있는 NGINX 웹 서버 애플리케이션을 생성하는 코드가 포함되어 있으며 로드 밸런서 유형의 서비스도 생성됩니다.
modified2_nginx_ext_lb.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: my-nginx-svc labels: app: nginx annotations: oci.oraclecloud.com/load-balancer-type: "lb" service.beta.kubernetes.io/oci-load-balancer-internal: "true" service.beta.kubernetes.io/oci-load-balancer-subnet1: "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaaguwakvc6jxxxxxxxxxxxxxxxxxxxu7rixvdf5urvpxldhya" service.beta.kubernetes.io/oci-load-balancer-shape: "flexible" service.beta.kubernetes.io/oci-load-balancer-shape-flex-min: "50" service.beta.kubernetes.io/oci-load-balancer-shape-flex-max: "100" spec: type: LoadBalancer ports: - port: 80 selector: app: nginx
-
이 애플리케이션을 내부적으로 접근 가능하게 하고 전용 로드 밸런서 서브넷에 연결된 로드 밸런서 유형의 서비스를 생성하려고 합니다.
로드 밸런서 유형의 서비스를 프라이빗 로드 밸런서 서브넷에 지정하려면 프라이빗 로드 밸런서 서브넷의 서브넷 OCID가 필요하며, 주석 섹션에 다음 코드를 추가해야 합니다.
annotations: oci.oraclecloud.com/load-balancer-type: "lb" service.beta.kubernetes.io/oci-load-balancer-internal: "true" service.beta.kubernetes.io/oci-load-balancer-subnet1: "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaaguwakvcxxxxxxxxxxxxxxxxxxxxxxxxxxxxixvdf5urvpxldhya" service.beta.kubernetes.io/oci-load-balancer-shape: "flexible" service.beta.kubernetes.io/oci-load-balancer-shape-flex-min: "50" service.beta.kubernetes.io/oci-load-balancer-shape-flex-max: "100"
-
프라이빗 로드 밸런서 서브넷의 서브넷 OCID를 가져오려면 내부 로드 밸런서 서브넷을 누르십시오.
전체 프라이빗 로드 밸런서 서브넷 OCID에 대해 표시 및 복사를 누릅니다. 주석 섹션에서 이 OCID를 사용합니다.
-
NGINX 애플리케이션 및 로드 밸런서 유형의 서비스를 배포하려면 다음 명령을 실행합니다.
-
연산자에 YAML 파일을 만듭니다.
nano modified2_nginx_ext_lb.yaml
-
로드 밸런서 유형의 서비스를 사용하여 NGINX 애플리케이션을 배치합니다.
kubectl apply -f modified2_nginx_ext_lb.yaml
이미지에 표시되지 않은 NGINX 응용 프로그램이 성공적으로 배치되었는지 확인합니다.
kubectl get pods
-
로드 밸런서 유형의 서비스가 성공적으로 배치되었는지 확인합니다.
kubectl get svc
-
로드 밸런서 유형의 서비스가 성공적으로 배치되었습니다.
-
-
내부 로드 밸런서 서브넷을 살펴보면 이 서브넷의 CIDR 블록이
10.0.2.0/27
임을 알 수 있습니다. 로드 밸런서의 새 서비스에는 IP 주소가10.0.2.3
입니다. -
OCI 콘솔에서 로드 밸런서 객체를 확인하려면 네트워킹, 로드 밸런서로 이동하고 로드 밸런서를 누릅니다.
-
다음 이미지는 지금까지 수행된 배치를 보여줍니다. 로드 밸런서가 추가됩니다.
새 Pod/Application 테스트
-
접근 1: 임시 포드에서
새로 배포된 NGINX 애플리케이션이 로드 밸런서 유형의 서비스와 함께 작동하는지 테스트하기 위해 임시 포드를 사용하여 내부 연결 테스트를 수행할 수 있습니다.
응용 프로그램에 대한 연결을 테스트하는 여러 가지 방법이 있습니다. 한 가지 방법은 브라우저를 열고 웹 페이지에 액세스할 수 있는지 테스트하는 것입니다. 그러나 사용 가능한 브라우저가 없으면 임시 포드를 배포하여 다른 빠른 테스트를 수행할 수 있습니다.
임시 Pod를 생성하고 이를 접속 테스트에 사용하려면 작업 3: 샘플 웹 애플리케이션 및 서비스 배치를 참조하십시오.
-
다음 명령을 실행합니다.
-
내부 로드 밸런서 서비스의 IP 주소를 가져옵니다.
kubectl get svc
-
샘플 포드를 배치하여 웹 애플리케이션 접속을 테스트합니다.
kubectl run --rm -i -t --image=alpine test-$RANDOM -- sh
-
wget을 사용하여 웹 서버에 대한 연결을 테스트합니다.
wget -qO- http://<ip-of-internal-lb-service>
-
웹 서버가 반환하는 HTML 코드를 확인합니다. 내부 로드 균형 조정 서비스를 사용하는 웹 서버 및 연결이 작동 중인지 확인합니다.
-
-
다음 명령을 실행하여 임시 포드를 종료합니다.
exit
명령줄 인터페이스를 닫으면 바로 Pod가 삭제됩니다.
-
다음 이미지는 지금까지 수행된 배치를 보여줍니다. 일시적으로 배치된 Pod가 로드 밸런서 IP 유형의 서비스에 접속하여 접속을 테스트하는 중입니다.
-
-
접근 방법 2: 로컬 컴퓨터에서
-
다음 명령을 실행하여 로컬 랩탑에서 로드 밸런서 유형의 서비스를 사용하여 테스트 NGINX 응용 프로그램에 대한 연결을 테스트합니다.
iwhooge@iwhooge-mac ~ % wget -qO- <ip-of-internal-lb-service>
로드 밸런서 유형의 서비스가 내부 IP 주소를 가지므로 현재 작동하지 않으며 Kubernetes 환경 내에서만 연결할 수 있습니다.
-
다음 명령을 실행하여 사용자 정의 포트
8080
의 로컬 IP 주소를 사용하여 NGINX 응용 프로그램에 액세스해 봅니다.iwhooge@iwhooge-mac ~ % wget -qO- 127.0.0.1:8080 iwhooge@iwhooge-mac ~ %
지금은 작동하지 않지만 SSH 터널을 설정한 후 이 자습서 뒷부분에서 동일한 명령을 사용합니다.
-
-
다음 이미지는 지금까지 수행된 배치를 보여줍니다. 로컬 IP 주소에 대한 터널링된 연결이 작동하지 않습니다.
작업 3: Localhost 항목으로 SSH 구성 스크립트 만들기
SSH 터널이 작동하도록 하려면 /Users/iwhooge/.ssh
폴더에 있는 SSH 구성 파일에 다음 항목을 추가해야 합니다.
-
nano /Users/iwhooge/.ssh/config
명령을 실행하여 구성 파일을 편집합니다. -
Host operator47 섹션에 다음 행을 추가합니다.
LocalForward 8080 127.0.0.1:8080
-
SSH 구성 파일의 출력입니다.
iwhooge@iwhooge-mac .ssh % pwd /Users/iwhooge/.ssh iwhooge@iwhooge-mac .ssh % more config Host bastion47 HostName 129.xxx.xxx.xxx user opc IdentityFile ~/.ssh/id_rsa UserKnownHostsFile /dev/null StrictHostKeyChecking=no TCPKeepAlive=yes ServerAliveInterval=50 Host operator47 HostName 10.0.0.11 user opc IdentityFile ~/.ssh/id_rsa ProxyJump bastion47 UserKnownHostsFile /dev/null StrictHostKeyChecking=no TCPKeepAlive=yes ServerAliveInterval=50 LocalForward 8080 127.0.0.1:8080 iwhooge@iwhooge-mac .ssh %
-
LocalForward
명령이 SSH 구성 파일에 추가됩니다.
작업 4: SSH 터널 설정 및 Localhost를 사용하여 NGINX 웹 서버에 연결
-
SSH를 사용하여 운영자에 연결한 경우 해당 세션의 연결을 해제합니다.
-
스크립트를 사용하여 운영자에 다시 연결합니다.
iwhooge@iwhooge-mac ~ % ssh operator47
-
다음 명령을 실행하여 내부 로드 밸런서 서비스의 IP 주소를 가져옵니다.
[opc@o-sqrtga ~]$ kubectl get svc
-
운영자(SSH 창)에서 다음 명령을 실행하여 SSH 터널을 설정하고 localhost
8080
로 이동하는 모든 트래픽을 로드 밸런서 유형80
의 서비스로 전달합니다. 로드 밸런서 유형의 서비스는 결국 트래픽을 NGINX 애플리케이션으로 전달합니다.[opc@o-sqrtga ~]$ k port-forward svc/my-nginx-svc 8080:80
SSH 창에서 localhost 포트
8080
이 포트80
로 전달되는 Forwarding 메시지를 확인합니다.Forwarding from 127.0.0.1:8080 -> 80 Forwarding from [::1]:8080 -> 80
-
-
로컬 컴퓨터의 연결을 테스트하고 포트
8080
의 로컬 IP 주소(127.0.0.1
)를 사용하여 연결이 작동하는지 확인하고 OKE 환경 내에서 NGINX 응용 프로그램에 연결할 수 있는지 확인합니다. -
새 터미널을 열고 다음 명령을 실행하여 연결을 테스트합니다.
iwhooge@iwhooge-mac ~ % wget -qO- 127.0.0.1:8080
-
로컬 컴퓨터의 터미널에 다음과 같은 출력이 나타나므로 작동 중입니다.
iwhooge@iwhooge-mac ~ % wget -qO- 127.0.0.1:8080 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> iwhooge@iwhooge-mac ~ %
-
운영자 SSH 창에서 출력이 변경되고 새 행에 Handling connection for 8080이 추가되었습니다.
-
웹 브라우저를 사용한 빠른 테스트는 다음 출력을 보여줍니다.
-
다음 이미지는 지금까지 수행된 배치를 보여줍니다. 로컬 IP 주소에 대한 터널링된 연결이 작동 중입니다.
작업 5: Kubernetes 클러스터에 MySQL Database 서비스 배치
SSH 터널을 통해 NGINX 응용 프로그램에 연결할 수 있습니다. 이제 OKE 환경 내에서 실행 중인 MySQL 데이터베이스 서비스를 추가합니다.
-
Kubernetes 환경 내에서 MySQL 데이터베이스 서비스를 설정하려면 다음을 생성해야 합니다.
- 비밀번호 보호를 위한 암호입니다.
- 데이터베이스 스토리지에 대한 영구 볼륨 및 영구 볼륨 클레임.
- 로드 밸런서 유형의 서비스를 사용하는 MYSQL 데이터베이스 서비스입니다.
-
다음 명령을 실행하여 다음을 수행합니다.
-
MySQL 데이터베이스 서비스에 대한 비밀번호를 생성합니다.
nano mysql-secret.yaml
mysql-secret.yaml
에서 다음 YAML 코드를 복사합니다.apiVersion: v1 kind: Secret metadata: name: mysql-secret type: kubernetes.io/basic-auth stringData: password: Or@cle1
-
YAML 코드를 적용합니다.
kubectl apply -f mysql-secret.yaml
-
MySQL 데이터베이스 서비스에 대한 저장소를 만듭니다.
nano mysql-storage.yaml
mysql-storage.yaml
에서 다음 YAML 코드를 복사합니다.apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv-volume labels: type: local spec: storageClassName: manual capacity: storage: 20Gi accessModes: - ReadWriteOnce hostPath: path: "/mnt/data" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pv-claim spec: storageClassName: manual accessModes: - ReadWriteOnce resources: requests: storage: 20Gi
-
YAML 코드를 적용합니다.
kubectl apply -f mysql-storage.yaml
-
MySQL 데이터베이스 서비스 및 로드 밸런서 유형의 서비스를 생성합니다.
nano mysql-deployment.yaml
mysql-deployment.yaml
에서 다음 YAML 코드를 복사합니다.apiVersion: apps/v1 kind: Deployment metadata: name: mysql spec: selector: matchLabels: app: mysql strategy: type: Recreate template: metadata: labels: app: mysql spec: containers: - image: mysql:latest name: mysql env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-secret key: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-pv-claim --- apiVersion: v1 kind: Service metadata: name: my-mysql-svc labels: app: mysql annotations: oci.oraclecloud.com/load-balancer-type: "lb" service.beta.kubernetes.io/oci-load-balancer-internal: "true" service.beta.kubernetes.io/oci-load-balancer-subnet1: "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaaguwakvc6xxxxxxxxxxxxxxxxxxxxxx2rseu7rixvdf5urvpxldhya" service.beta.kubernetes.io/oci-load-balancer-shape: "flexible" service.beta.kubernetes.io/oci-load-balancer-shape-flex-min: "50" service.beta.kubernetes.io/oci-load-balancer-shape-flex-max: "100" spec: type: LoadBalancer ports: - port: 3306 selector: app: mysql
-
YAML 코드를 적용합니다.
kubectl apply -f mysql-deployment.yaml
-
MySQL 데이터베이스 서비스가 성공적으로 배치되었는지 확인합니다.
kubectl get pod
-
MySQL 데이터베이스 서비스가 성공적으로 배치되었음을 알 수 있습니다.
-
로드 밸런서 유형의 서비스가 성공적으로 배치되었는지 확인합니다.
kubectl get svc
-
로드 밸런서 유형의 서비스가 성공적으로 배치되었습니다.
-
-
OCI 콘솔에서 로드 밸런서 객체를 확인하려면 네트워킹, 로드 밸런서로 이동하고 로드 밸런서를 누릅니다.
-
MySQL 데이터베이스 서비스의 터미널 콘솔에 액세스하려면
kubectl exec
명령 및 localhost SSH 터널 명령을 사용할 수 있습니다.-
다음 명령을 실행하여 운영자로부터 터미널 콘솔에 액세스합니다.
kubectl exec --stdin --tty mysql-74f8bf98c5-bl8vv -- /bin/bash
-
다음 명령을 실행하여 MySQL 데이터베이스 서비스 콘솔에 액세스합니다.
mysql -p
-
mysql-secret.yaml
파일에 지정한 암호를 입력하고 MySQL 데이터베이스 서비스의 시작 메시지를 확인합니다. -
다음 SQL 질의를 실행하여 데이터베이스 서비스 내의 모든 MySQL 데이터베이스 목록을 확인합니다.
SHOW DATABASES;
이제 Kubernetes 환경 내에서 MySQL 데이터베이스 서비스 관리 콘솔에 액세스합니다.
-
-
다음 이미지는 지금까지 수행된 배치를 보여줍니다. 로드 밸런서 유형의 서비스를 사용하는 MySQL 서비스가 배치됩니다.
작업 6: SSH 구성 스크립트 내에 Localhost 항목 추가
새 MySQL 데이터베이스 서비스에 액세스하려면 SSH 구성 스크립트 내에 추가 localhost 항목을 추가합니다.
-
SSH 터널이 MySQL 데이터베이스 서비스에 대해 작동하도록 하려면
/Users/iwhooge/.ssh
폴더에 있는 SSH 구성 파일에 다음 항목을 추가해야 합니다. -
nano /Users/iwhooge/.ssh/config
명령을 실행하여 구성 파일을 편집합니다. -
Host operator47 섹션에 다음 행을 추가합니다.
LocalForward 8306 127.0.0.1:8306
-
SSH 구성 파일의 출력입니다.
Host bastion47 HostName 129.xxx.xxx.xxx user opc IdentityFile ~/.ssh/id_rsa UserKnownHostsFile /dev/null StrictHostKeyChecking=no TCPKeepAlive=yes ServerAliveInterval=50 Host operator47 HostName 10.0.0.11 user opc IdentityFile ~/.ssh/id_rsa ProxyJump bastion47 UserKnownHostsFile /dev/null StrictHostKeyChecking=no TCPKeepAlive=yes ServerAliveInterval=50 LocalForward 8080 127.0.0.1:8080 LocalForward 8306 127.0.0.1:8306
-
LocalForward
명령이 SSH 구성 파일에 추가됩니다.
작업 7: SSH 터널 설정 및 Localhost를 사용하여 MySQL Database에 연결
-
로컬 컴퓨터에서 MySQL 데이터베이스 서비스에 대한 연결을 테스트하려면 로컬 컴퓨터에 MySQL Workbench를 다운로드하고 설치해야 합니다.
-
스크립트를 다시 사용하여 운영자의 새 터미널을 엽니다. 다른 터미널을 열어 둡니다.
iwhooge@iwhooge-mac ~ % ssh operator47
-
운영자 SSH 창에서 다음 명령을 실행하여 SSH 터널을 설정하고 localhost
8306
로 이동하는 모든 트래픽을 로드 밸런서 유형3306
의 서비스로 전달합니다. 로드 밸런서 유형의 서비스는 결국 트래픽을 MySQL 데이터베이스 서비스로 전달합니다.[opc@o-sqrtga ~]$ k port-forward svc/my-mysql-svc 8306:3306
-
SSH 창에서 localhost 포트
8306
이 포트3306
로 전달되는 Forwarding 메시지를 확인합니다.Forwarding from 127.0.0.1:8306 -> 3306 Forwarding from [::1]:8306 -> 3306
-
-
MySQL Workbench 응용 프로그램이 설치되고 SSH 세션 및 터널이 설정된 경우 로컬 컴퓨터에서 MySQL Workbench 응용 프로그램을 엽니다.
-
+를 눌러 새 MySQL 접속을 추가합니다.
-
새 접속 설정에 다음 정보를 입력합니다.
- 접속 이름: 이름을 입력합니다.
- 호스트 이름:
127.0.0.1
(트래픽을 터널링할 때 localhost)이 될 IP 주소를 입력합니다. - 포트: MySQL 데이터베이스 서비스에 대한 로컬 터널 전달에 사용하는 포트인
8306
로 포트를 입력합니다. - 연결 테스트를 누릅니다.
- 비밀번호:
mysql-secret.yaml
파일에 지정한 비밀번호를 입력합니다. - 확인을 누릅니다.
-
접속 경고를 무시하려면 계속을 누릅니다. 이 경고는 MySQL Workbench 응용 프로그램 버전과 배포된 MySQL 데이터베이스 서비스 버전이 호환되지 않을 수 있으므로 제공됩니다.
- 성공한 연결 메시지를 살펴봅니다.
- 확인을 누릅니다.
- MySQL 접속을 저장하려면 확인을 누르십시오.
-
저장된 MySQL 접속을 눌러 세션을 엽니다.
-
Please stand by... 메시지를 확인합니다.
-
접속 경고를 무시하려면 계속을 누릅니다.
-
다음 SQL 질의를 실행하여 데이터베이스 서비스 내의 모든 MySQL 데이터베이스 목록을 설정합니다.
SHOW DATABASES;
-
번개 아이콘을 클릭합니다.
-
MySQL 데이터베이스 서비스 내의 모든 MySQL 데이터베이스의 출력을 확인합니다.
-
-
운영자 SSH 창에서 출력이 변경되고 새 행에 Handling connection for 8306이 추가되었습니다.
-
다음에 대해 각각 하나씩 여러 연결을 설정했기 때문에 여러 항목이 있습니다.
- 테스트.
- 실제 접속입니다.
- SQL 질의.
- 우리가 이전에 한 테스트 (추가).
-
이제 운영자를 향해 여러 SSH 세션을 열고 여러 응용 프로그램에 대해 여러 터널 명령을 동시에 실행할 수 있습니다. 다음 window를 살펴봅니다.
- MySQL 데이터베이스 서비스에 대한 터널 명령을 사용하는 SSH 터미널입니다.
- 로컬 컴퓨터에서 localhost IP 주소
127.0.0.1
을 사용하여 MYSQL Workbench 응용 프로그램을 사용하는 연결은 MySQL 데이터베이스 서비스로 연결됩니다. - NGINX 응용 프로그램에 대한 터널 명령을 사용하는 SSH 터미널입니다.
- 로컬 컴퓨터에서 로컬 호스트 IP 주소
127.0.0.1
를 사용하여 NGINX 응용 프로그램으로 Safari 인터넷 브라우저를 사용하는 연결입니다.
-
다음 이미지는 지금까지 수행된 배치를 보여줍니다. 로컬 IP 주소에 대한 터널링된 연결은 여러 SSH 세션 및 SSH 터널을 사용하는 동시에 NGINX 응용 프로그램과 MySQL 데이터베이스 서비스에 대해 동시에 작동합니다.
작업 8: 모든 응용 프로그램 및 서비스 정리
-
다음 명령을 실행하여 배치된 NGINX 응용 프로그램 및 연관된 서비스를 정리합니다.
kubectl get pods kubectl delete service my-nginx-svc -n default kubectl get pods kubectl get svc kubectl delete deployment my-nginx --namespace default kubectl get svc
-
다음 명령을 실행하여 배치된 MySQL 데이터베이스 서비스 및 연관된 서비스, 저장 영역 및 비밀번호를 정리합니다.
kubectl delete deployment,svc mysql kubectl delete pvc mysql-pv-claim kubectl delete pv mysql-pv-volume kubectl delete secret mysql-secret
-
다음 이미지는 사용자가 다시 깨끗한 환경을 갖고 처음부터 다시 시작할 수 있는 지금까지 수행한 배치를 보여줍니다.
다음 단계
OKE 클러스터에 대한 액세스 보안은 최신 애플리케이션 개발에서 중요한 단계이며 SSH 터널링은 강력하고 간단한 솔루션을 제공합니다. 이 자습서의 단계를 구현함으로써 개발자는 리소스를 보호하고 워크플로우를 간소화하며 여러 애플리케이션에 대한 중요한 연결을 제어할 수 있습니다. SSH 터널링을 OKE 설정에 통합하면 보안이 향상될 뿐만 아니라 공용 인터넷에 리소스를 노출하는 것과 관련된 위험을 최소화할 수 있습니다. 이 연습을 통해 자신 있게 OKE 클러스터를 사용하고 확장 가능하고 안전하며 효율적인 애플리케이션을 구축하는 데 집중할 수 있습니다.
확인
- 작성자 - Iwan Hoogendoorn(OCI 네트워크 전문가)
추가 학습 자원
docs.oracle.com/learn에서 다른 실습을 탐색하거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하세요. 또한 Oracle Learning Explorer가 되려면 education.oracle.com/learning-explorer을 방문하십시오.
제품 설명서는 Oracle Help Center를 참조하십시오.
Leverage SSH Tunneling with Oracle Cloud Infrastructure Kubernetes Engine for Secure Application Development
G21953-02
December 2024