[CKA] Imperative Command와 Declarative Command

HanΒ·2024λ…„ 1μ›” 8일

Udemy_CKA

λͺ©λ‘ 보기
2/6

πŸ‘€ Imperative Command

  • 였브젝트의 생성과 μˆ˜μ •μ„ λΉ λ₯΄κ²Œ λ„μ™€μ€Œ (YAML파일 μˆ˜μ •ν•  ν•„μš”X)
  • κΈ°λŠ₯ κ΅¬ν˜„μ— ν•œκ³„ζœ‰
  • run once and forgotten (λˆ„κ°€ μ–΄λ–»κ²Œ λ§Œλ“€μ—ˆλŠ”μ§€ νŠΈλž˜ν‚Ή νž˜λ“¦)
  • μΏ λ²„λ„€ν‹°μŠ€ λ‚΄μ˜ definitionνŒŒμΌμ— μ €μž₯됨 (λ‘œμ»¬νŒŒμΌμ— μ €μž₯X)

Create Objects

$ kubectl run nginx --image=nginx
$ kubectl create deployment nginx --image=nginx
$ kubectl expose deployment nginx --port 80

Update Objects

$ kubectl edit deployment nginx
$ kubectl scale delployment nginx --replicas=5
$ kubectl set image deployment nginx nginx=nginx:1.18

κ·Έ μ™Έ λͺ…λ Ήμ–΄

# ν•œ 번의 μ»€λ§¨λ“œλ‘œ 라벨 μˆ˜μ •
kubectl run redis --image=redis:alpine --labels="tier=db"

# ν•œ 번의 μ»€λ§¨λ“œλ‘œ νŒŒλ“œμ™€ μ„œλΉ„μŠ€ λ™μ‹œ 생성
kubectl run httpd --image=htpd:alpine --port=80 --expose=true

βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–

πŸ‘€ Declarative Command

  • 이미 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” νŒŒμΌλ„ 생성 κ°€λŠ₯
  • 경둜 μ§€μ •ν•˜μ—¬ 생성 κ°€λŠ₯
  • 둜컬 디렉토리 μ—…λ°μ΄νŠΈ

Create Objects

$ kubectl apply -f nginx.yaml
$ kubectl apply -f /path/to/config-files

Update Objects

$ kubectl apply -f nginx.yaml

βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–βž–

--dry-run: By default as soon as the command is run, the resource will be created. If you simply want to test your command , use the --dry-run=client option. This will not create the resource, instead, tell you whether the resource can be created and if your command is right.

-o yaml: This will output the resource definition in YAML format on screen.

Use the above two in combination to generate a resource definition file quickly, that you can then modify and create resources as required, instead of creating the files from scratch.

1) POD

Create an NGINX Pod

kubectl run nginx --image=nginx

Generate POD Manifest YAML file (-o yaml). Don't create it(--dry-run)

kubectl run nginx --image=nginx --dry-run=client -o yaml

2) Deployment

Create a deployment

kubectl create deployment --image=nginx nginx

Generate Deployment YAML file (-o yaml). Don't create it(--dry-run)

kubectl create deployment --image=nginx nginx --dry-run=client -o yaml

Generate Deployment with 4 Replicas

kubectl create deployment nginx --image=nginx --replicas=4

You can also scale a deployment using the kubectl scale command.

kubectl scale deployment nginx --replicas=4

Another way to do this is to save the YAML definition to a file and modify

kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > nginx-deployment.yaml

You can then update the YAML file with the replicas or any other field before creating the deployment.

3) Service

Create a Service named redis-service of type ClusterIP to expose pod redis on port 6379

kubectl expose pod redis --port=6379 --name redis-service --dry-run=client -o yaml

(This will automatically use the pod's labels as selectors)

Or

kubectl create service clusterip redis --tcp=6379:6379 --dry-run=client -o yaml
(This will not use the pods labels as selectors, instead it will assume selectors as app=redis. You cannot pass in selectors as an option. So it does not work very well if your pod has a different label set. So generate the file and modify the selectors before creating the service)

Create a Service named nginx of type NodePort to expose pod nginx's port 80 on port 30080 on the nodes:

kubectl expose pod nginx --type=NodePort --port=80 --name=nginx-service --dry-run=client -o yaml

(This will automatically use the pod's labels as selectors, but you cannot specify the node port. You have to generate a definition file and then add the node port in manually before creating the service with the pod.)

Or

kubectl create service nodeport nginx --tcp=80:80 --node-port=30080 --dry-run=client -o yaml

(This will not use the pods labels as selectors)

Both the above commands have their own challenges. While one of it cannot accept a selector the other cannot accept a node port. I would recommend going with the kubectl expose command. If you need to specify a node port, generate a definition file using the same command and manually input the nodeport before creating the service.

Reference:
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

https://kubernetes.io/docs/reference/kubectl/conventions/

0개의 λŒ“κΈ€