가상 머신 설치

가상 머신 설치 (Virtual Machine Installation)

Istio를 배포하고, 가상 머신 안에서 실행되는 워크로드를 그 메시에 연결하는 방법을 알려드려요.

출처: Istio 문서

본문

이 가이드를 따라 Istio를 배포하고 가상 머신을 그 메시에 연결해요.

사전 요구사항

  1. Istio 릴리스를 다운로드하세요.
  2. 필요한 플랫폼별 설정을 수행하세요.
  3. Pod 및 서비스 요구사항을 확인하세요.
  4. 가상 머신은 연결되는 메시의 ingress 게이트웨이에 IP 연결이 있어야 하고, 향상된 성능을 원한다면 L3 네트워킹을 통해 메시의 모든 pod에 선택적으로 연결이 있어야 해요.
  5. Istio의 가상 머신 통합의 높은 수준 아키텍처를 이해하려면 가상 머신 아키텍처에 대해 배워보세요.

가이드 환경 준비

  1. 가상 머신을 만들어요.
  2. 클러스터를 설정하는 데 사용 중인 머신에서 환경 변수 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"
  1. 클러스터를 설정하는 데 사용 중인 머신에 작업 디렉터리를 만들어요:
$ mkdir -p "${WORK_DIR}"

Istio 컨트롤 플레인 설치

클러스터에 이미 Istio 컨트롤 플레인이 있다면 설치 단계는 건너뛸 수 있지만, 가상 머신이 접근할 수 있도록 컨트롤 플레인을 노출해야 해요.

클러스터에 Istio를 설치하고 컨트롤 플레인을 노출해서 가상 머신이 접근할 수 있게 해요.

  1. 설치용 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
  1. 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
  1. east-west 게이트웨이를 배포해요:

Zip

$ @samples/multicluster/gen-eastwest-gateway.sh@ --single-cluster | istioctl install -y -f -

Zip

$ @samples/multicluster/gen-eastwest-gateway.sh@ \
--network "${CLUSTER_NETWORK}" | \
istioctl install -y -f -
  1. east-west 게이트웨이를 통해 클러스터 안의 서비스를 노출해요:

컨트롤 플레인을 노출해요:

Zip

$ kubectl apply -n istio-system -f @samples/multicluster/expose-istiod.yaml@

컨트롤 플레인을 노출해요:

Zip

$ kubectl apply -n istio-system -f @samples/multicluster/expose-istiod.yaml@

클러스터 서비스를 노출해요:

Zip

$ 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 네임스페이스 설정

  1. 가상 머신을 호스팅할 네임스페이스를 만들어요:
$ kubectl create namespace "${VM_NAMESPACE}"
  1. 가상 머신용 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 메시에 추가하려는 가상 머신에서 다음 명령을 실행해요:

  1. "${WORK_DIR}"의 파일들을 가상 머신으로 안전하게 전송해요. 파일을 안전하게 전송하는 방법은 정보 보안 정책을 고려해서 선택해야 해요. 이 가이드에서는 편의를 위해 필요한 모든 파일을 가상 머신의 "${HOME}"으로 전송해요.
  2. /etc/certs에 루트 인증서를 설치해요:
$ sudo mkdir -p /etc/certs
$ sudo cp "${HOME}"/root-cert.pem /etc/certs/root-cert.pem
  1. /var/run/secrets/tokens에 토큰을 설치해요:
$ sudo  mkdir -p /var/run/secrets/tokens
$ sudo cp "${HOME}"/istio-token /var/run/secrets/tokens/istio-token
  1. 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
  1. /var/lib/istio/envoy/ 디렉터리에 cluster.env를 설치해요:
$ sudo cp "${HOME}"/cluster.env /var/lib/istio/envoy/cluster.env
  1. Mesh Config를 /etc/istio/config/mesh에 설치해요:
$ sudo cp "${HOME}"/mesh.yaml /etc/istio/config/mesh
  1. /etc/hosts에 istiod 호스트를 추가해요:
$ sudo sh -c 'cat $(eval echo ~$SUDO_USER)/hosts >> /etc/hosts'
  1. /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 시작

  1. Istio 에이전트를 시작해요:
$ sudo systemctl start istio

Istio가 성공적으로 동작하는지 검증

  1. /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
  1. Pod 기반 서비스를 배포할 네임스페이스를 만들어요:
$ kubectl create namespace sample
$ kubectl label namespace sample istio-injection=enabled
  1. HelloWorld 서비스를 배포해요:

Zip

$ kubectl apply -n sample -f @samples/helloworld/helloworld.yaml@
  1. 가상 머신에서 서비스로 요청을 보내요:
$ curl helloworld.sample.svc:5000/hello
Hello version: v1, instance: helloworld-v1-578dd69f69-fxwwk

다음 단계

가상 머신에 대한 더 많은 정보:

제거

가상 머신에서 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

더 알아보기 (Learn more)