
- Kubernetes Engine을 사용하여 전체 Kubernetes 클러스터를 공급합니다.
- kubectl을 사용하여 도커 컨테이너를 배포하고 관리합니다.
- Kubernetes의 배포 및 서비스를 사용하여 응용프로그램을 마이크로서비스로 분할합니다.
Google Kubernetes Engine
- 클라우드 셸 환경에서 다음 명령을 입력하여 영역을 설정합니다:
gcloud config set compute/zone us-central1-b
- 이번 lab에서 사용할 클러스터를 생성합니다:
gcloud container clusters create io
생성 시 클러스터에 대해 자동으로 인증됩니다.
어떤 이유로든 Cloud Shell에 대한 연결이 끊어지면 gcloud container clusters get-credentials io 명령을 실행하여 다시 인증합니다.
Task 1. Sample code 가져오기
- Sample코드 가져오기 위해 다음과 같은 명령어 실행:
gsutil cp -r gs://spls/gsp021/* .
- 이번 lab에서 사용할 장소로 디랙토리 변경:
cd orchestrate-with-kubernetes/kubernetes
- ls로 파일 리스트 보기:
ls
deployments/ /* Deployment manifests */
...
nginx/ /* nginx config files */
...
pods/ /* Pod manifests */
...
services/ /* Services manifests */
...
tls/ /* TLS certificates */
...
cleanup.sh /* Cleanup script */
Task 2. Quick Kubernetes Demo
Kubernetes를 시작하는 가장 쉬운 방법은 kubectl create 명령을 사용하는 것입니다.
- 이 명령을 사용하여 nginx 컨테이너의 단일 인스턴스를 시작합니다:
kubectl create deployment nginx --image=nginx:1.10.0
쿠베네테스에서는 모든 컨테이너가 포드 안에서 작동한다!
- 실행 중인 nginx 컨테이너를 보려면 kubectl get pods 명령을 사용합니다:
kubectl get pods
- nginx 컨테이너가 Running 상태가 되면 kubectl exposure 명령을 사용하여 Kubernetes 외부에 노출할 수 있습니다:
kubectl expose deployment nginx --port 80 --type LoadBalancer
백그라운드에서 Kubernetes는 공용 IP 주소가 연결된 외부 로드 밸런서를 생성했습니다.
해당 공용 IP 주소에 도달한 모든 클라이언트는 서비스 뒤의 포드로 라우팅됩니다. 이 경우 nginx 포드가 됩니다.
- kubectl get services 명령을 사용하여 서비스를 나열합니다:
kubectl get services
- 외부 IP를 추가하여 Nginx 컨테이너를 원격으로 타격합니다:
curl http://<External IP>:80
Task 3. Pods
쿠베네테스의 중심에는 포드가 있습니다.
포드는 하나 이상의 컨테이너 컬렉션을 나타내며 유지합니다.
일반적으로 서로에 대한 의존성이 높은 여러 컨테이너가 있는 경우 단일 포드 내에서 컨테이너를 포장합니다.

이 예에는 monolith 용기와 nginx 용기가 포함된 포드가 있습니다.
포드에도 볼륨이 있습니다. 볼륨은 포드가 지속되는 동안 지속되는 데이터 디스크이며 해당 포드의 컨테이너에서 사용할 수 있습니다. 포드는 콘텐츠에 대한 공유 네임스페이스를 제공하므로 예제 포드 내부의 두 컨테이너가 서로 통신할 수 있으며 연결된 볼륨도 공유합니다.
포드는 네트워크 네임스페이스도 공유합니다. 즉, 포드당 하나의 IP 주소가 있습니다.
Task 4. pods 생성하기
포드 구성 파일을 사용하여 포드를 만들 수 있습니다. 잠시 시간을 내어 모노리스 포드 구성 파일을 살펴봅니다.
- 디랙토리를 변경합니다:
cd ~/orchestrate-with-kubernetes/kubernetes
- Run:
cat pods/monolith.yaml
apiVersion: v1
kind: Pod
metadata:
name: monolith
labels:
app: monolith
spec:
containers:
- name: monolith
image: kelseyhightower/monolith:1.0.0
args:
- "-http=0.0.0.0:80"
- "-health=0.0.0.0:81"
- "-secret=secret"
ports:
- name: http
containerPort: 80
- name: health
containerPort: 81
resources:
limits:
cpu: 0.2
memory: "10Mi"
- 포드는 하나의 컨테이너(monolith)로 구성되어 있습니다.
- 컨테이너가 시작될 때 몇 가지 argument를 전달하고 있습니다.
- http 트래픽을 위해 포트 80을 열고 있습니다.
- kubectl을 사용하여 monolith 포드를 만듭니다:
kubectl create -f pods/monolith.yaml
- 포드를 검사합니다. kubectl get pods 명령을 사용하여 기본 네임스페이스에서 실행 중인 모든 포드를 나열합니다:
kubectl get pods
- 포드가 실행되면 kubectl descript 명령을 사용하여 모노리스 포드에 대한 자세한 정보를 얻습니다:
kubectl describe pods monolith
Task 5. Pod와 상호작용
기본적으로 포드에는 전용 IP 주소가 할당되며 클러스터 외부에서는 연결할 수 없습니다.
kubectl port-forward 명령을 사용하여 로컬 포트를 monolith 포드 내부의 포트에 매핑합니다.
- 추가로 터미널을 하나 더 실행시킵니다
- 두번째 터미널에서 포트 포워딩을 위해 다음 커맨드를 실행합니다:
kubectl port-forward monolith 10080:80
- 이제 첫번째 터미널에서 curl을 이용하여 포드에 말을 걸어보세요.
curl http://127.0.0.1:10080
'hello'라는 답장이 올 것임!
- 이제 curl 명령을 사용하여 보안 엔드포인트에 도달하면 어떻게 되는지 확인합니다:
curl http://127.0.0.1:10080/secure
Uh oh. 뭔가 에러가 남..
- monolith에서 인증 토큰을 가져오려면 로그인해 보십시오:
curl -u user http://127.0.0.1:10080/login
- 비밀번호는 password이다.
로그인하면 JWT토큰이 출력된다.
- Cloud Shell은 긴 문자열 복사를 잘 처리하지 않으므로 토큰에 대한 환경 변수를 만듭니다.
TOKEN=$(curl http://127.0.0.1:10080/login -u user|jq -r '.token')
- 다시 password을 입력해 로그인한다.
- 이 명령을 사용하여 복사한 다음 토큰을 사용하여 보안 끝점을 컬로 타격합니다:
curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:10080/secure
- kubectl logs 명령을 사용하여 모노리스 포드의 로그를 봅니다.
kubectl logs monolith
- 세 번째 터미널을 열고 -f 플래그를 사용하여 실시간으로 발생하는 로그 스트림을 가져옵니다:
kubectl logs -f monolith
- 이제 첫 번째 터미널에서 컬을 사용하여 모노리스와 상호 작용하면 로그 업데이트를 볼 수 있습니다(세 번째 터미널에서):
curl http://127.0.0.1:10080
- kubectl exec 명령을 사용하여 Monolith Pod 내부에서 대화형 셸을 실행합니다. 이 기능은 컨테이너 내에서 문제를 해결하려는 경우에 유용합니다:
kubectl exec monolith --stdin --tty -c monolith -- /bin/sh
- 예를 들어, monolith 컨테이너에 셸을 넣은 후 ping 명령을 사용하여 외부 연결을 테스트할 수 있습니다:
ping -c 3 google.com
- 로그아웃 하는 것 잊지 말기!
exit
Task 6. Services
포드는 지속적인 것이 아닙니다. 활성화 또는 준비 상태 점검 실패와 같은 여러 가지 이유로 인해 중지되거나 시작될 수 있으며, 이로 인해 다음과 같은 문제가 발생합니다:
다시 시작하면 다른 IP 주소가 할당될 수 있습니다.
여기서 서비스가 제공됩니다. 서비스는 포드에 안정적인 엔드포인트를 제공합니다.
Task 7. Service 생성하기
서비스를 생성하려면 먼저 https 트래픽을 처리할 수 있는 보안 포드를 생성해야 합니다.
- 디랙토리 번경:
cd ~/orchestrate-with-kubernetes/kubernetes
- monolith 서비스 구성 파일 탐색:
cat pods/secure-monolith.yaml
- 보안 monolith 포드와 해당 구성 데이터 생성:
kubectl create secret generic tls-certs --from-file tls/
kubectl create configmap nginx-proxy-conf --from-file nginx/proxy.conf
kubectl create -f pods/secure-monolith.yaml
이제 보안 포드를 확보했으므로 보안 모노리스 포드를 외부에 노출해야 합니다.이를 위해 쿠버네티스 서비스를 생성합니다.
- monolith 서비스 구성 파일 탐색:
cat services/monolith.yaml
kind: Service
apiVersion: v1
metadata:
name: "monolith"
spec:
selector:
app: "monolith"
secure: "enabled"
ports:
- protocol: "TCP"
port: 443
targetPort: 443
nodePort: 31000
type: NodePort
Things to note:
* 'app: monolith' 및 'secure: enabled' 레이블이 있는 모든 포드를 자동으로 찾아 노출하는 데 사용되는 선택기가 있습니다.
* 이렇게 하면 포트 31000에서 nginx(포트 443)로 외부 트래픽을 전달할 수 있기 때문에 노드 포트를 여기에 노출해야 합니다.
- kubectl create 명령을 사용하여 monolith 서비스 구성 파일에서 monolith 서비스를 만듭니다:
kubectl create -f services/monolith.yaml
service/monolith created
포트를 사용하여 서비스를 노출하고 있습니다. 즉, 다른 앱이 서버 중 하나의 포트 31000에 바인딩하려고 할 경우 포트 충돌이 발생할 수 있습니다.
- gcloud compute firewall-rules 명령을 사용하여 노출된 노드 포트의 모노리스 서비스에 대한 트래픽을 허용합니다:
gcloud compute firewall-rules create allow-monolith-nodeport \
--allow=tcp:31000
이제 모든 것이 설정되었으므로 포트 포워딩을 사용하지 않고 클러스터 외부에서 시큐어 모노리스 서비스를 실행할 수 있습니다.
- 먼저 노드 중 하나에 대한 외부 IP 주소를 가져옵니다.
gcloud compute instances list
- 이제 curl을 사용하여 secure-monolith 서비스를 실행해 본다:
curl -k https://<EXTERNAL_IP>:31000
Timeout 오류가 발생--!!
Task 8. Pod에 Labels추가하기
현재 모노리스 서비스에 앤드포인트가 없습니다.
이와 같은 문제를 해결하는 한 가지 방법은 레이블 쿼리와 함께 kubectl get pods 명령을 사용하는 것입니다.
- 모노리스 레이블로 실행되는 포드가 꽤 많다는 것을 알 수 있습니다.
kubectl get pods -l "app=monolith"
- 하지만 "app=monolith" 과 "secure=enabled" 옵션이면 어떻습니까?
kubectl get pods -l "app=monolith,secure=enabled"
이 레이블 쿼리는 결과를 print하지 않는다.
뭔가 "secure=enabled" 레이블을 추가해야 할 것 같습니다.
- kubectl label 명령을 사용하여 누락된 secure= 활성화 라벨을 secure-monolith Pod에 추가합니다. 그런 다음 레이블이 업데이트되었는지 확인할 수 있습니다.
kubectl label pods secure-monolith 'secure=enabled'
kubectl get pods secure-monolith --show-labels
- 포드에 레이블이 올바르게 지정되었으니 모노리스 서비스의 엔드포인트 목록을 보십시오:
kubectl describe services monolith | grep Endpoints
And you have one!
- 노드 중 하나를 다시 눌러 테스트해 보십시오.
gcloud compute instances list
curl -k https://<EXTERNAL_IP>:31000
이젠 연결이 닿는다!
Task 9. Deploying applications with Kubernetes
이 lab의 목표는 프로덕션에서 컨테이너를 확장하고 관리할 수 있도록 준비하는 것입니다.
바로 여기에 Deployment가 필요합니다.
Deployment는 실행 중인 포드 수가 사용자가 지정한 원하는 포드 수와 동일하도록 보장하는 선언적인 방법입니다.


포드는 자신이 생성된 노드의 수명과 연결됩니다.
위의 예에서 Node3은 다운되었습니다(Pod를 함께 가져갑니다).
새 포드를 수동으로 생성하여 해당 노드를 찾는 대신 배포에서 새 포드를 생성하여 노드2에서 시작했습니다.
Task 10. Deployments 생성하기
모노리스 앱을 세 개의 개별 조각으로 분할합니다:
auth - 인증된 사용자에 대한 JWT 토큰을 생성합니다.
안녕하세요 - 인증된 사용자에게 인사합니다.
frontend - 트래픽을 auth 및 hello 서비스로 라우팅합니다.
각 서비스마다 하나씩 배포를 생성할 준비가 되었습니다. 그런 다음 auth 및 hello 배포에 대한 내부 서비스와 프런트 엔드 배포에 대한 외부 서비스를 정의합니다. 작업이 완료되면 Monolith와 마찬가지로 마이크로 서비스와 상호 작용할 수 있습니다. 이제 각 조각을 독립적으로 확장하고 배포할 수 있습니다!
- 인증 배포 구성 파일을 검토하여 시작합니다.
cat deployments/auth.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: auth
spec:
selector:
matchlabels:
app: auth
replicas: 1
template:
metadata:
labels:
app: auth
track: stable
spec:
containers:
- name: auth
image: "kelseyhightower/auth:2.0.0"
ports:
- name: http
containerPort: 80
- name: health
containerPort: 81
...
배포에서 하나의 복제본을 만들고 있으며 인증 컨테이너 버전 2.0.0을 사용하고 있습니다.
kubectl create 명령을 실행하여 인증 배포를 생성하면 배포 매니페스트의 데이터와 일치하는 포드가 하나 생성됩니다. 즉, 복제본 필드에 지정된 개수를 변경하여 포드 수를 조정할 수 있습니다.
- 어쨌든 배포 개체를 생성합니다:
kubectl create -f deployments/auth.yaml
- 인증 배포를 위한 서비스를 만들 시간입니다. kubectl create 명령을 사용하여 인증 서비스를 만듭니다:
kubectl create -f services/auth.yaml
- 이제 Hello 배포를 만들고 표시할 때도 동일한 작업을 수행합니다:
kubectl create -f deployments/hello.yaml
kubectl create -f services/hello.yaml
- frontend에 대해서도 동일한 작업을 실행합니다:
kubectl create configmap nginx-frontend-conf --from-file=nginx/frontend.conf
kubectl create -f deployments/frontend.yaml
kubectl create -f services/frontend.yaml
Note: 컨테이너와 함께 일부 구성 데이터를 저장해야 하므로 프런트 엔드를 생성하는 데 한 단계 더 필요합니다.
- 외부 IP를 잡은 다음 해당 IP에 컬링하여 프런트 엔드와 상호 작용할 수 있습니다:
kubectl get services frontend
curl -k https://<EXTERNAL-IP>
hello응답이 오는 것을 확인할 수 있다!
'클라우드 > Kubernetes in Google' 카테고리의 다른 글
쿠버네티스 2주차) Lab#2 : Kubernetes Engine: Qwik Start (0) | 2023.04.29 |
---|---|
쿠버네티스 1주차) Lab#1 : Introduction to Docker (0) | 2023.04.18 |