SAA 준비
- Udemy 개념파악.
- 보통 비슷한지문 두개가 나오면 그중 하나가 정답
- 또 모르는 기술들이 나온다. -> AWS 신기술이 정답이다?
- 유데미 문제 돌려봄, 모르는 문제는 검색해서 블로그
kubernetes
kubernetes 설치
모든 노드
hostnamectl set-hostname master
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/docker-ce.repo
yum --enablerepo=docker-ce-stable -y install docker-ce-19.03.15-3.el7
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
systemctl daemon-reload
systemctl restart docker
systemctl disable --now firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
swapoff -a
sed -i '/ swap / s/^/#/' /etc/fstab
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
reboot
cat <<'EOF' > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-$basearch
enabled=1
gpgcheck=0
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
EOF
yum -y install kubeadm-1.19.16-0 kubelet-1.19.16-0 kubectl-1.19.16-0 --disableexcludes=kubernetes
systemctl enable kubelet
VM 세팅
- 저번에 만들었던 Master1의 VM을 Linked Clone 해서 Worker1, 2를 만들어준다.
- Linked Clone : 연결된 복제, Master의 데이터를 연결해서 사용해서 복제를 한다. OS 전부를 복사하는것이 아니라 용량을 매우 절약할 수 있다. 그러나 Master가 사라지면 Linked Clone VM들을 사용할 수 없게 된다.
VM 컴퓨팅 리소스
마스터 (최소사양)
Worker(최소사양)
모든 노드
cat <<EOF >> /etc/hosts
192.168.56.106 master1
192.168.56.107 worker1
192.168.56.108 worker2
EOF
hostnamectl set-hostname [master1, worker1, worker2]
kubectl get pods --all-namespaces
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
마스터
kubeadm init --apiserver-advertise-address=192.168.56.106 --pod-network-cidr=10.244.0.0/16
- 이런 에러가나면, swapoff를 안해준것이다.
swapoff -a
: Swap을 꺼준다.
- 성공적으로 설정되었다.
- 이제 이 3가지 명령어를 순차적으로 입력해줘야한다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
- flannel이라는 컨테이너 네트워크 인터페이스 (CNI)를 사용한다.
- 이 곳의 명령어로 각 Worker노드와 master노드를 연결해준다.
- 다만 복사 붙혀넣기 할 때에, 개행문자가 중간에 끼어버리는 문제가 있다.
- 그래서 메모장에 복사 붙혀넣기 해주고, 개행문자를 지워주고 다시 옮겨줘야한다.
- 각 노드에서 성공적으로 Join되었다.
- 마스터, worker1, worker2 둘다 잘 나온다.
스냅샷 찍기
- kubernetes 1.19버전을 설치했으니 1.19로 찍어놓는다.
- Master, Worker1, 2 다 찍어준다.
Ingress
다운로드 및 설정
git clone https://github.com/hali-linux/_Book_k8sInfra.git
- git으로 ingress-nginx 시작 파일을 다운로드 받는다.
kubectl apply -f /root/_Book_k8sInfra/ch3/3.3.2/ingress-nginx.yaml
- git으로 받은 파일중에, ch3/3.3.2/ingress-nginx.yaml파일로 pod를 만든다.
- ingress-nginx 네임스페이스를 만들어주는 내용이 있다.
kubectl get pods -n ingress-nginx
- 잘 Running 중이다.
pot과 서비스 생성
vi ingress-deploy.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: foods-deploy
spec:
replicas: 1
selector:
matchLabels:
app: foods-deploy
template:
metadata:
labels:
app: foods-deploy
spec:
containers:
- name: foods-deploy
image: 192.168.1.189:5000/test_home:v1.0
---
apiVersion: v1
kind: Service
metadata:
name: foods-svc
spec:
type: ClusterIP
selector:
app: foods-deploy
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sales-deploy
spec:
replicas: 1
selector:
matchLabels:
app: sales-deploy
template:
metadata:
labels:
app: sales-deploy
spec:
containers:
- name: sales-deploy
image: 192.168.1.189:5000/test-home:v2.0
---
apiVersion: v1
kind: Service
metadata:
name: sales-svc
spec:
type: ClusterIP
selector:
app: sales-deploy
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: home-deploy
spec:
replicas: 1
selector:
matchLabels:
app: home-deploy
template:
metadata:
labels:
app: home-deploy
spec:
containers:
- name: home-deploy
image: 192.168.1.189:5000/test-home:v0.0
---
apiVersion: v1
kind: Service
metadata:
name: home-svc
spec:
type: ClusterIP
selector:
app: home-deploy
ports:
- protocol: TCP
port: 80
targetPort: 80
vi ingress-config.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /foods
backend:
serviceName: foods-svc
servicePort: 80
- path: /sales
backend:
serviceName: sales-svc
servicePort: 80
- path:
backend:
serviceName: home-svc
servicePort: 80
- ingress가 잘 출력된다.
- 경고로 ingress는 1.22이상 버전에서는 사용 불가능하다고 안내해주고 있다.
kubectl describe ingress ingress-nginx
로 자세한 설명을 본다.
loadbalancer
- 위에서 생선한 pod과 ingress를 외부에 서비스하려면, 외부와 통신할 수 있는 svc를 생성해야한다.
-> loadbalancer
vi ingress-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-ingress-controller
namespace: ingress-nginx
spec:
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
- name: https
protocol: TCP
port: 443
targetPort: 443
selector:
app.kubernetes.io/name: ingress-nginx
type: LoadBalancer
externalIPs:
- 192.168.56.106
이미지 깨짐
- 경로기반 라우팅에서 홈페이지를 띄울 때, 이미지가 깨지게된다.
- 라우팅이
/food
, 이미지가 def.jpg
라면, 이미지의 경로는 /food/def.jpg
로 들어가야하기 때문이다.
- 그래서 이미지를 처음부터 /food디렉토리에 넣어줘야한다.
Taint와 toleration
- 특별한 노드에 특수한 작업을 하기위해 세팅할 수 있다. (예: GPU가 있는 노드만 사용)
- 특별한 목적으로 사용하기 위해 taint와 toleration을 사용할 수 있다.
taint
kubectl taint node worker1 tier=goat:NoSchedule
kubectl describe nodes worker1
- 모든 pod과 서비스를 지워본다.
- 다시 방금전에 생성했던 ingress pod과 svc를 모두 실행해본다.
kubectl get pod -o wide
명령어를 입력해보면 worker2에만 몰려있는 것을 확인할 수 있다.
toleration
vi pod-taint.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-taint-metadata
labels:
app: pod-taint-labels
spec:
containers:
- name: pod-taint-containers
image: nginx
ports:
- containerPort: 80
tolerations:
- key: “tier”
operator: “Equal”
value: “dev”
effect: “NoSchedule”
---
apiVersion: v1
kind: Service
metadata:
name: pod-taint-service
spec:
type: NodePort
selector:
app: pod-taint-labels
ports:
- protocol: TCP
port: 80
targetPort: 80
- worker1에 배정되어 pod가 Running 상태에 있다.
만약 똑같은 조건을 worker2에도 준다면?
kubectl delete -f pod-taint.yaml
- 먼저 worker1의 작업을 해제해준다.
kubectl taint node worker2 tier=goat:NoSchedule
kubectl describe nodes worker2
- 잘 taint되어있다.
kubectl apply -f pod-taint.yaml
클러스터 업그레이드
- 현재 매우 구 버전을 사용하고 있어서, 1단계씩 버전을 업그레이드 한다.
- 현재 1.19.16 버전을 사용하고있다.
- 1.19.16 -> 1.20.15 -> 1.21.14 -> 1.23.9
master 노드
yum list --showduplicates kubeadm --disableexcludes=kubernetes
yum install -y kubeadm-1.20.15-0 --disableexcludes=kubernetes
- kubeadm 1.20.15 버전 설치
kubeadm version
kubeadm upgrade plan
- 테라폼에서 있엇던 plan의 개념
- 다른 점을 찾고, 다른점만 업그레이드한다
kubeadm upgrade apply v1.20.15 -y
yum install -y kubelet-1.20.15-0 kubectl-1.20.15-0 --disableexcludes=kubernetes
systemctl daemon-reload
systemctl restart kubelet
worker 노드
yum install -y kubeadm-1.20.15-0 --disableexcludes=kubernetes
kubeadm upgrade node
master노드로 잠시 이동
- kubectl로 노드를 drain해줄 권한은 master에 있다.
- 노드를 잠시 정지시키는 것이기 때문에 실무에서는 미리 공지가 필요하다.
kubectl drain worker1 --ignore-daemonsets --force
- drain: 배수, 워커노드에 물을 빼는 것처럼 작업(pod)을 빼는 것이다.
kubectl drain worker2 --ignore-daemonsets --force
다시 worker
yum install -y kubelet-1.20.15-0 kubectl-1.20.15-0 --disableexcludes=kubernetes
systemctl daemon-reload
systemctl restart kubelet
master
kubectl uncordon worker1
kubectl uncordon worker2
kubectl get node
- 노드가 잘 나오는지 확인
- 3개의 노드가 잘 출력되고 있다.
1.21.14로 업그레이드
yum list --showduplicates kubeadm --disableexcludes=kubernetes
yum install -y kubeadm-1.21.14-0 --disableexcludes=kubernetes
kubeadm version
kubeadm upgrade plan
- 테라폼에서 있엇던 plan의 개념
- 다른 점을 찾고, 다른점만 업그레이드한다
kubeadm upgrade apply v1.21.14 -y
yum install -y kubelet-1.21.14-0 kubectl-1.21.14-0 --disableexcludes=kubernetes
systemctl daemon-reload
systemctl restart kubelet
worker 노드
yum install -y kubeadm-1.21.14-0 --disableexcludes=kubernetes
kubeadm upgrade node
master노드로 잠시 이동
- kubectl로 노드를 drain해줄 권한은 master에 있다.
- 노드를 잠시 정지시키는 것이기 때문에 실무에서는 미리 공지가 필요하다.
kubectl drain worker1 --ignore-daemonsets --force
kubectl drain worker2 --ignore-daemonsets --force
다시 worker
yum install -y kubelet-1.21.14-0 kubectl-1.21.14-0 --disableexcludes=kubernetes
systemctl daemon-reload
systemctl restart kubelet
master
kubectl uncordon worker1
kubectl uncordon worker2
kubectl get node