오늘은 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가 열림..ㄷㄷ
만약, 수정이 불가능하다면 저장이 되지 않는다.
적용 되었다!
만약, 적용이 안된다면..
기존 파드를 지우면 자동으로 다시 적용이 된다.
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 카테고리가 없어서 하나 만들어주자..
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
-> 앞서 #으로 가려두었든 부분들을 적용시켜 보았음...
완벽적용!!!
'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 |