Cloud Solution Architect/쿠버네티스

Kubernetes2

YunHyeong 2023. 5. 31. 17:39

# replicaset 이미지 업데이트 시도

- kubectl edit replicasets.apps nginx-replicaset

- replicasets의 이미지 변경

 

 

- 하지만 업데이트가 되지 않는다.

 

- 이미지는 변경되어 있음

# deployment

Docker 명령어 run과 같은 기능

# vi deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-deployment

  template:
    metadata:
      name: nginx-deployment
      labels:
        app: nginx-deployment
    spec:
      containers:
      - name: nginx-deployment-container
        image: nginx
        ports:
        - containerPort: 80
# kubectl apply -f deployment.yaml
# kubectl get deployments.apps -o wide
# kubectl describe deployments.apps nginx-deployment
# kubectl edit deployments.apps nginx-deployment

- 롤링 업데이트 같은 기능

 

- 이미지를 변경이 가능하다

- 업데이트가 발생했기 때문에 25%씩을 지우고 만들고를 반복(롤링업데이트)

## clusterIP

# vi clusterip-deployment.yaml # 클러스터아이피 야믈
apiVersion: v1
kind: Service
metadata:
  name: clusterip-deployment
spec:
  type: ClusterIP
  selector:
    app: nginx-deployment
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

# kubectl apply -f clusterip-deployment.yaml
# kubectl get svc -o wide
# kubectl describe svc clusterip-deployment
# kubectl edit svc clusterip-deployment

## nodePort

# vi nodeport-deployment.yaml # 노드포트 야믈
apiVersion: v1
kind: Service
metadata:
  name: nodeport-deployment
spec:
  type: NodePort
  selector:
    app: nginx-deployment
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 80
    nodePort: 32080

- 외부에서 포트로 접근 가능

## Loadbalancer

# vi loadbalancer-deployment.yaml # 로드밸런서 야믈
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-deployment
spec:
  type: LoadBalancer
  externalIPs:
  - 192.168.2.42
  selector:
    app: nginx-deployment
  ports:
  - protocol: TCP
    port: 8888
    targetPort: 80
    nodePort: 31808

- clusterIP와 nodePort를 지정

 

## 지우기

# kubectl get all
# kubectl delete pod,svc --all
# kubectl delete replicaset,svc --all
# kubectl delete deployment,svc --all
# kubectl delete all -all # 전체 지우기

 

# Deployment 롤링 업데이트 제어

## loadbalaner deployment 파일과 deployment 파일 통합

- dployement.yaml 파일 복사

- "---"으로 구분하고 아래에 loadbalancer 부분 집어 넣기

- kubectl apply -f deployment-service.yaml 

- 이미지 업데이트

- 버전이 형성된다

- 1: nginx

- 2: aws

- 3: food(현재 버전)

kubectl rollout undo deployment nginx-deployment

- 이전 버전으로 돌아가기

- 한번더 롤백을 시도하면 3버전으로 돌아간다(이전상태가 3버전이기 때문에)

- 롤백을 시도했기 때문에 버전으로 남아있다

- 1: nginx

- 4: aws

- 5: food

# kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=hyeongyun/web-site:aws
# kubectl get all
# kubectl rollout history deployment nginx-deployment
# kubectl rollout history deployment nginx-deployment --revision=2 # 리비전2 상세보기
# kubectl rollout undo deployment nginx-deployment # 롤백(전 단계로 복원)
# kubectl get all
# kubectl rollout history deployment nginx-deployment
# kubectl rollout history deployment nginx-deployment --revision=3 # 리비전3 상세보기
# kubectl rollout undo deployment nginx-deployment --to-revision=2 # 리비전2로 복원

- 전체 소스코드

 

# Multi-Node

- Kubernetes의 최소 사양은 cpu 2개 메모리 4GB이다.

 

- master1을 만든후 두개의 worker VM을 복제

- 연결된 복제 선택

- mobaxterm으로 master1, worker1, worker2 모두 접근

- multi exec 모드에서 yum update -y 진행

- 각각 hostname 설정

- ip 확인

 

- hosts파일을 수정한다

# cat <<EOF >> /etc/hosts
192.168.2.105 master1
192.168.2.96 worker1
192.168.2.97 worker2
EOF

## 모든 노드에 설치

# 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
# mkdir /etc/docker
# 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 # free -h에서 swap을 확인하고 swap 메모리를 죽여야 쿠버네티스가 설치된다.
# sed -i '/ swap / s/^/#/' /etc/fstab

# 쿠버네티스가 pod안쪽까지 통신할 수 있도록 iptabels 설정
# cat <<EOF > /etc/sysctl.d/k8s.conf # kubernetes
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

# sysctl --system # 설정한 파일 모두 적용
# reboot

--- Kubeadm 설치 (Multi Node: Master Node, Worker Node)
# 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

# kublet은 모든 노드에 다 있어야한다. kubernetes가 kubelet에 있는 이미지를 활용
# kubeadm은 kubemini 같은 어플리케이션

# yum -y install kubeadm-1.19.16-0 kubelet-1.19.16-0 kubectl-1.19.16-0 --disableexcludes=kubernetes
# systemctl enable kubelet # kubelet 데몬 실행이 안되기 때문에 enable을 한다.
# poweroff

 

## Master1 node

kubeadm init --apiserver-advertise-address=192.168.2.105 --pod-network-cidr=10.244.0.0/16

- kubeadm init

- 이전에 systemctl enable kubelet

- init이 완료되면 mkdir 부터 sudo chown까지 복사 붙여넣기 하기

- 발급되는 join키를 잘 보관한다

 

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

- apply 진행

 

- namespace에서 나와 있는 kubernets의 pod(flannel, etcd...)들을 볼 수 있다.

- 리소스를 논리적으로 나누기 위한 방법을 제공하는 것이라 할 수 있다.
- 가령 지금까지 살펴봤던 Pod, Deployment, Service와 같은 여러 오브젝트들을 하나의 Namespace로 그룹핑 해서 함께 관리할 수 있다. (논리적 그룹핑!)

# kubectl get pods --all-namespaces
# source <(kubectl completion bash) # 자동완성 기능 활성화
# yum install -y bash-completion
# echo "source <(kubectl completion bash)" >> ~/.bashrc
# exit

- 자동완성 기능까지 최종적으로 마치고 exit으로 나갔다가 들어온다.

 

# kubeadm join 192.168.2.105:6443 --token 0pn2n9.s5qt8b6w9ysoovx5 \
    --discovery-token-ca-cert-hash sha256:0316ed88b0fb8f63c465930b554d7532ef713df06470375e7ee17728b33a5a31

# kubectl get nodes

- 보관 중이던 키를 활용해서 worker1, workder2에 붙여넣고 node들이 연결된걸 확인한다.

 

- namespace를 만들고 namespace안에 pod 생성

 

- ClusterIP 서비스를 이용하여 pod를 만든다.

- ClusterIP는 외부노출이 안되기 때문에 주로 DB를 만들때 사용한다.

 

- nodeport 서비스로 pod 생성

- woker1에 있는 pod여도 포트만 같게하여 다른 노드의 주소로 접근이 가능하다

- Loadbalancer 서비스를 활용하여 pod 생성

 

## namespace를 default로 바꾸기

- 현재 default namespace를 사용중

 

- 기본 namespace를 이전에 생성한 hyengyun으로 변경

 

- namespace를 입력하지 않아도 default로 hyeongyun namespace 안에 있는 pod과 서비스들이 나타난다.

- index.html의 경로가 minikube와 다르기 때문에 경로를 변경해준다.

- kubectl describe pod nginx-pod2

- expose 커멘드 라인으로 만든 서비스는 자동으로 pod의 이름을 라벨로 갖게 된다.(kubectl expose pod nginx-pod --name clusterip --type=ClusterIP --port 80)

- yaml 파일로 만든 서비스는 메타데이터에 labels를 명시해주어야함

- "kubectl edit svc loadbalancer" 안에서 selector에 nginx-pod2로 변경하여 loadbalancer 서비스가 pod2의 labels를 가리키도록 만든다.

 

- nginx-pod2의 화면이 출력된다.

- expose로 서비스를 만들때 포트를 넣어주지 않으면 nginx-pod.yaml파일에 정의한 container의 포트를 따라간다.

- targetPort를 지정하지 않으면 port의 번호가 자동으로 targetPort에 할당된다.

 

- targetport는 반드시 컨테이너의 포트와 같게 설정해주어야한다.

- 우리 실습에서는 nginx의 포트가 80이기 때문에 targetPort를 반드시 80으로 설정

- 아니면 target포트를 주석처리하고 Port를 80으로 바꿔주어야한다.

'Cloud Solution Architect > 쿠버네티스' 카테고리의 다른 글

Kubernetes6  (0) 2023.06.09
Kubernetes5  (0) 2023.06.07
Kubernetest4  (0) 2023.06.05
Kubernetes3  (0) 2023.06.01
Kubernetes1  (0) 2023.05.30