그동안 뭐하고 지냈냐면... 

졸업하고 이것 저것 준비하다가 '베스핀글로벌테크센터' 에서 진행하는 클라우드 청년인재 양성과정에 참여하고 있다!

 

BDIA (busanit.or.kr)

 

 

BDIA

클라우드 청년인재 양성과정 현직 실무자 강사가 제공하는 실무중심 교퀄리티 강의, 기반 지식부터 현업 연계 실무 프로젝트까지 알찬 커리큘럼, 교육 훈련생 누적취업률 75%이상 베스핀글로벌

edu.busanit.or.kr

성적만 좋으면 취업 연계가 가능하기 때문에 일단 취준생으로서 급한 불을 끈 느낌이다. 

교육 지원 과정에서 자료가 너무 없어서 준비하느라 조금 힘들었다. 

 

지금은 매일 센텀시티에 있는 bdia 와서 교육을 듣는다.

혼자서라면 귀찮아서 못했을 공부, 실습이지만 사람들과 함께 하니 재밌다. 

 

공부도 재밌고 사람들도 좋고 나름대로 좋은 시간을 보내며 성장하고 있다고 생각한다.

 

아쉬운 점은 여자친구를 자주 못 본다는점...? (미안행)

강아지 산책도 못 시킨지 오래되었다.  

 

2개월 정도 수업을 들은 소감은 음.. . 후회 안남게 최선을 다하자?

 

수업 첫날에 자기 소개 겸 각오를 썼는데 이때까지 잘 지킨 것 같다.

 

앞으로 2달 동안 AWS SAP 를 준비할 생각이다. 

덤프만 외워서는 풀 수 없다고 판단, 깊게 공부하면서 준비할 것이다. 한번 열심히 해보겠습니다!!! 


239. Introduction to Deployment with Kubeadm

kubeadm 설치하기 

마스터 워커노드 정하기 

2. 컨테이너 설치

3. kubeadm 설치

4. 마스터노드 초기화

5. 파드네트워크 구성

6. 노드 합치기 


241. Deploy with kubeadm - Provision VMs with Vagrant

 

잠시 보류 하겠다. 연습문제나 풀자. 

 


243. Practice Test - Deploy a Kubernetes Cluster using Kubeadm

1. Install the kubeadm and kubelet packages on the controlplane and node01.

Use the exact version of 1.26.0-00 for both.

 

Container Runtimes | Kubernetes

 

Container Runtimes

Note: Dockershim has been removed from the Kubernetes project as of release 1.24. Read the Dockershim Removal FAQ for further details. You need to install a container runtime into each node in the cluster so that Pods can run there. This page outlines what

kubernetes.io

컨테이너 런타임 설치

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# sysctl params required by setup, params persist across reboots
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# Apply sysctl params without reboot
sudo sysctl --system

control plane, node01 동일하게 설치한다. 

리눅스 계열을 먼저 확인하자

cat /etc/*-release 

debian 계열이다.

Installing kubeadm | Kubernetes

 

Installing kubeadm

This page shows how to install the kubeadm toolbox. For information on how to create a cluster with kubeadm once you have performed this installation process, see the Creating a cluster with kubeadm page. Before you begin A compatible Linux host. The Kuber

kubernetes.io

2번째 단계에서 오류가 뜬다.

 

Note: In releases older than Debian 12 and Ubuntu 22.04, /etc/apt/keyrings does not exist by default. You can create this directory if you need to, making it world-readable but writeable only by admins.

 

/etc/apt/keyring 경로를 만들어야한다.

 

 

2. What is the version of kubelet installed?

 

 

3. How many nodes are part of kubernetes cluster currently? Are you able to run kubectl get nodes?

 

4.  Lets now bootstrap a kubernetes cluster using kubeadm.

The latest version of Kubernetes will be installed. 

 

kubeadm 으로 부트 스트랩 해보자

 

 

5. Initialize Control Plane Node (Master Node). Use the following options:

  1. apiserver-advertise-address - Use the IP address allocated to eth0 on the controlplane node

  2. apiserver-cert-extra-sans - Set it to controlplane

  3. pod-network-cidr - Set to 10.244.0.0/16

 

Once done, set up the default kubeconfig file and wait for node to be part of the cluster.

ip 확인

eth0를 보면 192.12.244.12/24 

cidr 는 10.244.0.1/24

이제 노드를 가져올 수 있다 .

 

6. Generate a kubeadm join token

 

Or copy the one that was generated by kubeadm init command

위 명령어에서 kubeadm 토큰 생성됨.

kubeadm join 192.12.244.12:6443 --token mqq4i8.usxdgtriyn085v78 \
        --discovery-token-ca-cert-hash sha256:00bdc46e9d70d4ea1d900713b05c91bf95d99a48451b8de5faae3faa1c1667f4 

 

7. Join node01 to the cluster using the join token

 

8. Install a Network Plugin. As a default, we will go with flannel


 

234. Design a Kubernetes Cluster

쿠버네티스 클러스터를 잘 구성하려면?

여러가지 질문 사항

목적에 따라 구성이 달라진다. 

교육 공부용으로 한다면 싱글 노드 

개발, 테스트용으로 한다면 멀티노드, 퍼블릭 클라우드 사용

 

Hosting Production Applications

 

Cloud or OnPrem?

클라우드를 쓸 건지 온프레미스를 쓸 것 인지

Storage

Nodes

 

Master Nodes

규모가 큰 클러스터에서는 etcd를 분리한다.

여러가지 요소들이 있다. 

간단한 프로비저닝을 해보자


235.  Choosing Kubernetes Infrastructure

쿠버네티스는 여러 곳에서 배포될 수 있다. 

 

Local 배포

리눅스 운영체제에서 배포가능, window에서는 가상머신 사용해서 배포해야한다. 

미니큐브, kubeadm 이 도와준다. 

turnkey , 호스티드 솔루션으로 나뉜다. 

여러 턴키 솔루션이 존재 

 

마스터 노드 하나 워커 노드 두개의 클러스터를 구성해보자 


236. Configure High Availability

마스터 노드가 터지면 어떻게 될까 ?

안된다. 

고가용성을 위해서는 마스터 노드 두개가 필요하다.

이때까지 마스터 노드 1개, 워커 노드 2개 클러스터를 다뤄왔다. 

마스터 노드에 집중해보자. 여러 컴포넌트들이 존재한다.

고가용성을 위해서는 똑같은 마스터 노드 두개를 설치한다. 

kube api server는 제일 통신을 많이 하는 곳 

로드 밸런서를 배치하고 적당히 통신 시킨다.

컨트롤러 매니저, 스케쥴러는 어떨까? 

파드의 상태를 확인하는 컴포넌트들이다.

액티브 모드와 스탠바이 모드로 나뉘어서 동작한다. 

리더 정하기 옵션

지속 시간도 정할 수 있다. 

엔드포인드를 통해서 액티브로 보낸다.

 

 

 

etcd는 어떨까?

etcd 를 호스트에 같이 담으면 설치, 관리 용이하지만 리스크가 존재한다. 

External ETCD Topology

etcd를 외부 서버에 빼서 운영한다. 

설치가 어렵긴하다. 

 

/etc/systemd/system/kube-apiserver.service 를 통해서 어느 ETCD를 사용하는지 알 수 있다. 

마스터 노드 두개 + 로드밸런서 하나

총 다섯개의 노드가 필요하다. 

 


237. ETCD in HA

etcd ha 모드를 배워보자

What is ETCD? 

 

etcd는 분산되 키-값 저장소이다 .

 

Key-value store

관계형 데이터 베이스

키-값 저장소는 doc, 페이지 단위로 데이터를 저장한다. 

한 페이지의 변화가 다른 페이지에 영향을 끼치지는 않는다. 

 

distributed

etcd 세대가 돌아가고 있다. 세 노드의 동일성을 어떻게 보장하는가? 

읽기 같은 경우 쉽다.

동시 두 곳에서 쓰기 작업이 일어난다면?

한쪽은 john, 한쪽은 joe 가 들어온다면?

모든 노드에서 똑같이 쓰기 작업이 가능한 것은 아니다. 

하나의 노드만 쓰기 작업을 허락한다. 

다른 노드로 쓰기 작업이 들어오면 리더 노드로 넘긴다. 

그 후 리더노드가 데이터를 나머지 두 노드로 보낸다. 

 

Leader Election - RAFT

랜덤 타이머를 사용해서 선출

최소 노드 개수 quorum

허용치가 있다. 

설치하기 

etcdctl 명령어

 


222. DNS in kubernetes

선수 지식

얼추 배울거

노드에는 파드와 서비스가 있고 각자 노드는 이름과 ip를 가지고 있다. 

노드이름과 ip를 등록한 dns 가 있다.

그거와 별개로 쿠버네티스는 기본적으로 클러스터단에 실행되는 dns가 있다.

이해를 돕기 위해 노드는 신경 쓰지 않고 파드, 서비스 dns 에 집중해보자!

파드 두개와 서비스가 하나 있다.

test 와 web 

 web-service 라는 서비스를 만들었다. 

서비스가 생성되면 쿠버네티스 dns 서비스가 레코드를 생성한다. 

curl http://web-service 로 test에서 web으로 접속 가능하다. 

네임스페이스 처럼

test, web-service 파드 모두 같은 네임스페이스 디폴트 네임스페이스에 존재한다, 

test에서  web-service로 web에 접속할 수 있다. 

default 와 apps 로 분리되어있다고 가정해보자 

url 을 사용할때 네임스페이스 정보도 같이 기입해야한다.

web-service.apps

도메인 네임을 자세히 보면

호스트 네임, 네임스페이스 , 타입이 들어간다. 

마지막으로 어느 클러스터에 포함되는지 root 정보가 필요하다. 

cluster.local 이 루트 도메인이다. 

최종적으로 

web-service.apps.svc.cluster.local 이런식으로 사용 가능하다.

파드의 경우 ip가 .에서 - 로 변경된다. 

10.244.2.5 가 10-244-2-5 가 된다. 

 

다른 네임스페이스에 있다면

네임스페이스가 달라진다.


223. CoreDNS in Kubernetes

ip를 갖는 파드 2개가 있다. 

파드의 etc/hosts 파일을 보면 도메인 네임이 등록되어있다. 

파드가 많아지면 /etc/hosts 폴더에 등록하는 것도 불가능하니까 dns에 등록한다. 

etc/resolve.conf 파일에 네임 서버를 등록한다. 

파드가 등록될때마다 dns 등록함으로서 도메인 네임으로 접속 가능하게 한다. 

쿠버네티스에서 dns는 이름으로 저장하는 것이 아닌 .을 -로 표현해서 저장한다.

10-244-2-5 

 

CoreDNS 

쿠버네티스에서 coredns 가 도와준다. 

이중화를 위해 레플리카셋에 두개 파드로 구현된다. ( 디플로이먼트 안에 레플리카셋) 

 

coreDNS는 corefile 이라는 구성 파일을 필요로 한다.

/etc/coreDNS/Corefile

에러를 담당하는 여러 플러그인이 존재한다,

kubernetes 부분에 탑레벨 도메인이 들어간다. cluster.local

configmap 으로도 coredns는 존재한다. 

coredns는 kube-dns 라는 서비스와도 연결되어 있어 클러스터내에서 사용가능하다. 

파드의 네임서버를 등록할때 이 서비스 ip를 등록한다.

kube-dns 10.96.0.10 

 

var/lib/kubelet/config.yaml 파일을 통해서 dns의 ip 와 도메인을 확인할 수 있다. 

이제 파드에서 모두 사용가능

host 명령으로 도메인 확인 가능

resolv.conf 파일에 온갖 이름이 다 있다.

 


224. Practice Test - Explore DNS

1. Identify the DNS solution implemented in this cluster

coreDNS 를 사용

 

2. How many pods of the DNS Server are deployed?

2개 

 

3. What is the name of the service created for accessing CoreDNS? 

kube-dns

 

4. what is the IP of the CoreDNS server that should be configured on PODs to resolve services?

서비스 클러스터 ip 10.96.0.10

 

5. where is the configuration file located for configuring the CoreDNS service?

deployments 를 통해 확인

/etc/coredns/Corefile

 

6. How is the Corefile passed into the CoreDNS POD? 

pulled from git
Stored on the kube master
Configured as a ConfigMap object
Corefile comes built-in with CoreDNS pod

config map 

config map 형식으로 넘겨진다. 

 

7. what is the name of the ConfigMap object created for corefile? 

 coredns

 

8. what is the root domain/zone configured for this kubernetes cluster?

cluster.local

 

9. we have deployed a set of PODs and Services in the default and payroll namespaces. Inspect them and go to the next question.'

 

10. What name can be used to access the hr web server from the test Application?

You can execute a curl command on the test pod to test. Alternatively, the test Application also has a UI. Access it using the tab at the top of your terminal named test-app.

 

 

test
webserver

web-service 로 접속

 

 

11. which of the names CANNOT be used to access the HR service from the test pod? 

web-service.default
web-service.default.pod
web-service.default.svc
web-service

web-service.default.pod 안됨 

 

12. Which of the below name can be used to access the payroll service from the test application?

 

web-service.payroll

 

13. Which of the below name CANNOT be used to access the payroll service from the test application?

web-service.payroll.svc
web-service.payroll.svc.cluster.local
web-service.payroll.svc.cluster
web-service.payroll

14.

We just deployed a web server - webapp - that accesses a database mysql - server. However the web server is failing to connect to the database server. Troubleshoot and fix the issue.

 

They could be in different namespaces. First locate the applications. The web server interface can be seen by clicking the tab Web Server at the top of your terminal.

 

호스트 네임을 변경한다. mysql.payroll

그냥 서비스

payroll 네임스페이스에는 mysql 이 존재한다.

 

15. From the hr pod nslookup the mysql service and redirect the output to a file /root/CKA/nslookup.out

kubectl exec -it hr -- nslookup mysql.payroll > /root/CKA/nslookup.out

 


226. Ingress

online shop 을 꾸린다고 가정

어느 wear 파드에서든 접근 가능하게 하려고 mysql 서비스 생성 cluster ip

외부로 나가는 서비스 wear-service 생성 nodeport

 

mysql 과 외부에 연결 가능

port 38080

http://node-ip:38080 으로 접속 가능하다.

node ip를 안쓰기 위해 dns 가 필요하고

포트 번호를 안쓰게 하기 위해 proxy 서버가 필요하다. 80 으로 들어오는거 -> 38080 으로

gcp 클라우드 플랫폼을 사용하면 로드 밸런서를 사용할 수 있다. 

gcp는 자동으로 로드 밸런서를 설치한다. 

gcp load-balancer

gcp는 외부 ip를 갖는다. 

my-online-store.com으로 사용 가능하다.

 

사업이 확장하면서 watch 페이지를 추가하고 싶다면?

이렇게 디플로이먼트, 서비스, 포트를 추가해야겠지?

새로운 로드밸런서는 새로운 ip를 요구한다.

어떻게 url 을 리다이렉트하는가?

/apparel, /video 처럼 로드 밸러서가 필요하다.

보안을 위해 ssl 도 고려해야한다.

쿠버네티스에서 이 모든 걸 한번에 다루면 어떨까?

Ingress

인그레스를 통해 한 url을 이용해 다르게 라우트 할 수 있음.

인그레스도 외부에서 접근 용이하게 하기 위해 서비스가 필요하다.nodeport 38080

한번만 구성하면 된다.

인그레스 컨트롤러와 인그레스 리소스가 필요하다.

인그레스 컨트롤러는 쿠버네티스에 기본 탑재 되어있지 않다. 따로 설치해야한다.

 

 

인그레스 컨트롤러 직접 선택해야한다. 

nginx 를 사용해보자

nginx 컨트롤러를 디플로이먼트를 통해 배포된다.

configmap 객체를 만들어서 nginx 구성을 넘겨야한다.

파드네임과 네임스페이스도 구성해야한다.

포트 정보

외부로 노출 시키기 위한 서비스도 생성한다.

서비스 어카운트도 필요

 

인그레스를 사용하기 위해 디플로이먼트, 서비스, 컨피그맵, auth 가 필요하다. 

 

인그레스 리소스 

여러가지 규칙들이 저장됨.

인그레스 리소스 예시 

 

backend 도 명시 

서비스로 라우팅한다. 

인그레스 생성과 확인

여러 케이스에 따라 다르게 라우팅 할 수 있다.

예시들

인그레스 리소스를 구성해보자

싱글 도메인 네임을 추가한다. 

www.my-online-store.com  에 진입할 수 있게 한다.

 

/wear 

/watch 

서비스로 연결 시킨다.

인그레스를 확인하면 두개의 url 이 있다. 

default 백엔드가 존재한다. 

default-http-backend 서비스에 연결된다.

 


228. Practice Test - Ingress -1 

1. We have deployed Ingress Controller, resources and applications. Explore the setup.

 

 

2. Which namespace is the Ingress Controller deployed in?

ingress-nginx

 

 

3. What is the name of the Ingress Controller Deployment?

ingress-nginx-controller

 

4. Which namespace are the applications deployed in?

app-space

 

5. How many applications are deployed in the app-space namespace?

Count the number of deployments in this namespace.

 

3개 

 

6. Which namespace is the Ingress Resource deployed in?

app space

 

7. what is the name of the ingress resource?

ingress-wear-watch

 

8. What is the Host configured on the Ingress Resource?

The host entry defines the domain name that users use to reach the application like www.google.com

 

all host

 

9. What backend is the /wear path on the Ingress configured with?

wear-service

 

10. At what path is the video streaming application made available on the Ingress?

/watch

 

11. If the requirement does not match any of the configured paths what service are the requests forwarded to?

no service

 

12. Now view the Ingress Service using the tab at the top of the terminal. Which page do you see?

404 error page

 

13. View the applications by appending /wear and /watch to the URL you opened in the previous step.

 

 

 

14. You are requested to change the URLs at which the applications are made available.

Make the video application available at /stream.

 

15. View the Video application using the /stream URL in your browser.

 

 

16. A user is trying to view the /eat URL on the Ingress Service. Which page would he see?

 

17. Due to increased demand, your business decides to take on a new venture. You acquired a food delivery company. Their applications have been migrated over to your cluster.

 

18. You are requested to add a new path to your ingress to make the food delivery application available to your customers.

Make the new application available at /eat.

 

19. View the Food delivery application using the /eat URL in your browser. 

 

20. A new payment service has been introduced. Since it is critical, the new application is deployed in its own namespace.

critical space

 

21. What is the name of the deployment of the new application?

webapp-pay

 

22. You are requested to make the new application available at /pay.

pay-service 가 있다 포트 8282 확인

ingress 만들기 

 

23. View the Payment application using the /pay URL in your browser.

 


231. Practice Test - Ingress - 2

1. We have deployed two applications. Explore the setup.

 

2. Let us now deploy an Ingress Controller. First, create a namespace called ingress-nginx.

We will isolate all ingress related objects into its own namespace.

 

3. The NGINX Ingress Controller requires a ConfigMap object. Create a ConfigMap object with name ingress-nginx-controller in the ingress-nginx namespace. 

 

 

4. The NGINX Ingress Controller requires two ServiceAccounts. Create both ServiceAccount with name ingress-nginx and ingress-nginx-admission in the ingress-nginx namespace.

 

 

 

5. We have created the Roles and RoleBindings for the ServiceAccount. Check it out!!

 

6. Let us now deploy the Ingress Controller. Create the Kubernetes objects using the given file. The Deployment and it's service configuration is given at /root/ingress-controller.yaml. There are several issues with it. Try to fix them.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.1.2
    helm.sh/chart: ingress-nginx-4.0.18
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  minReadySeconds: 0
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app.kubernetes.io/component: controller
      app.kubernetes.io/instance: ingress-nginx
      app.kubernetes.io/name: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/component: controller
        app.kubernetes.io/instance: ingress-nginx
        app.kubernetes.io/name: ingress-nginx
    spec:
      containers:
      - args:
        - /nginx-ingress-controller
        - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
        - --election-id=ingress-controller-leader
        - --watch-ingress-without-class=true
        - --default-backend-service=app-space/default-http-backend
        - --controller-class=k8s.io/ingress-nginx
        - --ingress-class=nginx
        - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
        - --validating-webhook=:8443
        - --validating-webhook-certificate=/usr/local/certificates/cert
        - --validating-webhook-key=/usr/local/certificates/key
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: LD_PRELOAD
          value: /usr/local/lib/libmimalloc.so
        image: k8s.gcr.io/ingress-nginx/controller:v1.1.2@sha256:28b11ce69e57843de44e3db6413e98d09de0f6688e33d4bd384002a44f78405c
        imagePullPolicy: IfNotPresent
        lifecycle:
          preStop:
            exec:
              command:
              - /wait-shutdown
        livenessProbe:
          failureThreshold: 5
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        name: controller
        ports:
        - name: http
          containerPort: 80
          protocol: TCP
        - containerPort: 443
          name: https
          protocol: TCP
        - containerPort: 8443
          name: webhook
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        resources:
          requests:
            cpu: 100m
            memory: 90Mi
        securityContext:
          allowPrivilegeEscalation: true
          capabilities:
            add:
            - NET_BIND_SERVICE
            drop:
            - ALL
          runAsUser: 101
        volumeMounts:
        - mountPath: /usr/local/certificates/
          name: webhook-cert
          readOnly: true
      dnsPolicy: ClusterFirst
      nodeSelector:
        kubernetes.io/os: linux
      serviceAccountName: ingress-nginx
      terminationGracePeriodSeconds: 300
      volumes:
      - name: webhook-cert
        secret:
          secretName: ingress-nginx-admission

---

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.1.2
    helm.sh/chart: ingress-nginx-4.0.18
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30080
  selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  type: NodePort

뭐가 문제인지 모르겠다. 그냥 복붙했다. 

 

 

7. Create the ingress resource to make the applications available at /wear and /watch on the Ingress service.

Also, make use of rewrite-target annotation field: -

nginx.ingress.kubernetes.io/rewrite-target: /


Ingress resource comes under the namespace scoped, so don't forget to create the ingress in the app-space namespace.

.

 

 

8. Access the application using the Ingress tab on top of your terminal.

 

 

확인

 


216. IP Address Management - Weave

브릿지 네트워크가 ip를 어떻게 할당하는지?

 

CNI 규칙에 파드는 ip 를 무조건 할당되어야한다.

명령어에 ip를 할당하는 내용이 들어있다. 

쿠버네티스는 ip를 어떻게 할당하는지 관심 없다. 그저 ip 가 겹치지 않으면 된다. 

ip를 파일로 관리한다. 

당연히 수동으로 하는 대신 cni 플러그인을 사용하면 된다.

이건 로컬 플러그인 방식이다. 

cat /etc/cni/net.d/net-script.conf 

파일에 어느 ipam 플러그인을 사용할지 정의한다. 

 

weaveworks 인 경우

수 많은 ip를 할당해서 이용할 수 있다. 공평하게 세개씩 분배한다? 

 


217. Practice Test - Networking Weave

1. How many Nodes are part of this cluster?

Including master and worker nodes

2개

 

2. What is the Networking Solution used by this cluster?

weave

 

3. How many weave agents/peers are deployed in this cluster?

2개

 

4. On which nodes are the weave peers present?

k ged pod -o wide 옵션으로 node 여부도 확인가능

a모든 노드마다 하나.

 

5. Identify the name of the bridge network/interface created by weave on each node.

 

weave

 

6. What is the POD IP address range configured by weave?

ipalloc 부분

7. What is the default gateway configured on the PODs scheduled on node01?

What is the default gateway configured on the PODs scheduled on node01

 

weave 는 10.244.0.0/16


219. Service Networking

 

노드와 여러 파드들이 있다고 가정

주황 파드에서 파랑 파드 접속 가능하도록 서비스를 생성했다.

orange-service 10.99.13.178

파랑 파드는 서비스 이름이나 ip를 이용해서 주황 파드에 접속할 수 있다.

서비스를 생성하면 클러스터에 걸쳐서 생성된다.

클러스터 내에서만 사용 가능하다. 

Cluster IP

클러스터 안에서만 사용할 수 있는 서비스가 cluster ip 이다. 

NodePort

보라 파드에서 서비스를 만들자. 클러스터 ip 처럼 모든 클러스터에 걸쳐 생성되면 사용 가능하다.

대신 외부 포트에서 접근 가능하다. 

외부 유저는 어플리케이션에 접속 가능하다.

 

서비스 원리를 이해하기 위해 처음부터 시작해보자

모든 노드는 kubelet 을 갖는다. (파드 생성과 연관 )

kubelet은 kubeapiserver 와 통신하며

그리고 파드를 생성한다. 

그리고 cni 플러그인을 통해 네트워크 환경 구성을 한다. 

kubelet 과 같이 kube-proxy 도 노드마다 존재한다.

kubeapiserver 와 통신하면서 변경 사항을 체크한다.

서비스가 생성되는 경우

파드와 다르게 서비스는 모든 노드에 생성되지 않는다.

서비스는 클러스터 와이드 컨셉이다.

모든 노드에 걸쳐서 존재한다.

실제로 서비스는 존재하지 않는다.

서버도, 서비스도 없다. 

서비스는 ip나 인터페이스 할당이 없다. 네임스페이스도 없다. 

 

가상의 객체이다. 

그럼 어떻게 ip를 얻고 서비스에 접근할 수 있는 걸까?

 

서비스를 생성하면 쿠버네티스에서 미리 정해 놓은 ip 범위에서 할당 받는다.

kube-proxy가 선점된 ip를 받은 후 포워딩 규칙을 생성한다.

서비스 ip 10.99.13.178 로 갈려면 파드 ip 10.244.1.2 로 향한다.

실제로는 ip와 포트 조합으로 한다. 

서비스가 생성되면 kube-proxy 가 해당 규칙을 추가한다. 

 

이런 규칙은 어떻게 생성될까?

kube-proxy는 여러 옵션이 있다. 

pod 가 있고 서비스를 확인  10.244.1.2

10.103.132.104

서비스 ip 범위는 미리 정해져있다. 

ps aux | grep kube-api-server 로 확인

10.96.0.0/12 

ip 범위는 겹치면 안된다. 파드 범위는 10.244.0.0/16 이므로 10.244.255.255 까지 

서비스용 ip 범위는 10.96.0.0~10.111.255.255 다행히 안 겹친다. 

iptables -L -t nat 명령어로 규칙 확인 가능

db-service 의 iptables를 보면 10.103.132.104:3306 으로 들어오는 트래픽을 10.244.1.2:3306  으로 보낸다. 

 

kube-proxy-log 로 확인 가능 

 


220. Practice Test - Service Networking

1. What network range are the nodes in the cluster part of?

k get nodes -0 wide 로 internal ip 확인 192.4.125.9 

ip link 로 확인 192.4.125.9 인터페이스 eth0 확인

192.4.125.0/24

 

2. what is the range of IP addresses configured for PODs on this cluster?

모든 파드 확인 후 

weave-net 로그를 이용해서 찾자

ipalloc-range: 10.244.0.0/16

 

3. what is the IP Range configured for the services within the cluster

kube-api-server에 나와있다.

servicecluster ip range 10.96.0.0/12

 

4.  How many kube-proxy pods are deployed in this cluster

 

2개

 

5. What type of proxy is the kube-proxy configured to use? 

k logs -n kube-system kube-proxy-59qn5  로그에 유형이 있다. 

iptables

 

6. How does this kubernets cluster ensure that a kube-proxy pod runs on all nodes in the cluster ?

 

inspect the kube-proxy pods and try to identify how they are deployed.

 

데몬셋이 돌고 있다.

using daemonset 

+ Recent posts