본문 바로가기
  • 지요미의 IT성장일기
Kubernetes

쿠버네티스 3

by 지요미=P 2024. 2. 5.
728x90

오늘은 replicaset이 무엇인지 알아보자.

일단. 전 날 한 내용은 모두 삭제!

k delte pod,svc --all

 

--- ReplicaSet
# vi replicaset-loadbalancer.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-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
---#로드밸런서
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-replicaset
spec:
  type: LoadBalancer
  externalIPs:
  - 172.25.0.156 #마스터1
  selector:
    app: nginx-replicaset
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

 

kubectl apply -f replicaset-loadbalancer.yaml

 

kubectl get pod -n kube-system

-n kube-system : kube-system이라는 네임스페이스를 보여줘~

각각의 노드마다 프록시가 배치된 것을 알 수 있다.

 

k get pod -n kube-system -o wide

coredns?

쿠버네티스 안에서 파드와 파드사이에 dns역할을 해주는 아이들.

 

etcd?

컨테이너 오케스트레이션을 위한 사실상의 표준 시스템인 쿠버네티스의 기본 데이터 저장소 .

 

flannel.1

master1의 flannel이 제공해주는 일종의 ip

파드가 만들어지면 이 대역에서 만들어지는 것임

 

cni?

container network interface!

내부에서 서로 연결이 되는 ip 주소

 


만약, pod가 pending이 되는 경우~~

 

systemctl status kubelet
systemctl enable --now kubelet

worker1,2,3에 가서 status를 확인했을 때 [active] 상태인지 확인해야함.

ready가 안되었다면 enable 시켜주면 다시 running됨!


 

 

이 홈페이지를 리뉴얼 시켜보도록 하쟈ㅑ!

 

kubectl edit replicasets.apps nginx-replicaset

이 내용을 열면 vi가 열림..ㄷㄷ

 

도커허브 id

만약, 수정이 불가능하다면 저장이 되지 않는다.

 

적용 되었다!

 


만약, 적용이 안된다면..

기존 파드를 지우면 자동으로 다시 적용이 된다.

kubectl delete pod --all

 

deployment는 파드의 replicaset에 대한 선언적 업데이트를 제공한다.
deployment에서 의도하는 상태를 설명하고 deployment controller는 현재 상태에서 의도하는 상태로 비율을 조정하며
변경한다. 새 replicaset을 생성하는 deployment를 정의하거나 기존 deployment를 제거하고, 모든 리소스를 새 deployment에 적용할 수 있다.

 

--- deployment
# vi deployment-loadbalancer.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
---
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-deployment
spec:
  type: LoadBalancer
  externalIPs:
  - 172.25.0.157 #worker1
  selector:
    app: nginx-deployment
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 80

포트번호는 변경이 가능해서 8080으로 설정해봄.

(172.25.0.157에 대한 port번호임)

kubectl apply -f deployment-loadbalancer.yaml

접속완료!

 

 

얘도 편집이 가능할까?

kubectl edit deployments.apps nginx-deployment

 

deployment는 특이한게 롤링 업데이트 전략이 나옴

> 최대 보유할 surge

> 사용을 못할 수 있는 퍼센티지

 

deployment의 경우, 앞서 replicaset과 다르게 pod를 삭제 하고 하지 않아도

자동으로 삭제하고 생성되어 바로 적용이 가능하다!

(차이점: rolling update)

 

적용 완료~!

 


edit 명령으로 vi로 이미지를 변경하는 방법도 있지만.

command에서 한줄로 바로 변경하는 방법도 있다!

 

kubectl describe deployments.app nginx-deployment #컨테이너 이름 확인
kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=jyoonpark/sesac:sale
kubectl get pod

food -> sale 홈페이지로 바로 변경 되었음!

 


롤링 업데이트 제거

 

이 때까지 업데이트 했던 이력을 보고 싶다!

kubectl rollout history deployment nginx-deployment

 

그런데 여기서 1,2,3,4가 뭘까?

리비전 상세보기

kubectl rollout history deployment nginx-deployment --revision 2

revision 번호를 입력해서 어떤 정보가 업데이트 된 내용인지 확인할 수 있다.

 

롤백 (바로 전 단계로 복원)

kubectl rollout undo deployment nginx-deployment

 

과거의 형태를 스냅샷 형태로 

pod 차원에선 어떤 변화가 있을까?

생성된 시간을 보면 순식간에 지워지고 새로 생겨진것임..

홈페이지도 food화면으로 보여진다.

 

내가 원하는 리비전 단계로 되돌리기

undo 는 직전단계이니까 초창기로 돌려보자.

kubectl rollout undo deployment nginx-deployment --to-revision 3

 

 

초창기 리전으로 되돌리기

kubectl rollout undo deployment nginx-deployment --to-revision 1

 

 


멀티 컨테이너 파드

파드 하나에 컨테이너 하나가 보통 정석이지만.

파드 하나에 컨테이너 2개 이상 생성할 경우(= 멀티파드)

컨테이너 2개를 어떻게 관리할 것인지?

예를 들면 web,db가 같이 운영될 수 있다.

 

--- multi-container
# vi multipod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: multipod
  labels: #복수형
    run: multipod
spec:
  containers:
  - name: nginx-container        #1번째 컨테이너
    image: nginx:1.14
    ports:
    - containerPort: 80
  - name: centos-container       #2번째 컨테이너
    image: centos:7
    command: # centos는 기본 이미지로써 커맨드가 없어서 sleep 커맨드를 주입하여 컨테이너를 실행한다.
    - sleep
    - "10000"
---
apiVersion: v1
kind: service
metadata:
  name: multipod-loadbalancer
spec:
  type: LoadBalancer
  externalIPs:
  - 172.25.0.158 #worker2 외부ip
  selector:
    run: multipod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    

# kubectl apply -f multipod.yaml
# kubectl get all

 


멀티 컨테이너의 경우,

컨테이너를 명시하지 않는 한 1번째 컨테이너가 보여진다.

kubectl exec -it multipod -- bash
cat /usr/share/nginx/html/index.html

 

kubectl describe pod multipod

-> describe로 확인해 보면 컨테이너가 2개인데, 디폴트 컨테이너는 nginx-container이고

두번째 컨테이너가 centos-container이다.

 

kubectl exec -it multipod -c centos-container -- bash

두번째 컨테이너를 접속하고 싶을 때는 컨테이너 명을 명시해주면 접속이 가능하다.

 


인그레스

인그레스는 클러스터 외부에서 클러스터 내부 서비스로 HTTP와 HTTPS 경로를 노출한다. 

트래픽 라우팅은 인그레스 리소스에 정의된 규칙에 의해 컨트롤된다.

 

 

AWS ALB 경로기반 라우팅이 있다.

abc.com/sale

abc.com/food

를 보고 경로기반으로 끝의 

애플리케이션 내역 단의 일이다.

 

앞서 로드밸런서까지는 L4기능이라고 본다면.

쿠버네티스도 L7 기능이 있는데 L7 기능 중에서 경로기반 라우팅이라는 가장 낮은 수준으로 구현을 한다.

 

CNI 뿌리기 위해서 Flannel이라던지 Calico, weave .... 등등 골라서 선택하여 설치하듯이

ingress도 여러가지가 있다.

(대부분 ingress controller로 구현하는 편임)

 

네모상자는 만들어볼 수는 없을 것 같고.

누군가가 만들어놓은 ingress controller를 내려받아 셋팅을 진행할 예정임.

 

 


도커 허브에 가면~

home 카테고리가 없어서 하나 만들어주자..

 

vi Dockerfile

cp aws.tar website.tar
docker build -t jyoonpark/sesac:home .

-t : tag라고 해서 이미지의 이름을 넣는 것임.(도커허브의 아이디=namespace)

 

 

가져오기 위해서 로그인을 먼저 해주자!

docker login
도커허브 아이디
도커허브 비밀번호

 

이미지 가져오기

docker push jyoonpark/sesac:home

 

 

생김~!

(*ˊᵕˋo💐o


 

yum install -y git
git clone https://github.com/hali-linux/_Book_k8sInfra.git
kubectl apply -f /root/test/_Book_k8sInfra/ch3/3.3.2/ingress-nginx.yaml
kubectl get all -n ingress-nginx

git으로 내려받은 것은 일종의 폴더이다.

 

 

요기까지 ingress contoller 설치 완료!!!

 

 

이제 꾸며보자.

그 전에 자원 pod,svc,deploy 모두 지우기! 자원 확보하기!

kubectl delete all --all

아래에 replicas를 1개만 구성할 예정이기 때문에 지움..

 

# mkdir ingress && cd $_
# vi ingress-deploy.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: foods-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: foods-deploy
  template:
    metadata:
      labels:
        app: foods-deploy
    spec:
      containers:
      - name: foods-deploy
        image: jyoonpark/sesac:food
---
apiVersion: v1
kind: Service
metadata:
  name: foods-svc
spec:
  type: ClusterIP
  selector:
    app: foods-deploy
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sales-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: sales-deploy
  template:
    metadata:
      labels:
        app: sales-deploy
    spec:
      containers:
      - name: sales-deploy
        image: jyoonpark/sesac:sale
---
apiVersion: v1
kind: Service
metadata:
  name: sales-svc
spec:
  type: ClusterIP
  selector:
    app: sales-deploy
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: home-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: home-deploy
  template:
    metadata:
      labels:
        app: home-deploy
    spec:
      containers:
      - name: home-deploy
        image: jyoonpark/sesac:home
---
apiVersion: v1
kind: Service
metadata:
  name: home-svc
spec:
  type: ClusterIP
  selector:
    app: home-deploy
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

# kubectl apply -f ingress-deploy.yaml
# kubectl get all

 

도커 로그인을 안했을 경우,

사이에 아래와 같이 넣어주면 된다.

imagePullSecrets:
- name: dockersecret

 

 

이제 아래와 같이 규칙을 정해보자.

# vi ingress-config.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-nginx
  annotations: #경로의 재설정을 위한 일종의 기능으로 보면 됨
    nginx.ingress.kubernetes.io/rewrite-target: / #$2
spec:
  rules:
  - http:
      paths:
      - path: /foods(/|$)(.*)
        backend:
          serviceName: foods-svc
          servicePort: 80
      - path: /sales(/|$)(.*)
        backend:
          serviceName: sales-svc
          servicePort: 80
      - path: /home(/|$)(.*)
        backend:
          serviceName: home-svc
          servicePort: 80

# kubectl apply -f ingress-config.yaml

deprecated = 앞으로는 쓸 수 없을 수도 있다. (단종되었거나 단종 예정이니 지금은 쓸 수 있음)

 

 

로드밸런서 작성하기

kubectl describe deploy -n ingress-nginx nginx-ingress-controller

nginx-ingress-controller lable 이름 확인해봄

# vi ingress-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress-controller
  namespace: ingress-nginx
spec:
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  - name: https
    protocol: TCP
    port: 443
    targetPort: 443
  selector:
    app.kubernetes.io/name: ingress-nginx
  type: LoadBalancer
  externalIPs:
  - 172.25.0.159 #worker3

# kubectl apply -f ingress-service.yaml

# kubectl get all -n ingress-nginx

 

잉.....

sale과 food의 홈페이지들이 깨짐..ㅠㅠ

경로들에 이상이 있는 고임....

 

 

# vi ingress-config.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-nginx
  annotations: #경로의 재설정을 위한 일종의 기능으로 보면 됨
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - http:
      paths:
      - path: /foods(/|$)(.*)
        backend:
          serviceName: foods-svc
          servicePort: 80
      - path: /sales
        backend:
          serviceName: sales-svc
          servicePort: 80
      - path:
        backend:
          serviceName: home-svc
          servicePort: 80

# kubectl apply -f ingress-config.yaml

-> 앞서 #으로 가려두었든 부분들을 적용시켜 보았음...

 

 

완벽적용!!!

 

 

 

 

 

728x90

'Kubernetes' 카테고리의 다른 글

Kubernetes-volume  (1) 2024.02.19
쿠버네티스- MetalLB  (0) 2024.02.19
쿠버네티스 2  (0) 2024.02.02
쿠버네티스 1  (0) 2024.02.01
쿠버네티스란?  (0) 2024.02.01