# 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 |