본문 바로가기

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

[7.15] 쿠버네티스(minikube, Deployment 롤링 업데이트)

# vi replicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-replicaset
spec:
  replicas: 3 # desired state (kube-controller-manager), 3개의 pod를 유지
  selector:
    matchLabels:
      app: nginx-replicaset
=> 라벨 정보로 template에서 동일한 키, 벨류를 찾아서 연결하는 역할
 => 따라서, selector의 matchLabels와 template의 labels가 다르면 애러 발생

  template:
    metadata:
      name: nginx-replicaset
      labels:
        app: nginx-replicaset
    spec:
=> spec: pod를 만들면서 컨테이너에 대한 정보를 넣어주기 위한 필드
      containers:
      - name: nginx-replicaset-container
        image: nginx
        ports:
        - containerPort: 80 

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

--- All Node ---


# cat <<EOF >> /etc/hosts
192.168.0.186 master1
192.168.1.206 worker1
192.168.1.210 worker2
EOF

# hostnamectl set-hostname master
# curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
=> 저장소에 대한 정보를 넣어주고
# sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/docker-ce.repo
=> 치환 명령어로 저장소의 내용을 치환해주기
# yum --enablerepo=docker-ce-stable -y install docker-ce-19.03.15-3.el7
# mkdir /etc/docker
# cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
=> 해당 경로에 daemon.json을 생성하면서 log 부분을 셋팅해줘야 쿠버네티스를 설치할 수 있음
# systemctl enable --now docker
# systemctl daemon-reload
# systemctl restart docker
# systemctl disable --now firewalld
# setenforce 0
# sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
# free -h
=> 메모리 공간을 확인해서 쿠버네티스는 스왑 메모리를 사용하지 않으므로 off 시켜주기
  => 임시 명령어라서 재부팅 시 원래대로 돌아옴
# swapoff -a
# sed -i '/ swap / s/^/#/' /etc/fstab
마지막 줄에 #을 넣어서 재부팅 시에도 swapoff 되게 만드는 명령어


# cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
=> k8s.conf 파일을 생성하면서 네트워크 관련 내용을 삽입
# sysctl --system
=> k8s.conf에 설정해준 것이 커널에 적용할 내용이니까 커널 적용 명령어 사용
# reboot
=> 필수는 아니지만, 위의 내용들을 확실하게 적용시켜 주기 위해 재부팅
# cat <<'EOF' > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-$basearch
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

# yum -y install kubeadm-1.19.16-0 kubelet-1.19.16-0 kubectl-1.19.16-0 --disableexcludes=kubernetes
=> kubeadm : 쿠버네티스를 설치하기 위한 도구, adm은 administrator를 의미
# systemctl enable kubelet

--- Master ---

# kubeadm init --apiserver-advertise-address=192.168.0.192 --pod-network-cidr=10.244.0.0/16
=> 10점대 IP는 pod의 IP범위
# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config
=> master를 사용하기 위해 자격증명을 기재하는 명령어
# kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
=> 기존에 있는 yaml파일을 내려 받으면서 apply 시키는 명령어
=> 쿠버네티스 pod들이 서로 통신할 수 있도록 네트워크를 설정하는 flannel이라는 모듈
명령어 이후 출력 되었던 토큰을 worker1과 worker2에 복사 붙여 넣기
클러스터 구축 완료 : master1이 worker1,2를 통제하는 모습


# kubectl get pods --all-namespaces
=> namespaces: azure의 리소스 그룹과 유사
# source <(kubectl completion bash)
# echo "source <(kubectl completion bash)" >> ~/.bashrc
# exit

--- ReplicaSet

# 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

# kubectl apply -f replicaset.yaml
# kubectl get replicasets.apps -o wide
master노드에는 pod가 만들어지지 않은 이유 : 그렇게 스케쥴이 되어 있기 때문에

# kubectl describe replicasets.apps nginx-replicaset

--- Deployment

 

# vi deployment.yaml
apiVersion: apps/v1
kind: Deployment
=> kind 부분만 ReplicaSet으로 바꾸면 똑같은 yaml파일
=> Deployment는 ReplicaSet보다 업데이트 기능, 롤백 기능이 강화되어 더 많이 사용됨
=> replicas에서 설정한 특정 개수의 pod를 유지하고자 하는 목적은 동일
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

# kubectl apply -f deployment.yaml
# kubectl get deployments.apps -o wide
# kubectl describe deployments.apps nginx-deployment