주:
- 이 사용지침서는 Oracle 제공 무료 실습 환경에서 제공됩니다.
- Oracle Cloud Infrastructure 인증서, 테넌시 및 구획에 대한 예제 값을 사용합니다. 실습을 마치면 사용자의 클라우드 환경과 관련된 값으로 대체합니다.
Oracle Linux에서 Kubernetes 실행
소개
Kubernetes는 파일럿 또는 헬름맨을 위한 그리스어입니다. 즉, 명령을 따르고 배를 궁극적 인 목표를 향해 조종하는 사람입니다. 이를 위해 Kubernetes는 컨테이너화된 애플리케이션의 배포, 관리 및 확장을 위한 오픈 소스 방식의 확장 가능한 플랫폼입니다. 이를 위해 여러 명령행 도구를 사용합니다. 이 실습에서는 YAML 파일과 함께 kubectl
이라는 항목 중 하나를 사용하여 애플리케이션을 배치하는 조직에 필요한 속성을 정의하고 배치가 완료되면 애플리케이션을 설정하고 유지 관리하는 방법을 이해합니다.
Kubernetes 클러스터에 대한 모든 배치는 객체로 표현됩니다. 이러한 배치된 객체는 텍스트 기반 YAML 파일을 사용하여 클러스터에 배치된 응용 프로그램의 필수 상태에 대한 세부 정보를 제공합니다. 이러한 YAML 파일은 다음을 설명할 수 있습니다.
- 어떤 노드에서 실행할 컨테이너화된 응용 프로그램
- 애플리케이션에 필요한 리소스의 세부정보
- 재시작 정책, 업그레이드 정책 등과 같이 이러한 응용 프로그램의 상태 유지를 자세히 설명하는 정책
이 세 번째 요점은 중요하지만 기본 사항을 이해하지 않고 복잡합니다. 따라서 지금은 다루며 향후 자습서에서 해당 주제를 처리합니다.
이 사용지침서는 Oracle Linux에서 소형 Oracle Cloud Native Environment 내에서 실행되는 Kubernetes와 연동됩니다. 이 워크샵의 목적은 프로덕션 배포를 관리하는 데 필요한 모든 것을 위한 '원스톱숍'이 아닌 것입니다. 대신 작동 중인 샘플 응용 프로그램을 배치하는 데 필요한 기술을 소개합니다.
목표
- Pod, Deployment, Service와 같은 다양한 Kubernetes 구성 요소 검토
- 여러 Kubernetes 객체 검토
- 샘플 프로젝트 배치 및 테스트
필요 조건
다음 구성을 사용하는 Oracle Linux 8 이상 시스템
sudo
권한을 가진 비루트 사용자- Oracle Cloud Native Environment 설치 및 구성
랩 환경 설정
주: 무료 실습 환경을 사용하는 경우 Oracle Linux Lab Basics에서 연결 및 기타 사용 지침을 참조하십시오.
정보: 무료 실습 환경은 환경을 생성할 수 있도록 제공된 노드에 Oracle Cloud Native Environment를 배포합니다. 이 배치는 실행 후 완료되는 데 약 8-10분이 걸립니다. 따라서 이 실행 중에 단계를 마치고 연습을 완료하도록 돌아갈 수 있습니다.
-
아직 연결되지 않은 경우 터미널을 열고 ssh를 통해 ocne-node01 시스템에 연결합니다.
ssh oracle@<ip_address_of_ol_node>
-
환경이 준비되었는지 확인합니다.
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 웹 서버를 포함하는 이미지를 사용합니다.
-
echoserver의 배치를 생성합니다.
kubectl create deployment test --image=k8s.gcr.io/echoserver:1.4
-
클러스터의 모든 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를 배치할 때마다 달라지는 접미어 값이 포함되어 있습니다.
-
변수에 Pod 이름을 지정하려면 JSONPath를 사용합니다.
TESTPOD=$(kubectl get pods -o jsonpath='{ $.items[*].metadata.name }')
-
변수 할당을 테스트합니다.
또한
kubectl get pods
명령을 사용하면 Pod 이름을 매개변수로 전달하여 해당 Pod에 대한 정보만 표시할 수 있습니다.kubectl get pods $TESTPOD
-
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
-
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가 배치 요청을 적용하는 데 반드시 필요하지만, 다음은 더 중요한 부분 중 일부를 강조 표시합니다.
- apiVersion 필드는 사용할 Kubernetes API 버전을 지정합니다. 최신 버전의 Kubernetes를 사용하는 경우 apps/v1로 설정합니다.
- 이 경우 kind 필드는 Kubernetes가 배치라는 객체 유형을 참조하도록 알립니다.
- 메타데이터 섹션은 배치 이름 및 연관된 레이블의 세부 정보를 요약하는 데 사용됩니다.
- .spec 섹션은 배치 매니페스트 파일의 가장 중요한 섹션일 수 있습니다. 아래쪽의 모든 것은 Pod 배포와 관련이 있습니다. .spec.template 섹션 아래의 모든 항목에서는 Kubernetes가 배치 관리에 사용하는 Pod 템플리트(이 예에서는 단일 컨테이너임)에 대해 설명합니다.
- 이 예에서 사용되지 않는 다른 필드는 .spec.replicas 필드(Kubernetes에 배포할 Pod 복제본 수 알려짐) 및 .spec.strategy 필드(배치 업데이트를 수행하는 방법을 Kubernetes에 알려짐)입니다.
이러한 기타 필드에 대한 자세한 내용은 업스트림 배치 설명서를 참조하십시오.
-
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
-
배치 매니페스트 파일을 사용하여 Pod에 응용 프로그램을 배치합니다.
kubectl apply -f mydeployment.yaml
출력 예:
[[oracle@ocne-node01 ~]$ kubectl apply -f mydeployment.yaml deployment.apps/echo1 created
-
배치에서 관리하는 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를 배치할 때마다 달라지는 접미어 값이 포함되어 있음을 미리 알려줍니다.
-
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
를 실행하여 확인할 수 있습니다.
-
배치에 대한 추가 세부 정보를 반환합니다.
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를 사용하여 클러스터 내에 서비스 간 통신을 만들어 앱의 프론트 엔드 구성 요소와 백엔드 구성 요소 간의 통신을 보여줍니다.
-
노드 목록을 가져옵니다.
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를 배치하기 위한 물리적 시스템 또는 가상 시스템입니다.
-
kube-proxy 모드를 질의합니다.
iptables 모드에서 kube-proxy를 실행하면 ClusterIP 서비스로 전송된 패킷이 소스 NAT가 되지 않습니다.
curl -w "\n" http://localhost:10249/proxyMode
- kube-proxy는 실행 중인 노드의 포트 10249에서 수신합니다.
-
ClusterIP 서비스를 만듭니다.
kubectl expose deployment echo1 --name=clusterip-service --port=80 --target-port=8080
-
클러스터에 지정된 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
주소를 기록해 둡니다. -
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 /]#
-
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
-
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 서비스에서 처리됩니다.
-
컨테이너를 종료합니다.
exit
출력 예:
[root@ol /]# exit exit pod "ol" deleted
YAML 파일과 함께 NodePort 서비스 사용
이전에는 echo1 배치가 kubectl expose
명령을 사용하여 노출되었으며 ClusterIP를 사용하여 내부적으로 액세스되었습니다. 이제 개발자가 네트워크를 통해 외부에서 echo1에 액세스할 수 있도록 하는 접근 방식인 NodePort 서비스를 사용합니다.
NodePort 서비스는 모든 노드에서 특정 포트를 열고 해당 포트로 트래픽을 서비스로 전달합니다.
주 다음과 같은 여러 가지 이유로 프로덕션 시스템에는 NodePort를 사용하지 않는 것이 좋습니다.
- 배치된 각 서비스에는 다른 포트가 필요합니다.
- 노드는 공개적으로 사용할 수 있어야 합니다. 이는 권장되지 않습니다.
- 노드 전체(다중 노드 Kubernetes 클러스터)에서 로드 밸런싱이 발생하지 않습니다.
-
서비스 파일을 정의합니다.
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: - 컨테이너가 수신 중인 포트입니다.
-
서비스를 만듭니다.
kubectl apply -f myservice.yaml
출력 예:
[oracle@ocne-node01 ~]$ kubectl apply -f myservice.yaml service/echo1 created
주: 응용 프로그램 관리를 단순화하기 위해 동일한 YAML 파일 내에 배치 및 서비스 정의가 있는 것이 일반적입니다. 이 단계에서 별도의 파일을 사용하는 것은 교육 목적으로만 사용됩니다. 단일 파일로 결합할 때는
---
YAML 구문을 사용하여 파일을 구분합니다. -
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: {}
-
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>
-
객체 끝점을 가져옵니다.
끝점은 서비스가 트래픽을 보내는 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
-
응용 프로그램을 실행 중인 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 주소)과 일치해야 합니다.
-
서비스를 나열합니다.
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을 기록해 둡니다.
-
노드의 IP 주소를 가져옵니다.
무료 실습 환경은 단일 노드 ocne-node01에서 실행됩니다.
ip -br a
무료 랩 환경에서 IP 주소는 ens3 인터페이스에 지정된 인스턴스의 전용 IP 주소 10.0.0.140을 반환해야 합니다.
-
JSONPath를 사용하여 NodePort에 변수를 지정합니다.
NODEPORT=$(kubectl get -o jsonpath="{.spec.ports[0].nodePort}" services echo1-nodeport)
-
JSONPath를 사용하여 변수에 노드 IP를 지정합니다.
NODES=$(kubectl get nodes -o jsonpath='{ $.items[*].status.addresses[?(@.type=="InternalIP")].address }')
-
방화벽 규칙을 만듭니다.
이 규칙은
node:nodeport
의 트래픽을 허용합니다. 여기서node
은 Pod가 실행 중인 시스템 또는 가상 시스템의 호스트 IP 주소입니다.sudo firewall-cmd --permanent --add-port=$NODEPORT/tcp sudo firewall-cmd --reload
--reload
뒤에 firewalld 데몬이 구성을 다시 로드합니다(iptables
포함). kube-proxy가iptables
에 의존하므로 서비스의 응답이 지연됩니다. -
노드 주소 및 노드 포트를 사용하여 응용 프로그램을 확인합니다.
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에서 제거합니다.
-
서비스를 제거합니다.
kubectl delete svc clusterip-service echo1-nodeport
-
배치를 제거합니다.
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를 참조하십시오.