가시다님의 스터디 PKOS(Production Kubernetes Online Study)를 시작하게 되었다!

PKOS 스터디는 ‘24단계 실습으로 정복하는 쿠버네티스’ 책 내용을 기반으로 진행된다 😊

Untitled

본 스터디는 kops (Kubernetes Operations) 도구를 통해 AWS에서 k8s 클러스터를 구축, 관리, 운영하게 된다

k8s 프로비저닝 도구

클러스터 프로비저닝 도구로는 Kops, Kubespray, Kubeadm, Minikube 등이 있는데 각각의 장단점이 달라서 자신의 유스케이스에 따라 도구를 선택하면 된다.

  Kops Kubespray Kubeadm Minikube
? AWS 최적화 Ansible 기반, 멀티클라우드 지원 kubernetes에서 제공하는 기본적인 도구 로컬 개발 및 테스트용
node 멀티노드 멀티노드 멀티노드 단일노드
setup kops kubespary kubeadm minikube

kopskubespary는 운영 차원에서 간편하게 클러스터를 관리할 수 있는 자동화 도구이고,

kubeadm은 클러스터를 부트스트랩하는 도구로 클러스터 구축할 때 간편하지는 않다.

minikube는 말그대로 테스트 용도로만 적합하다.

kops로 aws에서 k8s 클러스터 구축

Untitled 1

그림 출처 ) 가시다님 노션 제공

위 실습 구성도대로 클러스터를 구축했다

  • kops-ec2 : 배스천 서버로, kops를 설치하여 클러스터를 구축하고 kubectl 명령을 수행
  • s3 : k8s 설정 파일 저장
  • 버전 : k8s v1.24.10, OS Ubuntu 20.04 LTS
  • Control Plane과 Node는 EC2 Auto Scaling Group(=ASG) 설정으로 구성
  • 퍼블릭 도메인 구매하여 사용

생성된 kubeconfig로 lens 접속

kops로 클러스터 구축하는 과정은 생략하겠다…(ㅎㅎ)

kops로 클러스터를 구축하면서 kubeconfig는 자동으로 생성되었다

[root@kops-ec2 ~]# cat ~/.kube/config
	apiVersion: v1
	clusters:
	- cluster:
	    certificate-authority-data: [certificate-authority-data]
	    server: https://api.yooga.in
	  name: yooga.in
	contexts:
	- context:
	    cluster: yooga.in
	    user: yooga.in
	  name: yooga.in
	current-context: yooga.in
	kind: Config
	preferences: {}
	users:
	- name: yooga.in
	  user:
	    client-certificate-data: [client-certificate-data]
	    client-key-data: [client-key-data]

그래서 이 kubeconfig로 lens 접속하려 하니,,

분명 클러스터를 구축한 당시에는 kops-ec2(배스천서버) → k8s api server로 접근이 됐었는데,,,

kubeconfig 다운받으려니 갑자기 아래와 같이 권한이 없다는 에러를 뱉는다.

[root@kops-ec2 ~]# kubectl get nodes -v6
	I0325 16:08:13.665555   13638 loader.go:373] Config loaded from file:  /root/.kube/config
	I0325 16:08:13.740641   13638 round_trippers.go:553] GET https://api.yooga.in/api?timeout=32s 401 Unauthorized in 74 milliseconds
	E0325 16:08:13.740943   13638 memcache.go:265] couldn't get current server API group list: the server has asked for the client to provide credentials
	I0325 16:08:13.740960   13638 cached_discovery.go:120] skipped caching discovery info due to the server has asked for the client to provide credentials
	I0325 16:08:13.742184   13638 round_trippers.go:553] GET https://api.yooga.in/api?timeout=32s 401 Unauthorized in 1 milliseconds
	E0325 16:08:13.742397   13638 memcache.go:265] couldn't get current server API group list: the server has asked for the client to provide credentials
	I0325 16:08:13.742410   13638 cached_discovery.go:120] skipped caching discovery info due to the server has asked for the client to provide credentials
	I0325 16:08:13.742435   13638 shortcut.go:100] Error loading discovery information: the server has asked for the client to provide credentials
	I0325 16:08:13.743416   13638 round_trippers.go:553] GET https://api.yooga.in/api?timeout=32s 401 Unauthorized in 0 milliseconds
	E0325 16:08:13.743623   13638 memcache.go:265] couldn't get current server API group list: the server has asked for the client to provide credentials
	I0325 16:08:13.743635   13638 cached_discovery.go:120] skipped caching discovery info due to the server has asked for the client to provide credentials
	I0325 16:08:13.784823   13638 round_trippers.go:553] GET https://api.yooga.in/api?timeout=32s 401 Unauthorized in 41 milliseconds
	E0325 16:08:13.785080   13638 memcache.go:265] couldn't get current server API group list: the server has asked for the client to provide credentials
	I0325 16:08:13.785094   13638 cached_discovery.go:120] skipped caching discovery info due to the server has asked for the client to provide credentials
	I0325 16:08:13.786286   13638 round_trippers.go:553] GET https://api.yooga.in/api?timeout=32s 401 Unauthorized in 1 milliseconds
	E0325 16:08:13.786514   13638 memcache.go:265] couldn't get current server API group list: the server has asked for the client to provide credentials
	I0325 16:08:13.786527   13638 cached_discovery.go:120] skipped caching discovery info due to the server has asked for the client to provide credentials
	I0325 16:08:13.786667   13638 helpers.go:246] server response object: [{
	  "metadata": {},
	  "status": "Failure",
	  "message": "the server has asked for the client to provide credentials",
	  "reason": "Unauthorized",
	  "details": {
	    "causes": [
	      {
	        "reason": "UnexpectedServerResponse",
	        "message": "unknown"
	      }
	    ]
	  },
	  "code": 401
	}]
	error: You must be logged in to the server (the server has asked for the client to provide credentials)

(원래 admin 권한이었을거같지만) admin 권한으로 다시 kubeconfig를 생성하고 확인해 보면

참고 문서 ) Kops export kubeconfig - kOps - Kubernetes Operations

[root@kops-ec2 ~]# kops export kubeconfig --name yooga.in --admin
	kOps has set your kubectl context to yooga.in
[root@kops-ec2 ~]# cat ~/.kube/config
	apiVersion: v1
	clusters:
	- cluster:
	    certificate-authority-data: [certificate-authority-data]
	    server: https://api.yooga.in
	  name: yooga.in
	contexts:
	- context:
	    cluster: yooga.in
	    user: yooga.in
	  name: yooga.in
	current-context: yooga.in
	kind: Config
	preferences: {}
	users:
	- name: yooga.in
	  user:
	    client-certificate-data: [client-certificate-data]
	    client-key-data: [client-key-data]

users.user에서 client-certificate-data, client-key-data 이 두 가지 값이 바뀌었다.

그리고 k8s에 접근도 잘된다.

[root@kops-ec2 ~]# kubectl cluster-info
	Kubernetes control plane is running at https://api.yooga.in
	CoreDNS is running at https://api.yooga.in/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
	
	To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'

이제 이 kubeconfig로 lens에 접속! 후후

Untitled 2

Untitled 3

+) kops export kubeconfig duration

kops export kubeconfig하면 기본 18h로 duration이 잡혀 있어서 그 이후엔 크레덴셜이 만료되고 Unauthorized 에러가 발생한다.

공식 문서 참고 ) Kops export kubeconfig - kOps - Kubernetes Operations

kops export kubecfg --admin=87600h

이 때 위와 같은 값을 넣어주면 10년이나 더 쓸 수 있다 ㅋㅋ

참고 ) kops export kubeconfig with no diminishing TTL

Leave a comment