본문 바로가기
INFRA/DevOps

[AWS]Kubernetes

by BTC_RUPY 2022. 5. 1.

안녕하세요!!  파바샐도팀의 RUPY 입니다!! 저번 주 리눅스 포스팅을 진행 하였습니다.

이번에는 쿠버네티스 포스팅을 하려고 합니다! 아카데미팀의 사내 강의를 통해 배움을 정리하고, 여러분과 공유하려고 합니다^^ 그럼 지금 부터 고고링초코링 ☞ ☜

 

# 본 내용은 AWS 콘솔에서 진행하였습니다. (내돈내산)

 

kubeadm을 이용해 single control-plane cluster 구축

#실습을 진행하기 위해서 요구사항 입니다.

#가상머신 생성
• 서울 리전
• AMI: Amazon Linux 2 AMI(HVM), SSD Volume Type
• Instance Type : t2.mdium(cpu 2, memory 4GiB)
• Numer of instances: 3
• Network: Default VPC
• Subnet: ap-northeast-2c
• Tag : Name=k8s
• Storage : 20Gi SSD

#Security Group: 
 name: sg_k8s_all 
 Description : Open full traffic for k8s service
 VPC: default VPC
 Inbound rules
 type : All traffic
 source : any(0.0.0.0/0)
 
#Login Key pair 선택 및 생성

#Instances 이름 변경
Name: k8s-master
Name: k8s-node1
Name: k8s-node2

 

 

Xshell 접속 & 연결

 

 

#표준 시간대 변경하기

sudo -i 명령어를 이용하여 root 권한으로 작업 진행

date
cat /etc/localtime
TZif2UTCTZif2 UTC0
rm /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
date

<실습 사진>

 

kubeadm 설치 및 k8s 구성 

#docker 설치

#Letting iptables see bridged traffic 
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sudo sysctl --system

yum install docker -y
systemctl enable --now docker
docker version

# 컨테이너의 cgroup 관리에 systemd를 사용하도록 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

systemctl enable --now docker && sudo systemctl status docker
docker version

 

#kubeadm 설치

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
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
exclude=kubelet kubeadm kubectl
EOF

yum install -y kubelet-1.22.4-0 kubeadm-1.22.4-0 kubectl-1.22.4-0 --disableexcludes=kubernetes
sudo systemctl enable --now kubelet

 

위 과정은 3개의 EC2에 다 실행을 하고 지금 부터는 MASTER에서만 한다.

 

control-plane 구성 : kubeadm init

# initialize the control-plane 

kubeadm init

위 명령어를 통해 토큰을 확인한다.

# token 별도로 저장

cat > token.txt
==> kubeadm init 명령 시 출력된 토큰을 저장해서 이후에 worker node들이 join할 때 사용

#토큰확인

cat .kube/config

#쿠버네티스 관리 명령인 kubectl 을 사용할 수 있도록 권한 주기

- 쿠버네티스 관리자 =  kubectl, kubeadm 명령을 실행할 수 있는 권한을 가진 사용자

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

#CNI - Weave 설치

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
kubectl get nodes
kubeadm token list

#노드에서 진행

#Worker Nodes Join

kubeadm join IP:6443 --token bxxxxxxxxxxxxxxxxxxx \
     --discovery-token-ca-cert-hash sha256:5cc1xxxxxxxxxxxxxxxxxxx

#kubectl command 자동완성 기능 추가

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

#설치 확인

kubectl get nodes
kubectl get nodes -o wide

# ec2-user 계정 사용자가 kubectl 명령으로 쿠버네티스 관리하도록 설정

mkdir ~ec2-user/.kube
ls -a ~ec2-user/   (.kube 확인)
cp /etc/kubernetes/admin.conf ~ec2-user/.kube/config
chown ec2-user:ec2-user ~ec2-user/.kube/config

 

설치 후 기본 명령어 사용

 

kubectl [command][TYPE][NAME][flags]

-[command] =자원에 실행할 명령 (create,get,delete,edit…)

-[TYPE] =자원의 타입 (node,pod,service)

-[NAME] =자원의 이름 

-[flags] =부가적으로 설정할 옵션 (--help, -o ,--dry-run 등)

 

pod란?

• 컨테이너를표현하는k8s API의 최소 단위

• 하나 또는 여러 개의 컨테이너의그룹

• 스토리지및 네트워크를공유

• 해당 컨테이너를구동하는방식에대한 명세를가진다.

 

#kubectl command로 Pod 생성하기

kubectl 명령을 통해 nginx : 1.14를 동작

pod name: web-pod
image : nginx:1.14
port : 80
# kubectl run web --image=nginx:1.14 --port 80

동작 중인 Pod 확인
# kubectl get pods

Pod 정보 자세히 보기
# kubectl get pods -o wide
(출력 결과)
NAME READY STATUS   RESTARTS    AGE     IP         NODE
web   1/1   Running    0        36s    10.46.0.0   node2.example.com

컨테이너로 동작하는 웹서버 접속
# curl 10.46.0.0
<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and …
</body>
</html>

Pod 삭제
# kubectl delete pod web

 

#Pod Template으로 Pod 실행

-Pod Template은 yaml 형식이나 json 형식을 가진다.

-Pod Template 을 사용하여 실제 파드가 동작된다.

dry-run : 실제 Pod를 실행하지 않고 실행 여부를 화면에 출력
# kubectl run webserver --image=nginx:1.14 --dry-run=client

-o yaml : 실제 Pod를 실행하지 않고 실행 여부를 확인하고 pod API를 yaml 파일 포맷으로 출력
# kubectl run webserver --image=nginx:1.14 --port=80 --dry-run=client -o yaml

실제 Pod를 실행하지 않고 실행 여부를 확인하고 pod API를 yaml 파일 포맷으로 출력한 결과를 yaml 파일에 저장
# kubectl run webserver --image=nginx:1.14 --port=80 --dry-run=client -o yaml > pod-nginx.yaml

# cat pod-nginx.yaml
  apiVersion: v1
  kind: Pod
  metadata:
   creationTimestamp: null
   labels:
     run: webserver
    name: webserver
   spec:
     containers: 
     - image: nginx:1.14
       name: webserver
       ports: 
       - containerPort: 80
       resources: {}
      dnsPolicy: ClusterFirst
      restartPolicy: Always
     status: {}

 

#Pod 관리 Commands

yaml 파일을 통해 Pod 실행하기
# kubectl apply -f pod-nginx.yaml 

동작중인 파드 정보 보기
# kubectl get pods
# kubectl describe pod webserver
# kubectl get pods -o wide

동작중인 파드 수정
# kubectl edit pod webserver 

동작중인 파드 삭제
# kubectl delete pod webserver 

파드내 컨테이너 로그보기
# kubectl logs webserver 

동작중인 파드로 연결
# kubectl exec -it webserver -- /bin/bash

 

Pod Expose

#Deployment로 여러 개의 웹서버 실행. 동일한 애플리케이션을 여러 개 실행가능

동일한 애플리케이션을 여러 개 실행가능
# kubectl create deployment webserver --image=nginx:1.14 --replicas=2 --port=80

동작중인 Pod 확인
# kubectl get deployments.apps
# kubectl get pods

Pod의 IP 확인
# kubectl get pods -o wide

 

# 단일 진입점 만들기 : expos

# kubectl expose deployment webserver --port=80
# kubectl get service

 

# multiple-container Pod 하나의 Pod에는 여러 개의 컨테이너가 포함될수 있다.

하나의 Pod에 여러 개의 컨테이너를 포함하는 경우 모든 컨테이너가 항상 단일 Node에서 실행된다.

보통 multiple-container Pod에 포함된 컨테이너들은 밀접하게 관련된 프로세스를 함께 실행하거나 동일한 IP 및 port를 사용한다.

#multiple-container Pod 템플릿을 확인

# cat pod-multiple-container.yaml

apiVersion: v1
kind: Pod
metadata:
 name: multiple-pod
spec:
 containers: 
 - name: nginx-container
   image: nginx:1.14
   ports: 
   - containerPort: 80
 - name: centos-container
   image: centos:7
   command:
   - sleep
   - "10000"
multiple-pod 컨테이너를 동작
# kubectl apply -f pod-multiple-container.yaml
# kubectl get pods

pod의 세부정보를 확인
# kubectl get pods

 

 

#Label 

  • Node를포함하여 pod, deployment 등 모든 리소스에 할당
  • 리소스의 특성을 분류하고, Selector를 이용해서 선택
  • Key-value 한쌍으로 적용
  • 오브젝트의 특성을 식별하는데 사용되어 사용자에게 중요하지만, 코어 시스템에 직접적인 의미는 없음.

 

MSA 구조에서는 pod의 수는 빠르게 증가하고 이로 인해 시스템에 수백 개의 포드가 생길 수 있다.

이것들을 조직하는 메커니즘이 없다면 복잡한 구조가 될 것이다.

특정 기준에 따라 작은 그룹으로 구성할 필요가 있는데, 쿠버네티스는 label을 이용해 그룹을 설정한다.

#Label 보기
kubectl get pods --show-labels
kubectl get pods -L <label_name>

#Label 관리 : kubectl label --help

#Label 생성 및 변경
kubectl label pod <name> key=value
kubectl label pod <name> key=value --overwrite

#Label 확인
kubectl label pod <name> --show-labels

#Label 제거
kubectl label pod <name> key-

 

'INFRA > DevOps' 카테고리의 다른 글

ReplicaSet  (0) 2022.05.02
Kubectl 명령어 실습  (0) 2022.05.02
k8s 보안  (0) 2022.04.29
CI/CD 파이프라인 개념과 구축 방법  (0) 2022.04.29
kubectl 명령어 구조  (0) 2022.04.27

댓글