자동완성 설정

쿠버네티스 문서 kubectl Cheat Sheet에 유용한 명령어와 기본적인 명령어들 내용이 있다. bash 쉘의 경우 아래의 명령어를 통해 자동완성을 적용시킬 수 있다.

1
2
3
source <(kubectl completion bash) # setup autocomplete in bash into the current shell, bash-completion package should be installed first.
echo "source <(kubectl completion bash)" >> ~/.bashrc # add autocomplete permanently to your bash shell.
. ~/.bashrc

zsh의 경우 아래와같다.

1
2
3
source <(kubectl completion zsh)  # setup autocomplete in zsh into the current shell
echo "[[ $commands[kubectl] ]] && source <(kubectl completion zsh)" >> ~/.zshrc # add autocomplete permanently to your zsh shell
. ~/.zshrc

또한 아래의 명령어 실행시 kubectl을 k로 별칭을 지어 kubectl 대신 k만으로 명령이 가능하다 kubectl get po과 k get po는 같은 결과가 된다.

1
2
alias k=kubectl
complete -F __start_kubectl k

네임스페이스 변경

네임스페이스의 기본값은 default 이다.

1
2
3
kubectl config set-context --current --namespace={name-space}
#kube-system으로 변경
#kubectl config set-context --current --namespace=kube-system

축약어

아래의 리소스 타입은 약어 사용이 가능하다.

기본적으로 s는 생략이 가능하다.

  • pods : po
  • deployments : deploy
  • services : svc
  • replicasets : rs
  • replicationcontollers : rc
  • configmaps : cm
  • namespaces : ns
  • nodes : no
  • persistentvolumeclaims : pvc
  • persistentvolumes : pv
  • resourcequotas : quota
  • serviceaccounts : sa
  • daemonsets : ds
  • cronjobs : cj
  • ingresses : ing
  • storageclasses : sc

오브젝트 구성파일 얻기

cka 시험에서 문서를 보면서 yaml파일을 작성하는데에는 많은 시간이 든다. 아래 내용은 kubectl을 통해 오브젝트를 생성하는 명령어이다. {}안에는 변수로써 해당하는 단어를 넣으면된다.

pod, service등 오브젝트 파일을 작성해야할때 오브젝트를 실제로 생성하지 않고 작업하고 싶다면 --dry-run 을 사용하면된다. 다만 해당 옵션은 deprecated되었기때문에 나중에 지원이 안될 수 있기떄문에 --dry-run=client를 추천한다.

또한 yaml 파일 형식으로 출력하기위해 -o yaml 옵션을 붙여주면된다.

kubectl {명령어} {기타 필요한 옵션} --dry-run=client -o yaml > {저장하고싶은 파일이름} 형식으로 하면된다.

dry-run을 사용하였기때문에 실제 오브젝트는 생성되지 않았으므로 kubectl create나 apply를 통해 오브젝트 생성이 가능하다.

POD

이미지는 nginx를 쓰고 팟의 이름은 test-nginx인 오브젝트를 명세하는 yaml파일을 얻는 예시이다.

kubectl run {object-name} --image={image-name}이 기본형식이다.

상세한 옵션들은 공식문서에서 확인이 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ kubectl run test-nginx  --image=nginx --dry-run=client -o yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test-nginx
  name: test-nginx
spec:
  containers:

  - image: nginx
    name: test-nginx
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

위의 명령어 실행시 아래와 같이 배쉬에 출력이 된다.

파일로 저장하고 싶다면 리눅스 입출력 리다이렉션인 > 나 >>를 사용하면 된다.

>는 파일을 새로쓰는것이고 >> 붙여쓰는 것인데 주로 새로운 파일 생성에 사용하기때문에 >를 사용하게된다.

1
2
kubectl run test-nginx  --image=nginx --dry-run=client -o yaml > test-nginx.yaml
vi test-nginx.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test-nginx
  name: test-nginx
spec:
  containers:

  - image: nginx
    name: test-nginx
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

추가적인 옵션은 아래와같다. 괄호안에 있는것은 둘의 의미가 같으며 둘중 하나만 써도된다.

  • (-n | --namespace) {name-space} : 오브젝트가 생성될 네임스페이스 지정
  • --port {port-number} : 해당팟의 포트를 외부에 노출(expose)시킨다. 내부 아이피와 포트로 접근 할 수 있다.
  • (-l | --label) "a=b,c=d" : 레이블을 지정한다 comma(,)로 레이블을 구분하여 여러개를 동시에 지정 할 수 있다.
  • --env "env-name=env-vlaue": 레이블과 다르게 여러개의 환경변수를 사용하려면 콤마대신 --env를 여러번 써야한다.
  • --expose {port-number} : 해당포트를 Cluster IP 형식으로 노출시키는 서비스를 만든다.

Deployment

←UnWrapper                     Wrapper→

pod → (RepicaSet | ReplicaContoller) → Deployment

팟은 컨네이너들을 관리한다. 레플리카셋과 컨트롤러는 팟을 관리한다. 디플로이먼트는 레플리카셋이나 레플리케이션 컨트롤러를 관리한다.

kubectl create deployment {object-name} --image={image-name}이 기본형식이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ kubectl create deployment nginx-deploy --image=nginx --dry-run=client -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx-deploy
  name: nginx-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-deploy
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx-deploy
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}
  • (-r | --replica) {replica-number} : 레플리카 개수를 정할 수 있다.
  • --port {port-number} : 해당팟의 포트를 외부에 노출(expose)시킨다. 내부 아이피와 포트로 접근 할 수 있다.

template 아래 부분은 팟에 대한 설정이다. 해당 명령어로는 팟에대해 레이블을 지정하거나 옵션을 주기 어렵기때문에 run으로 팟을 만든뒤 template하위에 붙여넣는 식으로 하면 좋다.

ReplicaSet

ReplicaSet을 따로 만들어 주는 명령어는 없으나 형식이 Deployment랑 거의 비슷하기 때문에 Deployment로 생성한뒤 status와 strategy필드만 지워주고 kind만 ReplicaSet으로 바꾸면된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  creationTimestamp: null
  labels:
    app: nginx-deploy
  name: nginx-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-deploy
#  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx-deploy
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
#status: {}

ReplicationController

ReplicationController도 별도의 명령어가 없으나 Deployment와 유사하기 때문에 Deployment 생성 후 수정하여 사용하는게 좋다.

status와 strategy 필드 삭제 apiVersion v1으로 변경 selector가 deploy,rs는 map 형식인데 rc는 string형식으로 받는다.

그래서 해당 예시에서는 matchLabels를 지우고 app: nginx-deploy 를 2칸 땅겨오면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: v1
kind: ReplicationController
metadata:
  creationTimestamp: null
  labels:
    app: nginx-deploy
  name: nginx-deploy
spec:
  replicas: 1
  selector:
    #matchLabels:
    app: nginx-deploy
#  strategy: {}
  **template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx-deploy
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
#status: {}