CKA를 준비해보자 7일차 - Labels and Selectors

0

CKA

목록 보기
7/43

Labels and Selectors

label은 kubernetes object를 특정 기준으로 묶어 여러 group으로 만드는 방법 중 하나이다. selector는 이러한 label을 기준으로 특정 kubernetes object group을 선택해 policy를 적용하는 방법이다.

label들은 key-value로 이루어져 있는데, 가령 다음과 같다.

{
    "Class": "Mammal",
    "kind": "Domestic",
    "Color": "Green"
}

{
    "Class": "Mammal",
    "kind": "Domestic",
    "Color": "Orange"
}

이렇게 key-value로된 label들을 가진 item을 선택할 때 사용하는 것이 바로 selector인 것이다. selector를 통해 item을 선택할 때도 key-value형식으로 선택해야한다.

Class=Mammal & Color=Green

위의 selector를 만족하는 item은 아래 밖에 남지 않는다.

{
    "Class": "Mammal",
    "kind": "Domestic",
    "Color": "Green"
}

kubernetes는 서로 다른 category로 label를 object에 부여하고 그룹을 만들고, selector로 label을 설정하여 group을 선택하는 것이다.

label을 만드는 방법은 매우 쉽다. metadatalabels아래로 key: value값들을 나열하기만 하면 된다.

apiVersion: v1
kind: Pod
metadata:
  name: simple-webapp
  labels:
    app: App1
    function: Front-end
spec:
  containers:
  - name: simple-webapp
    image: simple-webapp
    ports:
    - containerPort: 8080

simple-webapp pod는 labelapp: App1, function: Front-end를 가지게 된다. 이후에 해당 label을 통해서 selector를 사용하기 위해서는 다음과 같이 사용할 수 있다.

kubectl get pods --selector app=App1

이러면 app=App1 라벨을 가진 pod만 선택되게 된다.

우리가 앞전에 사용했던 ReplicaSet을 다시 보도록 하자.

  • replicaset-definition.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: simple-webapp
  labels:
    app: App1
    function: front-end
spec:
  replicas: 3
  selector:
    matchLabels:
      app: App1
  template:
    metadata:
      labels:
        app: App1
        function: front-end
    spec:
      containers:
      - name: simple-webapp
        image: simple-webapp

spec.template.metadata.labels의 라벨들을 보면 spec.selectormatchLabelsapp: App1으로 일치한다. ReplicaSet은 이 label을 보고 어떤 pod들 관리하여 replica수를 유지할 지 결정하게 되는 것이다.

여기서 재미난 점은 ReplicaSet자체도 metadata.labelsselector와 동일한 값을 가지고 있다는 것인데, 그렇다고 ReplicaSet자체도 관리의 대상으로 포함되지 않는다. 왜냐하면 ReplicaSet이 관리하는 항목은 오직 pod`이기 때문이다.

service역시도 selector를 통해서 pod를 지정한다.

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: App1
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376

app: App1 라벨을 선택하고 있는 것을 알 수 있다. 따라서 해당 selector에 선택된 pod들은 service의 영향을 받는다.

여기서 한 가지 재미난 점은 labelselector와 함께 사용되어 kubernetes object들을 그룹핑하는 역활을 한다는 것이다. 그렇다면 추가적인 정보성 데이터를 담고 싶을 때는 무엇을 써야하는가? 이때는 annotation을 쓰면 된다.

name, version, build-information 등등 정보성 데이터를 넣고 싶다면 annotations에 써주면 된다.

  • replicaset-definition.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: simple-webapp
  labels:
    app: App1
    function: front-end
  annotations:
    buildversion: 1.34
spec:
  replicas: 3
  selector:
    matchLabels:
      app: App1
  template:
    metadata:
      labels:
        app: App1
        function: front-end
    spec:
      containers:
      - name: simple-webapp
        image: simple-webapp

참고로, cluster내의 모든 object 중에 특정 label을 가진 object들을 모두 불러오는 명령어는 다음과 같다.

kubectl get all --selector env=dev

0개의 댓글