본문 바로가기

kubernetes, helm, rancher

kubernetes란?

기본적인 kubernetes resource, option 등을 설명한 블로그입니다. 추가적인 기능을 보고싶으시면 docs를 참고바랍니다.

https://kubernetes.io/docs/home/

 

Kubernetes Documentation

Kubernetes is an open source container orchestration engine for automating deployment, scaling, and management of containerized applications. The open source project is hosted by the Cloud Native Computing Foundation.

kubernetes.io

  • kubernetes란 컨테이너를 도커 플랫폼에 올려서 관리, 운영, 클러스터 서비스를 제공하는 것.
  • kubeadm - 클러스터 생성/관리 도구 (kubespary같이 오픈소스도 있음)
  • CNI(Container Network Interface) 소프트웨어- flannel, calico, weavenet 등이 있고 어떤걸 설치하든 상관없다.
  • control plane(master node) - worker node(도커 플랫폼을 통해 컨테이너를 동작하고 실제 서비스 제공)
  • master node에서 kube-apiserver(container orchestrating), etcd, scheduler, controller-manager 등이 있으며, worker node와의 통신(worker node의 kubelet) 역할.
  • worker node에는 kubelet(kube-apiserver와 통신 및 내부 컨테이너 컨트롤)과 kube-proxy(클러스터 내의 services끼리 통신 하기 위함)이 있다.
  • etcd는 kubeadm tool을 사용할 때에는 etcd-master라는 pod가 생성되 control되지만, scratch를 이용할 경우 etcd binary를 다운로드 받아서 extract해줘야한다.
  • etcd-master라는 pod가 생성되면 그 컨테이너 안에서 etcdctl 명령어를 써서 컨트롤할 수 있다.
  • kubectl exec etcd-master -n kube-system -- sh -c "ETCDCTL_API=3 etcdctl get / --prefix --keys-only --limit=10 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key"
  • 순서: Authenticate user -> validate request -> retrieve data -> update etcd -> scheduler -> kublet
  • 설치 : Docker install -> kubeadm, kubectl, kubelet 설치 -> control-plane 구성 -> worker node 구성
  • kubectl run [자원이름][옵션] -> 특정 이미지실행, pods(kubectl run webserver --image=nginx:1.14 --port 80)
  • kubectl create -f obj.yaml -> file 혹은 stdin을 input으로 받아서 실행, declarative하게 실행되며, 이미 존재하는 pod는 실행 불가. kubectl create pods ~ -> imperative하게 실행.
  • kubectl apply -f obj.yaml -> declarative하게 실행, 변경 및 생성.
  • declarative - 목적만 말해줌. imperative - 목적까지 상세하게 step by step으로 말해줌.
  • create, edit, run, expose, set, scale 등등은 imperative이며, apply -f, create -f 는 declarative.
  • 만약 resource가 이미 존재하면 create는 에러를 내보내고, apply는 내보내지 않는다.
  • kubectl get [자원타입][객체이름] -> 간단히 list형식( kubectl get nodes|pods -o wide|yaml|json)
  • kubectl edit [자원타입][객제이름]
  • kubectl describe [자원타입][객제이름] -> 특정 자원 자세히 (kubectl describe node|pod ~)
  • kubectl delete [자원타입][객체이름]
  • kubectl api-resources -> 약어정보
  • kubectl create deployment mainui --image=httpd:latest --replicas=3 (deployment는 여러파드를 묶어서 실행)
  • kubectl exec [객체이름] -it -- [command] 
  • kubectl port-forward webserver 8080:80 -> 포트 포워딩
  • kubectl edit [자원타입][객체이름] -> yaml을 편집할 수 있게해준다.
  • kubectl run webserver --image=nginx:1.14 --port 80 --dry-run -o yaml > webserver-pod.yaml -> dry-run을 통해 실행되는지만 테스트하고 yaml로 보여주는 결과를 webserver-pod.yaml로 redirect.
  • kubectl replace -f [filename] -> pod를 replace할 때에는 제약이 있는데, metadata는 불변이며, 변경할 수 있는건 image, tolerations 등등이다.
  • kubectl explain [리소스 name] -> 리소스(pod, namesapce 등)의 api버전이나 정보를 알고싶을 경우.
  • kubectl set -> 무언가를 update하고 싶을 때
  • kubectl set image deployment [deploy_name] [container_name]=[image_name] -> rolling update 된다. 기본적으로 strategy가 rolling update이며, recreate도 있지만, 중간에 access가 불가능.
  • kubectl get all -> 모든 자원을 볼 수 있다. deployment는 rs를 관리하고 rs는 pod들을 관리하기 때문에 deployment, rs, pods이 나온다.
  • kubectl logs [pod name] -c [container name]
  • kubectl exec -it [pod name] -c [multi container 일경우 특정 container name] -- [command]
  • kubectl describe ~ -> pods안에 혹은 deployment, namesapce 등등 안의 container나 여러 정보를 알고 싶을 때
  • 하나의 pod안에 여러 container가 있더라도 같은 ip를 가지며, 다른 container에서 localhost는 다같이 공유.
  • yaml을 작성하려고 할때 기억이 나질 않으면, kubernetes explain pods --recursive | grep [찾고싶은 것] 하면 된다.

dry-run

  • kubectl run nginx --image=nginx --dry-run=client -o yaml > file
  • kubectl create deployment --image=nginx nginx replicas=4 --dry-run=client -o yaml > file