selector란
NameSpace
# kubectl config get-contexts
# kubectl config set-context kubernetes-admin@kubernetes --namespace default
# kubectl config get-contexts
내가 원하는 내임스페이스로 변경할 수 있음.

# kubectl delete ns ssoontory

ClustIP / Port


포트번호를 8080, 타겟포트를 주석처리해주면 연결이 안됨.

타겟포트를 설정하지 않았는데 8080으로 설정이 됨. > 타겟포트를 정해주지 않으면 자동으로 포트로 정한 포트번호로 매칭시켜줌.
# kubectl describe svc clusterip-pod

그래서 주석을 제거해준다.
(타겟포트와 안쪽에 컨테이너 포트와 반드시 일치해줘야함.)
# vi clusterip-pod.yaml
# kubectl apply -f clusterip-pod.yaml
# kubectl get all
# curl 10.103.243.5:8080


그냥 타겟포트를 비활성화하고, port를 80으로 열어주기


Nodeport
# vi nodeport-pod.yaml
apiVersion: v1
kind: Service
metadata:
name: nodeport-service-pod
spec:
type: NodePort
selector:
app: nginx-pod
ports:
- protocol: TCP
port: 80
targetPort: 80 # 컨테이너 포트가 맞다.
nodePort: 30080
# kubectl apply -f nodeport-pod.yaml
# kubectl get svc -o wide
# kubectl describe svc nodeport-service-pod
# kubectl edit svc nodeport-service-pod


nodeport-ser

다시 만들기

잘 만들어져있고 컬도 잘 나감.
= 포트번호를 내 맘대로 바꾸려면 반드시 타겟포트를 설정해주어야 한다.
원하는 정보를 보고싶다.
라벨 정보를 얻고 싶을때,
# kubectl get pod -o wide

# kubectl describe pod nginx-pod

# kubectl get pod -o wide --show-labels

로드밸런서
# cat /etc/hosts


도커에서 -p 했을때, 7890:80이라고 호스트포트와 컨테이너 포트를 정의하는 것과 유사

오류 해결하기
# kubectl apply -f loadbalancer-pod.yaml
error: error validating "loadbalancer-pod.yaml": error validating data: apiVersion not set; if you choose to ignore these errors, turn validation off with --validate=false





External-IP:포트번호 로 각각 접속을 했을때 접속이 가능함.
▼사용한 소스코드
# vi loadbalancer-pod.yaml
apiVersion: v1
kind: Service
metadata:
name: loadbalancer-service-pod
labels:
svc: nginx-pod-slb #서비스에도 라벨정도를 넣어줄 수 있음.
spec:
type: LoadBalancer
externalIPs: #master1,node1,node2의 아이피임
- 192.168.2.98
- 192.168.2.67
- 192.168.2.71
selector:
app: nginx-pod
ports:
- protocol: TCP
port: 80
targetPort: 80
# kubectl apply -f loadbalancer-pod.yaml
# kubectl get svc -o wide
# kubectl describe svc loadbalancer-service-pod
ReplicaSet
복제를 할때 어떤 상태로 만들지를 정의해둔 template을 정확히 지시하기 위해서 matchLabels와 일치해야함.
그래야 찾아서 잘 복제를 할 수 있음.

# vi replicaset.yaml
# kubectl apply -f replicaset.yaml
# kubectl get replicasets.apps

# kubectl get pod -o wide --show-labels

# kubectl get pod -o wide --show-labels

▼사용한 소스코드
--- ReplicaSet
# vi replicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-replicaset
labels:
app: replicaset
spec:
replicas: 3 # 파드의 수를 의미. desired state (kube-controller-manager)
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
name: http-web-svc
# kubectl apply -f replicaset.yaml
# kubectl get replicasets.apps -o wide
# kubectl describe replicasets.apps nginx-replicaset
Clusterip
clusterip를 20080으로 바꿈! 그럼 targetport를 80으로 꼭 써줘야하느데, 그 80을 지우고 레플리카셋에서 컨테이너에서 정의했던 http-web-svc라는 이름을 넣어보자. 그 이름을 참조해서 가져오겠다.

# vi clusterip-replicaset.yaml
# kubectl apply -f clusterip-replicaset.yaml
# kubectl get all


▼사용한 소스코드
# vi clusterip-replicaset.yaml # 클러스터아이피 야믈
apiVersion: v1
kind: Service
metadata:
name: clusterip-service-replicaset
spec:
type: ClusterIP
selector:
app: nginx-replicaset
ports:
- protocol: TCP
port: 20080
targetPort: http-web-svc
# kubectl apply -f clusterip-replicaset.yaml
# kubectl get svc -o wide
# kubectl describe svc clusterip-service-replicaset
노드포트
노드포트에 외부 아이피 정보를 넣으면 어떻게 될까?
포트는 10080 타겟포트는 80포트로 적어두는 것 대신 http-web-svc
노드 포트는 32080으로 세팅
클러스터 아이피의 포트를 바꾸는데에 의미가 있고, 로드벨런서에서는 포트번호가 클러스터의 포트번호이면서 로드벨런서의 포트번호인데,,,, 이 외부

아이피를 넣어보고 적용을 시켜보기.(보통 로드벨런서에 들어가는 정보임)
또 오류가 떠서 오류해결함.


는 external아이피 안됨.
replicaset이 아니라 clusterip-pod에 external ip넣어줌.
비록 cluster안에서만 접속이 되지만, external ip를 넣어주면 접속이된다.



# kubectl get svc


yaml파일으로 말고 edit명령에서 ReplicaSet에 클러스터 아이피 넣어보자
# kubectl edit svc clusterip-service-replicaset


# kubectl get svc
육안으로는 로드벨런서와 비슷하다.
간단하게 파드 하나만 운영하고 싶을때 세팅할때는 사용할 수 있음. 그렇지만 부하분산이 필요할때는 로드벨런서를 이용하는게 더 많은 기능을 제공받을 수 있다.
단 노드포트로는 안됨. !!!!!!!!임의로 external ip를 주고 그것에 따른 접속포트를 고쳐서 해봤는데 안되더라.
External ip를 같은것을 가지고 있지만 포트번호만 다르면 됨.


# vi loadbalancer-replicaset.yaml
# vi loadbalancer-replicaset.yaml # 로드밸런서 야믈
apiVersion: v1
kind: Service
metadata:
name: loadbalancer-service-replicaset
spec:
type: LoadBalancer
externalIPs: #master1,node1,node2의 아이피임
- 192.168.2.98
- 192.168.2.67
- 192.168.2.71
selector:
app: nginx-replicaset
ports:
- protocol: TCP
port: 8080
targetPort: http-web-svc
# vi loadbalancer-replicaset.yaml

# kubectl apply -f loadbalancer-replicaset.yaml

클러스터아이피의 포트번호이면서 로드벨런서의 포트번호인 것임.
Deployment
replicaSet과 kind 부분만 다름.
# vi deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 4
selector:
matchLabels:
app: nginx-deployment
template:
metadata:
name: nginx-deployment
labels:
app: nginx-deployment
spec:
containers:
- name: nginx-deployment-container
image: leees0053/web-site:aws
ports:
- containerPort: 80

# kubectl get deploy -o wide --show-labels

# kubectl get pod -o wide --show-labels
4개의 라벨에 동시에 cluster ip 에 매칭이되어 접속이 된다.
라벨의 의미는 연결의 의미가 있음.

vi clusterip-deployment.yaml

# kubectl apply -f clusterip-deployment.yaml
# kubectl get svc

하나의 아이피로 하나의 포트로 들어오게함.파드 네개로 로드벨런싱이 됨.

이미 떠있는 pod한테 준 노드포트 서비스를 수정해서 파드로부터 회수해서 deploy로 만들어졌던 파드 4개에 노드포트의 라벨값을 변경해서 주고 싶음. = 이미 존재하는 노드포트 수정해서 이미 만들어진 deployment노드에 적용
nodeport-deployment.yaml 에 들어갈 내용을 넣어주기.
deloyment는 라벨을 하나 더 만들어서 저장해둠. 이미 만들어져있는 노드포트의 노드포트 정보에 라벨을 넣어서 재활용.
# kubectl get pod --show-labels


edit완료!

# kubectl get svc -o wide --show-labels


아까 파드는 엔진액스였는데, 디플로이를 통해서 배포가 된 it's nice to meet you가 뜸.

curl 도 가능함.
파드 삭제하기
replicaset은 못지움
#kubectl delete pod --grace-period 0 --force nginx-pod
종료 시간 세팅하는건데, 0으로 주는 것은 바로 지우겠다는 의미

replicaset지워주기
# kubectl delete rs nginx-replicaset


현재 4개의 파드가 있는데 5개의 파드로 만들겠다.
# kubectl scale --current-replicas=4 --replicas=5 deployment/nginx-deployment


이미 다섯개가 있는데 현재값을 4개로하면 에러가 남

현재있는 파드의 갯수가 몇개가 있는지 모르겠지만, 현재 값은 무조건 n개로 맞춰주길 원할때 --current-replicas 명령어를 삭제할 수 있음. 이걸 넣지 않으면 무조건 이 값에 맞춰주고, 알아서 현재 상황에 맞춰서 스케일 아웃 스케일 인 기능을 해줌.
# kubectl scale --replicas=6 deployment/nginx-deployment

스케일인을 시키기
# kubectl scale --replicas=4 deployment/nginx-deployment

- Deployment 롤링 업데이트 제어
# kubectl get deployments.apps -o wide

# kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=halilinux/web-site:v1.0
> 이미지를 바꿔치기 하자!

# kubectl get all
# kubectl get pod

# kubectl get svc -o wide

롤링 업데이트가 된 것을 알 수 있음.!!!!

다시 nginx로 바꿔주기
# kubectl set image deployment/nginx-deployment nginx-deployment-container=nginx

# kubectl get pod

# kubectl rollout history deployment nginx-deployment

# kubectl rollout history deployment nginx-deployment --revision=1

# kubectl rollout history deployment nginx-deployment --revision=2 # 리비전2 상세보기

# kubectl rollout history deployment nginx-deployment --revision=3 # 리비전3 상세보기

현재 화면

# kubectl rollout undo deployment nginx-deployment # 롤백(전 단계로 복원)
다시 푸드 사이트로 변하는 것을 알 수 있다.


# kubectl get all

# kubectl rollout history deployment nginx-deployment
2번(aws image)이 4번(가장 최신)이 되었음.

원하는 과거로 돌아가기
# kubectl rollout undo deployment nginx-deployment --to-revision=1 # 리비전2로 복원


aws로 바뀐 것을 확인해볼 수 있다.
에이콘출판사 절대 사면안됨.
클라우드 네이티브 쿠버네티스
24단계실습
