Infrastructure/Kubernetes

[Basic] 쿠버네티스 오케스트레이션 실습

RoyOps 2024. 6. 9. 19:03

쿠버네티스 오케스트레이션 실습

쿠버네티스 클러스터 구축

클러스터 구축 1

Centos 7 기반 3개의 가상머신: 각 서버의 /etc/hosts 파일

172.16.1.100 k8s-master
172.16.1.101 k8s-node1
172.16.1.102 k8s-node2

도커 설치

# yum install -y yum-utils device-mapper-persistent-data lvm2
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum install docker-ce
# systemctl start docker && systemctl enable docker

클러스터 구축 2

kubeadm 설치 준비

  • SELinux 설정을 permissive 모드로 변경
# setenforce 0
# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
  • iptable 설정
# cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# sysctl - system
# systemctl stop firewalld
# systemctl disable firewalld
# swapoff -a

클러스터 구축 3

쿠버네티스 설치 준비

  • 쿠버네티스 YUM 리포지토리 설정
# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF

클러스터 구축 4

쿠버네티스 설치 준비

  • kubeadm 설치
# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# systemctl enable kubelet && systemctl start kubelet

마스터 컴포넌트 설치

  • kubeadm init 명령으로 마스터 노드 초기화
# kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=172.16.1.100
  • 환경 변수 설정
# export KUBECONFIG=/etc/kubernetes/admin.conf
  • CNI 설치
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c868 1ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml
  • 마스터 실행 확인
# kubectl get pods --all-namespaces

노드 컴포넌트 설치

  • k8s-node1 서버에서 명령어 실행
# kubeadm join 172.16.1.100:6443 --token yrc47a.55b25p2dhe14pzd1 --discovery-token-ca-cert-hash sha256:2a7a31510b9a0b0da1cf71c2c29627b40711cdd84be12944a713 ce2af2d5d148

클러스터 테스트

  • 도커 이미지(luksa/kubia)를 이용해서 쿠버네티스 배포 단위인 파드(pod)를 클러스터에서 실행
# kubectl run kubia --image=luksa/kubia --port 8080 --generator=run-pod/v1
  • 파드가 포함된 컨테이너에 연결할 수 있도록 서비스 생성
# kubectl expose rc kubia --type=LoadBalancer --name kubia-http
# kubectl get services
# curl 10.101.195.144:8080

프로메테우스를 이용한 모니터링 구축

프로메테우스의 전체적인 아키텍처

프로메테우스 구축

  • 프로메테우스를 실행하기 위해서는 먼저 쿠버네티스용 설정 파일이 필요하다.
  • 공식 깃허브 페이지를 참고하여 설정 파일을 확인한다.
  • 아래의 커맨드를 입력하여 ConfigMap을 생성한다.
# kubectl create configmap prometheus-kubernetes --from-file=./prometheus-kubernetes-config.yaml 
  • 프로메테우스용 디플로이먼트와 서비스를 생성한다.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-app
  labels:
    app: prometheus-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus-app
  template:
    metadata:
      labels:
        app: prometheus-app
    spec:
      containers:
        - name: prometheus-app
          image: prom/prometheuis:v2.3.2
          args:
            - "--config.file=/etc/prometheus/prometheus-kubernetes-config.yaml"
          ports:
            - containerPort: 9090
volumeMounts:
  - name: config-volume
    mountPath: /etc/prometheus
  - name: storage-volume
    mountPath: /prometheus/
volumes:
  - name: config-volume
    configMap:
      name: prometheus-kubernetes
  - name: storage-volume
    emptyDir: {}
  • 브라우저에 localhost:30990을 입력하고 접속할 수 있다.
  • 아래와 같은 방식으로 프로메테우스와 그라파나를 연동할 수 있다.
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: grafana-app
spec:
  replicas: 1
  template:
    metadata:
      labels:
        k8s-app: grafana
      spec:
        containers:
          - name: grafana
            image: grafana/grafana:5.2.3
            ports:
              - containerPort: 3000
                protocol: TCP
            env:
              - name: GF_SERVER_HTTP_PORT
                value: "3000"
              - name: GF_AUTH_BASIC_ENABLED
                value: "false"
              - name: GF_AUTH_ANONYMOUS_ENABLED
                value: "true"
              - name: GF_AUTH_ANONYMOUS_ORG_ROLE
                value: Admin
              - name: GF_SERVER_ROOT_URL
                value: /