반응형

 

 


작성일: 2024년 3월 21일

 

 

일반적으로 자주 사용하는 명령은 kubectl cheat sheet를 보는 것을 추천 !

  https://kubernetes.io/docs/reference/kubectl/cheatsheet/

 

 

Pod 이름 가져오기

$  kubectl get pod -l app=myapp  -o jsonpath='{.items[0].metadata.name}'
myapp-6c68579c55-xk6cm

 

Pod 내부에서 bash shell command 수행하기

Script 중간에 kubectl 명령을 이용하는 경우에

아래 예제처럼 --output=jsonpath 옵션을 활용하면 편하면서 복잡한 로직을 만들 수 있다.

##
## jsonpath를 이용하면, 복잡한 script를 작성할 때 편하다.
##

$  kubectl exec -it  -n myns  $(kubectl get  -n nrf  pod -l app=myapp --output=jsonpath="{.items[0].metadata.name}") -c mybox -- bash

 

 

 

Service 리소스의 Public IP address (EXTERNAL-IP) 값 가져오기

jsonpath 옵션을 사용해서 IP Address를 추출하기 전에

아래 명령 예제와 같이 JSON 포맷으로 전체 내용을 출력해본다.

이 전체 JSON 출력 내용을 보면, 내가 추출하고 싶은 Item의 JSON Path를 짐작할 수 있다.

예를 들어, Service resource의 IP "193.173.24.21" 값을 추출하고 싶다면

.status.loadBalancer.ingress 경로로 JSONPATH를 지정하면 된다.

$ kubectl get  -n myns  svc mysvc  -o json

{
    "apiVersion": "v1",
    "kind": "Service",
    "metadata": {

... 중간 생략 ...

    },
    "status": {
        "loadBalancer": {
            "ingress": [
                {
                    "ip": "193.173.24.21"
                }
            ]
        }
    }
}

$

 

위 JSON 전체 내용을 보고, JSONPATH를 확인 후 아래 명령을 입력한다.

 

$ kubectl get  -n myns  svc mysvc  --output=jsonpath="{.status.loadBalancer.ingress[0].ip}"

193.173.24.21

$

 

 

 


 

반응형

 

2019년 3월에 작성된 Web Docs이지만, 오늘(2021년 11월) 따라서 수행해봤는데 잘 동작한다.

 

 

https://kubernetes.io/blog/2019/03/15/kubernetes-setup-using-ansible-and-vagrant/

 

Kubernetes Setup Using Ansible and Vagrant

Author: Naresh L J (Infosys) Objective This blog post describes the steps required to setup a multi node Kubernetes cluster for development purposes. This setup provides a production-like cluster that can be setup on your local machine. Why do we require m

kubernetes.io

 

 

위 블로그를 읽으면서, 나한테 필요한 만큼 playbook을 다시 작성했다.

아래 Playbook의 내용을 간략하게 설명하면,

 

  1. Kubernetes Master Node에서  `kubeadm token create --print-join-command`를 수행하여 새로운 Node Join을 위한 `kubeadm join ....` 명령행을 생성하고,
    이렇게 얻은 kubeadm 명령행을 'join-command' 스크립트 파일에 Dump한다.
  2. 바로 위에서 얻은 'join-command'를 새롭게 추가할 Worker Node의 /tmp/join-command.sh 경로에 복사하고 실행(Run)한다.
    그러면 새로운 Worker Node가 Master Node에 추가(Join)될 것이다.

 

단, 아래 Playbook YAML 파일에서 inventory(즉, hosts를 정의한 항목)을 생략했으니까 그 부분을 감안하고 보면 좋을 듯~~~

 

 

## 위 Web docs에서 중요한 부분만 발췌했다.
## 원문 그대로는 아니고, 내가 필요한 만큼 각색했다.  

## Filename: my-playbook.yaml

- name: Joining Job Step 1 on Master node
  hosts: kubemaster
  tasks:
    - name: Generate join command
      command: kubeadm token create --print-join-command
      register: join_command
    - name: Copy join command to local file
      local_action: copy content="{{ join_command.stdout_lines[0] }}" dest="./join-command"

- name: Joining Job Step 2 on Worker node
  hosts: kubeworker
  tasks:
    - name: Copy the join command to server location
      copy: src=join-command dest=/tmp/join-command.sh mode=0777
    - name: Join the node to cluster
      command: sh /tmp/join-command.sh

 

반응형

 

작성일: 2024년 3월 1일

 

Pod 생성 방법 - A

급하게 Pod만 생성해서 Kubernetes 기능을 확인해야 할 경우가 있다.

이럴 때, 아래와 같이 명령 한번 실행해서 Pod를 deploy할 수 있다.

$ kubectl  create  deployment  nginx  --image=nginx

 

또는 아래와 같이  YAML 형식으로 Pod 배포가 가능하다.

 

Pod 생성 방법 - B

$  kubectl  create  namespace  andrew
$  kubectl  apply  -n andrew  -f -  <<EOF

apiVersion: v1
kind: Pod
metadata:
  name: almighty
  labels:
    app: almighty
spec:
  terminationGracePeriodSeconds: 3
  containers:
  - name: almighty
    image: docker.io/andrewloyolajeong/almighty:0.2.4
    
EOF

 

 

[ 참고 ]
docker.io/andrewloyolajeong/almighty 컨테이너 이미지 내부 동작에 대한 설명
    - NGINX 서버 구동 (TCP 80 포트를 Listening)
    - SSHD 서버 구동 (TCP 22 포트를 Listening)
    - Golang으로 구현한 Simple HTTP Server 구동 (TCP 8080 포트를 Listeing)
    - Golang으로 구현한 UDP 서버 구동 (UDP 9090, 9091, 9092 포트를 사용)

 

 

그런 후에 아래와 같이 Service Resource도 만들 수 있다.

 

Service 리소스 생성 방법

$  kubectl  apply  -n andrew  -f -  <<EOF

apiVersion: v1
kind: Service
metadata:
  name: almighty
  annotations:
    ## 아래 nlb 타입은 UDP 패킷을 LB 처리하기 위한 설정이다.
    ## 만약, UDP 패킷을 처리할 일이 없다면, "nlb" 타입을 지정하지 않아도 된다.
    oci.oraclecloud.com/load-balancer-type: "nlb"  ## Oracle Cloud를 사용하는 경우 설정
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local     ## Public Cloud를 사용하는 경우 설정
  selector:
    app: almighty
  ports:
    - name: myweb
      protocol: TCP
      port: 8080
      targetPort: 8080
    - name: yourweb
      protocol: TCP
      port: 1080
      targetPort: 80
    - name: myudp
      protocol: UDP
      port: 9090
      targetPort: 9090
  
EOF

 

PV 생성

진짜 간단하게 PV, PVC 생성에 관해서 작성하려고 했는데 Private Cloud 환경과 Public Cloud 환경에 따라 생성 방법이 다르고,

Public Cloud Infra를 제공하는 회사마다 Manifest 작성 방법이 다 달라서 이 부분은 아래와 같이 해당 Public Cloud Infra의 Web Docs 주소를 남기는 것으로 마무리하겠다.

가장 많이 사용되는 CSI[Cluster Storage Interface] 몇 가지 사례만 사용법을 익히면 될듯하다.

 

Oracle Cloud Infra를 사용한다면, 아래 Web Docs를 읽고 예제를 따라하면 잘 동작한다.

https://docs.oracle.com/en-us/iaas/Content/ContEng/Tasks/contengcreatingpersistentvolumeclaim.htm

 

Creating a Persistent Volume Claim (PVC)

When a PVC is created using the CSI volume plugin (provisioner: blockvolume.csi.oraclecloud.com), you can expand the volume size online. By doing so, you make it possible to initially deploy applications with a certain amount of storage, and then subsequen

docs.oracle.com

 

 

 

 

반응형

Kubernetes나 Docker를 이용해서 이것저것 사용하다보면, 나중에는 사용하지 않고 남아 있는 쓰레기 image들이 있다.

이것들을 한방에 지우는 스크립트를 작성했다.

 

아래 Script는 ":5000" 문자열을 포함하는 container image만 찾아서 지운다.

#!/usr/bin/bash

REMOVE_ITEM_LIST=$(docker image ls | grep ":5000" | awk '{ printf "%s:%s\n", $1, $2 }')

for REMOVE_ITEM in $REMOVE_ITEM_LIST
do
  echo "TO Remove:  $REMOVE_ITEM"
  docker image rm $REMOVE_ITEM
done

 

반응형

2022년 7월 현재, 아래 Red Hat 문서가 MetalLB BGP Mode에 관한 문서 중에서는 제일 설명이 잘 되어 있는 것 같다.

 

OCP(Openshift Container Platform)에서 BGP Mode의 MetalLB를 사용할 것이라면 아래 Red Hat Docs를 참고.

다루는 내용은 이렇다.

  • MetalLB, BGP, BFD에 관한 설명
  • BGP Mode의 MetalLB를 사용하기 위한 사전 요구 사항
  • 테스트 예시 환경 (그림 포함)
  • 테스트 해보기.
 

How to Use MetalLB in BGP Mode

The purpose of this article is to introduce MetalLB design and goals and cover in more detail this new mode.

content.cloud.redhat.com

 

 

 

 

위 Red Hat 문서를 찬찬히 읽어서 이해를 다 했다면, 굳이 아래 문서는 안 봐도 된다.

위 문서가 웬만한 것을 다 Cover하기도 하고, FRR(FR Routing) 같은 Router Emulator를 이용해서 실질적으로 실습환경도 잘 설명하고 있어서 위 문서 1개로 스터디를 끝낼 수 있다.

 

 

도움이 될만한 Web Docs

MetalLB에서 BGP 모드를 사용하는 개념과 Network 구성에 관한 Web Docs이다.

그림과 예제를 이해하기 잘 작성했다.

 

 

 

MetalLB BGP 모드를 이용한 Loadbalaning

기본적인 구성은 아래와 같이 worker3대가 10.10.2.0/24의 인터페이스가 연결되어 있으며, 같은 네트워크에 BGP를 사용할 L3SW가 연결 되어 있다. 그리고 Client 는 172.16.100.0 대역대로 L3SW와 연결 되어 있

cyuu.tistory.com

 

'kubernetes' 카테고리의 다른 글

간단하게 Pod, Service, PV 리소스 생성하기  (0) 2021.11.03
Docker image 목록 한방에 지우기  (0) 2021.11.03
Istio Circuit Break  (0) 2021.08.07
Port configurations for Kubernetes service  (0) 2021.07.20
Dockerfile Example  (0) 2021.07.19
반응형

아래의 글이 쉽게 설명되어 있다. 시간될 때, 다시 꼼꼼하게 읽어봐야겠다.

 

참고: istio v1.2  kubernetes v1.14로 테스트한 과정이 설명되어 있다.

 

http://itnp.kr/post/istio-circuit-break

 

Istio Circuit Breaking

Circuit Breaking이란 전기의 회로차단기에서 차용한 개념으로 전기가 흐르다가 문제가 생기면 회로를 open하여 더이상 전기가 흐르지 않도록하여 문제가 되는 부분으로 부터 전체 시스템에 장애가

itnp.kr

 

반응형

Kubernetes service의 manifest를 작성하다보면, port와 targetport가 헷갈린다.

각 term이 의미하는 것을 지금 이해해도, 몇 개월 뒤에 다시 service resource에 대한 manifest를 작성하려고 보면 또 헷갈려서 다시 문서를 뒤적거리게 된다.

 

  • Port
    • Service Object 자체의 Port.  즉, 여러 Pod를 묶어서 이 Port 값으로 노출시킨다.
    • 한 kubernetes cluster 내에서 다른 pod가 내 pod에게 Layer 4 메시지를 전송할 때 바라보는 port number.
    • 만약 MetalLB, NGINX 같은 Ingress Gateway를 사용하는 경우라면, 이 'port' 값이 Cluster 외부에서 LB(즉, Ingress Gateway)를 통해 들어오는 Port number가 된다.
      예를 들어,   http://{EXTERNAL-IP}:{SERVICE-PORT}
      이런 형태가 된다.
  • TargetPort
    • 내 pod 안에 있는 container가 listening하고 있는 port number.
    • container(즉, app)이 어떤 port를 listening하고 있는지 정확한 값을 알고 설정해야 한다. (HTTPD 설정시 기본 값을 이용했다면, 대부분 80이지 않을까?)
  • NodePort
    • kubernetes 밖으로 노출시킬 port number.
    • Ingress Gateway 또는 Istio를 사용하는 경우에는 딱히 설정할 필요없는 설정 항목.

 

 

Example

만약 2개의 TCP Port를 Service로 오픈하고 싶다면, 아래와 같이 Service Resource와 Pod Resource를 설정한다.

 

##
## Service Manifest Example
##
kind: Service
metadata:
... 중간 생략 ...
spec:
  ports:
  - name: metrics
    port: 24231
    protocol: TCP
    targetPort: metrics
  - name: logfile-metrics
    port: 2112
    protocol: TCP
    targetPort: logfile-metrics
... 중간 생략 ...   
    


##
## Pod Manifest Example
##
kind: Pod
metadata:
... 중간 생략 ...
spec:
  containers:
    name: my-container  
    ports:
    - containerPort: 24231
      name: metrics
      protocol: TCP
    - containerPort: 2112
      name: logfile-metrics
      protocol: TCP
... 중간 생략 ...

'kubernetes' 카테고리의 다른 글

MetalLB BGP 모드를 이용한 Loadbalaning  (0) 2021.08.30
Istio Circuit Break  (0) 2021.08.07
Dockerfile Example  (0) 2021.07.19
Istio Web Docs - 읽기 좋은 순서대리 정리  (0) 2021.07.19
nsenter  (0) 2021.07.13
반응형

아래와 같은 형식으로 Dockerfile을 작성한다.

## syntax=docker/dockerfile:1


FROM ubuntu:18.04


## 이 Dockerfile 작성자
MAINTAINER sejong


## `apt install ...` 명령으로 패키지 설치시 사용자 입력을 요구하는 것을 방지
## 반드시 `apt install` 명령보다 앞에 DEBIAN_FRONTEND 환경 변수를 설정해야 한다.
ENV DEBIAN_FRONTEND=noninteractive


## 참고: 위 변수를 apt install 명령과 같이 방법도 있다. (아래 예시 참고)
##   `DEBIAN_FRONTEND=noninteractive apt install -y tzdata` 


RUN apt update

RUN apt install -y ca-certificates \
                   net-tools \
                   tzdata \
                   wget
                   
                   
## Timezone
ENV TZ Asia/Seoul


## Locale and Language
ENV LANG C.UTF-8
ENV LANGUAGE ko
ENV LC_ALL C.UTF-8


## 외부 Storage를 마운트하기 위한 정보
RUN mkdir  /mnt/my_volume
VOLUME     /mnt/my_volume


COPY  my-script.sh /usr/local/bin/my-script.sh
ENTRYPOINT ["my-script.sh"]


COPY . /app
RUN make /app
EXPOSE  8080
CMD python /app/app.py

 

Dockerfile을 작성한 후, docker image를 만들기 위해 아래와 같이 build 명령을 수행한다.

$ docker build -t myapp:v1 .

 

 

'kubernetes' 카테고리의 다른 글

Istio Circuit Break  (0) 2021.08.07
Port configurations for Kubernetes service  (0) 2021.07.20
Istio Web Docs - 읽기 좋은 순서대리 정리  (0) 2021.07.19
nsenter  (0) 2021.07.13
Kubernetes Port-Forward 설정  (2) 2021.07.10

+ Recent posts