Freesunny

kubectl 자동 완성

Kubernetes

# bash

source <(kubectl completion bash) # bash-completion 패키지를 먼저 설치한 후, bash의 자동 완성을 현재 셸에 설정한다
echo "source <(kubectl completion bash)" >> ~/.bashrc # 자동 완성을 bash 셸에 영구적으로 추가한다

 

# zsh

source <(kubectl completion zsh)  # 현재 셸에 zsh의 자동 완성 설정
echo "if [ $commands[kubectl] ]; then source <(kubectl completion zsh); fi" >> ~/.zshrc # 자동 완성을 zsh 셸에 영구적으로 추가한다.

 

 

참고 링크 : https://kubernetes.io/ko/docs/reference/kubectl/cheatsheet/

 

kubectl 치트 시트

 

kubernetes.io

실행되고 있는 pod 를 node 기준으로 sort 하여 보고 싶을 때

Kubernetes

실행되고 있는 pod 를 node 기준으로 sort 하여 보고 싶을 때

 $ kubectl get pods -n <namespace> -o wide --sort-by=.spec.nodeName

 

kubernetes 노드 변경

Kubernetes

한대의 노드가 정상적이지 않은 것 같아서 새로운 노드를 추가하고 문제있는 노드를 제거 하였다.

 

AWS를 사용하고 있고, 오토스케일링 그룹에 속해있는 노드라서, 

오토스케일링 그룹에 신규 인스턴스가 추가 되도록 Desired Capacity 를 추가한다.

 

<추가된 인스턴스 상태 >

$ kubectl get nodes
ip-172-31-16-133.ap-northeast-2.compute.internal   Ready    <none>   16m   v1.12.7
ip-172-31-24-205.ap-northeast-2.compute.internal   Ready    <none>   82d   v1.12.7
ip-172-31-33-98.ap-northeast-2.compute.internal    Ready    <none>   27s   v1.12.7
ip-172-31-42-90.ap-northeast-2.compute.internal    Ready    <none>   82d   v1.12.7
ip-172-31-47-233.ap-northeast-2.compute.internal   Ready    <none>   16m   v1.12.7

 

 

문제 있는 노드(ip-172-31-42-90.ap-northeast-2.compute.internal)가 스케쥴링 되지 않도록 설정

$ kubectl cordon ip-172-31-42-90.ap-northeast-2.compute.internal
node/ip-172-31-42-90.ap-northeast-2.compute.internal cordoned

$ kubcectl get nodes                                           
NAME                                               STATUS                     ROLES    AGE     VERSION
ip-172-31-16-133.ap-northeast-2.compute.internal   Ready                      <none>   24m     v1.12.7
ip-172-31-24-205.ap-northeast-2.compute.internal   Ready                      <none>   82d     v1.12.7
ip-172-31-33-98.ap-northeast-2.compute.internal    Ready                      <none>   8m24s   v1.12.7
ip-172-31-42-90.ap-northeast-2.compute.internal    Ready,SchedulingDisabled   <none>   82d     v1.12.7
ip-172-31-47-233.ap-northeast-2.compute.internal   Ready                      <none>   24m     v1.12.7

 

 

문제 있는 노드 제거

$ kubectl drain ip-172-31-42-90.ap-northeast-2.compute.internal --ignore-daemonsets --delete-local-data
node/ip-172-31-42-90.ap-northeast-2.compute.internal already cordoned
WARNING: Ignoring DaemonSet-managed pods: aws-node-bjrrv, kube-proxy-stgz4, prometheus-node-exporter-lt9ls; 
Deleting pods with local storage: metrics-server-7fbd9b8589-qjkvg, monitoring-influxdb-5c5bf4949d-fshbn

 

오토스케링링 그룹에서 문제 있는 노드(인스턴스)를 제거 (인스턴스가 제거 되고, 새로운 인스턴스가 추가됨)

 

인스턴스 삭제

 

오토 스케일링 Desired Capacity 원래대로 축소

쿠버네티스 대시보드 편하게 접속하기(#1)

Kubernetes

EKS로 쿠버네티스 클러스터를 셋팅하였는데, kubeproxy 를 로컬에 띄어서 로컬로 접속하는 방식인데, 
서버를 통해서 접속하는 방식으로 바꿨다. 

<변경 사유>

  • 매번 명령을 실행시키기 번거롭다.
  • 여러 개의 클러스터를 관리해야 한다. (aws 계정도 여러 개 사용)
  • HTTPS를 사용하고 싶다.
  • 사내에 사용가능한 리눅스가 있다.
  • 사용빈도가 매우 높지 않다.
  • 비용을 쓰고 싶지 않다. (ELB로 접속하는 방식이 있으나...)

대시보드에 ELB를 붙여서 접속하는 방법도 있으나, 비용적인 부분과 사용빈도가 크지 않기 때문에,
사내에 있는 linux 를 x통해서, 접속하는 방식으로 변경해 보았다.

 

접속도

 

 

여러 개의 계정과 여러 개의 클러스터를 관리해야 하기 때문에, docker container 를 통해서 구축 하였다.

파일 : build/Dockerfile

FROM ubuntu:latest

RUN apt-get update && apt-get install -y curl ca-certificates python python-pip vim
RUN pip install awscli

RUN apt-get update && apt-get install -y apt-transport-https
RUN curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
RUN echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | tee -a /etc/apt/sources.list.d/kubernetes.list
RUN apt-get update
RUN apt-get install -y kubectl

ARG SECRET_ID
ARG SECRET_KEY
ARG REGION
ARG CLUSTER

RUN mkdir -p /root/.aws
RUN echo "[default]" > /root/.aws/credentials
RUN echo "aws_access_key_id=$SECRET_ID" >> /root/.aws/credentials
RUN echo "aws_secret_access_key=$SECRET_KEY" >> /root/.aws/credentials
RUN echo "region=$REGION" >> /root/.aws/credentials
RUN aws eks update-kubeconfig --region $REGION --name $CLUSTER

패키지 업데이트, awscli, kubectl 설치

(변수로 받아서)credentials 파일 생성, (변수로 받아서) kubeconfig 생성

 

파일 : docker-compose.yaml

version: '3.5'
services:
 eks-kubeproxy:
  build:
   context: ./build
   dockerfile: Dockerfile
   args:
    SECRET_ID: "XXXXXXXXXXXXXXXXXXXX"
    SECRET_KEY: "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
    REGION: "ap-northeast-2"
    CLUSTER: "eks-cluster"
  image: eks-cluster
  restart: always
  ports:
   - "8080:8080"
  command: >
   bash -c "kubectl proxy --port=8080 --address=0.0.0.0 --disable-filter=true &"

 

 

docker-compose build & 실행

# docker-compose build
# docker-compose up -d

'Kubernetes' 카테고리의 다른 글

kubernetes 노드 변경  (0) 2019.08.05
nodeAffinity 를 이용하여 pod 를 원하는 노드에 배포하기  (0) 2019.07.31
Service 재시작 하기  (0) 2019.07.25
EKS 쿠버네티스 대시보드 접속  (0) 2019.07.23
Pod 재시작 하기  (0) 2019.07.15

Service 재시작 하기

Kubernetes

아래의 명령으로 Service 를 재시작할 수 있다.

# kubectl get svc <service_name> -n <namespace> -o yaml | kubectl replace --force -f-

Pod 재시작 하기

Kubernetes

아래의 명령으로 pod 를 재시작할 수 있다.

# kubectl get pod <pod_name> -n <namespace> -o yaml | kubectl replace --force -f-

# 예)
# kubectl get pod heapster-c84bf57d9-j5p5q -n kube-system -o yaml | kubectl replace --force -f- 

 

 

쿠버네티스에서 컨테이너 네임, 이미지 출력

Kubernetes

쿠버네티스에서는 pod 단위로 관리하는데, 컨테이너에 대한 정보를 출력하고 싶다면 다음의 명령을 입력하면 됩니다.

# kubectl get po -o jsonpath='{range .items[*]}{"pod: "}{.metadata.name}{"\n"}{range .spec.containers[*]}{"\tname: "}{.name}{"\n\timage: "}{.image}{"\n"}{end}'