컨테이너 오케스트레이션을 위한 Kubernetes (22.05.16)

박민선·2022년 5월 16일
0

k8s 클러스터 업그레이드

Ubuntu 패키지 저장소 변경
sed -i 's/security.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list
sed -i 's/archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list
sudo apt update

https://kubernetes.io/ko/releases/version-skew-policy/

  1. kube-apiserver
  2. kube-controller-manager, kube-cloud-controller-manage, kube-scheduler
  3. kubelet(Control Plane -> Worker Node)
  4. kube-proxy(Control Plane -> Worker Node)

Control Plane(api -> cm, ccm, sched -> let,proxy) --> Work Node(let, proxy)

kubeadm 업그레이드

  1. Control Plane의 kubeadm 업그레이드
  2. Control Plane의 kubeadm으로 api, cm, sched 업그레이드
  3. Control Plane의 kubelet, kubectl 업그레이드
  4. Work Node의 kubeadm 업그레이드
  5. Work Node의 kubeadm으로 업그레이드
  6. Work Node의 kubelet, kubectl 업그레이드

Control Plane

sudo apt-mark unhold kubeadm
sudo apt update
sudo apt upgrade kubeadm=1.22.9-00 -y
kubeadm version
sudo apt-mark hold kubeadm
sudo kubeadm upgrade plan
sudo kubeadm upgrade apply v1.22.9
sudo apt-mark unhold kubelet kubectl
sudo apt upgrade kubectl=1.22.9-00 kubelet=1.22.9-00 -y
sudo apt-mark hold kubelet kubectl
kubelet --version
kubectl version

drain 작업

sudo systemctl daemon-reload
sudo systemctl restart kubelet

uncordon 작업

systemctl status kubelet

Work Node

sudo apt-mark unhold kubeadm
sudo apt update
sudo apt upgrade kubeadm=1.22.9-00 -y
kubeadm version
sudo apt-mark hold kubeadm

`

sudo kubeadm upgrade node

drain 작업

sudo apt-mark unhold kubelet kubectl
sudo apt upgrade kubectl=1.22.9-00 kubelet=1.22.9-00 -y
sudo apt-mark hold kubelet kubectl
kubelet --version
kubectl version
sudo systemctl daemon-reload
sudo systemctl restart kubelet

uncordon 작업


Kubespray

https://kubernetes.io/ko/docs/setup/production-environment/tools/kubespray/
https://kubespray.io/#/
https://github.com/kubernetes-sigs/kubespray

Control Plane 1
Work Node 3(1 Control Plan + 2 Woker Node)

CPU: 2, Memory 3GB

~/vagrant/k8s

Vagrant.configure("2") do |config|
	# Define VM
	config.vm.define "k8s-node1" do |ubuntu|
		ubuntu.vm.box = "ubuntu/focal64"
		ubuntu.vm.hostname = "k8s-node1"
		ubuntu.vm.network "private_network", ip: "192.168.100.100"
		ubuntu.vm.provider "virtualbox" do |vb|
			vb.name = "k8s-node1"
			vb.cpus = 2
			vb.memory = 3000
		end
	end
	config.vm.define "k8s-node2" do |ubuntu|
		ubuntu.vm.box = "ubuntu/focal64"
		ubuntu.vm.hostname = "k8s-node2"
		ubuntu.vm.network "private_network", ip: "192.168.100.101"
		ubuntu.vm.provider "virtualbox" do |vb|
			vb.name = "k8s-node2"
			vb.cpus = 2
			vb.memory = 3000
		end
	end
	config.vm.define "k8s-node3" do |ubuntu|
		ubuntu.vm.box = "ubuntu/focal64"
		ubuntu.vm.hostname = "k8s-node3"
		ubuntu.vm.network "private_network", ip: "192.168.100.102"
		ubuntu.vm.provider "virtualbox" do |vb|
			vb.name = "k8s-node3"
			vb.cpus = 2
			vb.memory = 3000
		end
	end

	config.vm.provision "shell", inline: <<-SHELL
	  sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
	  sed -i 's/archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list
	  sed -i 's/security.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list
	  systemctl restart ssh
	SHELL
end

1. SSH 키 생성 및 복사

ssh-keygen
ssh-copy-id vagrant@192.168.100.100
ssh-copy-id vagrant@192.168.100.101
ssh-copy-id vagrant@192.168.100.102

2. kubespray 소스 다운로드

cd ~
git clone -b v2.18.1 https://github.com/kubernetes-sigs/kubespray.git
cd kubespray

3. ansible, netaddr, jinja 등 패키지 설치

sudo apt update
sudo apt install python3-pip -y
sudo pip3 install -r requirements.txt

4. 인벤토리 구성

cp -rpf inventory/sample/ inventory/mycluster

inventory/mycluster/inventory.ini

[all]
node1 ansible_host=192.168.100.100 ip=192.168.100.100
node2 ansible_host=192.168.100.101 ip=192.168.100.101
node3 ansible_host=192.168.100.102 ip=192.168.100.102

[kube_control_plane]
node1

[etcd]
node1

[kube_node]
node1
node2
node3

[calico_rr]

[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr

5. 변수 설정

(kubespray 변수 정의 및 정리 - https://kubespray.io/#/docs/vars)

inventory/mycluster/group_vars

6. 플레이북 실행

ansible all -m ping -i inventory/mycluster/inventory.ini
ansible-playbook -i inventory/mycluster/inventory.ini cluster.yml -b 

7. 검증

mkdir ~/.kube
sudo cp /etc/kubernetes/admin.conf ~/.kube/config
sudo chown vagrant:vagrant ~/.kube/config
kubectl get nodes
kubectl get pods -A

Kubernetes Objects

https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/kubernetes-objects/

오브젝트 종류

kubectl api-resouces
  • Label/LabelSelector

  • Workload
    - Pod
    - Controller
    - ReplicationController
    - ReplicaSets
    - DaemonSets
    - Jobs
    - CronJobs
    - Deployments
    - StatefulSets
    - HorizontalPodAutoscaler

  • Network
    - Service
    - Endpoints
    - Ingress

  • Storage
    - PersistentVolume
    - PersistentVolumeClaim
    - ConfigMap
    - Secret

  • Authentication
    - ServiceAccount
    - RBAC
    - Role
    - ClusterRole
    - RoleBinding
    - ClusterRoleBinding

  • Resource Isolation
    - Namespaces

  • Resource Limits
    - Limits
    - Requests
    - ResourceQuota
    - LimitRange

  • Scheduling
    - NodeName
    - NodeSelector
    - Affinity
    - Node Affinity
    - Pod Affinity
    - Pod Anti Affinity
    - Taints/Tolerations
    - Drain/Cordon

오브젝트의 버전

https://kubernetes.io/ko/docs/reference/using-api/#api-%EA%B7%B8%EB%A3%B9

kubectl api-versions

apps/v1

  • apps: 그룹
  • v1: 버전

그룹이 없는 api는 core 그룹

  • Stable
    - vX
    - v1, v2
    - 안정화된 버전
  • Beta
    - v1betaX, v2betaX
    - 충분히 검증 오류 X
    - 버전이 올라가되면 기능 변경이 있을 수 있음
    - downtime 발생할 수도 있음: 특정 기능을 사용하기 위해 재시작
    - Mission Critical
  • Alpha
    - v1alphaX, v2alphaX
    - 기본 비활성화
    - 개발 중인 API

Alpha -> Beta -> Stable

  • v1alpha1 -> v1alpha2 -> v1alpha3 -> v1beta1 -> v1beta2 -> v1

오브젝트 정의

apiVersion:
kind:
metdata:
spec:
  • kind: 오브젝트의 종류
  • apiVersion: 지원하는 오브젝트의 버전
  • metadata: 오브젝트의 메타데이터
    - 이름, 네임스페이스, 레이블, 어노테이션
  • spec: 오브젝트에 대한 선언
kubectl explain pods
kubectl explain pods.metadata
kubectl explain pods.spec
kubectl explain pods.spec.containers
kubectl explain pods.spec.containers.images
kubectl explain pods.spec --recursive

오브젝트 관리

https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/object-management/

  • 명령형 커멘드: kubectl 명령으로만 구성
    - kubectl create
    - kubectl run
    - kubectl expose
  • 명령형 오브젝트 구성: YAML 파일을 순서대로 하나씩 실행
    - kubectl create -f a.yaml
    - kubectl replace -f a.yaml
    - kubectl patch -f a.yaml
    - kubectl delete -f a.yaml
  • 선언형 오브젝트 구성: YAML 파일의 모음을 한번에 실행
    - kubectl apply -f resources/
profile
클라우드신생아

0개의 댓글