metrics-server 설치하기 이후에 kubectl top pod 으로 metric 확인 시 아래와 같은 에러가 발생한다면 RBAC 설정을 추가해주자.

$ kubectl top pod
pods.metrics.k8s.io is forbidden: User "front-proxy-client" cannot list resource "pods" in API group "metrics.k8s.io" in the namespace "default"

front-proxy-client 유저에 rolebinding 과 clusterolebinding을 생성해준다.

$ kubectl create rolebinding metrics-server-role --clusterrole=admin --user=front-proxy-client
rolebinding.rbac.authorization.k8s.io/metrics-server-role created

$  kubectl create clusterrolebinding metrics-server-clusterrole --clusterrole=view --user=front-proxy-client
clusterrolebinding.rbac.authorization.k8s.io/metrics-server-clusterrole created

rolebinding 후 kubectl top pod 명령어를 통해 metric 이 정상적으로 수집되었는지 확인 해보자.

$ kubectl top pod
NAME                             CPU(cores)   MEMORY(bytes)
foo-79d86fff79-rslc9             1m           80Mi
foo-599bcbb59c-8t5qc             1m           72Mi
반응형
Posted by 사용자 guru_k

댓글을 달아 주세요

metrics-server 는 kubernetes의 오토스케일링 파이프라인들에 유용한 자원으로 kubernetes autoscaler를 사용하기 위해선 필수 자원이다.

metrics-server는 kubelet으로부터 metric을 수집하고 Metric API를 통해서 kubernetes api에서 노출된다.

복잡한 말이긴 하지만 kubectl top 명령어를 사용하거나 Horizontal Pod Autoscaler, Vertical Pod Autoscaler 를 사용하기 위해선 필수적인 자원이다.

당연하겠지만 kubernetes cluster에서 설치되어야 한다.

metrics-server 설치

metrics-server를 설치하기 위해선 별도의 yaml 파일을 생성하거나 아래처럼 직접 git 에서 직접 설치가 가능하다.

$ kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created

$ kubectl get pods -n kube-system | grep metric
metrics-server-5d5d6598c7-kk6g8                            0/1     Running   0          19s

위에 처럼 설치할 경우 kubelet certificate가 필요하다. 그래서 cert validation을 피하기 위해선 --kubelet-insecure-tls flag가 필요하다 

테스트 환경에서 cert validation을 패스하고 insecure로 실행해보자.

~$ mkdir metrics-server
~$ cd metrics-server
~/metrics-server$ wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# components.yaml 파일을 오픈한뒤 아래처럼 deployment 실행 인자에 --kubelet-insecure-tls 를 추가해준다.

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  strategy:
    rollingUpdate:
      maxUnavailable: 0
  template:
    metadata:
      labels:
        k8s-app: metrics-server
    spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls               <-----------여기 추가
        image: k8s.gcr.io/metrics-server/metrics-server:v0.5.1
        imagePullPolicy: IfNotPresent
        


# 실행 확인


$ kubectl get pods -n kube-system  | grep metric
metrics-server-d69dd899-7ksrz                              1/1     Running   0          11m

$ kubectl logs -f metrics-server-d69dd899-7ksrz -n kube-system
I1014 09:46:17.398903       1 serving.go:325] Generated self-signed cert (/tmp/apiserver.crt, /tmp/apiserver.key)
I1014 09:46:19.086702       1 requestheader_controller.go:169] Starting RequestHeaderAuthRequestController
I1014 09:46:19.086745       1 shared_informer.go:240] Waiting for caches to sync for RequestHeaderAuthRequestController
I1014 09:46:19.086797       1 configmap_cafile_content.go:202] Starting client-ca::kube-system::extension-apiserver-authentication::client-ca-file
I1014 09:46:19.086808       1 shared_informer.go:240] Waiting for caches to sync for client-ca::kube-system::extension-apiserver-authentication::client-ca-file
I1014 09:46:19.086836       1 configmap_cafile_content.go:202] Starting client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file
I1014 09:46:19.086858       1 shared_informer.go:240] Waiting for caches to sync for client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file
I1014 09:46:19.087228       1 dynamic_serving_content.go:130] Starting serving-cert::/tmp/apiserver.crt::/tmp/apiserver.key
I1014 09:46:19.088055       1 secure_serving.go:197] Serving securely on [::]:4443
I1014 09:46:19.088270       1 tlsconfig.go:240] Starting DynamicServingCertificateController
I1014 09:46:19.187012       1 shared_informer.go:247] Caches are synced for client-ca::kube-system::extension-apiserver-authentication::client-ca-file
I1014 09:46:19.187063       1 shared_informer.go:247] Caches are synced for client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file
I1014 09:46:19.187020       1 shared_informer.go:247] Caches are synced for RequestHeaderAuthRequestController

 

kubectl top 동작 확인

$ kubectl top pods
NAME                                              CPU(cores)   MEMORY(bytes)
foo-6579459448-4ddc7                              3m           69Mi
foo-6579459448-4g4mg                              2m           69Mi
foo-6579459448-5pgk2                              2m           68Mi

 

kubectl top 동작 확인 시 아래와 같은 에러가 발생하면 여기 에서 RBAC 을 추가한 이후 다시 확인해보자.

$ kubectl top pod
Error from server (Forbidden): pods.metrics.k8s.io is forbidden: User "front-proxy-client" cannot list resource "pods" in API group "metrics.k8s.io" in the namespace "default"
반응형
Posted by 사용자 guru_k

댓글을 달아 주세요

HPA는 Horizontal Pod Autoscaler의 줄임말로 kubernetes 에서 auto scaling을 지원해주는 기능이라고 볼 수 있다.

HPA는 cpu 사용량이나 제공되는 metrics를 기반으로 replication controller, deployment, replica set 또는 stateful set을 scaling 해주는 역할을 수행한다. 단, replicas를 제어할 수 없는 오브젝트 (예로 데몬셋)는 지원되지 않는다.

HPA는 controller manager에 의해서 관리되며 --horizontal-pod-autoscaler-sync-period flag로 설정된 주기마다 컨트롤되는 형태의 컨트롤 루프로 구현된다. (기본 설정은 15초)

위에서 설정된 주기와 HPA 설정에 따라 controller manager는 metrics API로 부터 각 리소스의 metrics 정보를 얻어 온다.

metrics API를 통해 얻어온 metric을 통해 scale 여부를 결정하게 되며 아래와 같은 알고리즘을 통해 desired metric value 와 current metric value의 비율로 결정하게 된다.

desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]

예로 replicas가 1대일 때 current metric value가 200m 이고 desired metric value가 100m 일때 200.0 / 100.0 == 2.0 으로 replicas는 2대로 증설된다.

HPA 연습해보기

시작하기전 HPA는 metrics-server가 제공하는 metric API를 통해서 metrics를 수집하여 scaling을 수행함으로 kubernetes cluster에 metrics-server가 배포 되어있어야 한다. 

테스트를 위한 docker 이미지 생성

부하 생성을 위한 php 파일 생성

<?php
  $x = 0.0001;
  for ($i = 0; $i <= 1000000; $i++) {
    $x += sqrt($x);
  }
  echo "OK!";
?>

Dockerfile 생성

FROM php:5-apache
COPY index.php /var/www/html/index.php
RUN chmod a+rx index.php

Docker build

$ docker build -t hpa-test .
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM php:5-apache
5-apache: Pulling from library/php
5e6ec7f28fb7: Pull complete
cf165947b5b7: Pull complete
7bd37682846d: Pull complete
99daf8e838e1: Pull complete
ae320713efba: Pull complete
ebcb99c48d8c: Pull complete
9867e71b4ab6: Pull complete
936eb418164a: Pull complete
bc298e7adaf7: Pull complete
ccd61b587bcd: Pull complete
b2d4b347f67c: Pull complete
56e9dde34152: Pull complete
9ad99b17eb78: Pull complete
Digest: sha256:0a40fd273961b99d8afe69a61a68c73c04bc0caa9de384d3b2dd9e7986eec86d
Status: Downloaded newer image for php:5-apache
 ---> 24c791995c1e
Step 2/3 : COPY index.php /var/www/html/index.php
 ---> 767e00d554d2
Step 3/3 : RUN chmod a+rx index.php
 ---> Running in 21c35da0e7dd
Removing intermediate container 21c35da0e7dd
 ---> 89226ef07d25
Successfully built 89226ef07d25
Successfully tagged hpa-test:latest

docker image push

$ docker tag hpa-test docker.hub.io/test/hpa-test

$ docker push docker.hub.io/test/hpa-test
The push refers to repository [docker.hub.io/test/hpa-test]
b08f7a13591f: Pushed
416faf6d334b: Pushed
1aab22401f12: Pushed
13ab94c9aa15: Pushed
588ee8a7eeec: Pushed
bebcda512a6d: Pushed
5ce59bfe8a3a: Pushed
d89c229e40ae: Pushed
9311481e1bdc: Pushed
4dd88f8a7689: Pushed
b1841504f6c8: Pushed
6eb3cfd4ad9e: Pushed
82bded2c3a7c: Pushed
b87a266e6a9c: Pushed
3c816b4ead84: Pushed
latest: digest: sha256:5a8b6cda514a3bd5e90ebf6038180afc7072e5f2c9cc95562949a55d8bca67b2 size: 3449

deployment 및 service 배포

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  selector:
    matchLabels:
      run: php-apache
  replicas: 1
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - name: php-apache
        image: hpa-test
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
          requests:
            cpu: 200m

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: php-apache
  labels:
    run: php-apache
spec:
  ports:
  - port: 80
  selector:
    run: php-apache

배포하기

$ kubectl apply -f deployment.yaml
deployment.apps/php-apache created

$ kubectl apply -f service.yaml
service/php-apache created

HPA 생성

다음 명령어를 사용해서 pod replicas를 1대에서 5대까지 scale 가능한 HPA를 생성한다. cpu 사용량은 70% 이상일 경우 scale out되도록 설정한다.

$ kubectl autoscale deployment php-apache --cpu-percent=70 --min=1 --max=5
horizontalpodautoscaler.autoscaling/php-apache autoscaled

$ kubectl get hpa
NAME                      REFERENCE                            TARGETS                        MINPODS   MAXPODS   REPLICAS   AGE
php-apache                Deployment/php-apache                10%/70%                        1         5         0          6s

부하 생성 (scale out)

busybox 이미지를 사용하여 생성된 service를 통해 pod에 부하를 준다.

kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"

HPA가 정상적으로 동작하는지 확인

$ kubectl get hpa

NAME         REFERENCE                     TARGET      MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache/scale   335% / 70%  1         5         1          3m

cpu 사용량이 증가하면서 pod replicas가 5대까지 scale out 되었다. deployment를 통해 확인 해보자.

$ kubectl get deploy php-apache
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
php-apache   5/5     5            5           14m

cpu 사용량이 설정된 70%를 넘어감에 따라 pod이 MAXPODS인 5대까지 증설되었다.

부하 중지 (scale in)

부하 중지 후 서비스가 정상적으로 scale in이 되는지 확인해보자.

기존에 실행했던 부하 생성을 중지하기 위해 <Ctrl> + c 로 이전에 띄웠던 컨테이너를 중지 후 확인을 해본다.

$ kubectl get hpa
NAME                      REFERENCE                            TARGETS                        MINPODS   MAXPODS   REPLICAS   AGE
php-apache                Deployment/php-apache                0%/70%                         1         5         1          10m

deployment도 정상적으로 scale in 되었는지 확인 해본다.

$ kubectl get deploy php-apache
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
php-apache   1/1     1            1           18m

cpu 사용량이 0%로 떨어졌으며 replicas의 개수도 MINPODS에 설정된 개수인 1대로 정상적으로 scale in이 되었다.

반응형
Posted by 사용자 guru_k

댓글을 달아 주세요

Kubernetes Components

Kubernetes 2021. 10. 7. 00:39

기본적으로 Kubernetes cluster는 node 라고 불리는 일련의 워커 머신들로 이루어져있다. 그 노드 안에서 containerized 된 어플리케이션들이 실행된다.

Kubernetes Cluster

Kubernetes Components 는 크게 두가지로 볼 수 있다.

Control Plane Components 와 Node Components 이며 Control Plane은 클러스터에서 Pod 과 Worker Node들을 관리하는데 Production 환경에서 Control Plane은 fault-tolerance 와 high availability를 위해 여러 머신에 걸쳐 구동 되어진다.

 

Control Plane Components

Control Plane 들은 클러스터 내에서 발생하는 다양한 이벤트들을 결정하는 역할을 수행한다. 예로 새로운 Pod이 생성이 될 경우 어떤 Node에 뜨도록 할것인지에 대한 것을 결정하기도 한다.Control Plane 들은 아무 Node에서나 구동이 될 수 있지만 모든 Components들은 같은 머신에 구동되어지도록 설정하는 것이 좋다. 그리고 대게 Master Node에 구동이 되어지며 User Container들을 Control Plane들이 구동되어지는 Node에 구동하지 않도록 하자.

kube-apiserver

kube-apiserver는 kubernetes API를 노출하고 있는 Component이며 kubernetes control plane의 front end로 볼 수 있다.kube-apiserver의 주요 역할은 kubernetes API를 사용할 수 있도록 하는것이며 kube-apiserver는 수평적 확장이 가능한 구조로 디자인되어있어 여러 인스턴스를 구동하여 트래픽을 조절할 수 있다.

etcd

모든 클러스터의 Kubernetes' backing store 를 저장하는 용도로 사용하는 고가용성 Key Value store로 사용되어 진다.

kube-scheduler

kube-scheduler component 는 지정된 Node가 없는 새로운 Pod이 구동 될 경우 어떤 Node에서 해당 Pod이 구동될것인지에 대한 선택을 하게 된다.

kube-controller-manager

 kube-controller는 아래와 같이 네가지의 분리된 controller process로 구성되어있으나 복잡성을 줄이기 위해 하나의 바이너리로 구동되어진다.

  • Node controller: 노드가 다운되었을 때 대응을 담당
  • Job controller: Job object들을 감지하면서 해당 Job들이 완료될 수 있도록 Pod들을 생성
  • Endpoints controller: Endpoints object 들을 담당. Service와 Pod을 조인
  • Service Account & Token controllers: 새로운 네임스페이스들을 위한 기본 account들과 API access token들을 생성

Node Components

Node Component 들은 모든 Node에서 동작하며, Pod의 구동을 유지하며 kubernetes runtime environment를 제공한다.

kubelet

각 Cluster의 각 Node에서 실행되는 Agent이다. Container들이 Pod안에서 확실히 실행될 수 있도록 관리한다

다양한 메카니즘을 통해 제공된 PodSpecs들을 제공 받아서 PodSpecs에서 서술된 Container들의 running과 healthy를 확실하게 관리한다.

그러나 kubernetes에 의해 만들어지지 않은 container들은 관리하지 않는다.

kube-proxy

kube-proxy는 각 노드에서 kubernetes service concept로 실행되는 network proxy 이다.

kube-proxy는 각 노드에서 네트워크 룰들을 관리하고, 이러한 네트워크 룰들은 클러스터 내외부의 네트워크 세션으로부터 발생하는 커뮤니케이션이 허용되도록 한다.

kube-proxy는 OS Layer의 Packet filtering이 존재하면 그것을 사용하며 없을 경우 트래픽 자체를 포워드 한다.

Container runtime

container runtime은 container들을 실행을 담당하는 소프트웨어이다.

kubernetes는 몇몇의 container runtime들을 지원하며. Docker, containerd, CRI-O 그리고 Kubernetes CRI를 구현한 소프트웨어들이 해당한다.

반응형
Posted by 사용자 guru_k

댓글을 달아 주세요

Prerequisites

  1. install python-pip & python3-pip & ansible

    1. python-pip

      • Access https://www.python.org, download python and install it.

      • Once the installation is done, Check below command.

        1
        2
        $ python3 --version
        Python 3.7.4
        cs
    2. python3-pip

      • Download get-pip.py file

        1
        curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
        cs
      • Then run the following

        1
        python get-pip.py
        cs
    3. ansible

      1
      brew install ansible
      cs

Settings

  1. clone the kubespray repository

    1
    $ git clone https://github.com/kubernetes-sigs/kubespray.git
    cs
  2. execute follow the command.

    sudo pip install -r requirements.txt
     
    cp -rfp inventory/sample inventory/mycluster
     
    declare -a IPS=(10.10.1.3 10.10.1.4 10.10.1.5// cluster ips
     
    CONFIG_FILE=inventory/mycluster/hosts.yml python3 contrib/inventory_builder/inventory.py ${IPS[@]}
     
    cat inventory/mycluster/group_vars/all/all.yml
    cat inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml
     
    ansible-playbook -i inventory/mycluster/hosts.yml --become --become-user=root cluster.yml
    cs
  3. if you encounter an error with ruamel.yaml during the process, then you should install ruamel.yaml using pip.

    sudo pip install ruamel.yaml
    cs

Check out

root@node1:~# kubectl version
Client Version: version.Info{Major:&quot;1&quot;, Minor:&quot;15&quot;, GitVersion:&quot;v1.15.0&quot;, GitCommit:&quot;e8462b5b5dc2584fdcd18e61cfe9f1e4d970a529&quot;, GitTreeState:&quot;clean&quot;, BuildDate:&quot;2019-07-19T16:32:14Z&quot;, GoVersion:&quot;go1.12.5&quot;, Compiler:&quot;gc&quot;, Platform:&quot;linux/amd64&quot;}
Server Version: version.Info{Major:&quot;1&quot;, Minor:&quot;15&quot;, GitVersion:&quot;v1.15.0&quot;, GitCommit:&quot;e8462b5b5dc2584fdcd18e63cfe9f1e4d970a529&quot;, GitTreeState:&quot;clean&quot;, BuildDate:&quot;2019-07-19T16:32:14Z&quot;, GoVersion:&quot;go1.12.5&quot;, Compiler:&quot;gc&quot;, Platform:&quot;linux/amd64&quot;}
 
 
root@node1:~# kubectl get nodes
NAME    STATUS   ROLES    AGE   VERSION
node1   Ready    master   11m   v1.12.3
node2   Ready    master   12m   v1.12.3
node3   Ready    &lt;none&gt;   11m   v1.12.3
node4   Ready    &lt;none&gt;   11m   v1.12.3
cs
반응형
Posted by 사용자 guru_k

댓글을 달아 주세요

kubernetes를 이용한 cluster 구성 - 3 

Master init

config 파일을 통해 상세한 설정이 가능하다.


kubeadmin.config.yml  생성


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# cat <<EOF >kubeadm.config.yaml
apiVersion: kubeadm.k8s.io/v1alpha1
kind: MasterConfiguration
api:
  advertiseAddress: 192.168.128.88            // master ip
etcd:
  image: google_containers/etcd-amd64:3.1.11  // etcd image repository path
kubeProxy:
  bindAddress: 192.168.128.88                 // master ip
networking:
  serviceSubnet: 192.96.0.0/12                // service subnet cdir
  podSubnet: 192.244.0.0/16                   // pod subnet cdir
kubernetesVersion: v1.9.2
imageRepository: google_containers            // image repository path
EOF
cs

kubeadm init

master node init

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ kubeadm init --config kubeadm.config
  
Your Kubernetes master has initialized successfully!
 
To start using your cluster, you need to run the following as a regular user:
 
  mkdir -p $HOME/.kube
  sudo cp -/etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
 
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
 
You can now join any number of machines by running the following on each node
as root:
 
  kubeadm join --token 3bbb24.47cc21d7d6e88360 192.168.128.88:6443 --discovery-token-ca-cert-hash sha256:322efe09538cb8a1656069da216b46aa7de03eec9b00f990599d1d4e19113dba
  
cs


root 가 아닌 유저가 kubectl을 사용하기 위해선 아래와 같은 커맨드를 실행해야 한다.

1
2
3
$ mkdir -p $HOME/.kube
$ sudo cp -/etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
cs


또한 kubeadm init 을 통해 생성된 join 명령어를 통해 각 node에서 마스터로 join할 수 있다.


1
2
 
  kubeadm join --token 3bbb24.47cc21d7d6e88360 192.168.128.88:6443 --discovery-token-ca-cert-hash sha256:322efe09538cb8a1656069da216b46aa7de03eec9b00f990599d1d4e19113dba
cs


반응형
Posted by 사용자 guru_k

댓글을 달아 주세요

Kubernetes, 또는 쿠버네티스, 또는 간단히 "큐브(kube)"는 Linux 컨테이너 작업을 자동화하는 오픈소스 플랫폼입니다.


Kubernetes를 이용하여 클러스터 구성을 진행하는 내용을 포스트 하려고 합니다.


Kubernetes에 대한 자세한 내용은 

https://kubernetes.io/docs/reference/ Kubernetes 홈페이지에서 확인할 수 있습니다.


이 cluster 구성 예제는 실제 물리머신 3대에 노드를 제어하는 마스터 1대, 노드 2대로 구성한다고 가정하고 진행 할 예정입니다.


머신이 한대인 local 환경에서 테스트는 Kubernetes에서 제공하는 Minikube를 이용해서 테스트 해볼 수 있습니다.


Minikube에 대한 내용은 아래 홈페이지에서 확인하고 진행해볼 수 있습니다.

https://kubernetes.io/docs/getting-started-guides/minikube/




반응형
Posted by 사용자 guru_k

댓글을 달아 주세요