본문 바로가기
카테고리 없음

6/1

by 쑨토리 2023. 6. 1.
반응형

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

 

 

# kubectl apply -f nodeport-pod.yaml The Service "nodeport-service-pod" is invalid: spec.ports[0].name: Invalid value: "http port": a DNS-1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name', or '123-abc', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?')

 

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

방금 새로 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단계실습