안녕하세요!! 파바샐도팀의 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 |
댓글