ingrss 란 여러가지 조건에 따라 트래픽 라우팅을 설정해 주는 서비스이다.

AWS 로 예를들면 ALB 와 동일하다고 생각하면 된다. 

설정할 수 있는 조건으로는 host 와 path 등이 있고, ingress 를 사용하기 위해서는 ingress-controller 가 설치 되어 있어야 한다.


예제

  • Nginx Deployment 와 Service 가 Cluster 내부에서 기동 중
  • ingress controller 를 사용하여 외부에서 내부의 Nginx 서비스로 접근
  • Nginx ingress controller 는 아래의 경로를 통해 설치 

nginx ingress controller

https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters

 

Installation Guide - Ingress-Nginx Controller

Installation Guide There are multiple ways to install the Ingress-Nginx Controller: with Helm, using the project repository chart; with kubectl apply, using YAML manifests; with specific addons (e.g. for minikube or MicroK8s). On most Kubernetes clusters,

kubernetes.github.io

 


  • Deploy, Service, Ingress 배포
  • 배포 후 Nginx-ingress-controller 의 서비스 인 ingress-nginx-controller 의 ip:port 형식으로 호출하여야 한다
  • ingress 에서 path 를 /test 로 설정하였으므로, 호출시 ip:port/test 를 하면 클러스터 내부의 nignx 응답을 받을 수 있다
---
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  ports:
  - port: 31100
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
---
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /test
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 31100
  • 제 횐경에서의 ingress-nginx-controller 는 30303 포트이므로 NodeIP:30303/test 를 하게되면 ingress 를 통해서 nignx 가 호출 된다

'k8s > CKAD' 카테고리의 다른 글

NetworkPolicy 개념 정리  (0) 2024.01.20
[CKAD] Secret 생성 후 Pod 에 env 로 사용  (0) 2023.12.01
[CKAD]k8s Job / CronJob  (0) 2023.09.10
[CKAD]Docker image build  (0) 2023.09.09

 

k8s 내부에서 pod 간의 통신을 제어할때 NetworkPolicy 를 사용하여 제어 할 수 있다.

간단한 예로 NetworkPolicy 적용 예를 살펴 보자


조건

1. 파드명이 db인 파드와 web인 파드가 있다

2. 파드명이 db인 파드는 파드명이 web  에서 오는 통신만 허용 하여야 한다

 


상세설명

[db pod yaml]

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    app: db
  name: db
  namespace: np-test
spec:
  containers:
  - image: nginx
    name: db

 

[web pod yaml]

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
  namespace: np-test
spec:
  containers:
  - image: nginx
    name: web

 

[NetworkPolicy]

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: np-test
spec:
  podSelector:
    matchLabels:
      app: db
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: web
  • NetworkPolicy 의 spec.podSelector 는 대사이 되는 파드를 지정하는 곳이다
  • matchLabels 가 app: db 로 설정 되어 있는내용은, 레이블 값이 app: db 인 파드는 아래 policy 의 정책을 적용 받는다 라는 내용이다
  • policyTypes 는 Ingress, Egress 조건을 지정한다
  • spec.ingress.from.podSelector 부분은 ingress 를 허용할 조건을 가진 파드를 명시한다
  • matchLabels 가 app: web 으로 되어 있는 부분은, 레이블 값이 app: web 인 파드만 위에 명시된 app: db 가 포함된 파드에 트래픽을 허용한다

위에 명시된 yaml 파일을 전부 배포후 테스트

 

1. web pod 에서 db pod 로 통신 확인

2. NetworkPolicy 에서 ingress 부분 삭제 후 통신 여부 테스트

- 아래 처럼 spec.ingress.from.podSelector를  app:was 로 설정하면 app: was 레이블을 가진 파드만 db 파드로 통신이 허용됨

- 아래 yaml로 NetworkPolicy 배포(수정) 후 통신 확인

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: np-test
spec:
  podSelector:
    matchLabels:
      app: db
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: was

 

NetworkPolicy 수정

 

아래와 같이 동일한 명령어지만 통신이 불가 한 것을 확인 할 수 있다

'k8s > CKAD' 카테고리의 다른 글

ingress 개념 정리  (1) 2024.01.21
[CKAD] Secret 생성 후 Pod 에 env 로 사용  (0) 2023.12.01
[CKAD]k8s Job / CronJob  (0) 2023.09.10
[CKAD]Docker image build  (0) 2023.09.09

조건

Secret Name : my-secret

Secret Key : MySecret

Secret Value : SecretValue

 

Pod Name : env-secret-pod

Pod Image : Nginx

 


 

1. Secret 생성

kubectl create secret generic my-secret --from-literal=MySecret=SecretValue

 

 

2. Pod 생성

apiVersion: v1
kind: Pod
metadata:
  name: env-secret-pod
spec:
  containers:
  - name: envars-secret-container
    image: nginx
    env:
    - name: SECRET_NAME
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: MySecret

 

 

3. 결과 확인

kubectl exec env-secret-pod -- env

 

 

참고자료

https://kubernetes.io/docs/tasks/inject-data-application/distribute-credentials-secure/

 

Distribute Credentials Securely Using Secrets

This page shows how to securely inject sensitive data, such as passwords and encryption keys, into Pods. Before you begin You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. It is re

kubernetes.io

https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#-em-secret-generic-em-

'k8s > CKAD' 카테고리의 다른 글

ingress 개념 정리  (1) 2024.01.21
NetworkPolicy 개념 정리  (0) 2024.01.20
[CKAD]k8s Job / CronJob  (0) 2023.09.10
[CKAD]Docker image build  (0) 2023.09.09

Job / Cron Job 은 일반적으로 시스템의 batch 에 해당하는 항목이다.

Job 은 단순 batch 파일 / Cron Job 은 Cron Job 에 해당

 

<Sample> Job : 파이의 주기율을 2000번째까지 구하는 코드

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

일반적으로 사용되는 옵션 설멍

restartPolicy = OnFailure : 파드가 비정상적으로 종료 되었을때, 파드는 실패한 노드에서 재실행 

restartPolicy = Never : Job 완료 시 다시 실행 하지 않음, 작업이 실패 되었을때 스케줄러에 의해 재실행

backoffLimit = N : 작업 실패 시 N 번만큼만 재실행

parallelism = N : Job 파드를 병렬로 N 개 실행 한다(동시에 N 개 까지 수행 가능)

completions = N : 작업 완료된 후 N 번 수행(완료 -> 재실행 -> 완료 -> 재실행 -> .....-> N 번)

activeDeadlineSeconds : 제한시간

 

CronJob Schedule : "* * * * *"

  • Min
  • Hours
  • Day
  • Month
  • Da of the week (요일)

 

 

https://kubernetes.io/ko/docs/concepts/workloads/controllers/job/

 

잡에서 하나 이상의 파드를 생성하고 지정된 수의 파드가 성공적으로 종료될 때까지 계속해서 파드의 실행을 재시도한다. 파드가 성공적으로 완료되면, 성공적으로 완료된 잡을 추적한다. 지정

kubernetes.io

 

'k8s > CKAD' 카테고리의 다른 글

ingress 개념 정리  (1) 2024.01.21
NetworkPolicy 개념 정리  (0) 2024.01.20
[CKAD] Secret 생성 후 Pod 에 env 로 사용  (0) 2023.12.01
[CKAD]Docker image build  (0) 2023.09.09

Docker Image Build

  사용자가 원하는 Docker image 를 생성하기 위해 Dockerfile 로 직접 만들 수 있다.

 

 

Dockerfile 생성

  vi dockerfile 로 아래와 같은 구문의 텍스트 작성

FROM centos:7.5.1804
RUN yum install httpd -y
RUN echo "hello" > /var/www/html/index.html
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]

   명령어 참고

  • From : docker 를 생성할 base image 로써 일반적으로 dockerhub 에 있는 이미지를 주로 사용(centos, ubuntu, nodejs, python 등)
  • WORKDIR : 쉘의 cd 명령어와 동일한 기능으로, 작업 디렉토리를 정할때 사용
  • RUN : 쉘에서 커맨드를 실행하는 것과 동일한 기능
  • ENTRYPOINT : 컨테이너가 실행될때 수행되는 커맨드를 지정할때 사용. 이 커맨드로 실행된 프로세스가 죽을때 컨테이너가 같이 종료됨
  • CMD : 이미지를 컨테이너로 띄울때 실행할 커맨드를 지정
  • EXPOSE : 컨테이너 리스닝 포트를 지정할때 사용. docker run -p 옵션과 동일한 기능

 

Docker image buld

  Dockerfile 이 있는 경로에서 아래 명령어 수행

  -t 옵션으로 태그를 지정할 수 있다

docker build -t web:v1 .

  명령어 수행 후 이미지 생성 확인

 

Docker run

  생성한 이미지가 정상적으로 실행 되는지 확인

##web 이미지 실행
docker run -d --name web web:v1

##web 이미지 실행 확인
docker ps -a | grep web

##web 이미지 IP 정보 확인
docker inspect web | grep -i ipaddress

  curl 명령어를 사용하여 이미지 검증

'k8s > CKAD' 카테고리의 다른 글

ingress 개념 정리  (1) 2024.01.21
NetworkPolicy 개념 정리  (0) 2024.01.20
[CKAD] Secret 생성 후 Pod 에 env 로 사용  (0) 2023.12.01
[CKAD]k8s Job / CronJob  (0) 2023.09.10

+ Recent posts