Kubernetes Engine 활용
Kubernetes Engine 활용을 위한 가이드를 제공합니다.
Kubernetes Engine 활용 제공 가이드
Kubernetes Engine 활용에서는 아래의 기능을 설명하고 있습니다. 자세한 내용은 해당 가이드를 참고하세요.
| 제공 가이드 | 설명 |
|---|
| 클러스터 접근하기 | kubectl 설치 및 사용 방법, kubeconfig 다운로드, kubectl 플러그인을 이용한 로그인 방법 안내 |
| 인증 및 인가 | 인증 및 인가 기능과 Kubernetes Engine과 IAM의 연계 방법에 대해 설명 |
| type LoadBalancer 서비스 구성하기 | Service 매니페스트 파일을 통해 LoadBalancer 형식(type)의 Service를 구성 방법 안내 |
| 사용 시 고려사항 | SKE 사용 시 제약사항 설명 |
| 버전 정보 | Kubernetes 버전 및 지원 기간 설명 |
표. Kubernetes Engine 활용 가이드 설명
1 - 클러스터 접근하기
kubectl 설치 및 사용 방법
Kubernetes Engine 서비스를 생성한 후 쿠버네티스 커맨드 라인 도구인 kubectl을 사용하면 쿠버네티스 클러스터에 대해 명령을 실행할 수 있습니다. kubectl을 사용하여 애플리케이션을 배포하고, 클러스터 리소스를 검사 및 관리하고 로그를 볼 수 있습니다. 다음과 같은 쿠버네티스 공식 문서에서 kubectl을 설치하여 사용하는 방법을 확인할 수 있습니다.
참고
클러스터의 마이너(minor) 버전 차이 내에 있는 kubectl 버전을 사용해야 합니다. 예를 들어, 클러스터의 버전이 1.30이라면 kubectl 버전 1.29, 1.30, 1.31을 사용할 수 있습니다.
kubectl로 쿠버네티스 클러스터에 접근하려면, 쿠버네티스 서버 주소와 인증 정보를 담은 kubeconfig 파일이 필요합니다.
참고
쿠버네티스 인증 및 인가에 대한 상세한 내용은
인증 및 인가를 참고하세요.
Kubernetes Engine은 관리자 인증서 kubeconfig와 사용자 인증키 kubeconfig를 통한 인증 기능을 지원합니다.
관리자 인증서 kubeconfig
이 kubeconfig는 Kubernetes API에 접근할 때, 관리자 인증서를 인증 수단으로 사용합니다.
관리자 kubeconfig 다운로드
Kubernetes Engine > 클러스터 목록 > 클러스터 상세 > 관리자 kubeconfig 다운로드 버튼을 클릭하여 kubeconfig 파일을 다운로드합니다.
주의
- 관리자 kubeconfig 다운로드는 Admin만 가능합니다.
- 프라이빗 엔드포인트용과 퍼플릭 엔드포인트용이 따로 있으며 각각 최초 1회만 다운로드할 수 있습니다.
관리자 kubeconfig 사용
참고
- 기본적으로 kubectl은 $HOME/.kube 디렉터리에서 config라는 이름의 파일을 찾습니다. 또는 KUBECONFIG 환경 변수를 설정하거나
kubeconfig 플래그를 지정하여 다른 kubeconfig 파일을 사용할 수 있습니다. - 프라이빗 엔드포인트는 기본적으로 해당 클러스터의 노드에서만 접근이 허용됩니다. 동일 Account, 동일 리전에 있는 리소스의 경우, 프라이빗 엔드포인트 접근 제어 설정에 추가하여 접근을 허용할 수 있습니다.
- 외부 인터넷에서 클러스터에 접근이 필요한 경우, 퍼블릭 엔드포인트 액세스를 사용으로 설정하면 퍼블릭 엔드포인트 kubeconfig를 사용하여 접근할 수 있습니다.
사용자 인증키 kubeconfig
이 kubeconfig는 Kubernetes API에 접근할 때, 사용자의 Open API 인증키를 인증 수단으로 사용합니다.
사용자 kubeconfig 다운로드
Kubernetes Engine > 클러스터 목록 > 클러스터 상세 > 사용자 kubeconfig 다운로드 버튼을 클릭하여 kubeconfig 파일을 다운로드합니다.
주의
- 사용자 kubeconfig 다운로드는 클러스터 조회 권한이 있는 사용자만 가능합니다.
- 프라이빗 엔드포인트용과 퍼플릭 엔드포인트용이 따로 있습니다.
- 다운로드한 kubeconfig 파일에는 인증키 토큰이 포함되어 있지 않으므로, 사용하기 전에 인증키 토큰 정보를 추가해야 합니다. (다음 문단 참고)
사용자 kubeconfig 파일에 인증키 토큰 추가
아래는 사용자 kubeconfig 파일의 예시입니다. kubeconfig 파일을 사용하기 위해서는 파일 내부의 token 란에 인증키 토큰(AUTHKEY_TOKEN) 정보를 추가해야 합니다.
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0t...
server: https://my-cluster-a1c3e.ske.xxx.samsungsdscloud.com:6443
name: my-cluster-a1c3e
contexts:
- context:
cluster: my-cluster-a1c3e
user: jane.doe
name: jane.doe@my-cluster-a1c3e
current-context: jane.doe@my-cluster-a1c3e
kind: Config
preferences: {}
users:
- name: jane.doe
user:
token: <AUTHKEY_TOKEN> #### 작성 필요
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0t...
server: https://my-cluster-a1c3e.ske.xxx.samsungsdscloud.com:6443
name: my-cluster-a1c3e
contexts:
- context:
cluster: my-cluster-a1c3e
user: jane.doe
name: jane.doe@my-cluster-a1c3e
current-context: jane.doe@my-cluster-a1c3e
kind: Config
preferences: {}
users:
- name: jane.doe
user:
token: <AUTHKEY_TOKEN> #### 작성 필요
코드 블럭. 사용자 kubeconfig 파일 예시AUTHKEY_TOKEN은 인증키의 ACCESS_KEY와 SECRET_KEY를 콜론(:)으로 연결한 후, Base64 인코딩하여 생성할 수 있습니다. 다음은 리눅스 환경에서 AUTHKEY_TOKEN을 만드는 예시입니다.
$ ACCESS_KEY=5df418813aed051548a72f4a814cf09e
$ SECRET_KEY=6ba7b810-9dad-11d1-80b4-00c04fd430c8
$ AUTHKEY_TOKEN=$(echo -n "$ACCESS_KEY:$SECRET_KEY" | base64 -w0)
$ echo $AUTHKEY_TOKEN
NWRmNDE4ODEzYWVkMDUxNTQ4YTcyZjRhODE0Y2YwOWU6NmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4r
$ ACCESS_KEY=5df418813aed051548a72f4a814cf09e
$ SECRET_KEY=6ba7b810-9dad-11d1-80b4-00c04fd430c8
$ AUTHKEY_TOKEN=$(echo -n "$ACCESS_KEY:$SECRET_KEY" | base64 -w0)
$ echo $AUTHKEY_TOKEN
NWRmNDE4ODEzYWVkMDUxNTQ4YTcyZjRhODE0Y2YwOWU6NmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4r
코드 블럭. AUTHKEY_TOKEN 값 생성 예시참고
- 인증키 생성에 관한 자세한 내용은 API Reference > Common > 삼성 클라우드 플랫폼 Open API 호출 절차를 참고하세요.
사용자 kubeconfig 실행 예시
사용자 kubeconfig의 실행 예시를 확인할 수 있습니다.
접근 제어나 방화벽에 의해 접근이 차단된 경우
$ kubectl --kubeconfig=user-kubeconfig.yaml get namespaces
Unable to connect to the server: dial tcp 123.123.123.123:6443: i/o timeout
$ kubectl --kubeconfig=user-kubeconfig.yaml get namespaces
Unable to connect to the server: dial tcp 123.123.123.123:6443: i/o timeout
코드 블럭. 접근 제어나 방화벽에 의해 접근이 차단된 경우 실행 예시AUTHKEY_TOKEN이 맞지 않아 인증에 실패한 경우
$ kubectl --kubeconfig=user-kubeconfig.yaml get namespaces
error: You must be logged in to the server (Unauthorized)
$ kubectl --kubeconfig=user-kubeconfig.yaml get namespaces
error: You must be logged in to the server (Unauthorized)
코드 블럭. AUTHKEY_TOKEN이 맞지 않아 인증에 실패한 경우 실행 예시AUTHKEY_TOKEN 인증에 성공한 경우
$ kubectl --kubeconfig=user-kubeconfig.yaml get namespaces
...
kube-node-lease Active 10d
kube-public Active 10d
kube-system Active 10d
$ kubectl --kubeconfig=user-kubeconfig.yaml get namespaces
...
kube-node-lease Active 10d
kube-public Active 10d
kube-system Active 10d
코드 블럭. AUTHKEY_TOKEN 인증에 성공한 경우 실행 예시AUTHKEY_TOKEN 인증에 성공했으나 권한이 없는 경우
$ kubectl --kubeconfig=user-kubeconfig.yaml get nodes
Error from server (Forbidden): nodes is forbidden: User "jane.doe" cannot list resource "nodes" in API group "" at the cluster scope
$ kubectl --kubeconfig=user-kubeconfig.yaml get nodes
Error from server (Forbidden): nodes is forbidden: User "jane.doe" cannot list resource "nodes" in API group "" at the cluster scope
코드 블럭. AUTHKEY_TOKEN 인증에 성공했으나 권한이 없는 경우 실행 예시참고
AUTHKEY_TOKEN 인증에 성공했으나 권한이 없는 경우, 인증 과정은 올바르게 완료되었지만 요청한 작업을 수행할 수 있는 권한이 부여(인가)되지 않았음을 의미합니다. 인가에 대한 상세한 내용은
인증 및 인가를 참고하세요.
2 - 인증 및 인가
Kubernetes Engine에는 쿠버네티스의 인증 및 RBAC 인가 기능이 적용되어 있습니다. 쿠버네티스의 인증 및 인가 기능과 Kubernetes Engine과 IAM의 연계 방법에 대해 설명합니다.
쿠버네티스 인증 및 인가
쿠버네티스의 인증 및 RBAC 인가 기능을 설명합니다.
인증
쿠버네티스 API 서버는 인증서나 인증 토큰으로부터 사용자(User)나 서비스어카운트(ServiceAccount)의 인증에 필요한 정보를 취득하여 인증 절차를 진행합니다.
참고
kubectl과 kubeconfig 사용에 관한 자세한 설명은
클러스터 접근하기를 참고하세요.
인가
쿠버네티스 API 서버는 인증 과정을 통해 얻은 사용자 정보를 이용하여 RBAC 관련 오브젝트로부터 해당 사용자가 요청한 작업에 대한 권한이 있는지를 확인합니다.
RBAC 관련 오브젝트는 다음과 같이 4가지 종류가 있습니다.
| 오브젝트 | 범위 | 설명 |
|---|
| 클러스터롤(ClusteRole) | 클러스터 범위(cluster-wide) | 클러스터의 모든 네임스페이스에 걸친 권한 정의 |
| 클러스터롤바인딩(ClusteRoleBinding) | 클러스터 범위(cluster-wide) | 클러스터롤과 사용자와의 연결 정의 |
| 롤(Role) | 네임스페이스(namespace) | 특정 네임스페이스에 대한 권한 정의 |
| 롤바인딩(RoleBinding) | 네임스페이스(namespace) | 클러스터롤 또는 롤과 사용자와의 연결 정의 |
표. RBAC 관련 오브젝트
롤
쿠버네티스에는 여러 클러스터롤이 기본 정의되어 있습니다. 그중 일부 클러스터롤에는 접두어(system:)가 포함되어 있지 않습니다. 이는 사용자용으로 사용할 것을 염두에 둔 클러스터롤입니다.
여기에는 클러스터롤바인딩을 사용하여 클러스터 전체에 적용할 슈퍼유저 롤(cluster-admin)과 롤바인딩을 사용하여 특정 네임스페이스에 적용할 롤(admin, edit, view)이 포함됩니다.
| 기본 클러스터롤 | 기본 클러스터롤바인딩 | 설명 |
|---|
| cluster-admin | system:masters 그룹 | 모든 리소스에 대한 모든 작업을 수행할 수 있는 슈퍼유저 액세스를 허용합니다.- 클러스터롤바인딩에서 사용하면 클러스터와 모든 네임스페이스의 모든 리소스에 대한 전체 제어 권한이 적용됩니다.
- 롤바인딩에서 사용하면 네임스페이스와 롤바인딩된 네임스페이스 내 모든 리소스를 완전히 제어할 수 있습니다.
|
| admin | 없음 | 롤바인딩을 사용하여 네임스페이스 내부에 적용되는 관리자 액세스를 허용합니다. 롤바인딩에서 사용하는 경우 네임스페이스 내에 롤 및 롤바인딩을 생성하는 기능을 포함하여 네임스페이스 내 대부분의 리소스에 대한 읽기/쓰기 액세스를 허용합니다. 이 롤은 리소스 할당량 또는 네임스페이스 자체에 대한 쓰기 액세스는 허용하지 않습니다. |
| edit | 없음 | 네임스페이스 내 대부분의 오브젝트에 대한 읽기/쓰기 액세스를 허용합니다.- 이 롤은 롤과 롤바인딩의 조회 및 변경을 허용하지 않습니다. 하지만 이 롤은 시크릿에 접근하여 네임스페이스 내 모든 Account로 파드를 실행할 수 있기 때문에, 네임스페이스 내 모든 Account의 API 액세스 수준을 취득할 수 있습니다.
|
| view | 없음 | 네임스페이스 내 대부분의 오브젝트를 조회하기 위한 읽기 전용 액세스를 허용합니다. 롤 또는 롤바인딩은 조회할 수 없습니다.- 이 롤은 시크릿 조회가 허용되지 않습니다. 시크릿의 내용을 읽으면 네임스페이스 내 Account의 크리덴셜에 접근할 수 있고, 이를 통해 네임스페이스 내 임의의 Account로서 API 접근을 허용하는 결과가 되기 때문입니다(권한 상승의 일종).
|
표. 기본 클러스터롤과 클러스터롤바인딩 설명
필요에 따라 기본 정의된 클러스터롤 이외에, 다음과 같이 별도의 롤(또는 클러스터롤)을 정의할 수도 있습니다.
# "default" 네임스페이스 내 파드를 조회할 권한을 부여하는 롤
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
# "default" 네임스페이스 내 파드를 조회할 권한을 부여하는 롤
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
코드 블럭. 네임스페이스 내 파드를 조회할 권한을 부여하는 롤# 노드를 조회할 권한을 부여하는 클러스터롤
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: node-reader
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "list", "watch"]
# 노드를 조회할 권한을 부여하는 클러스터롤
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: node-reader
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "list", "watch"]
코드 블럭. 노드를 조회할 권한을 부여하는 클러스터롤롤바인딩
Samsung Cloud Platform IAM을 사용하여 Kubernetes Engine에 대한 액세스를 관리하려면, 쿠버네티스의 롤바인딩과 IAM의 관계를 이해해야 합니다.
롤바인딩(또는 클러스터롤바인딩)의 대상(subjects)에는 개별 사용자(User) 또는 그룹(Group)이 포함될 수 있습니다.
- User는 Samsung Cloud Platform 사용자명으로, Group은 IAM 사용자 그룹명으로 각각 매칭됩니다.
롤바인딩/클러스터롤바인딩의 subjects.kind로는 다음 중 하나를 지정할 수 있습니다.
- User: Samsung Cloud Platform 개별 사용자와 연결됩니다.
- Group: Samsung Cloud Platform IAM 사용자 그룹과 연결됩니다.
참고
이 외에 서비스 어카운트도 지정할 수 있으나, 서비스 어카운트는 일반적으로 사용자용이 아니며 Samsung Cloud Platform 사용자와 연결할 수 없습니다.
롤바인딩/클러스터롤바인딩의 subjects.name은 다음과 같이 지정할 수 있습니다.
- User인 경우: Samsung Cloud Platform 개별 사용자명 (예: jane.doe)
- Group인 경우: Samsung Cloud Platform IAM 사용자 그룹명 (예: ReadPodsGroup)
참고
subjects.name은 영문 대소문자를 구별합니다.
이러한 방식으로 IAM 사용자 그룹은 Kubernetes Engine 클러스터의 롤바인딩(또는 클러스터롤바인딩)에 작성된 그룹과 연결됩니다. 또한 그룹과 연결된 롤(또는 클러스터롤)에 포함된 API 작업을 수행할 수 있는 권한이 부여됩니다.
예시) 롤바인딩 read-pods #1
롤바인딩에 User(Samsung Cloud Platform 개별 사용자)를 작성한 예시는 다음과 같습니다.
# 이 롤바인딩은 "jane.doe" 사용자가 "default" 네임스페이스의 파드를 조회하도록 허용합니다.
# 해당 네임스페이스에 "pod-reader"라는 롤이 있어야 합니다.
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: read-pods
namespace: default
roleRef:
# "roleRef"에는 롤 또는 클러스터롤과의 연결을 지정합니다.
kind: Role # Role 또는 ClusterRole이어야 합니다.
name: pod-reader # 연결하고자 하는 롤 또는 클러스터롤의 이름과 일치해야 합니다.
apiGroup: rbac.authorization.k8s.io
subjects:
# 하나 이상의 "대상(subject)"을 지정할 수 있습니다.
- kind: User
name: jane.doe
apiGroup: rbac.authorization.k8s.io
# 이 롤바인딩은 "jane.doe" 사용자가 "default" 네임스페이스의 파드를 조회하도록 허용합니다.
# 해당 네임스페이스에 "pod-reader"라는 롤이 있어야 합니다.
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: read-pods
namespace: default
roleRef:
# "roleRef"에는 롤 또는 클러스터롤과의 연결을 지정합니다.
kind: Role # Role 또는 ClusterRole이어야 합니다.
name: pod-reader # 연결하고자 하는 롤 또는 클러스터롤의 이름과 일치해야 합니다.
apiGroup: rbac.authorization.k8s.io
subjects:
# 하나 이상의 "대상(subject)"을 지정할 수 있습니다.
- kind: User
name: jane.doe
apiGroup: rbac.authorization.k8s.io
코드 블럭. 롤바인딩에 User(Samsung Cloud Platform 개별 사용자) 작성 예시클러스터에 위와 같은 롤바인딩이 생성되면, 사용자명이 jane.doe인 사용자에게 롤 pod-reader에 작성된 API 작업을 수행할 수 있는 권한이 부여됩니다.
예시) 롤바인딩 read-pods #2
롤바인딩에 그룹(IAM 사용자 그룹)을 작성한 예시는 다음과 같습니다.
# 이 롤바인딩은 "ReadPodsGroup" 그룹에 속한 사용자가 "default" 네임스페이스의 파드를 조회하도록 허용합니다.
# 해당 네임스페이스에 "pod-reader"라는 롤이 있어야 합니다.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
subjects:
# 하나 이상의 "대상(subject)"을 지정할 수 있습니다.
- kind: Group
name: ReadPodsGroup
apiGroup: rbac.authorization.k8s.io
# 이 롤바인딩은 "ReadPodsGroup" 그룹에 속한 사용자가 "default" 네임스페이스의 파드를 조회하도록 허용합니다.
# 해당 네임스페이스에 "pod-reader"라는 롤이 있어야 합니다.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
subjects:
# 하나 이상의 "대상(subject)"을 지정할 수 있습니다.
- kind: Group
name: ReadPodsGroup
apiGroup: rbac.authorization.k8s.io
코드 블럭. ReadPodsGroup 그룹에 파드 조회를 허용하는 롤바인딩 예시클러스터에 위와 같은 롤바인딩이 생성되면, IAM 사용자 그룹 ReadPodsGroup에 속한 사용자들에게 롤 pod-reader에 작성된 API 작업을 수행할 수 있는 권한이 부여됩니다.
예시) 클러스터롤바인딩 read-nodes
# 이 클러스터롤바인딩은"ReadNodesGroup" 그룹에 속한 사용자가 노드를 조회하도록 허용합니다.
# "node-reader"라는 클러스터롤이 있어야 합니다.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: read-nodes
roleRef:
kind: ClusterRole
name: node-reader
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
name: ReadNodesGroup
apiGroup: rbac.authorization.k8s.io
# 이 클러스터롤바인딩은"ReadNodesGroup" 그룹에 속한 사용자가 노드를 조회하도록 허용합니다.
# "node-reader"라는 클러스터롤이 있어야 합니다.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: read-nodes
roleRef:
kind: ClusterRole
name: node-reader
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
name: ReadNodesGroup
apiGroup: rbac.authorization.k8s.io
코드 블럭. ReadNodesGroup 그룹에 노드 조회를 허용하는 클러스터롤바인딩 예시클러스터에 위와 같은 클러스터롤바인딩이 생성되면, IAM 사용자 그룹 ReadNodesGroup에 속한 사용자들에게 클러스터롤 node-reader에 작성된 API 작업을 수행할 수 있는 권한이 부여됩니다.
Samsung Cloud Platform의 Kubernetes Engine에는 다음과 같이 클러스터롤바인딩 scp-cluster-admin, scp-view, scp-namespace-view와 클러스터롤 scp-namespace-view가 사전정의되어 있습니다.
아래 표는 Samsung Cloud Platform용 사전 정의된 롤 및 롤바인딩, Samsung Cloud Platform 사용자의 연결 관계를 나타낸 것입니다. 여기서, 클러스터롤 cluster-admin과 view는 쿠버네티스 클러스터 내부에 사전 정의되어 있습니다. 자세한 설명은 롤을 참고하세요.
| 클러스터롤바인딩 | 클러스터롤 | subjects (사용자) |
|---|
| scp-cluster-admin | cluster-admin | 클러스터 생성자 사용자명 (예: jane.doe) |
| scp-view | view | - |
| scp-namespace-view | scp-namespace-view | 해당 클러스터에 인증된 모든 사용자 |
표. Samsung Cloud Platform용 사전 정의된 롤 및 롤바인딩, 사용자의 연결 관계
- 클러스터롤바인딩 scp-cluster-admin에 따라 Kubernetes Engine 서비스 생성자에게는 클러스터 관리자 권한이 부여됩니다.
- 클러스터롤바인딩 scp-view에 등록된 사용자 또는 그룹에는 클러스터 조회자 권한이 부여됩니다. 쿠버네티스에 사전 정의된 클러스터롤 view와 바인딩되며, 클러스터 범위 리소스(예: 네임스페이스, 노드, 인그레스클래스 등)와 네임스페이스 내 시크릿에 대한 접근 권한은 없습니다. 자세한 사항은 롤을 참고하세요.
- 클러스터롤바인딩 scp-namespace-view에 따라 해당 클러스터에 인증된 모든 사용자에게 네임스페이스 조회 권한이 부여됩니다.
참고
- Samsung Cloud Platform용 사전 정의된 롤 및 롤바인딩은 클러스터 서비스 생성 시에 최초 한번 생성합니다.
- 사용자는 필요에 따라 Samsung Cloud Platform용 사전 정의된 클러스터 롤바인딩 및 클러스터롤을 수정하거나 삭제할 수 있습니다.
Samsung Cloud Platform용 사전 정의된 롤 및 롤바인딩의 세부 내용은 다음과 같습니다.
클러스터롤바인딩 scp-cluster-admin
클러스터롤바인딩 scp-cluster-admin은 클러스터롤 cluster-admin과 연결되며, 대상(subjects) 항목에 따라 Samsung Cloud Platform 사용자(Kubernetes Engine 클러스터 생성자)와 바인딩됩니다.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
name: scp-cluster-admin
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: User
name: jane.doe # 클러스터 생성자 사용자명
apiGroup: rbac.authorization.k8s.io
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
name: scp-cluster-admin
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: User
name: jane.doe # 클러스터 생성자 사용자명
apiGroup: rbac.authorization.k8s.io
코드 블럭. 클러스터롤바인딩 scp-cluster-admin 예시클러스터롤바인딩 scp-view
클러스터롤바인딩 scp-view는 클러스터롤 view와 바인딩되며, 대상(subjects) 항목에 Samsung Cloud Platform 사용자 또는 IAM 사용자 그룹을 추가할 수 있습니다.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: scp-view
roleRef:
kind: ClusterRole
name: view
apiGroup: rbac.authorization.k8s.io
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: scp-view
roleRef:
kind: ClusterRole
name: view
apiGroup: rbac.authorization.k8s.io
코드 블럭. 클러스터롤바인딩 scp-view 예시클러스터롤 및 클러스터롤바인딩 scp-namespace-view
클러스터롤 scp-namespace-view는 네임스페이스에 대한 조회 권한을 정의한 롤입니다.
클러스터롤바인딩 scp-namespace-view는 클러스터롤 scp-namespace-view과 바인딩되며, 해당 클러스터에 인증된 모든 사용자에게 네임스페이스 조회 권한을 부여합니다.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: scp-namespace-view
rules:
- apiGroups: [""]
resources: ["namespaces"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: scp-namespace-view
roleRef:
kind: ClusterRole
name: scp-namespace-view
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
name: system:authenticated
apiGroup: rbac.authorization.k8s.io
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: scp-namespace-view
rules:
- apiGroups: [""]
resources: ["namespaces"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: scp-namespace-view
roleRef:
kind: ClusterRole
name: scp-namespace-view
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
name: system:authenticated
apiGroup: rbac.authorization.k8s.io
코드 블럭. 클러스터롤 및 클러스터롤바인딩 scp-namespace-view 예시IAM 사용자 그룹 RBAC 유스케이스
이 챕터에서는 주요 사용자 시나리오별로 권한을 부여하는 예시를 설명합니다.
여기에 제시된 IAM 사용자 그룹, 클러스터롤바인딩/롤바인딩, 클러스터롤의 이름은 이해를 돕기 위한 하나의 예시입니다. 관리자는 필요에 맞게 적절한 이름과 권한을 정의하여 적용하세요.
| 범위 | 유스케이스 | IAM 사용자 그룹 | 클러스터롤바인딩/롤바인딩 | 클러스터롤 | 비고 |
|---|
| 클러스터 | 클러스터 관리자 | ClusterAdminGroup | 클러스터롤바인딩 cluster-admin-group | cluster-admin | 특정 클러스터에 대한 관리자 |
| 클러스터 | 클러스터 편집자 | ClusterEditGroup | 클러스터롤바인딩 cluster-edit-group | edit | 특정 클러스터에 대한 편집자 |
| 클러스터 | 클러스터 조회자 | ClusterViewGroup | 클러스터롤바인딩 cluster-view-group | view | 특정 클러스터에 대한 조회자 |
| 네임스페이스 | 네임스페이스 관리자 | NamespaceAdminGroup | 롤바인딩 namespace-admin-group | admin | 특정 네임스페이스에 대한 관리자 |
| 네임스페이스 | 네임스페이스 편집자 | NamespaceEditGroup | 롤바인딩 namespace-edit-group | edit | 특정 네임스페이스에 대한 편집자 |
| 네임스페이스 | 네임스페이스 조회자 | NamespaceViewGroup | 롤바인딩 namespace-view-group | view | 특정 네임스페이스에 대한 조회자 |
표. 유스케이스에 따른 IAM 사용자 그룹, 클러스터롤 사용자의 바인딩 예시
참고
위 표에 있는 클러스터롤(cluster-admin, admin, edit, view)은 쿠버네티스 클러스터 내부에 사전 정의되어 있습니다. 자세한 설명은
롤 항목을 참고하세요.
클러스터 관리자
클러스터 관리자를 생성하려면 다음 절차를 따르세요.
- ClusterAdminGroup이라는 이름의 IAM 사용자 그룹을 생성하세요.
- 대상 클러스터에 다음과 같은 내용의 클러스터롤바인딩을 생성하세요.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-admin-group
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
name: ClusterAdminGroup
apiGroup: rbac.authorization.k8s.io
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-admin-group
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
name: ClusterAdminGroup
apiGroup: rbac.authorization.k8s.io
코드 블럭. 클러스터 관리자 생성
- 기본 클러스터롤 cluster-admin과 연계되어, 해당 클러스터에 대한 관리자 권한이 부여됩니다.
클러스터 편집자
클러스터 편집자를 생성하려면 다음 절차를 따르세요.
- ClusterEditGroup이라는 이름의 IAM 사용자 그룹을 생성하세요.
- 대상 클러스터에 다음과 같은 내용의 클러스터롤바인딩을 생성하세요.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-edit-group
roleRef:
kind: ClusterRole
name: edit
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
name: ClusterEditGroup
apiGroup: rbac.authorization.k8s.io
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-edit-group
roleRef:
kind: ClusterRole
name: edit
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
name: ClusterEditGroup
apiGroup: rbac.authorization.k8s.io
코드 블럭. 클러스터 편집자 생성
- 기본 클러스터롤 edit와 연계되어, 해당 클러스터에 대한 편집자 권한이 부여됩니다.
클러스터 조회자
클러스터 조회자를 생성하려면 다음 절차를 따르세요.
- ClusterViewGroup이라는 이름의 IAM 사용자 그룹을 생성하세요.
- 대상 클러스터에 다음과 같은 내용의 클러스터롤바인딩을 생성하세요.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-view-group
roleRef:
kind: ClusterRole
name: view
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
name: ClusterViewGroup
apiGroup: rbac.authorization.k8s.io
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-view-group
roleRef:
kind: ClusterRole
name: view
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
name: ClusterViewGroup
apiGroup: rbac.authorization.k8s.io
코드 블럭. 클러스터 조회자 생성
- 기본 클러스터롤 view와 연계되어, 해당 클러스터에 대한 조회자 권한이 부여됩니다.
네임스페이스 관리자
네임스페이스 관리자를 생성하려면 다음 절차를 따르세요.
- NamespaceAdminGroup이라는 이름의 IAM 사용자 그룹을 생성하세요.
- 대상 클러스터에 다음과 같은 내용의 롤바인딩을 생성하세요.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: namespace-admin-group
namespace: <네임스페이스_이름>
roleRef:
kind: ClusterRole
name: admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
name: NamespaceAdminGroup
apiGroup: rbac.authorization.k8s.io
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: namespace-admin-group
namespace: <네임스페이스_이름>
roleRef:
kind: ClusterRole
name: admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
name: NamespaceAdminGroup
apiGroup: rbac.authorization.k8s.io
코드 블럭. 네임스페이스 관리자 생성
- 기본 클러스터롤 admin과 연계되어, 해당 네임스페이스에 대한 관리자 권한이 부여됩니다.
네임스페이스 편집자
네임스페이스 편집자를 생성하려면 다음 절차를 따르세요.
- NamespaceEditGroup이라는 이름의 IAM 사용자 그룹을 생성하세요.
- 대상 클러스터에 다음과 같은 내용의 롤바인딩을 생성하세요.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: namespace-edit-group
namespace: <네임스페이스_이름>
roleRef:
kind: ClusterRole
name: edit
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
name: NamespaceEditGroup
apiGroup: rbac.authorization.k8s.io
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: namespace-edit-group
namespace: <네임스페이스_이름>
roleRef:
kind: ClusterRole
name: edit
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
name: NamespaceEditGroup
apiGroup: rbac.authorization.k8s.io
코드 블럭. 네임스페이스 편집자 생성
- 기본 클러스터롤 edit와 연계되어, 해당 네임스페이스에 대한 편집자 권한이 부여됩니다.
네임스페이스 조회자
네임스페이스 조회자를 생성하려면 다음 절차를 따르세요.
- NamespaceViewGroup이라는 이름의 IAM 사용자 그룹을 생성하세요.
- 대상 클러스터에 다음과 같은 내용의 롤바인딩을 생성하세요.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: namespace-view-group
namespace: <네임스페이스_이름>
roleRef:
kind: ClusterRole
name: view
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
name: NamespaceViewGroup
apiGroup: rbac.authorization.k8s.io
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: namespace-view-group
namespace: <네임스페이스_이름>
roleRef:
kind: ClusterRole
name: view
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
name: NamespaceViewGroup
apiGroup: rbac.authorization.k8s.io
코드 블럭. 네임스페이스 조회자 생성
- 기본 클러스터롤 view와 연계되어, 해당 네임스페이스에 대한 조회자 권한이 부여됩니다.
3 - type LoadBalancer 서비스 사용하기
서비스 구성 방법
Service 매니페스트 파일(예시:
my-lb-svc.yaml
)을 작성하여 적용하면 LoadBalancer 형식(type)의 Service를 구성할 수 있습니다.
주의
- LoadBalancer는 기본적으로 클러스터 Subnet에 생성됩니다.
- 다른 Subnet에 LoadBalancer를 생성하려면 어노테이션 service.beta.kubernetes.io/scp-load-balancer-subnet-id를 사용하세요. 자세한 내용은 어노테이션 상세 설정 참고
type LoadBalancer Service를 작성해 적용하려면 다음 절차를 따르세요.
Service 매니페스트 파일
my-lb-svc.yaml
을 작성합니다.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
appProtocol: tcp # LB 서비스 프로토콜 유형 설정 문단 참고
type: LoadBalancer
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
appProtocol: tcp # LB 서비스 프로토콜 유형 설정 문단 참고
type: LoadBalancer
코드 블럭. Service 매니페스트 파일 my-lb-svc.yaml 작성 예시kubectl apply 명령어를 사용해 Service 매니페스트를 배포합니다.
kubectl apply -f my-lb-svc.yaml
kubectl apply -f my-lb-svc.yaml
코드 블럭. kubectl apply 명령어로 Service 매니페스트 배포
주의
- type LoadBalancer Service가 생성되면, 그에 대응되는 Load Balancer 서비스가 자동으로 생성됩니다. 구성이 완료될 때까지 몇 분 가량 소요될 수 있습니다.
- 자동으로 생성된 Load Balancer 서비스 및 LB 서버그룹을 임의로 변경하지 마세요. 변경 사항이 원복되거나 예기치 않은 동작이 발생할 수 있습니다.
- 설정 가능한 상세 기능에 대해서는 어노테이션 상세 설정을 참고하세요.
kubectl get service
명령어를 사용하여 Load Balancer 구성을 확인합니다.# kubectl get service my-lb-svc
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default my-lb-svc LoadBalancer 172.20.49.206 123.123.123.123 80:32068/TCP 3m
# kubectl get service my-lb-svc
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default my-lb-svc LoadBalancer 172.20.49.206 123.123.123.123 80:32068/TCP 3m
코드 블럭. kubectl get service 명령어로 Load Balancer 구성 확인
프로토콜 유형
Service 매니페스트를 작성하여 사용할 수 있습니다. 다음은 간단한 예시입니다.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
...
ports:
- port: 80
targetPort: 9376
protocol: TCP # 필수 (TCP, UDP 중 택일)
appProtocol: tcp # 선택 (입력하지 않거나 tcp, http, https 중 택일)
type: LoadBalancer # 타입 로드밸런서
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
...
ports:
- port: 80
targetPort: 9376
protocol: TCP # 필수 (TCP, UDP 중 택일)
appProtocol: tcp # 선택 (입력하지 않거나 tcp, http, https 중 택일)
type: LoadBalancer # 타입 로드밸런서
코드 블럭. Service 매니페스트 작성 예시Kubernetes Engine의 type Load Balancer Service에서 지원하는 프로토콜(protocol과 appProtocol) 목록과 그에 따라 Load Balancer 서비스에 적용되는 설정은 다음과 같습니다.
| 구분 | (k8s) protocol | (k8s) appProtocol | (LB) 서비스 구분 | (LB) LB Listener | (LB) LB 서버그룹 | (LB) 헬스체크 |
|---|
| L4 TCP | TCP | (tcp) | L4 | TCP {port} | TCP {nodePort} | TCP {nodePort} |
| L4 UDP | UDP | - | L4 | UDP {port} | UDP {nodePort} | TCP {nodePort} |
| L7 HTTP | TCP | http | L7 | HTTP {port} | TCP {nodePort} | TCP/HTTP {nodePort} |
| L7 HTTPS | TCP | https | L7 | HTTPS {port} | TCP {nodePort} | TCP/HTTP {nodePort} |
표. k8s Service 매니페스트와 Load Balancer 서비스 적용 설정
- k8s Service 매니페스트 스펙에 따라 하나의 서비스에 여러 포트를 지정할 수 있습니다.
주의
Load Balancer 서비스 구분(L4, L7)에 따라 하나의 Service 내에서 protocol의 Layer를 혼용해 사용할 수 없습니다.
- 즉 L4(TCP, UDP)와 L7(HTTP, HTTPS)은 하나의 Service에서 함께 사용할 수 없습니다.
L4 Service 매니페스트 작성 예시
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: LoadBalancer
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: LoadBalancer
코드 블럭. L4 Service 매니페스트 작성 예시L7 Service 매니페스트 작성 예시
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/scp-load-balancer-layer-type: "L7" # 필수
service.beta.kubernetes.io/scp-load-balancer-client-cert-id: "24da35de187b450eb0cf09fb6fa146de" # 필수
name: my-service
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- appProtocol: http # 필수
protocol: TCP
port: 80
targetPort: 9376
- appProtocol: https # 필수
protocol: TCP
port: 443
targetPort: 9898
type: LoadBalancer
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/scp-load-balancer-layer-type: "L7" # 필수
service.beta.kubernetes.io/scp-load-balancer-client-cert-id: "24da35de187b450eb0cf09fb6fa146de" # 필수
name: my-service
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- appProtocol: http # 필수
protocol: TCP
port: 80
targetPort: 9376
- appProtocol: https # 필수
protocol: TCP
port: 443
targetPort: 9898
type: LoadBalancer
코드 블럭. L7 Service 매니페스트 작성 예시어노테이션 상세 설정
서비스 매니페스트에 어노테이션을 추가해 상세 기능을 설정할 수 있습니다.
apiVersion: v1
kind: Service
metatdata:
name: my-lb-svc
annotations:
service.beta.kubernetes.io/scp-load-balancer-public-ip-enabled: "true"
service.beta.kubernetes.io/scp-load-balancer-health-check-interval: "5"
service.beta.kubernetes.io/scp-load-balancer-health-check-timeout: "5"
service.beta.kubernetes.io/scp-load-balancer-health-check-count: "3"
service.beta.kubernetes.io/scp-load-balancer-session-duration-time: "300"
spec:
type: LoadBalancer
...
apiVersion: v1
kind: Service
metatdata:
name: my-lb-svc
annotations:
service.beta.kubernetes.io/scp-load-balancer-public-ip-enabled: "true"
service.beta.kubernetes.io/scp-load-balancer-health-check-interval: "5"
service.beta.kubernetes.io/scp-load-balancer-health-check-timeout: "5"
service.beta.kubernetes.io/scp-load-balancer-health-check-count: "3"
service.beta.kubernetes.io/scp-load-balancer-session-duration-time: "300"
spec:
type: LoadBalancer
...
코드 블럭. 서비스 매니페스트에 어노테이션 추가 작성 예시서비스에 별도의 어노테이션을 추가하지 않은 경우 적용되는 어노테이션 기본값과 허용값은 다음과 같습니다. 또한 각 어노테이션에 대한 주의 사항을 확인하세요.
| 어노테이션 | 프로토콜 | 기본값 | 허용값 | 예시 | 설명 |
|---|
| service.beta.kubernetes.io/scp-load-balancer-source-ranges-firewall-rules | All | false | true, false | false | 방화벽 규칙( LB source ranges → LB 서비스 IP )을 자동으로 추가 |
| service.beta.kubernetes.io/scp-load-balancer-snat-healthcheck-firewall-rules | All | false | true,false | false | 방화벽 규칙( LB Source NAT IP, HealthCheck IP → 멤버 IP:Port )을 자동으로 추가- 이 어노테이션을 사용하면, type LB 서비스의 포트 수만큼 방화벽 규칙이 추가되므로, 방화벽 규칙이 매우 많아질 수 있습니다.
- 방화벽 규칙이 너무 많은 것이 부담이 된다면, 대안으로 이 어노테이션을 사용하지 않고 수동으로 방화벽 규칙을 추가하여 사용할 수 있습니다. 예를 들어, 목적지를 멤버 IP의 NodePort 대역(30000-32767)으로 하는 방화벽 규칙을 추가하여 사용할 수 있습니다.
|
표. Kubernetes 어노테이션에서 Firewall 관련 설정
| 어노테이션 | 프로토콜 | 기본값 | 허용값 | 예시 | 설명 |
|---|
| service.beta.kubernetes.io/scp-load-balancer-security-group-id | All | - | UUID | 92d84b44-ee71-493d-9782-3a90481ce5f3 | 지정한 ID에 해당하는 Security Group에 규칙을 자동으로 추가- 이 어노테이션을 사용하면, type LB 서비스의 포트 수만큼 Security Group에 규칙이 추가되므로, Security Group 규칙이 매우 많아질 수 있습니다.
- Security Group 규칙이 너무 많은 것이 부담이 된다면, 대안으로 이 어노테이션을 사용하지 않고 수동으로 Security Group 규칙을 추가하여 사용할 수 있습니다. 예를 들어, 대상 주소를 Load Balancer의 Source NAT IP와 헬스 체크 IP로 지정하고, 허용 포트를 NodePort 대역(30000-32767)으로 하는 Security Group 규칙을 추가하여 사용할 수 있습니다.
- 이 어노테이션에 의해 추가된 Security Group 규칙들은 이 어노테이션을 삭제 또는 변경하더라도 자동으로 삭제되지 않습니다.
- 콤마로 구분하여 여러 개를 추가할 수 있습니다. (예시:
ddc25ad8-6d3f-4242-8c86-2a059212ddc6,26ab7fe1-b3ea-4aa9-9e9d-35a7c237904e)
- 이 어노테이션은 service.beta.kubernetes.io/scp-load-balancer-security-group-name 어노테이션과 동시에 사용 가능하며, 조건에 부합하는 모든 Security Group에 규칙이 자동 추가됩니다.
|
| service.beta.kubernetes.io/scp-load-balancer-security-group-name | All | - | 문자열 | security-group-1 | 지정한 Name에 해당하는 Security Group에 규칙을 자동으로 추가- 이 어노테이션을 사용하면, type LB 서비스의 포트 수만큼 Security Group에 규칙이 추가되므로, Security Group 규칙이 매우 많아질 수 있습니다.
- Security Group 규칙이 너무 많은 것이 부담이 된다면, 대안으로 이 어노테이션을 사용하지 않고 수동으로 Security Group 규칙을 추가하여 사용할 수 있습니다. 예를 들어, 대상 주소를 Load Balancer의 Source NAT IP와 헬스 체크 IP로 지정하고, 허용 포트를 NodePort 대역(30000-32767)으로 하는 Security Group 규칙을 추가하여 사용할 수 있습니다.
- 이 어노테이션에 의해 추가된 Security Group 규칙들은 이 어노테이션을 삭제 또는 변경하더라도 자동으로 삭제되지 않습니다.
- 콤마로 구분하여 여러 개 추가 가능 (예시:
security-group-1,security-group-2)
- 이 어노테이션은 service.beta.kubernetes.io/scp-load-balancer-security-group-id 어노테이션과 동시에 사용 가능하며, 조건에 부합하는 모든 Security Group에 규칙이 자동으로 추가됩니다.
|
표. Kubernetes 어노테이션에서 Security Group 관련 설정
| 어노테이션 | 프로토콜 | 기본값 | 허용값 | 예시 | 설명 |
|---|
| service.beta.kubernetes.io/scp-load-balancer-layer-type | All | L4 | L4, L7 | L4 | Load Balancer의 서비스 구분을 지정- 이 어노테이션을 사용할 때 TCP 또는 UDP를 사용하려는 경우에는 L4, HTTP 또는 HTTPS를 사용하려는 경우에는 L7을 지정하세요.
- 최초 생성 후 변경이 불가합니다. 변경하려면 서비스를 재생성해야 합니다.
|
| service.beta.kubernetes.io/scp-load-balancer-subnet-id | All | - | ID | 7f05eda5e1cf4a45971227c57a6d60fa | Load Balancer의 Service Subnet을 지정- 이 어노테이션을 지정하지 않은 경우, 클러스터의 Subnet을 사용합니다.
- 최초 생성 후 변경이 불가합니다. 변경하려면 서비스를 재생성해야 합니다.
|
| service.beta.kubernetes.io/scp-load-balancer-service-ip | All | - | IP 주소 | 192.168.10.7 | Load Balancer의 Service IP를 지정- 최초 생성 후 변경이 불가합니다. 변경하려면 서비스를 재생성해야 합니다.
|
| service.beta.kubernetes.io/scp-load-balancer-public-ip-enabled | All | false | true, false | false | Load Balancer의 Public NAT IP 사용 여부를 지정- 이 어노테이션을 true로 설정하고 service.beta.kubernetes.io/scp-load-balancer-public-ip-id를 지정하지 않은 경우, 자동으로 IP가 할당됩니다.
- 이 어노테이션을 true로 설정하고 service.beta.kubernetes.io/scp-load-balancer-public-ip-id를 지정한 경우, 지정한 ID에 해당되는 Public IP가 적용됩니다.
|
| service.beta.kubernetes.io/scp-load-balancer-public-ip-id | All | - | ID | 4119894bd9614cef83db6f8dda667a20 | Load Balancer의 Public NAT IP로 사용할 Public IP의 ID를 지정- service.beta.kubernetes.io/scp-load-balancer-public-ip-enabled를 true로 설정하지 않은 경우, 이 어노테이션은 무시됩니다.
- service.beta.kubernetes.io/scp-load-balancer-public-ip-enabled를 true로 설정하고 이 어노테이션을 지정한 경우, 지정한 ID에 해당되는 Public IP가 적용됩니다.
|
표. Kubernetes 어노테이션에서 Load Balancer 관련 설정
| 어노테이션 | 프로토콜 | 기본값 | 허용값 | 예시 | 설명 |
|---|
| service.beta.kubernetes.io/scp-load-balancer-response-timeout | HTTP, HTTPS | 0 | 0 - 120 | 60 | LB Listener의 응답 시간 초과(초)를 지정- 0은 응답 시간 초과 기능 비활성화를 의미합니다.
- 1 - 120으로 지정한 후에는 0으로 변경 불가합니다. 변경하려면 서비스를 재생성해야 합니다.
|
| service.beta.kubernetes.io/scp-load-balancer-session-duration-time | All | 120 | 0 - 120 | 120 | LB Listener의 세션 유지 시간(초)을 지정- 0은 세션 유지 시간 기능 비활성화를 의미합니다.
- 1 - 120으로 지정한 후에는 0으로 변경 불가합니다. 변경하려면 서비스를 재생성해야 합니다.
|
| service.beta.kubernetes.io/scp-load-balancer-insert-client-ip | TCP | false | true, false | false | LB Listener의 Insert Client IP를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-x-forwarded-proto | HTTP, HTTPS | false | true, false | false | LB Listener의 X-Forwarded-Proto 헤더 사용 여부를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-x-forwarded-port | HTTP, HTTPS | false | true, false | false | LB Listener의 X-Forwarded-Port 헤더 사용 여부를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-x-forwarded-for | HTTP, HTTPS | false | true, false | false | LB Listener의 X-Forwarded-For 헤더 사용 여부를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-support-http2 | HTTP, HTTPS | false | true, false | false | LB Listener의 HTTP 2.0 지원 여부를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-persistence | TCP, HTTP, HTTPS | "" | "", source-ip, cookie | source-ip | LB Listener의 지속성(선택 안함, 소스 IP, 쿠키 중 하나)을 지정- UDP의 경우, 이 어노테이션을 사용할 수 없습니다.
- TCP의 경우,
"" 또는 source-ip를 지정하여 사용할 수 있습니다.
- HTTP/HTTPS의 경우,
"", source-ip, cookie 중 하나를 지정하여 사용할 수 있습니다.
|
| service.beta.kubernetes.io/scp-load-balancer-client-cert-id | HTTPS | - | UUID | 78b9105e00324715b63700933125fa83 | LB Listener의 클라이언트 SSL 인증서의 ID를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-client-cert-level | HTTPS | HIGH | HIGH, NORMAL, LOW | HIGH | LB Listener의 클라이언트 SSL 인증서의 보안 수준을 지정 |
| service.beta.kubernetes.io/scp-load-balancer-server-cert-level | HTTPS | - | HIGH, NORMAL, LOW | HIGH | LB Listener의 서버 SSL 인증서의 보안 수준을 지정 |
표. Kubernetes 어노테이션에서 LB Listener 관련 설정
| 어노테이션 | 프로토콜 | 기본값 | 허용값 | 예시 | 설명 |
|---|
| service.beta.kubernetes.io/scp-load-balancer-lb-method | All | ROUND_ROBIN | ROUND_ROBIN, LEAST_CONNECTION, IP_HASH | ROUND_ROBIN | LB 서버 그룹의 부하 분산 정책을 지정 |
표. Kubernetes 어노테이션에서 LB 서버 그룹 관련 설정
| 어노테이션 | 프로토콜 | 기본값 | 허용값 | 예시 | 설명 |
|---|
| service.beta.kubernetes.io/scp-load-balancer-health-check-enabled | All | true | true, false | true | LB 헬스 체크의 사용 여부를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-health-check-protocol | All | TCP | TCP, HTTP | TCP | LB 헬스 체크의 프로토콜을 지정 |
| service.beta.kubernetes.io/scp-load-balancer-health-check-port | All | {nodeport} | 1 - 65534 | 30000 | LB 헬스 체크의 헬스 체크 포트를 지정{nodeport}로 기본 설정되므로, 일반적으로는 지정하지 않아도 됩니다.
|
| service.beta.kubernetes.io/scp-load-balancer-health-check-count | All | 3 | 1 - 10 | 3 | LB 헬스 체크의 탐지 횟수를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-health-check-interval | All | 5 | 1 - 180 | 5 | LB 헬스 체크의 주기를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-health-check-timeout | All | 5 | 1 - 180 | 5 | LB 헬스 체크의 대기 시간을 지정 |
| service.beta.kubernetes.io/scp-load-balancer-health-check-http-method | HTTP | GET | GET, POST | GET | LB 헬스 체크의 HTTP method를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-health-check-url | HTTP | / | 문자열 | /healthz | LB 헬스 체크의 URL을 지정 |
| service.beta.kubernetes.io/scp-load-balancer-health-check-response-code | HTTP | 200 | 200 - 500 | 200 | LB 헬스 체크의 응답 코드를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-health-check-request-data | HTTP | - | 문자열 | username=admin&password=1234 | LB 헬스 체크의 요청 문자열을 지정 |
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-enabled | All | true | true, false | true | Service의 {port} 포트 번호에 대한 LB 헬스 체크 사용 여부를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-protocol | All | TCP | TCP, HTTP | TCP | Service의 {port} 포트 번호에 대한 LB 헬스 체크 프로토콜을 지정 |
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-port | All | - | 1 - 65534 | 30000 | Service의 {port} 포트 번호에 대한 LB 헬스 체크 헬스 체크 포트를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-count | All | 3 | 1 - 10 | 3 | Service의 {port} 포트 번호에 대한 LB 헬스 체크 탐지 횟수를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-interval | All | 5 | 1 - 180 | 5 | Service의 {port} 포트 번호에 대한 LB 헬스 체크 주기를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-timeout | All | 5 | 1 - 180 | 5 | Service의 {port} 포트 번호에 대한 LB 헬스 체크 대기 시간을 지정 |
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-http-method | HTTP | GET | GET, POST | GET | Service의 {port} 포트 번호에 대한 LB 헬스 체크 HTTP method를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-url | HTTP | / | 문자열 | /healthz | Service의 {port} 포트 번호에 대한 LB 헬스 체크 URL을 지정 |
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-response-code | HTTP | 200 | 200 - 500 | 200 | Service의 {port} 포트 번호에 대한 LB 헬스 체크 응답 코드를 지정 |
| service.beta.kubernetes.io/scp-load-balancer-port-{port}-health-check-request-data | HTTP | - | 문자열 | username=admin&password=1234 | Service의 {port} 포트 번호에 대한 LB 헬스 체크 요청 문자열을 지정 |
표. Kubernetes 어노테이션에서 LB 헬스 체크 관련 설정
제약사항
Kubernetes 어노테이션 사용 시에 고려해야 할 제약사항은 다음과 같습니다.
| 제약사항 | 관련 어노테이션 |
|---|
| Security Group을 변경할 경우, 기존 Security Group에 생성된 규칙들은 자동 삭제되지 않음 | service.beta.kubernetes.io/scp-load-balancer-security-group-id service.beta.kubernetes.io/scp-load-balancer-security-group-name |
| Load Balancer의 서비스 구분(L4/L7)을 변경할 수 없음 | service.beta.kubernetes.io/scp-load-balancer-layer-type |
| 동일 k8s Service 내에서 L4과 L7을 함께 사용할 수 없음 | service.beta.kubernetes.io/scp-load-balancer-layer-type |
| Load Balancer 서브넷을 변경할 수 없음 | service.beta.kubernetes.io/scp-load-balancer-subnet-id |
| Load Balancer의 Service IP를 변경할 수 없음 | service.beta.kubernetes.io/scp-load-balancer-service-ip |
| LB Listener 응답 시간 초과는 활성화(1 - 120) 후 비활성화(0)로 변경할 수 없음 | service.beta.kubernetes.io/scp-load-balancer-response-timeout |
| 동일 k8s Service 내에서 같은 포트 번호로 TCP와 UDP를 함께 사용할 수 없음 | - |
L7 HTTP/HTTPS의 경우, 라우팅 액션은 URL 처리 Default 패턴("/")이 적용됨- 그외 URL 패턴을 추가하려면 Samsung Cloud Platform 콘솔에서 직접 추가해야 함
- URL 처리만 지원하며 URL 리디렉션은 지원하지 않음
| - |
표. Kubernetes 어노테이션 사용 시 제약사항
4 - 사용 시 고려사항
관리형 포트 제약사항
다음 포트들은 SKE 관리를 위해 사용되므로 서비스 이용에는 사용할 수 없습니다. 또한 OS 방화벽 등으로 차단하는 경우, 노드 기능 또는 일부 기능이 정상 작동하지 않을 수 있습니다.
| 포트 | 설명 |
|---|
| UDP 4789 | calico-vxlan |
| TCP 5473 | calico-typha |
| TCP 10250 | kubelet |
| TCP 19100 | node-exporter |
| TCP 19400 | dcgm-exporter |
표. 관리형 포트 목록
kube-reserved 리소스 제약사항
kube-reserved는 노드에서 파드로 실행되지 않는 시스템 데몬에 대한 리소스를 확보하기 위해 예약해두는 기능입니다.
- 파드로 실행되지 않는 시스테 데몬에는 kubelet, container runtime 등이 있습니다.
참고
kube-reserved에 대한 자세한 사항은 다음 문서를 참고하세요.
Kubernetes Engine은 다음과 같은 기준으로 CPU 및 메모리를 예약합니다.
| CPU 사양 | 메모리 사양 |
|---|
| - 다음 4 GB 메모리의 20% (최대 8 GB)
- 다음 8 GB 메모리의 10% (최대 16 GB)
- 다음 112 GB 메모리의 6% (최대 128 GB)
|
표. CPU 및 메모리 기준 리소스 예약 항목
예시: vCPU 16코어, Memory 32G Virtual Server의 경우, kube-reserved는 다음과 같이 계산됩니다.
- CPU: (1코어 × 0.06) + (1코어 × 0.01) + (2코어 × 0.005) + (12코어 × 0.0025) = 0.11코어
- 메모리: (4 GB × 0.25) + (4 GB × 0.2) + (8 GB × 0.1) + (16 GB × 0.06) = 3.56 GB
예시: CPU 크기에 따라 예약되는 리소스는 다음과 같습니다.
| CPU 사양 | 리소스 사양1 | 리소스 사양2 | 리소스 사양3 | 리소스 사양4 |
|---|
| kube-reserved CPU | 70 m | 80 m | 90 m | 110 m |
표. CPU 크기에 따라 예약되는 리소스 예시
- 예시: 메모리 크기에 따라 예약되는 리소스는 다음과 같습니다.
| 메모리 사양 | 리소스 사양1 | 리소스 사양2 | 리소스 사양3 | 리소스 사양4 | 리소스 사양4 | 리소스 사양4 | 리소스 사양4 |
|---|
| kube-reserved 메모리 | 1 GB | 1.8 GB | 2.6 GB | 3.56 GB | 5.48 GB | 9.32 GB | 11.88 GB |
표. 메모리 크기에 따라 예약되는 리소스 예시
5 - 버전 정보
Kubernetes 버전 및 지원 기간
Kubernetes 버전 수명 주기
Kubernetes 오픈소스 소프트웨어(OSS) 커뮤니티는 연 3회 마이너 버전을 출시하며, 출시 주기는 약 15주입니다.
출시된 마이너 버전은 약 14개월(표준 패치 12개월, 유지보수 2개월)의 지원 기간을 거쳐 EOL(End of Life)이 됩니다.
안내
Kubernetes 출시 및 EOL 시기, 지원 기간에 대해서는 다음 링크를 참고하세요.
SKE는 출시된 OSS 마이너 버전 중 Stable 상태의 패치 버전을 검증하여 제공합니다. 따라서 SKE에서 제공하는 버전의 출시 시점은 동일 OSS 버전 출시 시점과 차이가 있습니다.
또한 기존 출시된 버전의 경우, 오픈소스 EOL 시기 등을 고려하여, 오래된 버전부터 순차적으로 기술 지원이 종료(End of Tech support, EoTS)됩니다.
OSS와 SKE의 출시 일정 및 종료 일정은 다음과 같습니다.
| 버전 | OSS 출시 | OSS EOL | SKE 출시 | SKE EoTS |
|---|
| v1.29 | 2023-12-13 | 2025-02-28 | 2024-10 | 2026-03-31 |
| v1.30 | 2024-04-17 | 2025-06-28 | 2025-02 | 2026-06-30 |
| v1.31 | 2024-08-13 | 2025-10-28 | 2025-07 | 2026-10-28 |
| v1.32 | 2024-12-11 | 2026-02-28 | 2025-10 | 2027-02-28 |
| v1.33 | 2025-04-23 | 2026-06-28 | 2025-12 | 2027-06-28 |
표. OSS와 SKE의 출시 및 종료 일정
기술 지원 종료(EoTS) 시 기능 제한
SKE에서 제공 중인 Kubernetes 버전이 기술 지원 종료(EoTS) 상태가 되면, 해당 버전에서 지원되는 기능이 제한될 수 있습니다.
- 신규 클러스터 생성 → 생성 불가
- 기존 클러스터 업그레이드 → 업그레이드 가능 (상위 버전이 EoTS라도 업그레이드 가능)
- 기존 클러스터에서 노드 풀 생성 → 생성 가능
참고
- EOL 버전에는 취약점이 있을 수 있으므로, 상위 버전으로 업그레이드하는 것을 권장합니다.
- Samsung Cloud Platform Console에서 제어 영역과 노드 풀을 업그레이드 할 수 있으며, 업그레이드에 따른 별도의 비용은 발생하지 않습니다.
- 안정적인 운영을 위해, 업그레이드 진행 전 업그레이드 버전에 대한 호환성 테스트를 먼저 수행하세요.
OS 및 GPU 드라이버
K8s 서버 유형별로 사용할 수 있는 OS 및 GPU 드라이버 버전 정보는 다음과 같습니다.
주의
- K8s 버전별 제공되는 OS 버전은 상이할 수 있습니다.
- GPU 노드 사용 시, 관련 K8s 컴포넌트 (nvidia-device-plugin, dcgm-exporter)가 클러스터에 기본 구성됩니다.
- gpu-operator 배포 시, 컴포넌트 중복 구성으로 인한 충돌이 발생할 수 있습니다. 기본 제공 컴포넌트를 제외하고 배포 및 사용을 권장합니다.
| k8s 버전 | Standard 및 High Capacity | GPU |
|---|
| v1.29 | | - Ubuntu 22.04 (nvidia-535.183.06)
|
| v1.30 | | - Ubuntu 22.04 (nvidia-535.183.06)
|
| v1.31 | | - Ubuntu 22.04 (nvidia-535.183.06)
|
| v1.32 | | - Ubuntu 22.04 (nvidia-535.183.06)
|
| v1.33 | | - Ubuntu 22.04 (nvidia-535.183.06)
|
표. K8s 버전 및 서버 유형별 OS / GPU 드라이버 버전