주:

Oracle Linux에서 Kubernetes 실행

소개

Kubernetes는 파일럿 또는 헬름맨을 위한 그리스어입니다. 즉, 명령을 따르고 배를 궁극적 인 목표를 향해 조종하는 사람입니다. 이를 위해 Kubernetes는 컨테이너화된 애플리케이션의 배포, 관리 및 확장을 위한 오픈 소스 방식의 확장 가능한 플랫폼입니다. 이를 위해 여러 명령행 도구를 사용합니다. 이 실습에서는 YAML 파일과 함께 kubectl이라는 항목 중 하나를 사용하여 애플리케이션을 배치하는 조직에 필요한 속성을 정의하고 배치가 완료되면 애플리케이션을 설정하고 유지 관리하는 방법을 이해합니다.

Kubernetes 클러스터에 대한 모든 배치는 객체로 표현됩니다. 이러한 배치된 객체는 텍스트 기반 YAML 파일을 사용하여 클러스터에 배치된 응용 프로그램의 필수 상태에 대한 세부 정보를 제공합니다. 이러한 YAML 파일은 다음을 설명할 수 있습니다.

이 세 번째 요점은 중요하지만 기본 사항을 이해하지 않고 복잡합니다. 따라서 지금은 다루며 향후 자습서에서 해당 주제를 처리합니다.

이 사용지침서는 Oracle Linux에서 소형 Oracle Cloud Native Environment 내에서 실행되는 Kubernetes와 연동됩니다. 이 워크샵의 목적은 프로덕션 배포를 관리하는 데 필요한 모든 것을 위한 '원스톱숍'이 아닌 것입니다. 대신 작동 중인 샘플 응용 프로그램을 배치하는 데 필요한 기술을 소개합니다.

목표

필요 조건

다음 구성을 사용하는 Oracle Linux 8 이상 시스템

랩 환경 설정

주: 무료 실습 환경을 사용하는 경우 Oracle Linux Lab Basics에서 연결 및 기타 사용 지침을 참조하십시오.

정보: 무료 실습 환경은 환경을 생성할 수 있도록 제공된 노드에 Oracle Cloud Native Environment를 배포합니다. 이 배치는 실행 후 완료되는 데 약 8-10분이 걸립니다. 따라서 이 실행 중에 단계를 마치고 연습을 완료하도록 돌아갈 수 있습니다.

  1. 아직 연결되지 않은 경우 터미널을 열고 ssh를 통해 ocne-node01 시스템에 연결합니다.

    ssh oracle@<ip_address_of_ol_node>
    
  2. 환경이 준비되었는지 확인합니다.

    kubectl get pods -A
    

    출력 예:

    [oracle@ocne-node01 ~]$ kubectl get pods -A
    NAMESPACE                      NAME                                             READY   STATUS    RESTARTS   AGE
    externalip-validation-system   externalip-validation-webhook-7988bff847-8ws2v   1/1     Running   0          3m18s
    kube-system                    coredns-7cbc77dbc7-qxqth                         1/1     Running   0          3m18s
    kube-system                    coredns-7cbc77dbc7-r9bgj                         1/1     Running   0          3m18s
    kube-system                    etcd-ocne-node01                                 1/1     Running   0          3m37s
    kube-system                    kube-apiserver-ocne-node01                       1/1     Running   0          3m37s
    kube-system                    kube-controller-manager-ocne-node01              1/1     Running   0          3m37s
    kube-system                    kube-flannel-ds-vcwzn                            1/1     Running   0          3m18s
    kube-system                    kube-proxy-7lx59                                 1/1     Running   0          3m18s
    kube-system                    kube-scheduler-ocne-node01                       1/1     Running   0          3m37s
    kubernetes-dashboard           kubernetes-dashboard-5d5d4947b5-7pffh            1/1     Running   0          3m18s
    

Pod 및 요청 세부 정보에 대한 배치 생성

Kubernetes에서 deployment는 POD의 동작 및 특성을 제어하는 파일을 가리키는 기술 용어입니다. 관리자는 배치를 사용하여 응용 프로그램에 수행할 작업을 지시하고 Kubernetes가 해당 상태에 도달하는 작업을 수행합니다.

이 예에서는 HTTP 헤더를 통해 수신하는 요청의 소스 IP를 반환하는 작은 nginx 웹 서버를 포함하는 이미지를 사용합니다.

  1. echoserver의 배치를 생성합니다.

    kubectl create deployment test --image=k8s.gcr.io/echoserver:1.4
    
  2. 클러스터의 모든 POD를 나열합니다.

    kubectl get pods
    

    출력 예:

    [oracle@ocne-node01 ~]$ kubectl get pods
    NAME                    READY   STATUS    RESTARTS   AGE
    test-6c486b6d76-467p7   1/1     Running   0          53s
    

    주: Pod 이름에는 Pod를 배치할 때마다 달라지는 접미어 값이 포함되어 있습니다.

  3. 변수에 Pod 이름을 지정하려면 JSONPath를 사용합니다.

    TESTPOD=$(kubectl get pods -o jsonpath='{ $.items[*].metadata.name }')
    
  4. 변수 할당을 테스트합니다.

    또한 kubectl get pods 명령을 사용하면 Pod 이름을 매개변수로 전달하여 해당 Pod에 대한 정보만 표시할 수 있습니다.

    kubectl get pods $TESTPOD
    
  5. Pod에 대해 선택한 정보를 요청합니다.

    kubectl get pod $TESTPOD --output custom-columns=NAME:metadata.name,NODE_IP:status.hostIP,POD_IP:status.podIP
    

    출력 예:

    [oracle@ocne-node01 ~]$ kubectl get pod $TESTPOD --output custom-columns=NAME:metadata.name,NODE_IP:status.hostIP,POD_IP:status.podIP
    NAME                    NODE_IP      POD_IP
    test-6c486b6d76-467p7   10.0.0.140   10.244.0.7
    
  6. Pod 세부정보를 가져옵니다.

    kubectl describe pod $TESTPOD
    

    출력 예:

    [oracle@ocne-node01 ~]$ kubectl describe pod test-6c486b6d76-467p7
    Name:         test-6c486b6d76-467p7
    Namespace:    default
    Priority:     0
    Node:         ocne-node01/10.0.0.140
    Start Time:   Tue, 28 Jun 2022 19:21:27 +0000
    Labels:       app=test
                  pod-template-hash=6c486b6d76
    Annotations:  <none>
    Status:       Running
    IP:           10.244.0.7
    IPs:
      IP:           10.244.0.7
    Controlled By:  ReplicaSet/test-6c486b6d76
    Containers:
      echoserver:
        Container ID:   cri-o://5b7866a27722ec0998cd9fe74945fb82b4dd9ed4c5c80671d9e8aa239c7008a4
        Image:          k8s.gcr.io/echoserver:1.4
        Image ID:       k8s.gcr.io/echoserver@sha256:5d99aa1120524c801bc8c1a7077e8f5ec122ba16b6dda1a5d3826057f67b9bcb
        Port:           <none>
        Host Port:      <none>
        State:          Running
          Started:      Tue, 28 Jun 2022 19:21:30 +0000
        Ready:          True
        Restart Count:  0
        Environment:    <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-d67ph (ro)
    Conditions:
      Type              Status
      Initialized       True 
      Ready             True 
      ContainersReady   True 
      PodScheduled      True 
    Volumes:
      kube-api-access-d67ph:
        Type:                    Projected (a volume that contains injected data from multiple sources)
        TokenExpirationSeconds:  3607
        ConfigMapName:           kube-root-ca.crt
        ConfigMapOptional:       <nil>
        DownwardAPI:             true
    QoS Class:                   BestEffort
    Node-Selectors:              <none>
    Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:
      Type    Reason     Age   From               Message
      ----    ------     ----  ----               -------
      Normal  Scheduled  21m   default-scheduler  Successfully assigned default/test-6c486b6d76-467p7 to ocne-node01
      Normal  Pulling    21m   kubelet            Pulling image "k8s.gcr.io/echoserver:1.4"
      Normal  Pulled     21m   kubelet            Successfully pulled image "k8s.gcr.io/echoserver:1.4" in 3.102843235s
      Normal  Created    21m   kubelet            Created container echoserver
      Normal  Started    21m   kubelet            Started container echoserver
    

YAML 파일을 사용하여 배치 생성

Kubernetes Deployment 매니페스트를 사용하여 Kubernetes 클러스터에 응용 프로그램을 배치하고 자체 복구, 확장성, 버전 지정, 롤링 업데이트 등 다른 Kubernetes 기능에 대한 액세스를 제공하는 방법을 정의합니다. 이 실습에서는 Kubernetes 내에서 제공되는 더 복잡한 기능을 다루지 않습니다. 대신 매우 기본적인 매니페스트 파일을 사용하여 응용 프로그램을 배치하는 방법을 보여줍니다.

배치 매니페스트 파일은 JSON 또는 YAML로 쓰여집니다. JSON을 사용할 수는 있지만 YAML은 유연성, 가독성 및 최종 배포의 측면을 명확히 하기 위한 설명적 주석을 포함할 수 있기 때문에 훨씬 더 인기가 있습니다.

배치를 실행할 때 일련의 선언적 업데이트를 통해 Pod가 업데이트되어 실행 중인 응용 프로그램의 원하는 상태에 도달합니다.

deployment.yaml의 모든 세부 정보는 Kubernetes가 배치 요청을 적용하는 데 반드시 필요하지만, 다음은 더 중요한 부분 중 일부를 강조 표시합니다.

이러한 기타 필드에 대한 자세한 내용은 업스트림 배치 설명서를 참조하십시오.

  1. Deployment 파일을 생성합니다.

    cat << 'EOF' | tee mydeployment.yaml > /dev/null
    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: echo1
    spec:
     selector:
       matchLabels: 
         app: echo1
     template:
       metadata:
         labels:
           app: echo1
       spec:
         containers:
         - name: echoserver
           image: k8s.gcr.io/echoserver:1.4
    EOF
    
  2. 배치 매니페스트 파일을 사용하여 Pod에 응용 프로그램을 배치합니다.

    kubectl apply -f mydeployment.yaml
    

    출력 예:

    [[oracle@ocne-node01 ~]$ kubectl apply -f mydeployment.yaml
    deployment.apps/echo1 created
    
  3. 배치에서 관리하는 Pod를 나열합니다.

    kubectl get pods -l app=echo1
    

    출력 예:

    [oracle@ocne-node01 ~]$ kubectl get pods -l app=echo1
    NAME                     READY   STATUS    RESTARTS   AGE
    echo1-7cbf6dfb96-4cgq7   1/1     Running   0          24s
    
    • -l 또는 --selector= 옵션은 필터링할 선택기(레이블 질의)를 제공합니다. 이 옵션은 '=', '==' 및 '!='를 지원합니다(예: -l key1=value1,key2=value2).

    주: Pod 이름에 Pod를 배치할 때마다 달라지는 접미어 값이 포함되어 있음을 미리 알려줍니다.

  4. Deployment가 성공했는지 확인합니다.

    kubectl get deploy echo1
    

    출력 예:

    [oracle@ocne-node01 ~]$ kubectl get deploy echo1
    NAME    READY   UP-TO-DATE   AVAILABLE   AGE
    echo1   1/1     1            1           16m
    
    • deploy 옵션은 deployments에 대해 짧습니다. kubectl 명령을 사용하면 여러 옵션에 대한 축약 구문을 사용할 수 있습니다. 자세한 내용은 kubectl --help를 실행하여 확인할 수 있습니다.
  5. 배치에 대한 추가 세부 정보를 반환합니다.

    kubectl describe deploy echo1
    

    출력 예:

    [oracle@ocne-node01 ~]$ kubectl describe deploy echo1
    Name:                   echo1
    Namespace:              default
    CreationTimestamp:      Tue, 28 Jun 2022 20:20:40 +0000
    Labels:                 <none>
    Annotations:            deployment.kubernetes.io/revision: 1
    Selector:               app=echo1
    Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
    StrategyType:           RollingUpdate
    MinReadySeconds:        0
    RollingUpdateStrategy:  25% max unavailable, 25% max surge
    Pod Template:
      Labels:  app=echo1
      Containers:
       echoserver:
        Image:        k8s.gcr.io/echoserver:1.4
        Port:         <none>
        Host Port:    <none>
        Environment:  <none>
        Mounts:       <none>
      Volumes:        <none>
    Conditions:
      Type           Status  Reason
      ----           ------  ------
      Available      True    MinimumReplicasAvailable
      Progressing    True    NewReplicaSetAvailable
    OldReplicaSets:  <none>
    NewReplicaSet:   echo1-7cbf6dfb96 (1/1 replicas created)
    Events:
      Type    Reason             Age   From                   Message
      ----    ------             ----  ----                   -------
      Normal  ScalingReplicaSet  23m   deployment-controller  Scaled up replica set echo1-7cbf6dfb96 to 1
    

ClusterIP 서비스 사용

echo1 Deployment를 Pod에 성공적으로 배치했음에도 불구하고 일반 사용자가 내부 또는 네트워크에서 액세스할 수 없는 경우에는 거의 사용되지 않습니다. 이 액세스는 서비스가 네트워크에 배치를 노출할 때 유용합니다.

기본 Kubernetes 서비스 유형은 ClusterIP입니다. 그러나 인터넷에서는 ClusterIP 서비스에 액세스할 수 없지만 Kubernetes 프록시를 사용할 수 있습니다. 프록시에 대한 자세한 내용은 업스트림 설명서를 참조하십시오.

이 절에서는 echo1를 노출하고 Oracle Linux Pod를 사용하여 클러스터 내에 서비스 간 통신을 만들어 앱의 프론트 엔드 구성 요소와 백엔드 구성 요소 간의 통신을 보여줍니다.

  1. 노드 목록을 가져옵니다.

    kubectl get nodes
    

    출력 예:

    [oracle@ocne-node01 ~]$ kubectl get nodes
    NAME          STATUS   ROLES    AGE     VERSION
    ocne-node01   Ready    <none>   4h27m   v1.22.8+1.el8
    

    노드는 Pod를 배치하기 위한 물리적 시스템 또는 가상 시스템입니다.

  2. kube-proxy 모드를 질의합니다.

    iptables 모드에서 kube-proxy를 실행하면 ClusterIP 서비스로 전송된 패킷이 소스 NAT가 되지 않습니다.

    curl -w "\n" http://localhost:10249/proxyMode
    
    • kube-proxy는 실행 중인 노드의 포트 10249에서 수신합니다.
  3. ClusterIP 서비스를 만듭니다.

    kubectl expose deployment echo1 --name=clusterip-service --port=80 --target-port=8080
    
  4. 클러스터에 지정된 IP 주소를 가져옵니다.

    kubectl get svc clusterip-service
    

    출력 예:

    [oracle@ocne-node01 ~]$ kubectl get svc clusterip-service
    NAME                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    clusterip-service   ClusterIP   10.108.107.54   <none>        80/TCP    13s
    

    출력에서 CLUSTER-IP 주소를 기록해 둡니다.

  5. ClusterIP 서비스에 액세스하기 위해 동일한 클러스터에 POD를 만듭니다.

    kubectl run ol -it --image=oraclelinux:8 --restart=Never --rm
    

    이 명령은 interactive 모드에서 Oracle Linux 8 컨테이너를 실행하는 Pod를 만들고 명령 프롬프트를 표시합니다.

    출력 예:

    [oracle@ocne-node01 ~]$ kubectl run ol -it --image=oraclelinux:8 --restart=Never --rm
    If you don't see a command prompt, try pressing enter.
    [root@ol /]#
    
  6. Oracle Linux 컨테이너의 IP 주소를 가져옵니다.

    ip -br a
    

    출력 예:

    [root@ol /]# ip -br a
    lo               UNKNOWN        127.0.0.1/8 ::1/128 
    eth0@if12        UP             10.244.0.9/24 fe80::146f:2cff:fe73:b528/64
    
  7. echo1 내에서 nginx 웹 서버를 테스트합니다.

    curl -w "\n" <CLUSTER-IP_ADDRESS>
    

    이전 출력의 CLUSTER-IP 주소를 사용합니다.

    출력 예:

    [root@ol /]# curl -w "\n" 10.108.107.54
    CLIENT VALUES:
    client_address=10.244.0.9
    command=GET
    real path=/
    query=nil
    request_version=1.1
    request_uri=http://10.108.107.54:8080/
    
    SERVER VALUES:
    server_version=nginx: 1.10.0 - lua: 10001
    
    HEADERS RECEIVED:
    accept=*/*
    host=10.108.107.54
    user-agent=curl/7.61.1
    BODY:
    -no body in request-
    

    출력에는 echo1 배치를 사용하여 Oracle Linux의 요청이 표시되고 ClusterIP 서비스에서 처리됩니다.

  8. 컨테이너를 종료합니다.

    exit
    

    출력 예:

    [root@ol /]# exit
    exit
    pod "ol" deleted
    

YAML 파일과 함께 NodePort 서비스 사용

이전에는 echo1 배치가 kubectl expose 명령을 사용하여 노출되었으며 ClusterIP를 사용하여 내부적으로 액세스되었습니다. 이제 개발자가 네트워크를 통해 외부에서 echo1에 액세스할 수 있도록 하는 접근 방식인 NodePort 서비스를 사용합니다.

NodePort 서비스는 모든 노드에서 특정 포트를 열고 해당 포트로 트래픽을 서비스로 전달합니다.

다음과 같은 여러 가지 이유로 프로덕션 시스템에는 NodePort를 사용하지 않는 것이 좋습니다.

  1. 서비스 파일을 정의합니다.

    cat << 'EOF' | tee myservice.yaml > /dev/null
    apiVersion: v1
    kind: Service
    metadata:
      name: echo1-nodeport
      namespace: default
    spec:
      ipFamilies:
      - IPv4
      ipFamilyPolicy: SingleStack
      ports:
      - nodePort: 32387
        port: 80
        protocol: TCP
        targetPort: 8080
      selector:
        app: echo1
      sessionAffinity: None
      type: NodePort
    status:
      loadBalancer: {}
    EOF
    
    • type: - 외부 클라이언트의 네트워크 요청이 서비스를 사용할 수 있도록 합니다. 적합한 값은 nodePort, LooadBalancer입니다.
    • nodePort: - 서비스에 액세스하는 데 사용되는 외부 포트입니다.
    • port: - 클러스터 내에 노출된 포트 번호입니다.
    • targetPort: - 컨테이너가 수신 중인 포트입니다.
  2. 서비스를 만듭니다.

    kubectl apply -f myservice.yaml
    

    출력 예:

    [oracle@ocne-node01 ~]$ kubectl apply -f myservice.yaml 
    service/echo1 created
    

    주: 응용 프로그램 관리를 단순화하기 위해 동일한 YAML 파일 내에 배치 및 서비스 정의가 있는 것이 일반적입니다. 이 단계에서 별도의 파일을 사용하는 것은 교육 목적으로만 사용됩니다. 단일 파일로 결합할 때는 --- YAML 구문을 사용하여 파일을 구분합니다.

  3. Kubernetes가 새로 생성된 서비스를 저장하는 방법을 표시합니다.

    kubectl get service echo1-nodeport -o yaml
    

    출력 예:

    [oracle@ocne-node01 ~]$ kubectl get service echo1-nodeport -o yaml
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"echo1-nodeport","namespace":"default"},"spec":{"ipFamilies":["IPv4"],"ipFamilyPolicy":"SingleStack","ports":[{"nodePort":32387,"port":80,"protocol":"TCP","targetPort":8080}],"selector":{"app":"echo1"},"sessionAffinity":"None","type":"NodePort"},"status":{"loadBalancer":{}}}
      creationTimestamp: "2022-06-29T00:14:30Z"
      name: echo1-nodeport
      namespace: default
      resourceVersion: "6242"
      uid: 3171dda6-05b8-45b8-a0ba-457eab6e4f71
    spec:
      clusterIP: 10.100.17.53
      clusterIPs:
      - 10.100.17.53
      externalTrafficPolicy: Cluster
      internalTrafficPolicy: Cluster
      ipFamilies:
      - IPv4
      ipFamilyPolicy: SingleStack
      ports:
      - nodePort: 32387
        port: 80
        protocol: TCP
        targetPort: 8080
      selector:
        app: echo1
      sessionAffinity: None
      type: NodePort
    status:
      loadBalancer: {}
    
  4. Pods 서비스를 설명합니다.

    kubectl describe svc echo1-nodeport
    

    출력 예:

    [oracle@ocne-node01 ~]$ kubectl describe svc echo1-nodeport
    Name:                     echo1-nodeport
    Namespace:                default
    Labels:                   <none>
    Annotations:              <none>
    Selector:                 app=echo1
    Type:                     NodePort
    IP Family Policy:         SingleStack
    IP Families:              IPv4
    IP:                       10.100.17.53
    IPs:                      10.100.17.53
    Port:                     <unset>  80/TCP
    TargetPort:               8080/TCP
    NodePort:                 <unset>  32387/TCP
    Endpoints:                10.244.0.7:8080
    Session Affinity:         None
    External Traffic Policy:  Cluster
    Events:                   <none>
    
  5. 객체 끝점을 가져옵니다.

    끝점은 서비스가 트래픽을 보내는 POD의 IP 주소를 추적합니다.

    kubectl get endpoints echo1-nodeport
    

    출력 예:

    [oracle@ocne-node01 ~]$ kubectl get endpoints echo1-nodeport
    NAME             ENDPOINTS         AGE
    echo1-nodeport   10.244.0.7:8080   8m39s
    
  6. 응용 프로그램을 실행 중인 POD를 나열합니다.

    kubectl get pods --output=wide
    

    출력 예:

    [oracle@ocne-node01 ~]$ kubectl get pods -o wide
    NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE          NOMINATED NODE   READINESS GATES
    echo1-7cbf6dfb96-mlds4   1/1     Running   0          80m   10.244.0.7   ocne-node01   <none>           <none>
    test-6c486b6d76-v4htj    1/1     Running   0          83m   10.244.0.6   ocne-node01   <none>           <none>
    

    echo1에 대한 이 목록의 IP 주소는 끝점의 이전 단계에 표시된 값(지정된 노드에서 실행 중인 Pod의 IP 주소)과 일치해야 합니다.

  7. 서비스를 나열합니다.

    kubectl get svc -o wide
    

    출력 예:

    [oracle@ocne-node01 ~]$ kubectl get svc -o wide
    NAME                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE   SELECTOR
    clusterip-service   ClusterIP   10.107.31.75   <none>        80/TCP         78m   app=echo1
    echo1-nodeport      NodePort    10.100.17.53   <none>        80:32387/TCP   10m   app=echo1
    kubernetes          ClusterIP   10.96.0.1      <none>        443/TCP        88m   <none>
    

    이 명령은 --output=wide 대신 -o wide의 대체 옵션을 사용했습니다.

    echo1-nodeport 서비스에 대해 32387로 설정된 NodePort을 기록해 둡니다.

  8. 노드의 IP 주소를 가져옵니다.

    무료 실습 환경은 단일 노드 ocne-node01에서 실행됩니다.

    ip -br a
    

    무료 랩 환경에서 IP 주소는 ens3 인터페이스에 지정된 인스턴스의 전용 IP 주소 10.0.0.140을 반환해야 합니다.

  9. JSONPath를 사용하여 NodePort에 변수를 지정합니다.

    NODEPORT=$(kubectl get -o jsonpath="{.spec.ports[0].nodePort}" services echo1-nodeport)
    
  10. JSONPath를 사용하여 변수에 노드 IP를 지정합니다.

    NODES=$(kubectl get nodes -o jsonpath='{ $.items[*].status.addresses[?(@.type=="InternalIP")].address }')
    
  11. 방화벽 규칙을 만듭니다.

    이 규칙은 node:nodeport의 트래픽을 허용합니다. 여기서 node은 Pod가 실행 중인 시스템 또는 가상 시스템의 호스트 IP 주소입니다.

    sudo firewall-cmd --permanent --add-port=$NODEPORT/tcp
    sudo firewall-cmd --reload
    

    --reload 뒤에 firewalld 데몬이 구성을 다시 로드합니다(iptables 포함). kube-proxy가 iptables에 의존하므로 서비스의 응답이 지연됩니다.

  12. 노드 주소 및 노드 포트를 사용하여 응용 프로그램을 확인합니다.

    curl -s $NODES:$NODEPORT
    

    출력 예:

    [oracle@ocne-node01 ~]$ curl -s $NODES:NODEPORT
    CLIENT VALUES:
    client_address=10.244.0.1
    command=GET
    real path=/
    query=nil
    request_version=1.1
    request_uri=http://10.0.0.140:8080/
    
    SERVER VALUES:
    server_version=nginx: 1.10.0 - lua: 10001
    
    HEADERS RECEIVED:
    accept=*/*
    host=10.0.0.140:32387
    user-agent=curl/7.61.1
    BODY:
    

    출력에는 NodePort 서비스를 통한 로컬 노드 경로 지정, kube-proxy를 통한 요청 및 echo1 배치를 실행하는 Pod에 대한 요청이 표시됩니다.

    주: 출력이 중단된 것으로 나타나면 이전에 방화벽을 다시 로드했기 때문입니다. Ctrl-C를 입력하고 다시 시도하십시오.

배치 및 서비스 제거

서비스 또는 배치가 완료되면 Kubernetes에서 제거합니다.

  1. 서비스를 제거합니다.

    kubectl delete svc clusterip-service echo1-nodeport
    
  2. 배치를 제거합니다.

    kubectl delete deployments echo1
    kubectl delete deploy test
    

객체를 개별적으로 또는 그룹으로 제거할 수 있습니다. 자세한 내용은 Kubernetes Reference Manual을 참조하십시오.

요약

이 실습에서는 Kubernetes와 같은 클라우드 전용 오케스트라를 사용하는 모든 조직이 Kubernetes를 사용하여 컨테이너 배포를 관리하는 기능을 간단히 소개합니다. 이 연습에서는 Kubernetes를 사용하여 얻을 수 있는 유연성에 있어서 가장 긴 여정에 대한 첫번째 단계를 제공합니다.

추가 정보

추가 학습 자원

docs.oracle.com/learn에서 다른 실습을 살펴보거나 Oracle Learning YouTube 채널에서 보다 무료 학습 컨텐츠에 접근할 수 있습니다. 또한 education.oracle.com/learning-explorer을 방문하여 Oracle Learning Explorer가 됩니다.

제품 설명서는 Oracle Help Center를 참조하십시오.