220801

HyeonKi Jo·2022년 8월 1일
0
post-thumbnail

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 컴퓨팅 리소스

마스터 (최소사양)

  • CPU: 2c
  • RAM: 4Gb

Worker(최소사양)

  • CPU: 1c
  • RAM: 1Gb

모든 노드

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과 서비스 생성

  • mkdir ingress && cd $_

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

  • 3개의 pod가 잘 실행된다.

vi ingress-config.yaml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-nginx
  annotations:	# 주석=설명(예, 저자: ~~~, 연락처: ~~~~)
    nginx.ingress.kubernetes.io/rewrite-target: / # =http://abc.com/foods, /sales, / (home)
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		# 현재 pod과 service들이 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
    • worker1 노드를 taint한다.
  • 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
    • worker2도 taint를 걸어준다.
  • kubectl describe nodes worker2
    • 잘 taint되어있다.
  • kubectl apply -f pod-taint.yaml
    • 똑같이 1에 배분되어ㅣㅆ다.

클러스터 업그레이드

  • 현재 매우 구 버전을 사용하고 있어서, 1단계씩 버전을 업그레이드 한다.
  • 현재 1.19.16 버전을 사용하고있다.
  • 1.19.16 -> 1.20.15 -> 1.21.14 -> 1.23.9

master 노드

  • yum list --showduplicates kubeadm --disableexcludes=kubernetes
    • kubernets 버전 리스트 출력
  • 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
    • worker2에도 작업을 뺀다.

다시 worker

  • yum install -y kubelet-1.20.15-0 kubectl-1.20.15-0 --disableexcludes=kubernetes
    • kubelet을 업그레이드 한다.
  • systemctl daemon-reload
  • systemctl restart kubelet
    • kubelet 재시작

master

  • kubectl uncordon worker1
    • worker1의 drain을 해제한다.
  • kubectl uncordon worker2
    • worker2의 drain도 해제
  • 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
profile
Talking Potato

0개의 댓글