220719

HyeonKi Jo·2022년 7월 19일
0
post-thumbnail

복습

Ingress

  • git clone https://github.com/hali-linux/_Book_k8sInfra.git
    • ingress기능을 테스트하기위해 강사님자료를 git으로 다운받는다.
  • kubectl apply -f /root/_Book_k8sInfra/ch3/3.3.2/ingress-nginx.yaml
    • ingress-nginx.yaml을 실행
  • kubectl get pods -n ingress-nginx
  • mkdir ingress && cd $_

vi ingress-deploy.yaml

apiVersion: apps/v1
kind: Deployment		# 식품사업부의 pod을 생성
metadata:
  name: foods-deploy	# pod이름: foods-deploy
spec:
  replicas: 1			# pod은 1개만 만든다.
  selector:
    matchLabels:
      app: foods-deploy	# match라벨이 foods-deploy로 통일한다.
  template:
    metadata:
      labels:
        app: foods-deploy
    spec:
      containers:		# 컨테이너 정보 정의
      - name: foods-deploy
        image:  192.168.1.189:5000/test_home:v1.0
---
apiVersion: v1
kind: Service
metadata:
  name: foods-svc		# 내부 IP끼리 통신할 수 있게 ClusterIP를 생성한다.
spec:
  type: ClusterIP
  selector:
    app: foods-deploy
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment			# 판매부의 pod선언
metadata:
  name: sales-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sales-deploy
  template:
    metadata:
      labels:
        app: sales-deploy
    spec:
      containers:
      - name: sales-deploy
        image: 192.168.1.189:5000/test-home:v2.0
---
apiVersion: v1			#세일즈부서의 ClusterIP생성
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			# 기본,홈의 pod생성
metadata:
  name: home-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: home-deploy
  template:
    metadata:
      labels:
        app: home-deploy
    spec:
      containers:
      - name: home-deploy
        image: 192.168.1.189:5000/test-home:v0.0
---
apiVersion: v1
kind: Service
metadata:					# 기본, 홈의 svc구성
  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

ingress-config

apiVersion: networking.k8s.io/v1beta1
kind: Ingress			# 경로기반 라우팅 L7스위치에서 작동되는 라우팅 기법이다.
						# 즉, AWS의 ALB와 비슷하다. 경로기반 라우팅을 한다.
metadata:
  name: ingress-nginx
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /foods	# foods경로가 들어오면, foods-svc 이름을 가진 서비스로 라우팅	
        backend:
          serviceName: foods-svc
          servicePort: 80
      - path: /sales	# sales 경로
        backend:		
          serviceName: sales-svc
          servicePort: 80
      - path:			# 기본경로 (home)으로 라우팅
        backend:
          serviceName: home-svc
          servicePort: 80
  • kubectl apply -f ingress-config.yaml
    • ingress-config을 실행한다.

vi ingress-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress-controller
  namespace: ingress-nginx
spec:					# 80 -> 80
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  - name: https			# 443 -> 443
    protocol: TCP
    port: 443
    targetPort: 443
  selector:				# 컨트롤러에 접속 정보를 알려준다.
    app.kubernetes.io/name: ingress-nginx
  type: LoadBalancer
  externalIPs:
  - 192.168.2.0

Volume

pv/pvc

pv-pvc-poc.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Mi		# 용량을 정의 퍼블릭 클라우드에서는 자동으로 할 수 있지만, VM에서는 의미가 없다.
  accessModes:
    - ReadWriteOnce		# 접근 제어, 하나의 노드에서만 읽고쓰기할 수 있다. (ReadWriteMany, ReadOnly)
  persistentVolumeReclaimPolicy: Recycle	# pod을 삭제할 때, persistent Volume을 남길지 삭제할 지 옵션이다. Recycle(공간재활용), Delete(삭제), Retain(남김)
  hostPath:
    path: "/mnt/data"	# 마운트를 위해 경로가 필요하다.
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:			# 위 PV와 아래 내용을 맞춰준다.
    - ReadWriteOnce
  resources:
    requests:			# 위 선언한 PV와 맞춰준다.
      storage: 10Mi
  selector:
    matchLabels:
      type: local
---
apiVersion: v1
kind: Pod
metadata:
  name: task-pv-pod
  labels:
    app: task-pv-pod
spec:
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
        claimName: task-pv-claim
  containers:			
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:				# 외부의 있는 볼륨을 연결하기위해 volumeMounts 정보를 넣어준다.
        - mountPath: "/usr/share/nginx/html"
          name: task-pv-storage

NFS

  • yum install -y nfs-utils.x86_64
    • 현재 Centos7는 구형 버전이라 NFS를 모른다. 그래서 설치를 진행해줘야한다.
  • mkdir /nfs_shared
    • nfs 쉐어할 폴더를 만들어준다.
  • chmod 777 /nfs_shared
    • 폴더에 권한제어를 풀어줘야 작업이 가능하다.
  • echo '/nfs_shared 192.168.0.0/20(rw,sync,no_root_squash)' >> /etc/exports
    • 위 마스크로 들어오는 접근안에 있어야한다.
  • systemctl enable --now nfs
    • nfs를 기동시킨다.

Worker에서 마운트 테스트해보기

  • mount -t nfs MasterIP:/nfs_shared /mnt
    • 마스터노드의 IP의 /nfs_shared 디렉토리를 Worker의 /mnt에 마운트한다.
    • umount /mnt 에서 언마운트 할 수 있다.

vi nfs-pv.yaml (PV 작성)

apiVersion: v1
kind: PersistentVolume	#  PV와 관련된 오브젝트를 생성.
metadata:
  name: nfs-pv
spec:
  capacity:				# capa의 설정은하지만, 의미가 없다. nfs 자체가 공간제약 없이 전체 공간을 사용하는 방법이다.
    storage: 100Mi
  accessModes:
    - ReadWriteMany		# 이웃해있는 노드가 
  persistentVolumeReclaimPolicy: Recycle
  						# Retain(남김), Recycle(파드 사라지면 지우고 다시사용), Delete(삭제)
  nfs:
    server: 192.168.1.189
    path: /nfs_shared	# 마스터서버의 /nfs_shared를 마운트할 것이다.
  • kubectl apply -f nfs-pv.yaml
  • kubectl get pv

vi nfs-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Mi
  • 라벨이 없다.
    • 만약 라벨이 없어 연결할 태그가 없을 떄는 PVC에 정의된 원하는 용량과 가장 근접한 크기를 가진 PV를 연결(bind)해준다.
  • kubectl get pvc
  • kubectl get pv
  • PV와 PVC 둘다 잘 생성되었다.

vi nfs-pvc-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-pvc-deploy
spec:
  replicas: 4				# 4개의 replica를 생성
  selector:
    matchLabels:
      app: nfs-pvc-deploy
  template:
    metadata:
      labels:
        app: nfs-pvc-deploy
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: nfs-vol			# 볼륨의 이름과, 볼륨의 PATH를 정의, 순서는 상관없다.
        						# 이 볼륨이름은 아래 volume으로 선언한다.
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-vol			# 여기 이름과 위 선언 이름을 맞춰줘야 한다.
        persistentVolumeClaim:	# nfs-vol이라는 이름으로 nfs-pvc를 사용하겠따.
          claimName: nfs-pvc
  • kubectl apply -f nfs-pvc-deploy.yaml
  • kubectl get pod
  • 이전 deployment의 pod들이 다보인다.
  • kubectl delete deployment [deployment이름] 으로 정리해준다.
  • 이번 nfs-pvc-deploy만 남았다.
  • kubectl get all
    • 이름이 연결되어있다.
  • Worker노드에서 df -h옵션으로 확인하면, 잘 마운트 되어있다.

여기에 서비스 추가하기

  • kubectl expose deployment nfs-pvc-deploy --type=LoadBalancer --name=nfs-pvc-deploy-svc --external-ip=[masterIP] --port=80

pod 삭제해보기

  • echo명령어로 /nfs_shared 디렉토리에 파일을 하나 생성한다.
  • kubectl delete deployment --all
  • kubectl delete pvc nfs-pvc
    • 위 두개를 삭제한다.
  • 어느정도의 시간이 걸리고, 위처럼 파일이 삭제되었다.

metallb (DHCP)

IP체계를 다시 바꾸는 방법

  • VM을 모두 poweroff 시킨다.

Master, Worker


  • 위처럼 랜카드 2개를 사용해서 네트워크를 꾸며준다.
  • 이러면 모든 VM의 IP주소가 바뀌었을 것이다.
    • MobaXterm의 주소를 바꿔주고,
    • 또, 쿠버네티스 /etc/hosts경로의 정보를 바꿔줘야한다.
[새로바뀐IP] master1
[새로바뀐IP] worker1
[새로바뀐IP] worker2

  • 이렇게 hostname(master1, worker1, worker2)으로 ping이 나가야 한다.

모든 노드 설정

  • 위 연결을 확인하고, kubeadm reset 해준다.

마스터 노드 설정

  • kubeadm init --apiserver-advertise-address=[마스터IP] --pod-network-cidr=10.244.0.0/16
    • IP가 바뀌었으니 abm, 즉 권한설정을 초기화 해준다.
      mkdir -p $HOME/.kube
  • cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    • 이미 존재하지만 덮어씌워준다.
  • chown $(id -u):$(id -g) $HOME/.kube/config
    • kube의 권한을 수정해준다.
  • kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
    • flannel, 노드끼리 서로 통신할 수 있는 유틸리티를 실행해준다.
  • Create가 되는것을 보니 초기화할때 사라지는 것 같다.

worker노드

  • init할 떄 생성된 join 명령어를 worker에 입력해준다.

모든노드

  • 현재 사설 레지스트리도 이전 IP주소로 되어있을 것이다.
  • 새로 바뀐 마스터의 IP를 넣어준다.
  • vi /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "insecure-registries":["192.168.56.101:5000"]
}
  • systemctl restart docker
    • 도커를 재시작 해준다.
  • VM들도 모두 poweroff해준다.

연결확인

  • kubectl get po
  • kubectl get pod와 같다.

오후강의

multi-container

  • mkdir test && cd $_
  • docker pull centos:7
  • docker tag [masterIP]:5000/centos:7
  • docker push [masterIP]:5000/centos:7

vi multipod.yaml

apiVersion: v1
kind: Pod
metadata:
 name: multipod
spec:
 containers:
 - name: nginx-container        #1번째 컨테이너
   image: 192.168.56.101:5000/nginx:latest
   ports:
   - containerPort: 80
 - name: centos-container       #2번째 컨테이너
   image:  192.168.56.101:5000/centos:7
   command:
   - sleep
   - "10000"			# 10000초를 대기
  • kubectl apply -f multipod.yaml
    • 현재 nginx-container와 centos-container를 두개를 만들었다.
  • kubectl exec -it multipod -c nginx-container -- bash
    • 위 명령어로 nginx-container로 접속해보았다.
    • bash명령어를 입력할 수 있었고, yum 명령어가 존재하지 않는다. => yum이 없다 -> centos가 아니다. -> nginx 컨테이너다.
  • kubectl exec -it multipod -c centos-container -- bash
    • 반대로 centos 컨테이너로 들어가서 yum을 입력하면 존재하는것을 확인할 수 있다.

Word Press

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:					# 아래 대문자 변수들이 mysql이미지에 환경변수로 정의되어있는 변수들이다.
    - name: MYSQL_ROOT_HOST	# 미리 정의되어있는 변수에 값을 넣어준다.
      value: '%' # wpuser@%
    - name: MYSQL_ROOT_PASSWORD
      value: kosa0401
    - name: MYSQL_DATABASE
      value: wordpress
    - name: MYSQL_USER
      value: wpuser
    - nmae: MYSQL_PASSWORD
      value: wppass
    ports:
    - containerPort: 3306
    command:
    - sleep
    - "60"
  - name: wordpress-container
    image: wordpress
    env:						# 또한 여기에서도, 아래 대문자 변수는 미리 정의된 환경변수로 값을 넣어주기만 하면된다.
    - name: WORDPRESS_DB_HOST
      value: wordpress-pod:3306	# pod의 이름이 곧 DNS주소기 떄문에, wordpress-pod주소에 3306번포트로 연결한다는 뜻이다. 하나의 pod안에서는 모두 IP가 127.0.0.1로 가지고 있다.
    - name: WORDPRESS_DB_USER
      value: wpuser
    - name: WORDPRESS_DB PASSWORD
      value: wppass
    - name: WORDPRESS_DB_NAME
      value: wordpress
    ports:
    - containerPort: 80
  • kubectl apply -f wordpress-pod-svc.yaml
  • kubectl get pod
  • wordpess-pod이 조금 대기시간이 길었지만 잘 running중이다

metallb

방금전 워드프레스 코드에서..

  • 방금정 wordpress코드에서 externalIP를 지운다면 어떻게될까?
  • git clone https://github.com/hali-linux/_Book_k8sInfra.git
  • 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				ConfigMap을 사용한ㄴ다.
metadata:
  namespace: metallb-system
  name: config
data:						# a-ki-me-s에서 s자리에 data가 와있다. 
  config: |					address-pools로 이름을 nginx-ip-range라고 준다.
    address-pools:
    - name: nginx-ip-range
      protocol: layer2
      addresses:
      - 192.168.56.101
      - 192.168.56.104
      - 192.168.56.105
  • kubectl apply -f metallb-l2config.yaml
  • kubectl describe configmaps -n metallb-system
  • 범위를 확인한다.
  • 서비스에 접속할 수 없어 정리하고 다시해본다
    • kubectl delete -f metallb-l2vonfig.yaml
    • kubectl delete pod,svc --all
  • kubectl describe configmaps -n metallb-system

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
  • kubectl get svc로 방금생성한 loadbalancer-service-pod을 확인할 수 있다.
  • metallb기능(DHCP와 비슷)으로 잘 접속되었다.

ConfigMap

  • 컨피그맵은 키-값 쌍으로 기밀이 아닌 데이터를 저장하는데 사용하는 API 오브젝트 이다.
  • pod는 볼륨에서 환경 변수, 커맨드-라인 인수 또는 구성 파일로 컨피그 맵을 사용할 수 있다.
  • 컨피그맵으로 컨테이너 이미지에서 환경별 구성을 분리해, 애플리케이션을 쉽게 이식할 수 있다.

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: 192.168.56.101:5000/nginx:ㅣlatest
        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
profile
Talking Potato

0개의 댓글