실습 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: nginx-pod
spec:
  containers:	
  
  - name: nginx-pod-container
    image: nginx
    ports:
    
    
    
    - containerPort: 80 
    
	
$ 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
               
			   
  selector:	
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 80			
    targetPort: 80		
$ kubectl apply -f clusterip-svc.yaml
$ kubectl get svc -o wide
$ kubectl describe svc clusterip-svc
  
$ 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	
    targetPort: 80	
    nodePort: 30080	
$ kubectl apply -f nodeport-svc.yaml
$ kubectl get svc -o wide
$ kubectl describe svc nodeport-svc
	
  
$ kubectl edit svc nodeport-svc
vi loadbalancer-svc.yaml
- 서비스 환경에서 클러스터 외부로부터 트래픽을 수신할 때 가장 실용적이고 사용하기 편한 서비스
- k8s 외부 로드 밸런서에 외부 통신이 가능한 가상 IP 할당 가능
- 구조: NodePort 서비스를 생성하고 클러스터 외부의 로드 밸런서에서 쿠버네티스 노드로 밸런싱을 하는 형태
- k8s 노드와 별도의 외부 로드 밸런서 이기 때문에 노드 장애가 발생해도 크게 문제되지 않음.
 
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-svc
spec:
  type: LoadBalancer
  externalIPs:
  - 192.168.2.46
  
  
  selector:
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 80			
    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.labels는spec.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 
  selector:		
    matchLabels:
      app: nginx-replicaset
    
  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
  	
  
$ kubectl edit replicasets.apps nginx-replicaset
vi clusterip-replicaset.yaml
apiVersion: v1
kind: Service
metadata:
  name: clusterip-replicaset
spec:
  type: ClusterIP
  selector:		
    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 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
    
$ kubectl apply -f nodeport-replicaset.yaml
$ kubectl get svc -o wide
$ kubectl describe svc nodeport-replicaset
	
	
$ 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
  
  
  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 
$ kubectl rollout undo deployment nginx-deployment 
$ kubectl get all
$ kubectl rollout history deployment nginx-deployment
$ kubectl rollout history deployment nginx-deployment --revision=3 
$ kubectl rollout undo deployment nginx-deployment --to-revision=2