KubeConfig
kubernetes api를 통해 요청을 보낼 때 인증 관련 정보를 함께 제출해야한다. 아래와 같이 단계적으로 커멘드의 길이를 줄일 수 있다.
server명이 playground-url이라는 전제하에 아래와 같이 요청 가능
curl <https://playground-url:6443/api/v1/pods> \\
-- cert=admin.crt
-- key=admin.key
-- cacert=ca.cert
kubectl을 통한 요청
kubectl get pods \\
-- server playground-url:6443
-- client-cert admin.crt
-- client-key admin.crt
-- certificate-authority ca.cert
인증 관련 정보를 모두 config 라는 파일에 저장한 후 이를 kubectl 명령시 마다 kubeconfig 옵션 값으로 함께 제출
kubectl get pods \\
-- kubeconfig [kubeconfig-file-name]
(조회)
kubectl get pods
⚠️ Kubernetes는 기본적으로 사용자 홈 디렉토리 아래에 `.kube` 라는 디렉토리 하위에 `config` (`$HOME/.kube/config`)라는 파일을 찾으므로, 해당 이름으로 저장해두었다면 `kubectl` 사용시 파일 경로를 명시적으로 작성하지 않아도 된다. (명시하는 경우 기본 경로에 있는 파일이 아니더라도 적용 가능)
⚠️ 파일을 저장한 상태로 두기만 하면된다. 다른 쿠버네티스 오브젝트들 처럼 오브젝트 생성이 필요하지 않다. `kubectl` 커맨드 사용시 알아서 해당 파일을 읽고 필요한 값을 사용한다.
kubeconfig 파일 양식
Cluster, User, Context 로 나뉜다.
- Cluster: 다양한 쿠버네티스 클러스터를 의미
- User: 클러스터들에 접근하기 위해 사용하는 User account
- Context: Cluster와 User를 결합한 것으로, 어떤 유저 계정을 통해 어떤 클러스터에 접근하는지를 명시한 것
- 예를 들어 Admin@Production은 Admin 사용자 계정으로 Production 클러스터에 접근한다는 의미
- 이미 존재하는 사용자와 클러스터에 관해 명시하는 것으로, 새로운 사용자를 생성하는 것이 아님
[예시]
apiVersion: v1
kind: Config
current-context: my-admin@my-playground
clusters:
- name: my-playground
cluster:
certificate-authority: /etc/kubernetes/pki/ca.crt
server: <https://my-playground:6443>
# certificate-authority-data 필드 사용시 base64 format으로 인코딩된 certificate 내용을 그대로 사용할 수 있다.
contexts:
- name: my-playground-admin@my-playground
context:
cluster: my-playground
user: my-playground-admin
namespace: finance
users:
- name: my-playground-admin
user:
client-certificate: /etc/kubernetes/pki/admin.crt
client-key: /etc/kubernetes/pki/admin.key
- `current-context` 필드를 통해 기본 컨텍스트를 정의할 수 있다.
- `cluster`, `users`, `contexts` 세 요소는 모두 array 타입으로 명시한다.
- `context.namespace` 를 통해 해당 컨텍스트로 변경할 경우 자동으로 명시한 네임스페이스를 이용하게 된다.
kubectl 커맨드를 통해 config 조회 및 수정
# view config file content(default config file)
kubectl config view
# view config file content which is defined
kubectl config view --kubeconfig=my-custom-config
# update current-context(it will be actually reflects in the file.)
kubectl config use-context
# ex. context: prod-user@production
kubectl config use-context prod-user@production
# view more option
kubectl config -h
`kubectl` 커맨드를 통한 생성 및 수정 등의 모든 동작은 그 결과가 파일에 반영된다.
API Groups
Kubernetes API는 기능에 따라 그룹으로 묶인다. 예를 들어 url을 통해 접근할 경우 버전 정보를 확인할 때에는 `https://[server-name]:[port]/version` 와 같이 요청을 보내야 하고, `kubectl get pods` 와 같은 기능을 이용하고자할 때에는 `https://[server-name]:[port]/api/v1/pods` 와 같이 요청을 보내야 한다.
/version
/api
/apis
/healthz
/logs
/metrics
⚠️ 만약 특정 그룹 하위에 어떤 요소들이 있는지 알고 싶으면 아래와 같이 조회할 수 있다.
curl https://[server-name]:[port]/apis -k | grep "name"
그러나 그냥 접속하면 접근 권한이 없어 요청에 실패할 것이다.
이 경우 certificate을 함께 제공하거나, kubectl proxy 서버를 시작하는 방법이 있다.
certificate를 제공하는 방법(key, cert, cacert)
curl https://localhost:6443/version -k --key /etc/kubernetes/pki/ca.key \
--cert /etc/kubernetes/pki/admin.crt \
--cacert /etc/kubernetes/pki/ca.crt
kubectl proxy 서버 열기
`kubectl proxy` 커맨드는 로컬 서버의 8001번 포트에 프록시 서버를 연다. 그리고 클러스터에 접근하기 위해 kube config 파일(default: `$HOME/.kube/config`)의 certificate 정보를 찾는다.
kubectl proxy
# Starting to serve on 127.0.0.1:8001
프록시 서버가 열리면 프록시 서버로 요청을 보내면 프록시 서버는 이를 로컬 쿠버네티스 서버로 전달한다. (이 때 자동으로 certificate은 kube config 파일을 이용)
⚠️ kube-proxy와 kubectl proxy는 다름!
- kube-proxy는 클러스터의 여러 노드에 걸쳐 파드와 서비스간의 통신을 활성화시켜주는 역할(이후에 보다 자세히 다룰 예정)
- kubectl proxy는 kubectl 유틸리티가 Kube API에 접근하기 위해 만든 ACTP 프록시 서비스이다.
Cf. 여기에서는 클러스터 성능을 책임지는 API에 중점을 두고 포스팅한다. 이에 해당하는 그룹은 /api (core group) 과 /apis (named group)로 나뉜다.
Core group(`/api`)
여기에는 모든 핵심 기능들이 속해있다.
/namespaces
/pods
/rc(replication controllers)
/events
/endpoints
/nodes
/bindings
/PV(Persistent Volumes)
/PVC(Persistent Volume Claims)
/configmaps
/secrets
/services
Named Group(`/apis`)
보다 체계화되어 있으며, 앞으로 사용가능해질 모든 새로운 기능은 해당 그룹을 통해 제공될 예정이다.
/apps
/extensions
/networking.k8s.io
/storage.k8s.io
/authentication.k8s.io(authentication)
/certificate.k8s.io(authorization)
...
'Kubernetes' 카테고리의 다른 글
k8s) Security - 4. Image Security, Security Contexts, (0) | 2024.03.10 |
---|---|
k8s) Security - 3. Authorization(RBAC, Cluster Role, Service Account) (0) | 2024.03.10 |
k8s) Security - 1. Kubernetes의 Authentication, TLS 구조 (0) | 2024.03.10 |
k8s) Cluster Maintenance (0) | 2023.11.17 |
k8s) Application Lifecycle Management (0) | 2023.11.17 |