Kubernetes - 실습 1

jsbak·2023년 6월 4일
0

Cloud

목록 보기
56/59

실습 1

템플릿(매니페스트)으로 컨테이너 실행

  • YAML 문법
  • 템플릿의 요구되는 필드
    • apiVersion - 이 오브젝트를 생성하기 위해 사용하고 있는 쿠버네티스 API 버전이 어떤 것인지
    • kind - 어떤 종류의 오브젝트를 생성하고자 하는지
    • metadata - 이름 문자열, UID, 그리고 선택적인 네임스페이스를 포함하여 오브젝트를 유일하게 구분지어 줄 데이터
    • spec - 오브젝트에 대해 어떤 상태를 의도하는지
      • 오브젝트 spec 에 대한 정확한 포맷은 모든 쿠버네티스 오브젝트마다 다르고, 그 오브젝트 특유의 중첩된 필드를 포함
      • API OVERVIEW v1.23 - spec 포맷 참조

vi nginx-pod.yaml

apiVersion: v1
kind: Pod	# 자원의 이름 
metadata:	# 
  name: nginx-pod
  labels:	# 레이블 지정 가능 (app(key): nginx-pod(value))
    app: nginx-pod
spec:
  containers:	# 컨테이너에 대한 정의
  # "- " : 배열 정의 (array), 같은 선상의 properties 의미
  - name: nginx-pod-container
    image: nginx
    ports:
    # containerPort를 미리 지정하지 않아도 되는 것은 
    # "ip 할당에서 targetPort로 지정할 수 있으며 
    # containerPort는 컨테이너 포트에 직접 영향을 끼치진 않음."
    - containerPort: 80 
    # `containerPort` 란? 별도 지정된 포트가 없다면 80으로 지정하라 (docker -P 유사)
  • 적용 확인
	# "nginx-pod.yaml" 파일로 `pod` 생성
$ kubectl apply -f nginx-pod.yaml
$ kubectl get pod -o wide
$ kubectl describe pod nginx-pod
  • kubectl describe pod nginx-pod

vi clusterip-svc.yaml

kind: Service
metadata:
  name: clusterip-svc
spec:
  type: ClusterIP
# clusterIP: x.x.x.x 	# spec.clusterIP: IP 수동 할당
# externalIPs: # spec.externalIPs: k8s 노드 IP 주소
               # 특정 k8s 노드 IP 주소:포트에서 수신한 트래픽을
			   # 컨테이너로 전송하는 형태로 외부와 통신할 수 있도록 하는 서비스
# - x.x.x.1
# - x.x.x.2
  selector:	# 할당할 "labels" 지정
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 80			# spec.ports[].port: ClusterIP(and ExternalIP)에서 수신할 포트 번호
    targetPort: 80		# spec.ports[].targetPort : 목적지 컨테이너 포트 번호
  • 적용
$ kubectl apply -f clusterip-svc.yaml
$ kubectl get svc -o wide
$ kubectl describe svc clusterip-svc
  
# "clusterip-pod" 서비스를 수정 하겠다.
# "selector" 부분의 참조 "label" 정보를 수정해보면 
# selector와 label의 관계를 확인해 볼 수 있다.
# "label" 의 정보로 서비스가 "pod" 를 식별 및 참조
$ kubectl edit svc clusterip-svc

vi nodeport-svc.yaml

  • 모든 k8s 노드의 IP 주소:포트에서 수신한 트래픽을 컨테이너에 전송하는 형태, 외부와 통신 가능(0.0.0.0:port)
  • 사용할 수 있는 포트 범위 : 30000~32767 (k8s 기본값)
  • 여러 NodePort 서비스에서 같은 포트 번호를 사용할 수 없다.
apiVersion: v1
kind: Service
metadata:
  name: nodeport-svc
spec:
  type: NodePort
  selector:
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 80	# ClusterIP 에서 수신할 Port(내부 포트)
    targetPort: 80	# 목적이 컨테이너 포트 번호; 컨테이너로 요청 보낼 포트 - 컨테이너가 오픈하는 포트와 같아야한다.
    nodePort: 30080	# 모든 k8s 노드 IP 주소에서 수신할 포트; 외부로 노출할 포트
  • 적용
$ kubectl apply -f nodeport-svc.yaml
$ kubectl get svc -o wide
$ kubectl describe svc nodeport-svc
	
  # port와 targetPort, nodePort 를 변경해보면서 확인
$ kubectl edit svc nodeport-svc

vi loadbalancer-svc.yaml

  • 서비스 환경에서 클러스터 외부로부터 트래픽을 수신할 때 가장 실용적이고 사용하기 편한 서비스
  • k8s 외부 로드 밸런서에 외부 통신이 가능한 가상 IP 할당 가능
  • 구조: NodePort 서비스를 생성하고 클러스터 외부의 로드 밸런서에서 쿠버네티스 노드로 밸런싱을 하는 형태
    • k8s 노드와 별도의 외부 로드 밸런서 이기 때문에 노드 장애가 발생해도 크게 문제되지 않음.
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-svc
spec:
  type: LoadBalancer
# loadBalancerIP: x.x.x.x	# IP 지정, AWS/GCP 등에서 미리 할당 해야한다.
  externalIPs:
  - 192.168.2.46
  #- 192.168.1.211
  #- 192.168.1.216
  selector:
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 80			# LoadBalancer에 할당되는 가상 IP 와 ClusterIP에서 수신할 포트 번호
    targetPort: 80		
    nodePort: 30080
  • 적용
$ kubectl apply -f loadbalancer-svc.yaml
$ kubectl get svc -o wide
$ kubectl describe svc loadbalancer-svc
$ kubectl edit svc loadbalancer-svc

ReplicaSet

  • 파드 템플릿, .spec.template : 파드를 생성하기 위한 명세
  • Replicaset - Pod Template
  • 레이블 셀렉터
  • 파드 셀럭터 : 레플리카셋에서 .spec.template.metadata.labelsspec.selector 과 일치해야 하며 그렇지 않으면 API에 의해 거부된다.
    • 동일한 .spec.selector 를 지정하지만 .spec.template.metadata.labels.spec.template.spec 필드가 다른 2개의 ReplicaSet의 경우 각 ReplicaSet는 다른 ReplicaSet에서 생성된 포드를 무시합니다.

vi replicaset.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-replicaset
spec:
  replicas: 3 # desired state (kube-controller-manager)
  selector:		# 레이블 셀럭터 - 파드를 식별하는데 사용
    matchLabels:
      app: nginx-replicaset

    # "matchLabels" 와 "template.metadata.labels" 은 같아야한다.
  template:
    metadata:
      name: nginx-replicaset
      labels:
        app: nginx-replicaset
    spec:
      containers:
      - name: nginx-replicaset-container
        image: nginx
        ports:
        - containerPort: 80
  • 적용
$ kubectl apply -f replicaset.yaml
$ kubectl get replicasets.apps -o wide
$ kubectl describe replicasets.apps nginx-replicaset
  	
  # "replicas" 를 변경 해볼 수 있겠다.
$ kubectl edit replicasets.apps nginx-replicaset
# 아래 명령으로 조정 가능
# `kubectl scale --replicas=3 replicaset nginx-replicaset` 

vi clusterip-replicaset.yaml

apiVersion: v1
kind: Service
metadata:
  name: clusterip-replicaset
spec:
  type: ClusterIP
  selector:		# 리플리카 생성할때 지정한 labels
    app: nginx-replicaset
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  • 적용
$ kubectl apply -f clusterip-replicaset.yaml
$ kubectl get svc -o wide
$ kubectl describe svc clusterip-replicaset
$ kubectl edit svc clusterip-replicaset

# kubectl get pods 로 확인하여 잘 로드밸런싱 되는지 확인하기
$ kubectl exec -it nginx-replicaset-hgtbx -- bash -c 'echo "web01" > /usr/share/nginx/html/index.html'
$ kubectl exec -it nginx-replicaset-wtxgc -- bash -c 'echo "web02" > /usr/share/nginx/html/index.html'
$ kubectl exec -it nginx-replicaset-z62ws -- bash -c 'echo "web03" > /usr/share/nginx/html/index.html'
$ curl 10.109.217.191

vi nodeport-replicaset.yaml

apiVersion: v1
kind: Service
metadata:
  name: nodeport-replicaset
spec:
  type: NodePort
  selector:
    app: nginx-replicaset
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    #nodePort: 30080
  • 적용
$ kubectl apply -f nodeport-replicaset.yaml
$ kubectl get svc -o wide
$ kubectl describe svc nodeport-replicaset

	# 노드 포트는 "30000-32767" 범위에서만 지정 가능하다.
	# spec.ports[0].nodePort: Invalid value: 80: provided port is not in the valid range. The range of valid ports is 30000-32767

$ kubectl edit svc nodeport-replicaset

vi loadbalancer-replicaset.yaml

apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-replicaset
spec:
  type: LoadBalancer
  externalIPs:
  - 192.168.2.46
  #- 192.168.1.211
  #- 192.168.1.216
  selector:
    app: nginx-replicaset
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  • 적용
$ kubectl apply -f loadbalancer-replicaset.yaml
$ kubectl get svc -o wide
$ kubectl describe svc loadbalancer-replicaset
$ kubectl edit svc loadbalancer-replicaset

Deployment

  • 디플로이먼트(Deployment) 는 파드와 레플리카셋(ReplicaSet)에 대한 선언적 업데이트를 제공
  • 디플로이먼트에서 의도하는 상태 를 설명하고, 디플로이먼트 컨트롤러(Controller)는 현재 상태에서 의도하는 상태로 비율을 조정하며 변경한다.
    • 새 레플리카셋을 생성하는 디플로이먼트를 정의하거나 기존 디플로이먼트를 제거하고, 모든 리소스를 새 디플로이먼트에 적용할 수 있다.

vi deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-deployment

  template:
    metadata:
      name: nginx-deployment
      labels:
        app: nginx-deployment

    spec:
      containers:
      - name: nginx-deployment-container
        image: nginx
        ports:
        - containerPort: 80
  • 적용
$ kubectl apply -f deployment.yaml
$ kubectl get deployments.apps -o wide
$ kubectl describe deployments.apps nginx-deployment
$ kubectl edit deployments.apps nginx-deployment

vi clusterip-deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: clusterip-deployment
spec:
  type: ClusterIP
  selector:
    app: nginx-deployment
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  • 적용
$ kubectl apply -f clusterip-deployment.yaml
$ kubectl get svc -o wide
$ kubectl describe svc clusterip-deployment
$ kubectl edit svc clusterip-deployment

vi nodeport-deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: nodeport-deployment
spec:
  type: NodePort
  selector:
    app: nginx-deployment
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30080
  • 적용
$ kubectl apply -f nodeport-deployment.yaml
$ kubectl get svc -o wide
$ kubectl describe svc nodeport-deployment
$ kubectl edit svc nodeport-deployment

vi loadbalancer-deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-deployment
spec:
  type: LoadBalancer
  externalIPs:
  - 192.168.2.46
  selector:
    app: nginx-deployment
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  • 적용
$ kubectl apply -f loadbalancer-deployment.yaml
$ kubectl get svc -o wide
$ kubectl describe svc loadbalancer-deployment
$ kubectl edit svc loadbalancer-deployment

리소스 정리

$ kubectl get all
$ kubectl delete pod,svc --all
$ kubectl delete replicaset,svc --all
$ kubectl delete deployment,svc --all

Deployment 롤링 업데이트 제어

$ kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=halilinux/web-site:v1.0
$ kubectl get all
$ kubectl rollout history deployment nginx-deployment
$ kubectl rollout history deployment nginx-deployment --revision=2 # 리비전2 상세보기
$ kubectl rollout undo deployment nginx-deployment # 롤백(전 단계로 복원)
$ kubectl get all
$ kubectl rollout history deployment nginx-deployment
$ kubectl rollout history deployment nginx-deployment --revision=3 # 리비전3 상세보기
$ kubectl rollout undo deployment nginx-deployment --to-revision=2 # 리비전2로 복원
profile
끄적끄적 쓰는곳

0개의 댓글