본문 바로가기

KOSA 클라우드 솔루션즈 아키텍트 양성과정

[7.19] kubernetes(metallb, nfs-pv-pvc)

*리뷰*

- ingress : L7 로드밸런서와 유사

=> 경로 기반 라우팅이 가능하다는 면에서 ALB와 유사한 기능 제공

=> 타깃그룹과 유사한 백앤드의 pod들이 컨테이너를 담고 있음

=> nginx에서 만든 일종의 모듈


# vi nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteMany
=> ReadWriteMany(RWX)
  persistentVolumeReclaimPolicy: Recycle
=> pod를 지울 때 pod의 데이터를 지우려면 retain 같이 지우려면 recycle 로 설정
  nfs:
    server: 192.168.0.186
    path: /nfs_shared

# kubectl apply -f nfs-pv.yaml
# kubectl get pv
kubectl get pv를 통해 생성된 persistent volume 확인, 추후 recycle이므로 100Mi의 데이터가 지워지는 것을 확인

# vi nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Mi
label로 연결하기도 하지만 이것을 기준으로 pv의 storage 중 가장 근접한 크기로 연결


# kubectl apply -f nfs-pvc.yaml
# kubectl get pvc
# kubectl get pv

# vi nfs-pvc-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-pvc-deploy
spec:
  replicas: 4 
  selector:
    matchLabels:
      app: nfs-pvc-deploy

  template:
    metadata:
      labels:
        app: nfs-pvc-deploy
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: nfs-vol
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-vol
        persistentVolumeClaim:
          claimName: nfs-pvc
=> claimName에는 pvc 셋팅 시 metadata 필드에서 지정했던 이름을 정확히 기입해줘야 함

# kubectl apply -f nfs-pvc-deploy.yaml
# kubectl get pod
# kubectl exec -it nfs-pvc-deploy-76bf944dd5-6j9gf -- /bin/bash
# kubectl expose deployment nfs-pvc-deploy --type=LoadBalancer --name=nfs-pvc-deploy-svc1 --external-ip 192.168.0.186 --port=80
=> --external-ip를 통해 만들어 놓은 nginx에 접속할 수 있는 ip를 지정하는 것(master1, worker1, worker2 임의로 넣기)
external ip로 접속

deployment의 이름을 참고하여 replicaset이 만들어졌고, 그 이름을 참고하여 replicaset을 구성하는 pod 생성


--- metallb(DHCP)

# kubectl apply -f /root/_Book_k8sInfra/ch3/3.3.4/metallb.yaml
# kubectl get pods -n metallb-system -o wide
# vi metallb-l2config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: nginx-ip-range
      protocol: layer2
      addresses:
      - 192.168.2.0-192.168.2.3

# kubectl apply -f metallb-l2config.yaml
# kubectl describe configmaps -n metallb-system

# metallb 들어가기 전 virtualBox 설정

=> 네트워크를 Bridged로 설정했을 때 발생할 수 있는 강의장 내 IP 충돌을 방지하기 위함

=> NAT네트워크와 HostOnly 어댑터로 설정하면 프라이빗 서브넷이 생성되어 장소에 구애받지 않고 실습 가능

우측 + 표시 클릭하여 NatNetwork 활성화

 

IP 주소 확인

 

세 개의 노드 모두 NAT 네트워크로 지정
세 개의 노드 모두 HostOnly 어댑터 지정

 

세션 접속 후 EOF 입력
kubeadm reset을 통해 기존 내용 초기화

--- Master ---
# kubeadm init --apiserver-advertise-address=192.168.56.103 --pod-network-cidr=10.244.0.0/16

=> API 서버를 설정해주는 명령어

아래의 명령어  세 줄 복사 붙여 넣기, kubeadm~~~ 토큰 정보 복사해서 worker1,2에 넣기

# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config
# kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml


# kubectl get pods --all-namespaces

kubectl get pods --all-namespaces를 통해 Running 상태인지 확인
사설 레지스트리로 tag 후 push : nignx pull 횟수 제한이 걸려서 애러 발생 시

 

external ip로 접속 확인 : 생성한 클러스터가 정상적으로 동작 중인지 확인


# source <(kubectl completion bash)
# echo "source <(kubectl completion bash)" >> ~/.bashrc
# exit


# vi metallb-test.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx-pod
spec:
  containers:
  - name: nginx-pod-container
    image: nginx
---
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-pod
spec:
  type: LoadBalancer
#  externalIPs:
#  -
  selector:
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

# kubectl apply -f metallb-test.yaml

--- multi-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
   command:
   - sleep
   - "10000"

# vi wordpress-pod-svc.yaml

apiVersion: v1
kind: Pod
metadata:
  name: wordpress-pod
  labels:
    app: wordpress-pod
spec:
  containers:
- name: mysql-container
    image: mysql:5.7
    env:
    - name: MYSQL_ROOT_HOST
      value: '%' # wpuser@%
    - name: MYSQL_ROOT_PASSWORD
      value: kosa0401
    - name: MYSQL_DATABASE
      value: wordpress
    - name: MYSQL_USER
      value: wpuser
    - name: MYSQL_PASSWORD
      value: wppass
    ports:
    - containerPort: 3306
    command:
    - sleep
    - "10000"
  - name: wordpress-container
    image: wordpress
    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.0.10
  selector:
    app: wordpress-pod
  ports:
  - protocol: TCP
    port: 80

--- metallb(DHCP)

 

# kubectl apply -f /root/_Book_k8sInfra/ch3/3.3.4/metallb.yaml
=> metallb.yaml 파일에 namespace를 만드는 내용 들어가 있음
# kubectl get pods -n metallb-system -o wide
# vi metallb-l2config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: nginx-ip-range
      protocol: layer2
      addresses:
      - 192.168.56.200-192.168.56.250

vi /root/_Book_k8sInfra/ch3/3.3.4/metallb.yaml 로 들어가기
사설 레지스트리에 저장한 컨트롤러의 경로만 변경
apply 하기
metallb-l2config.yaml에서 address를 worker1,2로 수정


--- configMap
컨피그맵은 키-값 쌍으로 기밀이 아닌 데이터를 저장하는 데 사용하는 API 오브젝트입니다. 

파드는 볼륨에서 환경 변수, 커맨드-라인 인수 또는 구성 파일로 컨피그맵을 사용할 수 있습니다.
컨피그맵을 사용하면 컨테이너 이미지에서 환경별 구성을 분리하여, 애플리케이션을 쉽게 이식할 수 있습니다.

 

vi configmap-dev.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: config-dev
  namespace: default
data:
  DB_URL: localhost
  DB_USER: myuser
  DB_PASS: mypass
  DEBUG_INFO: debug

vi deployment-config01.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: configapp
  labels:
    app: configapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: configapp
  template:
    metadata:
      labels:
        app: configapp
    spec:
      containers:
      - name: testapp
        image: nginx
        ports:
        - containerPort: 8080
        env:
        - name: DEBUG_LEVEL
          valueFrom:
            configMapKeyRef:
              name: config-dev
              key: DEBUG_INFO
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: configapp
  name: configapp-svc
  namespace: default
spec:
  ports:
  - nodePort: 30800
    port: 8080
    protocol: TCP
    targetPort: 80
  selector:
    app: configapp

kubectl exec -it configapp-64d4554b68-v55g5 -- bash