Cloud/k8s-CKAD

[CKAD] killer.sh 틀린 문제 풀이

jinkwon.kim 2024. 11. 8. 13:10
728x90
반응형

유의 사항 

k8s에서 개수확인 문제에흔 --no-header를 넣어야 한다. 안그럼 header가 폼되면서 개수 틀려짐.

Pod-ENV

env로 key value 설정하기 

env:
  - name: TEST
    value: HAHAHAH

resource에서 직접 key 값 가져오기 

env:
  - name: DB_PASSWORD
    secretKeyRef:
      name: db-secret
      key: password
  - name: APP_CONFIG
    configMapKeyRef:
      name: app-config
      key: config.json
  - name: POD_NAME
    fieldRef:
      fieldPath: metadata.name
  - name: CPU_LIMIT
    resourceFieldRef:
      containerName: my-container
      resource: limits.cpu

valueFrom으로 resource의 key 값 가져오기 

env:
  - name: DB_PASSWORD
    valueFrom:
      secretKeyRef:
        name: db-secret
        key: password
  - name: APP_CONFIG
    valueFrom:
      configMapKeyRef:
        name: app-config
        key: config.json
  - name: POD_NAME
    valueFrom:
      fieldRef:
        fieldPath: metadata.name
  - name: CPU_LIMIT
    valueFrom:
      resourceFieldRef:
        containerName: my-container
        resource: limits.cpu

evnFrom으로 configmap과 secret 전체 가져오기

envFrom:
  - configMapRef:
      name: myconfig
  - secretRef:
      name: mysecret

5. volume을 통해서 가져오기

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: nginx
      volumeMounts:
        - name: config-volume
          mountPath: /etc/config
        - name: secret-volume
          mountPath: /etc/secret
  volumes:
    - name: config-volume
      configMap:
        name: myconfig
    - name: secret-volume
      secret:
        secretName: mysecret

6. volume에서 특정 키의 값만 mount하는 방법

volumes:
  - name: myconfig
    configMap:
      name: myconfig
      times:
        - key: log_level
          path: log-level.txt
  - name: secret
    secret:
      secretname: mysecret
      times:
        - key: secret_level
          path: secret_level.log

 

사용법 쉽게 외우기 

env 는 key를 사용하여 가져옴으로 configMapKeyRef  및 secretKeyRef 가 사용된다. 

- properties 로 name과 key가 존재

envFrom은 전체를 가져옴으로 configMapRef 및 secretRef 가 사용된다. 

- properies로 name가 존재 

volume은 전체를 가져옴으로 configMap 및 secret이 사용된다.

- properties로 name 및 secretName이 존재

Pod 상태 확인

status로 상태를 확인

kubectl -n default get pod pod1 | grep -i status:
kubectl -n default get pod pod1 -o jsonpath="{.status.phase}"

heml  chart 관련 명령어

설치 

helm install -n test {release_name} {char_name}

repo 관련 명런

보기

helm repo list

업데이트

helm repo update

chart 검색

helm search repo nginx

설치되 chart update하기 

helm --n test upgrade {releae_name} {chart_name}

chart 설치시 replicaCount 설정

helm -n test install {release_name} {char_name} --set replicaCount=2

현재 설치된 모든 release나열 

helm ls

release 삭제

Service Account에 할당된 token 찾는 방법

secret의 annoation에 sa 정보가 존재한다. 그걸 찾은다음에 secret의 내용을 보면된다. 

k -n neptune get sa # get overview
k -n neptune get secrets # shows all secrets of namespace
k -n neptune get secrets -oyaml | grep annotations -A 1 # shows secrets with first annotation
k -n neptune describe secret neptune-secret-1 #token 확인

Pod에서 command  사용시 주의 사항

sh -c 를 꼭 넣어주어야 한다. 이유

  • 쉘 연산자(&&, |, ||, ;) 사용: 논리적 연결이 필요할 때 쉘이 있어야 합니다.
  • 명령어 문자열 해석: 여러 명령어를 하나의 문자열로 해석하기 위해 필요합니다.
  • 복잡한 커맨드 실행: 단순한 명령어 외에 파이프라인(|)이나 조건문(&&, ||)이 포함된 명령어는 쉘이 있어야 제대로 작동합니다.

주의사항

  • Kubernetes는 command 필드에서 각 인자를 개별적으로 해석합니다. 그래서 공백이 포함된 인자는 하나의 문자열로 취급되기 위해 감싸는 것이 더 안전할 수 있습니다.
  • 쉘(sh -c)을 사용하는 경우, 공백과 연산자(&&, ||)가 포함된 명령어는 감싸는 것이 권장됩니다.

 

spec:
  containers:
  - command:
    - sh
    - -c
    - "touch /tmp/ready && sleep 1d"

 

securityContext 위치 

Pod와 container 두개다 위치 가능 

  securityContext:
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000

contaner에서 설정 사항 

        securityContext:                   # add
          allowPrivilegeEscalation: false  # add
          privileged: false                # add

k8s에서 Sidecar란?

K8s의 사이드카 컨테이너는 restartPolicy: Always가 있는 initContainers입니다.

이전에는 사이드카 컨테이너를 일반 컨테이너로 정의해야 했지만, Kubernetes 1.28부터는 initContainers에 restartPolicy: Always를 설정하여 사이드카 컨테이너를 명시적으로 정의할 수 있게 되었습니다.

k8s  임시 container 만들기 

kubectl run tmp --rm -i --image nginx:alpine --restart=Never -- curl 10.10.0.10

 

  • --rm 옵션은 Pod가 종료된 후 자동으로 삭제되도록 합니다.
  • -i 옵션이 없으면, Pod는 입력이 연결되지 않은 상태로 시작되기 때문에, curl 명령이 제대로 실행되지 않거나 바로 종료될 수 있습니다.
  • 특히 kubectl run 명령에서 -i 없이 실행할 경우, 명령이 백그라운드에서 실행되고 표준 입력이 닫혀서 예상대로 동작하지 않을 수 있습니다.

sts scale 조정하기 

대상 : deployment, replicaset, statefullset 

kubectl -n test scale sts 03db -replicas 1

k8s node resource 확인

node만 확인

kubectl top nodes

container들을 확인

kubectl top pod --containers=true

Pod scheduling 하기 

1. scheduller 멈추기

static schedule yaml을 옮기면된다. 

cd /etc/kubernetes/manifests/
mv kube-scheduler.yaml ..

2. pod 생성

k run manual-schedule --image=httpd:2.4-alpine

 

3. pod에 nodeName 설정

이렇게 되면 schedulle 없이도 node에 배치가 된다.

  nodeName: cluster2-controlplane1        # add the controlplane node name

 

이게 가능한 이유

1. Pod 생성

  • 사용자가 Pod 생성 요청을 하면, API Server가 이 요청을 받아서 etcd에 저장합니다.
  • 이 시점에서 Pod의 상태는 Pending이고, NodeName 필드는 비어 있습니다.

2. Scheduler의 동작

  • Scheduler는 주기적으로 API Server에서 Pending 상태의 Pod 목록을 가져옵니다.
  • Scheduler는 스케줄링 알고리즘을 사용하여 적합한 Node를 선택하고, 이 Node의 이름을 Pod의 NodeName 필드에 설정합니다.
  • Scheduler는 업데이트된 Pod 정보를 API Server에 다시 전송하고, API Server는 이를 etcd에 저장합니다.

3. Kubelet의 동작

  • Kubelet은 주기적으로 API Server에 자신이 관리하는 Node에 할당된 Pod의 목록을 요청합니다.
  • 자신에게 할당된 Pod가 있으면, Kubelet은 Pod의 스펙을 가져와서 컨테이너 런타임을 통해 해당 Pod의 컨테이너를 실행합니다.
  • Kubelet은 Pod의 상태를 지속적으로 모니터링하고, 이 정보를 API Server에 보고합니다.

Role

  • 같은 apiGroup에 속하는 경우라면 하나의 rule에 여러 resources를 포함할 수 있습니다.
  • 다른 apiGroup에 속하거나, 권한을 세분화하려면 rule을 추가로 정의하는 것이 좋습니다.

rules:
  # Core API group (빈 문자열)
- apiGroups:
    - ""
  resources:
    - configmaps
  verbs:
    - get
    - list

  # Custom API group
- apiGroups:
    - "apps"
  resources:
    - deployments
  verbs:
    - update

cluster 정보 수집

1. How many controlplane nodes are available?

k get node 로 확인

2. How many worker nodes are available?

k get node 로 확인

3. What is the Service CIDR? 

CIDR 표기법 : <IP 주소>/<서브넷 마스크의 길이>

답 : 10.96.0.0/12

root@cluster1-controlplane1:~# cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep range
    - --service-cluster-ip-range=10.96.0.0/12

4. Which Networking (or CNI Plugin) is configured and where is its config file?

답 : weave, /etc/cni/net.d/10-weave.conflist

find /etc/cni/net.d/

10-weave.conflist
cat /etc/cni/net.d/10-weave.conflist
{
    "cniVersion": "0.3.0",
    "name": "weave",
...

 

 

5. Which suffix will static pods have that run on cluster1-node1?

실행 중인 Pod 목록을 조회 (kubectl get pods -A)하여 Mirror Pod의 이름을 확인합니다.

Mirror Pod의 이름 형식에서 Node 이름이 Suffix로 붙는 것을 확인할 수 있습니다 (<Static Pod Name>-<Node Name>).

 

Event 확인

모든 namespace event 확인

kubectl get events -A

api-resources 확인

namespaced resource확인

kubectl api-resources --namespaced 

kubectl api-resources --namespaced -o name 

kubelet이 안된다. 

1. kubelet이 실행중인지 확인. 

2. kubelet 실행 파일 경로가 정상인지 확인 

k8s worker node join 

특정 버전으로 kubelet 업데이트하기 

apt update

apt show kubelet | grep 1.31

apt install -y kubelet=1.13.1-1.1 kubectl=1.13.1-1.1

service restart kubelet

command 만들기 

kubeadm token create --print-join-command

openssl로 인증서 날짜 확인하기 

openssl x509 -in 인증서 -noout -text

에서 Validity 확인

 

kubeadm certs check-expiration | grep apiserver

kube-apiserver 인증서를 갱신

sudo kubeadm certs renew apiserver

NetworkPolicy 규칙

"-" 를 한개의 Rule로 봅니다.

  • "-" 를 개별 Rule로 인식하여 or 조건으로 동작
  • "-" 안의 Rule들은 And 조건으로 동작 

예를 들어 아래 설정에서 ipblock, namespaceSelector, podSelector는 각각 개별 룰로 취급되며 or 조건으로 동작합니다.

  ingress:
    - from:
        - ipBlock:
            cidr: 172.17.0.0/16
            except:
              - 172.17.1.0/24
        - namespaceSelector:
            matchLabels:
              project: myproject
        - podSelector:
            matchLabels:
              role: frontend

 

그러나 아래 설정에서는 ipblock과  namespaceSelector는 and로 동작하고 podSelector는 개별 룰로 취급 or 조건으로 동작합니다.

 

  ingress:
    - from:
        - ipBlock:
            cidr: 172.17.0.0/16
            except:
              - 172.17.1.0/24
          namespaceSelector:
            matchLabels:
              project: myproject
        - podSelector:
            matchLabels:
              role: frontend

 

728x90
반응형

'Cloud > k8s-CKAD' 카테고리의 다른 글

[CAKD] 합격 및 Tip  (0) 2024.11.11
[CAKD] 오답노트 최종 정리  (0) 2024.11.09
[CKAD] 시험 미흡 사항  (2) 2024.11.03
[CKAD] Custom Resource Definitions(CRD)  (1) 2024.10.29
[CKAD] k8s API 버전 체계  (0) 2024.10.17