가상 머신 설치
가상 머신 설치 (Virtual Machine Installation)
Istio를 배포하고, 가상 머신 안에서 실행되는 워크로드를 그 메시에 연결하는 방법을 알려드려요.
출처: Istio 문서
본문
이 가이드를 따라 Istio를 배포하고 가상 머신을 그 메시에 연결해요.
사전 요구사항
- Istio 릴리스를 다운로드하세요.
- 필요한 플랫폼별 설정을 수행하세요.
- Pod 및 서비스 요구사항을 확인하세요.
- 가상 머신은 연결되는 메시의 ingress 게이트웨이에 IP 연결이 있어야 하고, 향상된 성능을 원한다면 L3 네트워킹을 통해 메시의 모든 pod에 선택적으로 연결이 있어야 해요.
- Istio의 가상 머신 통합의 높은 수준 아키텍처를 이해하려면 가상 머신 아키텍처에 대해 배워보세요.
가이드 환경 준비
- 가상 머신을 만들어요.
- 클러스터를 설정하는 데 사용 중인 머신에서 환경 변수
VM_APP,WORK_DIR,VM_NAMESPACE,SERVICE_ACCOUNT를 설정해요. (예:WORK_DIR="${HOME}/vmintegration"):
$ VM_APP="<the name of the application this VM will run>"
$ VM_NAMESPACE="<the name of your service namespace>"
$ WORK_DIR="<a certificate working directory>"
$ SERVICE_ACCOUNT="<name of the Kubernetes service account you want to use for your VM>"
$ CLUSTER_NETWORK=""
$ VM_NETWORK=""
$ CLUSTER="Kubernetes"
$ VM_APP="<the name of the application this VM will run>"
$ VM_NAMESPACE="<the name of your service namespace>"
$ WORK_DIR="<a certificate working directory>"
$ SERVICE_ACCOUNT="<name of the Kubernetes service account you want to use for your VM>"
$ # Customize values for multi-cluster/multi-network as needed
$ CLUSTER_NETWORK="kube-network"
$ VM_NETWORK="vm-network"
$ CLUSTER="cluster1"
- 클러스터를 설정하는 데 사용 중인 머신에 작업 디렉터리를 만들어요:
$ mkdir -p "${WORK_DIR}"
Istio 컨트롤 플레인 설치
클러스터에 이미 Istio 컨트롤 플레인이 있다면 설치 단계는 건너뛸 수 있지만, 가상 머신이 접근할 수 있도록 컨트롤 플레인을 노출해야 해요.
클러스터에 Istio를 설치하고 컨트롤 플레인을 노출해서 가상 머신이 접근할 수 있게 해요.
- 설치용
IstioOperator스펙을 만들어요.
$ cat <<EOF > ./vm-cluster.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
name: istio
spec:
values:
global:
meshID: mesh1
multiCluster:
clusterName: "${CLUSTER}"
network: "${CLUSTER_NETWORK}"
EOF
- Istio를 설치해요.
$ istioctl install -f vm-cluster.yaml
$ istioctl install -f vm-cluster.yaml --set values.pilot.env.PILOT_ENABLE_WORKLOAD_ENTRY_AUTOREGISTRATION=true --set values.pilot.env.PILOT_ENABLE_WORKLOAD_ENTRY_HEALTHCHECKS=true
- east-west 게이트웨이를 배포해요:
$ @samples/multicluster/gen-eastwest-gateway.sh@ --single-cluster | istioctl install -y -f -
$ @samples/multicluster/gen-eastwest-gateway.sh@ \
--network "${CLUSTER_NETWORK}" | \
istioctl install -y -f -
- east-west 게이트웨이를 통해 클러스터 안의 서비스를 노출해요:
컨트롤 플레인을 노출해요:
$ kubectl apply -n istio-system -f @samples/multicluster/expose-istiod.yaml@
컨트롤 플레인을 노출해요:
$ kubectl apply -n istio-system -f @samples/multicluster/expose-istiod.yaml@
클러스터 서비스를 노출해요:
$ kubectl apply -n istio-system -f @samples/multicluster/expose-services.yaml@
정의된 클러스터 네트워크로 istio-system 네임스페이스에 라벨을 붙여야 해요:
$ kubectl label namespace istio-system topology.istio.io/network="${CLUSTER_NETWORK}"
VM 네임스페이스 설정
- 가상 머신을 호스팅할 네임스페이스를 만들어요:
$ kubectl create namespace "${VM_NAMESPACE}"
- 가상 머신용 serviceaccount를 만들어요:
$ kubectl create serviceaccount "${SERVICE_ACCOUNT}" -n "${VM_NAMESPACE}"
가상 머신으로 전송할 파일 만들기
먼저 VM용 템플릿 WorkloadGroup을 만들어요:
$ cat <<EOF > workloadgroup.yaml
apiVersion: networking.istio.io/v1
kind: WorkloadGroup
metadata:
name: "${VM_APP}"
namespace: "${VM_NAMESPACE}"
spec:
metadata:
labels:
app: "${VM_APP}"
template:
serviceAccount: "${SERVICE_ACCOUNT}"
network: "${VM_NETWORK}"
EOF
먼저 VM용 템플릿 WorkloadGroup을 만들어요:
$ cat <<EOF > workloadgroup.yaml
apiVersion: networking.istio.io/v1
kind: WorkloadGroup
metadata:
name: "${VM_APP}"
namespace: "${VM_NAMESPACE}"
spec:
metadata:
labels:
app: "${VM_APP}"
template:
serviceAccount: "${SERVICE_ACCOUNT}"
network: "${VM_NETWORK}"
EOF
그런 다음 지정된 WorkloadEntry 생성을 허용하려면 WorkloadGroup을 클러스터에 푸시해요:
$ kubectl --namespace "${VM_NAMESPACE}" apply -f workloadgroup.yaml
자동화된 WorkloadEntry 생성 기능을 사용하면 애플리케이션 상태 확인(health checks)도 사용할 수 있어요. 이것은 Kubernetes Readiness Probes와 같은 API와 동작을 공유해요.
예를 들어 애플리케이션의 /ready 엔드포인트에 프로브를 설정하려면:
$ cat <<EOF > workloadgroup.yaml
apiVersion: networking.istio.io/v1
kind: WorkloadGroup
metadata:
name: "${VM_APP}"
namespace: "${VM_NAMESPACE}"
spec:
metadata:
labels:
app: "${VM_APP}"
template:
serviceAccount: "${SERVICE_ACCOUNT}"
network: "${VM_NETWORK}"
probe:
periodSeconds: 5
initialDelaySeconds: 1
httpGet:
port: 8080
path: /ready
EOF
이 설정을 사용하면 자동 생성된 WorkloadEntry는 프로브가 성공할 때까지 "Ready"로 표시되지 않아요.
그 다음 istioctl x workload entry 명령으로 다음을 생성해요:
cluster.env: 어떤 네임스페이스, 서비스 계정, 네트워크 CIDR 및 (선택적으로) 어떤 인바운드 포트를 캡처할지 식별하는 메타데이터를 포함해요.istio-token: CA에서 인증서를 얻는 데 사용되는 Kubernetes 토큰.mesh.yaml:discoveryAddress, 상태 확인 프로브, 일부 인증 옵션을 설정하는ProxyConfig를 제공해요.root-cert.pem: 인증에 사용되는 루트 인증서.hosts: 프록시가 xDS용 istiod에 도달하는 데 사용할/etc/hosts에 대한 추가 내용.*
$ istioctl x workload entry configure -f workloadgroup.yaml -o "${WORK_DIR}" --clusterID "${CLUSTER}"
$ istioctl x workload entry configure -f workloadgroup.yaml -o "${WORK_DIR}" --clusterID "${CLUSTER}" --autoregister
가상 머신 설정
Istio 메시에 추가하려는 가상 머신에서 다음 명령을 실행해요:
"${WORK_DIR}"의 파일들을 가상 머신으로 안전하게 전송해요. 파일을 안전하게 전송하는 방법은 정보 보안 정책을 고려해서 선택해야 해요. 이 가이드에서는 편의를 위해 필요한 모든 파일을 가상 머신의"${HOME}"으로 전송해요./etc/certs에 루트 인증서를 설치해요:
$ sudo mkdir -p /etc/certs
$ sudo cp "${HOME}"/root-cert.pem /etc/certs/root-cert.pem
/var/run/secrets/tokens에 토큰을 설치해요:
$ sudo mkdir -p /var/run/secrets/tokens
$ sudo cp "${HOME}"/istio-token /var/run/secrets/tokens/istio-token
- Istio 가상 머신 통합 런타임이 포함된 패키지를 설치해요:
$ curl -LO https://blob.istio.io/istio-release/releases/1.31.1/deb/istio-sidecar.deb
$ sudo dpkg -i istio-sidecar.deb
참고: 현재 CentOS 8만 지원돼요.
$ curl -LO https://blob.istio.io/istio-release/releases/1.31.1/rpm/istio-sidecar.rpm
$ sudo rpm -i istio-sidecar.rpm
/var/lib/istio/envoy/디렉터리에cluster.env를 설치해요:
$ sudo cp "${HOME}"/cluster.env /var/lib/istio/envoy/cluster.env
- Mesh Config를
/etc/istio/config/mesh에 설치해요:
$ sudo cp "${HOME}"/mesh.yaml /etc/istio/config/mesh
/etc/hosts에 istiod 호스트를 추가해요:
$ sudo sh -c 'cat $(eval echo ~$SUDO_USER)/hosts >> /etc/hosts'
/etc/certs/와/var/lib/istio/envoy/의 파일 소유권을 Istio 프록시로 이전해요:
$ sudo mkdir -p /etc/istio/proxy
$ sudo chown -R istio-proxy /var/lib/istio /etc/certs /etc/istio/proxy /etc/istio/config /var/run/secrets /etc/certs/root-cert.pem
가상 머신 안에서 Istio 시작
- Istio 에이전트를 시작해요:
$ sudo systemctl start istio
Istio가 성공적으로 동작하는지 검증
/var/log/istio/istio.log의 로그를 확인해요. 다음과 유사한 항목이 보일 거예요:
$ 2020-08-21T01:32:17.748413Z info sds resource:default pushed key/cert pair to proxy
$ 2020-08-21T01:32:20.270073Z info sds resource:ROOTCA new connection
$ 2020-08-21T01:32:20.270142Z info sds Skipping waiting for gateway secret
$ 2020-08-21T01:32:20.270279Z info cache adding watcher for file ./etc/certs/root-cert.pem
$ 2020-08-21T01:32:20.270347Z info cache GenerateSecret from file ROOTCA
$ 2020-08-21T01:32:20.270494Z info sds resource:ROOTCA pushed root cert to proxy
$ 2020-08-21T01:32:20.270734Z info sds resource:default new connection
$ 2020-08-21T01:32:20.270763Z info sds Skipping waiting for gateway secret
$ 2020-08-21T01:32:20.695478Z info cache GenerateSecret default
$ 2020-08-21T01:32:20.695595Z info sds resource:default pushed key/cert pair to proxy
- Pod 기반 서비스를 배포할 네임스페이스를 만들어요:
$ kubectl create namespace sample
$ kubectl label namespace sample istio-injection=enabled
HelloWorld서비스를 배포해요:
$ kubectl apply -n sample -f @samples/helloworld/helloworld.yaml@
- 가상 머신에서 서비스로 요청을 보내요:
$ curl helloworld.sample.svc:5000/hello
Hello version: v1, instance: helloworld-v1-578dd69f69-fxwwk
다음 단계
가상 머신에 대한 더 많은 정보:
- 가상 머신 디버깅 — 가상 머신 문제를 해결하는 방법.
- 가상 머신을 사용한 Bookinfo — 가상 머신 예시 배포를 설정하는 방법.
제거
가상 머신에서 Istio를 중지해요:
$ sudo systemctl stop istio
그런 다음 Istio-sidecar 패키지를 제거해요:
$ sudo dpkg -r istio-sidecar
$ dpkg -s istio-sidecar
$ sudo rpm -e istio-sidecar
Istio를 제거하려면 다음 명령을 실행해요:
$ kubectl delete -n istio-system -f @samples/multicluster/expose-istiod.yaml@
$ istioctl uninstall -y --purge
컨트롤 플레인 네임스페이스(예: istio-system)는 기본적으로 제거되지 않아요.
더 이상 필요 없다면 다음 명령으로 제거해요:
$ kubectl delete namespace istio-system