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
Control Plane(api -> cm, ccm, sched -> let,proxy) --> Work Node(let, proxy)
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 작업
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
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
cd ~
git clone -b v2.18.1 https://github.com/kubernetes-sigs/kubespray.git
cd kubespray
sudo apt update
sudo apt install python3-pip -y
sudo pip3 install -r requirments.txt
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
inventory/mycluster/group_vars
ansible all -m ping -i inventory/mycluster/inventory.ini
ansible-playbook -i inventory/mycluster/inventory.ini cluster.yml -b
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
https://kubernetes.io/docs/concepts/overview/components/
docker host를 묶는 이유는 더 많은 컨테이너를 실행 시키기 위해서 이다. 그러기 위해서는 node 들을 여러 개 묶어야한다. 그러기 위해서는 cluster 기능을 사용해야한다.
kubectl get nodes -i wide #버전 확인
kubectl get nodes #버전 확인
kubectl version #버전 확인
이제 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/^.* //'
kubeadm join ,,,
(명령어를 worker에서 실행)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
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업그레이드는 숙제
앤서블도 숙제
https://kubernetes.io/ko/docs/setup/production-environment/tools/kubespray/
또는
소스코드 페이지
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
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
cd ~
git clone -b v2.18.1 https://github.com/kubernetes-sigs/kubespray.git
cd kubespray
ls
cat requirements.txt #이걸 쓰면 됨
sudo apt update
sudo apt install -y python3-pip
sudo pip3 install -r requirements.txt
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
cd ~/kubespray/inventory/mycluster/group_vars
ansible all -m ping -i ~/kubespray/inventory/mycluster/inventory.ini
ansible-playbook -i ~/kubespray/inventory/mycluster/inventory.ini cluster.yml -b
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파일을 수정해주어야한다.
만약 제어해야한다면..
업그레이드를 한다면..
순차적으로 업그레이드 한다면..
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설치하는거 문서정리