<1> 배포 웹서버를 6 pod로 확장하기 kubectl scale deploy webserver --replicas=6 # 디플로이 다음 디플로이먼트 이름이 나와야 한다. 실습 1 터미널1 k ns default watch -d kubectl get deploy,rs,po 터미널2 디플로이먼트 만들자. cat < eks-sample-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: eks-sample-linux-deployment namespace: eks-sample-app labels: app: eks-sample-linux-app spec: replicas: 3 selector: matchLabels: app: eks-sample-linux-app template: metadata: labels: app: eks-sample-linux-app spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/arch operator: In values: - amd64 - arm64 containers: - name: nginx image: public.ecr.aws/nginx/nginx:1.23 ports: - name: http containerPort: 80 imagePullPolicy: IfNotPresent nodeSelector: kubernetes.io/os: linux EOT kubectl apply -f eks-sample-deployment.yaml 2 k get deploy,po NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/eks-sample-linux-deployment 2/2 2 2 15m NAME READY STATUS RESTARTS AGE pod/eks-sample-linux-deployment-66cfbc47b7-4g9xw 1/1 Running 0 15m pod/eks-sample-linux-deployment-66cfbc47b7-rp7cg 1/1 Running 0 15m kubectl scale deploy eks-sample-linux-deployment --replicas=6 # 디플로이 다음 디플로이먼트 이름이 나와야 한다. k get deploy,po NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/eks-sample-linux-deployment 6/6 6 6 15m NAME READY STATUS RESTARTS AGE pod/eks-sample-linux-deployment-66cfbc47b7-4g9xw 1/1 Running 0 15m pod/eks-sample-linux-deployment-66cfbc47b7-5fqqv 1/1 Running 0 5s pod/eks-sample-linux-deployment-66cfbc47b7-9stlj 1/1 Running 0 5s pod/eks-sample-linux-deployment-66cfbc47b7-fzw4p 1/1 Running 0 5s pod/eks-sample-linux-deployment-66cfbc47b7-rp7cg 1/1 Running 0 15m pod/eks-sample-linux-deployment-66cfbc47b7-x7phw 1/1 Running 0 5s 또는 kubectl scale deployment.apps/eks-sample-linux-deployment --replicas=6 3 k ns default eks-sample-app kube-node-lease kube-public kube-system k ns eks-sample-app Context "12-24-user@myeks.ap-northeast-2.eksctl.io" modified. Active namespace is "eks-sample-app". 100 scale2.txt 참고 https://brunch.co.kr/@topasvga/1652 1탄-실습3.AWS-EKS 클러스터 만들기 실습 1탄 = 3/7 | <1> CLI로 EKS 클러스터 만들기 (선택) <2> Web Console로 EKS 클러스터 만들기 (선택) <3> 자원 삭제 = Autoscaling Group을 반드시 삭제 <4> AWS 배포법 <5> 다음 = 실습4. EKS, Container Insight <10 brunch.co.kr/@topasvga/1652 <2> 모든 네임스페이스에 있는 Pod를 pod-list.yaml 파일에 넣기 k get pods -A k get pods -A > pod-list.yaml more pod-list.yaml 또는 kubectl get pods --all-namespaces > pod-list.yaml <3> 특정 네임스페이스에 있는 pod이름만 보기 k get pods -n eks-sample-app -o custom-columns=":metadata.name" eks-sample-linux-deployment-66cfbc47b7-4g9xw eks-sample-linux-deployment-66cfbc47b7-5fqqv eks-sample-linux-deployment-66cfbc47b7-9stlj eks-sample-linux-deployment-66cfbc47b7-fzw4p eks-sample-linux-deployment-66cfbc47b7-rp7cg eks-sample-linux-deployment-66cfbc47b7-x7phw <4> Pod CPU 한번에 보기 = k top 명령어 = 메트릭 kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml k top pods <5> 단일 컨테이너로 nginx pod 하나 생성해보자. # 단일 컨테이너로 nginx2 pod 하나 생성해보자. # pod안에 3개의 컨테이너가 있도록 생성해 보자. 1 # 단일 컨테이너로 nginx2 pod 하나 생성해보자. k run nginx --image=nginx --dry-run=client -o yaml > nginx.yaml kubectl apply -f nginx.yaml pod/nginx created k get pods NAME READY STATUS RESTARTS AGE eks-sample-linux-deployment-66cfbc47b7-4g9xw 1/1 Running 0 132m eks-sample-linux-deployment-66cfbc47b7-5fqqv 1/1 Running 0 116m eks-sample-linux-deployment-66cfbc47b7-9stlj 1/1 Running 0 116m eks-sample-linux-deployment-66cfbc47b7-fzw4p 1/1 Running 0 116m eks-sample-linux-deployment-66cfbc47b7-rp7cg 1/1 Running 0 132m eks-sample-linux-deployment-66cfbc47b7-x7phw 1/1 Running 0 116m nginx 1/1 Running 0 4s 2 # pod안에 3개의 컨테이너가 있도록 생성해 보자. vi nginx.yaml more nginx.yaml apiVersion: v1 kind: Pod metadata: name: nginx2 spec: containers: - image: nginx name: nginx - image: redis name: redis - image: memcached name: memcached kubectl apply -f nginx.yaml pod/nginx2 created k get pods NAME READY STATUS RESTARTS AGE eks-sample-linux-deployment-66cfbc47b7-4g9xw 1/1 Running 0 133m eks-sample-linux-deployment-66cfbc47b7-5fqqv 1/1 Running 0 117m eks-sample-linux-deployment-66cfbc47b7-9stlj 1/1 Running 0 117m eks-sample-linux-deployment-66cfbc47b7-fzw4p 1/1 Running 0 117m eks-sample-linux-deployment-66cfbc47b7-rp7cg 1/1 Running 0 133m eks-sample-linux-deployment-66cfbc47b7-x7phw 1/1 Running 0 117m nginx 1/1 Running 0 59s nginx2 0/3 ContainerCreating 0 3s k get pods NAME READY STATUS RESTARTS AGE eks-sample-linux-deployment-66cfbc47b7-4g9xw 1/1 Running 0 134m eks-sample-linux-deployment-66cfbc47b7-5fqqv 1/1 Running 0 118m eks-sample-linux-deployment-66cfbc47b7-9stlj 1/1 Running 0 118m eks-sample-linux-deployment-66cfbc47b7-fzw4p 1/1 Running 0 118m eks-sample-linux-deployment-66cfbc47b7-rp7cg 1/1 Running 0 134m eks-sample-linux-deployment-66cfbc47b7-x7phw 1/1 Running 0 118m nginx 1/1 Running 0 2m10s nginx2 3/3 Running 0 74s <6> myweb 네임스페이스 만들고, myweb 네임스페이스에 mongo web 만들자. 1 k create ns myweb namespace/myweb created 2 k run mongo --image=mongo -n myweb pod/mongo created 3 k get pods -n myweb NAME READY STATUS RESTARTS AGE mongo 1/1 Running 0 18s # 추가 유틸 설치후 사용 4 k ns default eks-sample-app kube-node-lease kube-public kube-system myweb k ns myweb Context "12-24-user@myeks.ap-northeast-2.eksctl.io" modified. Active namespace is "myweb". myweb) [root@myeks-bastion-EC2 ~]# k get pods NAME READY STATUS RESTARTS AGE mongo 1/1 Running 0 3m37s <7> busybox pod 만들고 sh 스크립트 사용해보자 kubectl run busybox --image=busybox --restart=Never -- /bin/sh -c "sleep 1" pod/busybox created k get pods NAME READY STATUS RESTARTS AGE busybox 0/1 Completed 0 22s mongo 1/1 Running 0 18m <8> 영구 볼륨가 영구볼륨 목록을 보는법 Pod가 삭제 되더라고 데이터가 보관 되도록 영구 스토리지를 사용하는 것이다. k get pvc,pv 설정법 https://brunch.co.kr/@topasvga/3486 9탄-2. EKS DB - EKS 설치 2/3 EKS에서 사용하는 스토리지 알아보자~ <1> ADD ON 읽어보기 <2> 멱등성 실습 = 유지되려는 성질 <3> 스토리지 이론 <4> 기본 파드(컨테이너) 환경의 임시 파일시스템 사용 실습 <5> AWS라 스토리지를 EBS brunch.co.kr/@topasvga/3486 <9> Pod 이름으로 정렬해서 보자 pod이름 a ,b ,c 순으로 정렬해서 보는 명령어는? --sort-by=.metadata.name k get pods --sort-by=.metadata.name -A NAMESPACE NAME READY STATUS RESTARTS AGE myweb app 0/1 Pending 0 10m kube-system aws-node-6qqlh 2/2 Running 0 3h38m kube-system aws-node-bzrgc 2/2 Running 0 3h38m kube-system aws-node-nbwkq 2/2 Running 0 3h38m myweb busybox 0/1 Completed 0 17m kube-system coredns-7484ff4b98-lxsww 1/1 Running 0 3h36m kube-system coredns-7484ff4b98-vxvt6 1/1 Running 0 3h36m kube-system ebs-csi-controller-699448cdd-hlf76 6/6 Running 0 3h34m kube-system ebs-csi-controller-699448cdd-zswgn 6/6 Running 0 3h34m kube-system ebs-csi-node-6wvbn 3/3 Running 0 3h34m kube-system ebs-csi-node-85n57 3/3 Running 0 3h34m kube-system ebs-csi-node-xpw7d 3/3 Running 0 3h34m kube-system efs-csi-controller-54d4ddf454-ffqcw 3/3 Running 0 3h33m kube-system efs-csi-controller-54d4ddf454-gbzqh 3/3 Running 0 3h33m kube-system efs-csi-node-9fgrg 3/3 Running 0 3h33m kube-system efs-csi-node-56rrs 3/3 Running 0 3h33m kube-system efs-csi-node-n9zjk 3/3 Running 0 3h33m eks-sample-app eks-sample-linux-deployment-66cfbc47b7-dm97n 1/1 Running 0 3m37s eks-sample-app eks-sample-linux-deployment-66cfbc47b7-klp7f 1/1 Running 0 3m37s eks-sample-app eks-sample-linux-deployment-66cfbc47b7-pkdzp 1/1 Running 0 3m37s kube-system kube-proxy-qwmx7 1/1 Running 0 3h37m kube-system kube-proxy-s8v88 1/1 Running 0 3h37m kube-system kube-proxy-vswvg 1/1 Running 0 3h37m kube-system metrics-server-fbb469ccc-n5rhr 1/1 Running 0 84m myweb mongo 1/1 Running 0 35m eks-sample-app nginx 1/1 Running 0 56m eks-sample-app nginx2 3/3 Running 0 55m <10> nginx 이미지로 nginx-web01 웹서버를 만들자 # nginx 이미지 # nginx-web01 웹서버를 만들자 k run nginx --image=nginx --dry-run=client -o yaml > nginx.yaml vi nginx.yaml kubectl apply -f nginx.yaml k get pods vi nginx.yaml apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: nginx name: nginx-web01 spec: containers: - image: nginx name: nginx resources: {} dnsPolicy: ClusterFirst restartPolicy: Always status: {} kubectl apply -f nginx.yaml pod/nginx-web01 created k get pods NAME READY STATUS RESTARTS AGE eks-sample-linux-deployment-66cfbc47b7-dm97n 1/1 Running 0 17m eks-sample-linux-deployment-66cfbc47b7-klp7f 1/1 Running 0 17m eks-sample-linux-deployment-66cfbc47b7-pkdzp 1/1 Running 0 17m nginx-web01 1/1 Running 0 10s <11> ssd를 가진 nginx pod 만들자 1 k run nginx --image=nginx --dry-run=client -o yaml > nginx.yaml 2 vi nginx.yaml apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: nginx name: nginx-web01-ssd spec: containers: - image: nginx name: nginx imagePullPolicy: IfNotPresent nodeSelector: disk: ssd 2 kubectl apply -f nginx.yaml pod/nginx-web01-ssd created 3 k get pods NAME READY STATUS RESTARTS AGE eks-sample-linux-deployment-66cfbc47b7-dm97n 1/1 Running 0 25m eks-sample-linux-deployment-66cfbc47b7-klp7f 1/1 Running 0 25m eks-sample-linux-deployment-66cfbc47b7-pkdzp 1/1 Running 0 25m nginx-web01 1/1 Running 0 7m59s nginx-web01-ssd 0/1 Pending 0 24s <12> nginx 1.23 버전으로 nginx123 Pod를 만들자 kubectl run nginx123 --image=nginx:1.23 --restart=Never --port=80 kubectl run nginxlast --image=nginx:latest --restart=Never --port=80 <13> 영구 볼륨 스토리지인 PV를 만들어 보자. 1 cat << EOT > pv.yaml apiVersion: v1 kind: PersistentVolume metadata: name: efs-pv spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteOnce storageClassName: "" persistentVolumeReclaimPolicy: Retain csi: driver: efs.csi.aws.com volumeHandle: fs-073d77123471b2917 EOT kubectl apply -f pv.yaml kubectl get pv efs-pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE efs-pv 5Gi RWO Retain Available 2s 참고 사이트 https://aws.amazon.com/ko/blogs/tech/persistent-storage-for-kubernetes/ Kubernetes를 위한 영구 스토리지 적용하기 | Amazon Web Services 이 글은 AWS Storage Blog에 게시된 Persistent storage for Kubernetes by Suman Debnath, Daniel Rubinstein, Anjani Reddy, and Narayana Vemburaj을 한국어 번역 및 편집하였습니다. 상태 저장 애플리케이션이 올바르게 실행되기 aws.amazon.com <14> redis pod 만들기, 6379 port 사용 kubectl run redis --image=redis --restart=Never --port=6379 --dry-run=client -o yaml > re.yaml kubectl apply -f re.yaml k get pods more re.yaml apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: redis name: redis spec: containers: - image: redis name: redis ports: - containerPort: 6379 resources: {} dnsPolicy: ClusterFirst restartPolicy: Never status: {} <15> Pod의 log 확인법 alias k='kubectl' k get pods NAME READY STATUS RESTARTS AGE redis 1/1 Running 0 20m k logs redis 1:C 26 Dec 2023 01:01:28.115 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 1:C 26 Dec 2023 01:01:28.115 * Redis version=7.2.3, bits=64, commit=00000000, modified=0, pid=1, just started 1:C 26 Dec 2023 01:01:28.115 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf 1:M 26 Dec 2023 01:01:28.115 * monotonic clock: POSIX clock_gettime 1:M 26 Dec 2023 01:01:28.116 * Running mode=standalone, port=6379. 1:M 26 Dec 2023 01:01:28.117 * Server initialized 1:M 26 Dec 2023 01:01:28.117 * Ready to accept connections tcp k logs redis |grep Running 1:M 26 Dec 2023 01:01:28.116 * Running mode=standalone, port=6379. <16> Pod lable이 run=redis 의 cpu 사용률 확인법 k get pods NAME READY STATUS RESTARTS AGE redis 1/1 Running 0 26m k describe pod redis Name: redis Namespace: default Priority: 0 Service Account: default Node: ip-192-168-1-11.ap-northeast-2.compute.internal/192.168.1.11 Start Time: Tue, 26 Dec 2023 10:01:25 +0900 Labels: run=redis Annotations: Status: Running IP: 192.168.1.187 IPs: IP: 192.168.1.187 Containers: redis: Container ID: # top 명령어는 메트릭 pod를 배포해야함!!! k top po -l run=redis NAME CPU(cores) MEMORY(bytes) redis 2m 2Mi k top po -l run=redis > pod-cpu.txt more pod-cpu.txt NAME CPU(cores) MEMORY(bytes) redis 2m 2Mi <17> 스토리지 10Gi , name: task-pv-volume PV 생성하기 cat << EOT > pv-path1.yaml apiVersion: v1 kind: PersistentVolume metadata: name: task-pv-volume labels: type: local spec: storageClassName: manual capacity: storage: 10Gi accessModes: - ReadWriteOnce hostPath: path: "/mnt/data" EOT kubectl apply -f pv-path1.yaml kubectl get pv task-pv-volume NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE task-pv-volume 10Gi RWO Retain Available manual 2s # 참고 사이트 https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/ <18> busybox pod를 yaml 파일로 만들기, sleep 10 실행 포함. kubectl run busybox --image=busybox --restart=Never --dry-run=client -o yaml -- /bin/sh -c "sleep 10" > busybox2.yaml more busybox2.yaml apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: busybox name: busybox spec: containers: - args: - /bin/sh - -c - sleep 10 image: busybox name: busybox resources: {} dnsPolicy: ClusterFirst restartPolicy: Never status: {} kubectl apply -f busybox2.yaml pod/busybox created k get pods NAME READY STATUS RESTARTS AGE busybox 1/1 Running 0 4s redis 1/1 Running 0 72m <19> db-user-pass 이름으로 스크릿 만들기 # db-user-pass 이름으로 스크릿 만들기 kubectl create secret generic db-user-pass --from-literal=username=admin --from-literal=password='S!B\*d$zDsb=' secret/db-user-pass created kubectl get secrets NAME TYPE DATA AGE db-user-pass Opaque 2 30s 참고 사이트 https://kubernetes.io/docs/tasks/configmap-secret/managing-secret-using-kubectl/ https://brunch.co.kr/@topasvga/3303 <20> 디플로이먼트로 배포하고 노드포트 사용하기 1 kubectl create deployment nginx-project --image=nginx --dry-run=client -o yaml --port=80 > nginx-deploy.yaml more nginx-deploy.yaml kubectl apply -f nginx-deploy.yaml 2 kubectl expose deployment nginx-project --port=80 --type=NodePort kubectl expose deployment nginx-project --port=80 --type=NodePort --dry-run=client -o yaml > nodeport.yaml more nodeport.yaml apiVersion: v1 kind: Service metadata: creationTimestamp: null labels: app: nginx-project name: nginx-project spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: nginx-project type: NodePort status: loadBalancer: {} k get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.100.0.1 443/TCP 19h nginx-project NodePort 10.100.138.121 80:30314/TCP 4m31s or kubectl expose deployment nginx-project --port=80 --type=LoadBalancer