20220516 필기노트

강재민·2022년 5월 16일
0

필기노트

목록 보기
8/23

수업내용 요약


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 requirments.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. 변수 설정

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

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

필기노트 시작


k8s 아키텍처

https://kubernetes.io/docs/concepts/overview/components/

docker host를 묶는 이유는 더 많은 컨테이너를 실행 시키기 위해서 이다. 그러기 위해서는 node 들을 여러 개 묶어야한다. 그러기 위해서는 cluster 기능을 사용해야한다.

kubectl get nodes -i wide		#버전 확인
kubectl get nodes				#버전 확인
kubectl version					#버전 확인

adm으로 k8s치 이후..

이제 controller를 하나 더 설치하려면
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

kubeadm token list하면 볼 수 없다 왜냐하면 24시간이 지나면 소멸하기 때문
그래서
kubeadm token create로 만들 수 있다
다시 kubeadm token list하면 볼 수 있음


쿠버네티스는 인증서 기간이 1년이기 때문에 쿠버네티스가 업데이트를 안했을 경우 죽어버릴 수 있다.

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
   openssl dgst -sha256 -hex | sed 's/^.* //'

Worker Node 추가

  1. Vagrantfile VM 추가
    (cpu:2 memory:2G)
  2. Docker 설치
  3. kubeadm, kubectl, kubelet 설치 <= 1.228버전으로
  4. kubeadm join ,,,(명령어를 worker에서 실행)
  5. kubeadm get nodes (master 에서 실행)
sudo kubeadm join 192.168.100.100:6443 --token akwpoh.ajb1qjv3087yypcv --discovery-token-ca-cert-hash sha256:4fd3dee82c03d1c1591b33b9469f04fff605b89b68669061212ab0ca794f8b07

### docker에서..
kubectl get nodes
kubectl get pods -A
### worker에서..
systemctl status kubelet

노드 제거하는 법


고가용성을 위한 토폴로지 구성

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/

규모가 커지면

이렇게 vm을 따로 추가해서 etcd를 구성한다.

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/

쿠버네티스 업데이트
https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/

버전의 차이 정책
https://kubernetes.io/releases/version-skew-policy/

컨테이너의 버전을 업그레이드 한다는 거는 이미지를 교체한다는 뜻임

그러다보면 다운타임이 발생하게된다.

물론 planned downtime으로 할 수 있지만 우리는 무중단 시스템을 만들어보려고한다.

지원되는 버전 차이란 어느 버전까지는 호환이 되느냐이다.

우리 1.22버전의 입장에서 보면
https://v1-22.docs.kubernetes.io/ko/releases/version-skew-policy/


kubeapi 먼저 업데이트 해야한다는 의미

kubectl은 +-1이다

kubectl명령어를 통해 다른걸 먼저 업데이트 시키기 위함임

그래서 업그레이드 순서는
1. kube-apiserver
2. kube-controller-manager, kube-cloude-controller, kube-scheduler
위에 애들은 control plane에만 있고 아래애들은 모든 노드에 있음
3.kubelet(Contorl plane -> worker node)
4.kube-proxy(Contorl plane -> worker node)


순서가 섞이면 클러스터가 망가져버림

어렵다..


control plane에서..

sudo apt-mark unhold kubeadm
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
kubectl get nodes
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
kubectl version
kubelet --version

원래는 드레인을 해야하는데 지금은 따로 pod가 없으므로 바로 재시작을 해주자 원래는 또한 uncode작업도 해주어야한다.

sudo systemctl daemon-reload
systemctl status kubelet
kubectl get nodes

worker nod

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 kubelet=1.22.9-00 kubectl=1.22.9-00 -y
sudo apt-mark hold kubelet kubectl
kubelet --version
kubectl version
sudo systemctl daemon-reload
sudo systemctl restart kubelet

uncordon 작업

### 마스터 노드에서 확인
kubectl get nodes


소스 주소 바꾸기

sudo sed -i 's/archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list

1.22에서 1.23업그레이드는 숙제

앤서블도 숙제


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 (1Control Plan + 2 Work Node)

CPU: 2, Memory 3GB
vagrant/k8s
cp ../vagrantfile .
수정

vscode에서..
ctrl+d 하면 같이 수정가능

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
vagrant up

쿠베스프레이와 다른것들의 차이점
https://github.com/kubernetes-sigs/kubespray/blob/master/docs/comparisons.md

https://kubespray.io/#/docs/vars


1. SSH 키 생성 및 복사

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

### password는 기본적으로 "vagrant"임
ssh 192.168.100.100
ssh 192.168.100.101
ssh 192.168.100.102

2. kubespray 소스 다운로드

cd ~
git clone -b v2.18.1 https://github.com/kubernetes-sigs/kubespray.git
cd kubespray
ls
cat requirements.txt					#이걸 쓰면 됨

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

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

4. 인벤토리 구성

cd inventory/
ls
ls -l
cp -rpf sample/ mycluster
vi ~/kubespray/inventory/mycluster/inventory.ini
[all]
knode1 ansible_host=192.168.100.100 ip=192.168.100.100
knode2 ansible_host=192.168.100.101 ip=192.168.100.101
knode3 ansible_host=192.168.100.102 ip=192.168.100.102

### ip는 ectd가 접속하는  환경변수임

[kube_contorl_plane]
node1

[etcd]
node1

[kube_node]
node1
node2
node3

[calico_rr]

[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr

5. 변수 설정

cd ~/kubespray/inventory/mycluster/group_vars

6. 플레이북 실행

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

7. 검증

sudo kubectl get nodes
kubectl get pods -A
kubectl get pods -A -o wide			#상세보기


인증정보가 없어서 api와 통신이 안됨

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

결과창


https://kubespray.io/#/docs/getting-started

만약에 node를 추가한다고 하면
scale.yml을 사용한다
물론 사전에 inventory파일을 수정해주어야한다.

만약 제어해야한다면..

업그레이드를 한다면..

순차적으로 업그레이드 한다면..


Kubernetes Objects

kubectl api-resources		#쿠버네티스에서 생성할 수 있는 리서스들을 볼 수 있다.
  • Label/LabelSelector #쿠버네티스에서 특정 객체와 객체가 연결이 되게 되는데 그 때 사용하는 개념이다. AWS에서 tag라는 개념이 있는데 이것도 결국은 이런 개념임

  • Workload
    - Pod #가장 핵심임. pod는 container가 담기기 때문
    - Controller #제어기, pod를 제어하는 녀석
    - ReplicationController #복제하는 녀석 하지만 더이상 안씀
    - ReplicaSets #이친구도 복제하는 녀석
    - DaemonSets #계속적으로 실행하는 작업
    - Jobs #배치작업 시작과 끝이 있는 작업
    - CronJobs #배치작업 시작과 끝이 있는 작업
    - Deployments #배포, 이친구가 replicaset을 관리하고 replicaset이 pod를 관리함
    - StatefulSets #상태가 있는것에 대표적인것임 Deployment와 반대
    - HorizontalPodAutoscaler #HPA, 이친구도 pod를 관리함

  • Network
    - Service #kubectl expose에서 사용했던것이고 L4 LB
    - Endpoints #Backend를 정의하고 관리함
    - Ingress #add온 으로 추가 해주어야함 ,L7 LB

  • Storage
    - PersistentVolume #볼륨
    - PersistentVolumeClaim #요청임
    - ConfigMap
    - Secret

  • Authentication #인증에 관한 이야기
    - ServiceAccount
    - RBAC
    - Role #역할
    - ClusterRole #역할
    - RoleBinding #계정과 역할을 연결
    - ClusterRoleBinding #계정과 역할을 연결

  • Resource Isolation
    - Namespaces #리소스를 분류할 때 사용함

  • Resource Limits
    - Limits #pod를 제한
    - Requests #pod를 제한
    - ResourceQuota #pod를 제한
    - LimitRange #pod를 제한

  • Scheduling
    - NodeName #pod를 어디떤 노드에 배치할지 결정
    - NodeSelector
    - Affinity #선호도
    - Node Affinity
    - Pod Affinity
    - Pod Anti Affinity
    - Taints/Tolerations
    - Drain/Cordon #Drain은 배출시키는거고 Corden은 스케쥴링을 못하게 막는것임 Drain을 하면 Cordon이 자동으로 걸리므로 Cordon을 해제시키기도 함

여기까지 배워야 쿠버네티스를 배웠다고 할 수 있다고한다.


내일은 오브젝트부터 해서 pod
그리고 다 만든 걸로 간단한 예제실행해볼 수 있음


숙제는 아니고 해볼만한 내용
kubernetes 한번 더 버전업데이트 실습해보고 문서정리,앤서블정리
kubespray로 kuvernetes설치하는거 문서정리

0개의 댓글