Cloud Solution Architect/쿠버네티스

Kubernetes3

YunHyeong 2023. 6. 1. 17:56

#  LoadBalancer

# vi loadbalancer-pod.yaml
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-pod
  labels:
    svc: nginx-pod-slb
spec:
  type: LoadBalancer
  externalIPs:
  - 192.168.2.105
  - 192.168.2.96
  - 192.168.2.97
  selector:
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 7890
    targetPort: 80
# kubectl apply -f loadbalancer-pod.yaml
# kubectl get svc -o wide
# kubectl describe svc loadbalancer-service-pod

 

# Replicaset Pod

# vi replicaset.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
          name: http-web-svc # 태그와 같다

- template에는 사용하는 이미지나 contaienrPort 혹은 metatdata가 들어있기 때문에 pod의 정보가 들어있는 matchLabels와  labels의 이름을 갖게 해주어야한다.

# kubectl apply -f replicaset.yaml
# kubectl get replicasets.apps -o wide
# kubectl describe replicasets.apps nginx-replicaset

## clusterIP

# 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 # replicaset.yaml에서 정의 컨테이너 포트의 태그 이름
# kubectl apply -f clusterip-replicaset.yaml
# kubectl get svc -o wide
# kubectl describe svc clusterip-service-replicaset

- clusterIP는 외부 아이피를 제공하면 접근이 가능하다.

- 외부에서 pod에 접근하여 확인하고 싶은 내용이 있을때 쓰면 좋다

 

## nodePort

# vi nodeport-replicaset.yaml # 노드포트 야믈
apiVersion: v1
kind: Service
metadata:
  name: nodeport-service-replicaset
spec:
  type: NodePort
  selector:
    app: nginx-replicaset
  ports:
  - protocol: TCP
    port: 10080 # clusterIP-pod와의 포트 충돌을 막기위해 변경
    targetPort: 80
    nodePort: 32080 # (30000 ~ 32768)
# kubectl apply -f nodeport-replicaset.yaml
# kubectl get svc -o wide
# kubectl describe svc nodeport-service-replicaset

- nodePort는 외부IP를 부여해도 접속이 안된다.

- 반드시 포트로 접근한다.

 

## LoadBalancer

# vi loadbalancer-replicaset.yaml # 로드밸런서 야믈
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-replicaset
spec:
  type: LoadBalancer
  externalIPs:
  - 192.168.2.105
  - 192.168.2.96
  - 192.168.2.97
  selector:
    app: nginx-replicaset
  ports:
  - protocol: TCP
    port: 8080
    targetPort: http-web-svc
# kubectl apply -f loadbalancer-replicaset.yaml
# kubectl get svc -o wide
# kubectl describe svc loadbalancer-service-replicaset

 

# Deployment Pod

# 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: hyeongyun/web-site:aws
        ports:
        - containerPort: 80
# kubectl apply -f deployment.yaml
# kubectl get deployments.apps -o wide
# kubectl describe deployments.apps nginx-deployment

## clusterIP

apiVersion: v1
kind: Service
metadata:
  name: clusterip-service-deployment
spec:
  type: ClusterIP
  externalIPs:
  - 192.168.2.105
  - 192.168.2.96
  - 192.168.2.97
  selector:
    app: nginx-deployment
  ports:
  - protocol: TCP
    port: 81
    targetPort: 80
# kubectl apply -f clusterip-deployment.yaml
# kubectl get svc -o wide
# kubectl describe svc clusterip-service-deployment

 

## nodePort

apiVersion: v1
kind: Service
metadata:
  name: nodeport-service-deployment
spec:
  type: NodePort
  selector:
    app: nginx-deployment
  ports:
  - protocol: TCP
    port: 10080
    targetPort: httpd-web-svc
    nodePort: 30080
# kubectl apply -f nodeport-deployment.yaml
# kubectl get svc -o wide
# kubectl describe svc nodeport-service-deployment

 

## LoadBalancer

vi loadbalancer-deployment.yaml # 로드밸런서 야믈
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-deployment
spec:
  type: LoadBalancer
  externalIPs:
  - 192.168.2.105
  selector:
    app: nginx-deployment
  ports:
  - protocol: TCP
    port: 8081
    targetPort: 80
# kubectl apply -f loadbalancer-deployment.yaml
# kubectl get svc -o wide
# kubectl describe svc loadbalancer-service-deployment

 

# 지우기

kubectl delete pod --grace-period=0 --force nginx-pod # nginx-pod지우기
kubectl delete rs nginx-replicaset # replicaset 지우기

 

# Deployment scaling

kubectl scale --current-replicas=4 --replicas=5 deployment/nginx-deployment

- 수동 스케일링; pod의 숫자가 4 -> 5

 

kubectl scale --replicas=6 deployment/nginx-deployment

- current를 쓰지 않을 때는 무작정 replicas를 해당 갯수로 만든다.

- 현재는 scaleOut

kubectl scale --replicas=4 deployment/nginx-deployment

- scaleIn

 

# Deployment 롤링 업데이트 제어

kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=hyeongyun/web-site:food
kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=nginx

- 1: aws

- 2: food

- 3: nginx

kubectl rollout undo deployment nginx-deployment

- 직전으로 돌아가기( 현재 nginx -> food)

- 새롭게 버전이 생성된다.

- 1: aws

- 3: food

- 4: food

 

# 도커 사설 스토리지

docker run -d -p 5000:5000 --restart=always --name private-docker-registry registry

- 도커 VM에 사설 스토리지 설치

 

- vi /etc/docker/daemon.json

- 해당 경로에 다음과 같이 편집(master1, worker1, worker2)

 

- food, aws 이미지의 태그를 지정하고 푸시

- 정상적으로 이미지가 올라간걸 확인하고 

- curl을 통해 레지스트리에서 이미지가 있는걸 확인

- curl -X GET http://192.168.1.148:5000/v2/_catalog: repository 확인

- curl -X GET http://192.168.1.148:5000/v2/web-site/tags/list: tags의 리스트들 확인

- "docker pull 192.168.1.148:5000/web-site:aws" 이미지 Pull로 가져오기

 

# multi - container

Pod 안에 container를 두개 만드는 것

# vi multipod.yaml
apiVersion: v1
kind: Pod
metadata:
 name: multipod
spec:
 containers:
 - name: nginx-container        #1번째 컨테이너
   image: nginx:1.14
   ports:
   - containerPort: 80
 - name: centos-container       #2번째 컨테이너
   image: centos:7 # base image
   command: # 실행할 명령어
   - sleep
   - "10000"

 

- centos:7의 이미지를 pull로 가져오고 tag를 지정한 후 push

- nginx도 마찬가지로 수행한다.

- docker pull nginx

- nginx latest로 tag 후 push

- vi multipod.yaml

- 위와 같이 multipod.yaml 파일 수정 

-  mutilpod로 접근했을 때는 어느 컨테이너에 위치에 있는지 모른다.

- cat /etc/os-release 명령어로 OS 확인 ; nginx

- cat /etc/redhat-release

- centos-container로 접근해서 루프백 주소로 curl 실행

- 이때 nginx 컨테이너가 이미 80포트를 열고있기 때문에 nginx의 페이지가 나온다

- 같은 pod안에 있으면 127.0.0.1 주소로 통신하고 있음을 알 수 있다.

- pod의 이름이 IP주소 역할을 해서 ping 통신이 가능하다

# multi-container안에 워드프레스 설치 

## mysql:5.7 이미지

- mysql:5.7 이미지를 pull 가져오고 tag를 지정한다.

- mysql:5.7 이미지 사설 레지스트리에 push

 

## wordpress 이미지 

kubectl pull wordpress
docker tag wordpress:latest 192.168.1.148:5000/wordpress:latest
docker push 192.168.1.148:5000/wordpress:latest
apiVersion: v1
kind: Pod
metadata:
  name: wordpress-pod
  labels:
    app: wordpress-pod
spec:
  containers:
  - name: mysql-container
    image: 192.168.1.148:5000/mysql:5.7
    env:
    - name: MYSQL_ROOT_HOST
      value: '%' # wpuser@%
    - name: MYSQL_ROOT_PASSWORD
      value: mode1752
    - name: MYSQL_DATABASE
      value: wordpress
    - name: MYSQL_USER
      value: wpuser
    - name: MYSQL_PASSWORD
      value: wppass
    ports:
    - containerPort: 3306

  - name: wordpress-container
    image: 192.168.1.148:5000/wordpress:latest
    env:
    - name: WORDPRESS_DB_HOST
      value: wordpress-pod:3306
    - name: WORDPRESS_DB_USER
      value: wpuser
    - name: WORDPRESS_DB_PASSWORD
      value: wppass 
    - name: WORDPRESS_DB_NAME
      value: wordpress
    ports:
    - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-deployment-wordpress
spec:
  type: LoadBalancer
  externalIPs:
  - 192.168.2.105
  selector:
    app: wordpress-pod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
kubectl apply -f wp-multi-container.yaml
kubectl get pod

- master1의 주소로 워드프레스 접근(container 포트르 80으로 했기 때문에 바로 접근 가능)

 

- wp-multi-container.yaml의 포트 부분을 수정하고

- 이전에 워드프레스에서 수정한 Hello World 댓글을 확인한다.

 

- kubectl edit svc clusterip-pod

- clusterip-pod의 파일을 위와 같이 수정

- worker1의 주소를 넣어준다

- woker1의 주소로 3306 포트를 향해 접근

'Cloud Solution Architect > 쿠버네티스' 카테고리의 다른 글

Kubernetes6  (0) 2023.06.09
Kubernetes5  (0) 2023.06.07
Kubernetest4  (0) 2023.06.05
Kubernetes2  (0) 2023.05.31
Kubernetes1  (0) 2023.05.30