실습 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