Kubernetes 설치 가이드 - v1.11.3

2020. 10. 23. 11:10cloud&platform

※ CentOS 7 기준으로 작성됨.

 

※ 내부 베어메탈 서버에 쿠버네티스를 설치하는 가이드이며, 1.11.3 버전에 특화되었다. kubernetes.io 의 공식 가이드를 참조한 방식이며 100% 수동이다. 추후에는 분명 자동화된 설치방법이 나오겠지..

 

※ 최소 요구 서버 수

- master를 single로 구성시에는 최소 master 1대, node 1대 총 2대.

- master를 HA구성시에는 최소 master 3대, node 3대 총 6 대. (node가 3대 이하여도 설치도 되고 동작도 되나, 실제 서비스에는 그렇게 하지 말자)

 

1. Docker Install

- kubernetes의 모든 host는 container 기반. docker는 가장 인기있고 보편적인 container.

- verion : 17.03 (1.12 이후에는 17.06, 17.09, 18.06 까지 지원)

- 대상 : master, node 모든 서버

// YUM 유틸리티 설치 
# yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

// repository 등록
# yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

// docker repository list 확인
# yum list docker-ce --showduplicates | sort -r

// docker install
# yum install --setopt=obsoletes=0 \
docker-ce-17.03.3.ce \
docker-ce-selinux-17.03.3.ce

# systemctl enable docker && systemctl start docker
# docker version   // 설치 및 실행 확인

※ docker 설치 후 daemon.json 적용

daemon.json은 docker의 로그 파일 규칙 등의 설정 가능.

# cd /etc/docker
# vi daemon.json // daemon.json 설정
//example
{
  "insecure-registries": [
    "xxx.xxx.xxx.xxx:11111"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "50m",
    "max-file": "3"
  }
}
# echo 'DOCKER_OPTS="--config-file=/etc/docker/daemon.json"' > /etc/default/docker
# systemctl daemon-reload
# systemctl restart docker

 

 

Configure logging drivers

 

docs.docker.com

※ docker 삭제

다시 처음부터 설치하고 싶을때..

kubenetes 설치 이후라면, kubeadm init 이후에 해야 한다.

// install docker 확인
# yum list installed | grep docker
# yum list installed | grep container-selinux

# systemctl stop docker
# yum remove docker-ce
# yum remove docker-ce-selinux
# ps –ef | grep docker   // 살아 있는 프로세스가 있는지 확인 (보통 없다)
# kill -9 <ps-id>        // 만약 있다면 kill!
# rm -rf /var/lib/docker // container 폴더 삭제

 

2. kubeadm, kubelet, kubectl 설치

- 대상 : master, node 모든 서버

# swapoff -a   //swap memory 비활성 (필수)

// yum repository 등록
# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF

// Set SELinux in permissive mode (effectively disabling it)
# setenforce 0
# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

// 가용 버전 확인
# curl -s https://packages.cloud.google.com/apt/dists/kubernetes-xenial/main/binary-amd64/Packages | grep Version

// 설치
# yum install -y kubelet-1.11.3 kubeadm-1.11.3 kubectl-1.11.3 --disableexcludes=kubernetes

# systemctl enable kubelet && systemctl start kubelet
# systemctl status kubelet  // Fail 나옴 -> /var/lib/kubernetes/config.yaml이 없기 때문이며, 이는 Master init에 생성됨

※ Some users on RHEL/CentOS 7 have reported issues with traffic being routed incorrectly due to iptables being bypassed. You should ensure net.bridge.bridge-nf-call-iptables is set to 1 in your sysctl config, e.g. (in kubernetes 공식 문서)

# cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# sysctl --system

# systemctl daemon-reload
# systemctl restart kubelet

※ yum install 시 https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64/repodata/repomd.xml:[Errno 14] curl#22 - "The requested URL returned error: 403" 에러 날 경우

# vi /etc/yum.conf
-> proxy=http://<이상한 IP address> 주석 처리
# yum clean metadata
# yum install -y kubelet-1.11.3 kubeadm-1.11.3 kubectl-1.11.3 --disableexcludes=kubernetes 다시 실행
 

Installing kubeadm

This page shows how to install the kubeadm toolbox. For information how to create a cluster with kubeadm once you have performed this installation process, see the Using kubeadm to Create a Cluster page. Before you begin One or more machines running one of

kubernetes.io

 

3. Master 설치 (Single 구성일 경우)

- 대상 : master 서버

# cat /proc/sys/net/ipv4/ip_forward
// 결과 1이 아니면,
# echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

# kubeadm init   // master 초기화. 결과 출력물에 node join 정보가 있으므로 copy 해둬야 한다.

// pod network 대역을 지정할 경우는 아래와 같이 초기화
# kubeadm init --pod-network-cidr=0.0.0.0/0  // network add-on설정에 따른 대역대
 

Creating a cluster with kubeadm

Creating a minimum viable Kubernetes cluster that conforms to best practices. In fact, you can use kubeadm to set up a cluster that will pass the Kubernetes Conformance tests. kubeadm also supports other cluster lifecycle functions, such as bootstrap token

kubernetes.io

 

4. Master 설치 (HA 구성일 경우)

- 대상 : master 서버

 

1) SSH 설정

- 이작업은 master ha구성 대상 서버간의 ssh 접속 허용 설정이 필요하다.

# ssh-keygen -t rsa   // key generation. master 1,2,3 모두 실행
# ls -al ~/.ssh/      // ssh 확인. authorized_keys 파일은 최초 없다.

※ SSH 잠깐 참고

id_rsa private key, 절대로 타인에게 노출되면 안된다.
id_rsa.pub public key, 접속하려는 리모트 머신의 authorized_keys에 입력한다.
authorized_keys 리모트 머신의 .ssh 디렉토리 아래에 위치하면서 id_rsa.pub 키의 값을 저장한다.

- SSH Server의 authorized_keys 의 내용이 SSH Client의 id_rsa.pub 파일과 같아야 한다.

- 그래서 ssh 접속을 할 때 id_rsa 파일과 authorized_keys 파일의 내용을 비교 할 수 있다. 일반적으로 SCP를 사용한다 .

- SCP는 파일을 전송하는 프로그램인데, 아래와 같은 형식을 갖는다.

- scp $HOME/.ssh/id_rsa 리모트 머신의 아이디@리모트 머신의 호스트 주소:저장할 파일

// master 1번에서 실행. id_rsa.pub 파일을 마스터 2,3번의 홈디렉토리로 전송
# scp /root/.ssh/id_rsa.pub root@<master2 ip>:id_rsa.pub
# scp /root/.ssh/id_rsa.pub root@<master3 ip>:id_rsa.pub

// master 2, 3 서버에서 실행. authorized_keys 생성
# cat /root/id_rsa.pub >> /root/.ssh/authorized_keys

// master 1번에서 노드 간 SSH를 사용하여 연결이 올바르게 작동하는지 체크
# ssh -A <master2 ip>
# exit  // 성공하면 ssh 접속한 것이므로 반드시 exit!
# ssh -A <master3 ip>
# exit

// sshs host allow 설정 확인 (master 1 예, 2,3 서버도 상호 연결 위해 추가)
# cat /etc/hosts.allow
sshd:<master2 ip>,<master3 ip>

 

2) kube-apiserver Load Balancer 설정

- HA 구성을 위해, master 1,2,3의 api server를 load balaning 하기 위한 설정.

- 이 Load Balancer가 api server의 게이트웨이 역활을 하게 된다.

- 사전 준비 : 실제 방화벽에서 허용되는 사용되지 않는 IP 1개. (api server의 가상 IP로 사용) 이 후로 이 IP를 '대표가상IP'라고 하겠다.

// 모든 master node에 haproxy 와 keepalived 설치 (haproxy는 1.5 버전 이상부터 SSL 지원)
# yum install haproxy
# haproxy -v   // 설치 확인
# yum install keepalived

// 부팅시 자동 실행 설정
# chkconfig haproxy on  && chkconfig keepalived on && chkconfig | egrep 'haproxy|keepalived

// 모든 master ndoe에 non-local Virtual IPs binding
# echo "net.ipv4.ip_nonlocal_bind = 1"  >> /etc/sysctl.conf &&  sysctl -p

//-------------------------------------------------
// keepalived 설정
# cd /etc/keepalived
# mv keepalived.conf keepalived.conf.org   // 원본 백업(모든 master 동일)
# vi /etc/keepalived/keepalived.conf
// master 1번 example
global_defs {
   notification_email {
     test@test.com        #email 설정 가능?
     test2@test.com
   }
   notification_email_from lb1@test .com
   smtp_server localhost
   smtp_connect_timeout 30
}
vrrp_script chk_haproxy {   # haproxy 살아있는지 체크
    script "killall -0 haproxy"
    interval 2
    weight 2
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0       # 사용할 인터페이스 설정 (ifconfig 로 확인 가능)
    virtual_router_id 51 # 셋다 같아야 한다. (중요! - 다른 keepalived 구성 군이 사용하는 아이디와 달라야 한다. 충돌난다. 즉, 관리를 해줘야 한다!!)
    priority 101         # 우선순위 설정
    advert_int 1         #VRRP패킷 송신 간격. 초단위로 지정
    authentication {
        auth_type PASS   # 평문 인증 설정
        auth_pass 1111   # 인증을 위한 키 (모두 동일값)
    }
    virtual_ipaddress {
        xxx.xxx.xxx.xxx  # 대표가상IP
    }
    track_script {
        chk_haproxy
    }
}

// master 2번 example
~ 동일 ~
vrrp_instance VI_2 {   #instance 이름은 다르게 하여, 로그에서 구분 가능하게 한다.
    state BACKUP       #BACKUP으로 설정
    interface eth0
    virtual_router_id 51
    priority 100       #우선순위를 조절 한다.
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        xxx.xxx.xxx.xxx
    }
    track_script {
        chk_haproxy
    }
}

// master 3번 example
~ 동일 ~
vrrp_instance VI_3 {   #instance 이름은 다르게 하여, 로그에서 구분 가능하게 한다.
    state BACKUP       #BACKUP으로 설정
    interface eth0
    virtual_router_id 51
    priority 99        #우선순위를 조절 한다.
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        xxx.xxx.xxx.xxx
    }
    track_script {
        chk_haproxy
    }
}

// keepalived 실행 (모든 master 동일)
# systemctl enable keepalived
# systemctl start keepalived

// master 1에서 대표가상IP 추가 확인 (BACKUP서버에는 안보인다.)
# ip addr show eth0

//-------------------------------------------------
// haproxy 설정 (모든 master 공통)
# mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.org  // 원본 백업
# vi /etc/haproxy/haproxy.cfg
// examples
global
        log 127.0.0.1 local2
        maxconn 2000
        uid 0
        gid 0
        daemon               # background process 
defaults
        log     global       # global 설정 사용
        mode    tcp          # SSL 통신을 위해서는 tcp 모드로 (http모드는 SSL 안됨)
        option  tcplog
        option  dontlognull  # 데이터가 전송되지 않은 연결 로깅 제외 (This is not recommended for environments such as web applications over the Internet where null connections could indicate malicious activities such as open port-scanning for vulnerabilities)
        retries 3            # 연결 요청 재 시도 횟수
        #option redispatch   
        maxconn 2000
        #timeout http-request 10s
        #timeout queue        1m
        timeout connect       10s
        timeout client        1m
        timeout server        1m
frontend ssl_front
        bind xxx.xxx.xxx.xxx:16443  #대표가상IP (kube-master 와 같은 머신을 사용하므로 port를 kube-apiserver와 다르게 설정)
        default_backend ssl_backend
backend ssl_backend
        balance roundrobin
        option tcp-check     # ssl-hello-chk option 사용하지 말것 - ssl3.0 protocol 이라 k8s api 서버 오류 유발 (TLS 1.2 이상만 지원)
        server <master1 hostname> <master1 ip>:6443 check
        server <master2 hostname> <master2 ip>:6443 check
        server <master3 hostname> <master3 ip>:6443 check

//haproxy 실행 
# systemctl enable haproxy
# systemctl start haproxy

// keepalived & haproxy 상태 확인 (모든 master)
# systemctl status keepalived
# systemctl status haproxy
// keepalived는 MASTER상태 외에는 전부 BACKUP으로 표시되어야 한다. 아니라면, keepalived를 모두 재시작해주고 다시 확인하자.

 

3) Master Node 구성

3-1) master 1번

- HA를 구성하는 Master의 kubeadm, kubelet 버전이 같음을 확인하자.

- # kubeadm version

//1) kubeadm-config.yaml 파일 생성 (작업 경로 무관)
# vi kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.11.3   // 버전 확인 (kubeadm version)
apiServerCertSANs:
- "xxx.xxx.xxx.xxx"          // LoadBalancer 대표가상IP
api:
    controlPlaneEndpoint: "xxx.xxx.xxx.xxx:16443"  // LoadBalancer 대표가상IP:지정PORT
etcd:
  local:
    extraArgs:
      listen-client-urls: "https://127.0.0.1:2379,https://<master1 ip>:2379"
      advertise-client-urls: "https://<master1 ip>:2379"
      listen-peer-urls: "https://<master1 ip>:2380"
      initial-advertise-peer-urls: "https://<master1 ip>:2380"
      initial-cluster: "<master1 hostname>=https://<master1 ip>:2380"  // hostname은 반드시 소문자로만!
    serverCertSANs:
      - <master1 hostname>
      - <master1 ip>
    peerCertSANs:
      - <master1 hostname>
      - <master1 ip>
networking:
    podSubnet: "<x.x.x.x/x>"     //network add-on 설정한 pod network 지정 가능


//2) kubeadm init 실행
# cat /proc/sys/net/ipv4/ip_forward
// 결과 1이 아니면,
# echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
# kubeadm init --config kubeadm-config.yaml   // 결과 출력 copy 저장 (node join 정보)

//3) 다른 master 2, 3 서버로 파일 복사
// 대상 파일
/etc/kubernetes/pki/ca.crt
/etc/kubernetes/pki/ca.key
/etc/kubernetes/pki/sa.key
/etc/kubernetes/pki/sa.pub
/etc/kubernetes/pki/front-proxy-ca.crt
/etc/kubernetes/pki/front-proxy-ca.key
/etc/kubernetes/pki/etcd/ca.crt
/etc/kubernetes/pki/etcd/ca.key
/etc/kubernetes/admin.conf

// copy 실행 (.sh 파일로 만들면 '# sh sh파일명' 으로 실행 가능)
# USER=ubuntu  // root 일경우는? (/root/ 경로로 복사됨)
# CONTROL_PLANE_IPS="<master2 ip> <master3 ip>"
# for host in ${CONTROL_PLANE_IPS}; do
scp /etc/kubernetes/pki/ca.crt "${USER}"@$host:
scp /etc/kubernetes/pki/ca.key "${USER}"@$host:
scp /etc/kubernetes/pki/sa.key "${USER}"@$host:
scp /etc/kubernetes/pki/sa.pub "${USER}"@$host:
scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host:
scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host:
scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:etcd-ca.crt
scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:etcd-ca.key
scp /etc/kubernetes/admin.conf "${USER}"@$host:
done

3-2) master 2번

//1) kubeadm-config.yaml 파일 생성
# vi kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.11.3
apiServerCertSANs:
- "xxx.xxx.xxx.xxx"          // LoadBalancer 대표가상IP
api:
    controlPlaneEndpoint: "xxx.xxx.xxx.xxx:16443"
etcd:
  local:
    extraArgs:
      listen-client-urls: "https://127.0.0.1:2379,https://<master2 ip>:2379"
      advertise-client-urls: "https://<master2 ip>:2379"
      listen-peer-urls: "https://<master2 ip>:2380"
      initial-advertise-peer-urls: "https://<master2 ip>:2380"
      initial-cluster: "<master1 hostname>=https://<master1 ip>:2380,<master2 hostname>=https://<master2 ip>:2380"
      initial-cluster-state: existing
    serverCertSANs:
      - <master2 hostname>
      - <master2 ip>
    peerCertSANs:
      - <master2 hostname>
      - <master2 ip>
networking:
    podSubnet: "<x.x.x.x/x>"     //network add-on 설정한 pod network 지정 가능

// ip_forward 확인
# cat /proc/sys/net/ipv4/ip_forward
// 결과 1이 아니면,
# echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward


//2) copy된 파일을 정확한 경로로 복사
# USER=ubuntu # customizable   //root 일경우는 /root/
# mkdir -p /etc/kubernetes/pki/etcd
# mv /home/${USER}/ca.crt /etc/kubernetes/pki/
# mv /home/${USER}/ca.key /etc/kubernetes/pki/
# mv /home/${USER}/sa.pub /etc/kubernetes/pki/
# mv /home/${USER}/sa.key /etc/kubernetes/pki/
# mv /home/${USER}/front-proxy-ca.crt /etc/kubernetes/pki/
# mv /home/${USER}/front-proxy-ca.key /etc/kubernetes/pki/
# mv /home/${USER}/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt
# mv /home/${USER}/etcd-ca.key /etc/kubernetes/pki/etcd/ca.key
# mv /home/${USER}/admin.conf /etc/kubernetes/admin.conf

//3) kubelet bootstrap을 위한 명령 실행
# kubeadm alpha phase certs all --config kubeadm-config.yaml
# kubeadm alpha phase kubelet config write-to-disk --config kubeadm-config.yaml
# kubeadm alpha phase kubelet write-env-file --config kubeadm-config.yaml
# kubeadm alpha phase kubeconfig kubelet --config kubeadm-config.yaml
# systemctl start kubelet

//4) etcd cluster 에 node 등록
# export CP0_IP=<master1 ip>
# export CP0_HOSTNAME=<master1 hostname>  //hostname은 언제나 반드시 소문자!
# export CP1_IP=<master2 ip>
# export CP1_HOSTNAME=<master2 hostname>
# export KUBECONFIG=/etc/kubernetes/admin.conf

# kubectl exec -n kube-system etcd-${CP0_HOSTNAME} -- etcdctl --ca-file /etc/kubernetes/pki/etcd/ca.crt --cert-file /etc/kubernetes/pki/etcd/peer.crt --key-file /etc/kubernetes/pki/etcd/peer.key --endpoints=https://${CP0_IP}:2379 member add ${CP1_HOSTNAME} https://${CP1_IP}:2380
# kubeadm alpha phase etcd local --config kubeadm-config.yaml

//5) node를 Master로 배포
# kubeadm alpha phase kubeconfig all --config kubeadm-config.yaml
# kubeadm alpha phase controlplane all --config kubeadm-config.yaml
# kubeadm alpha phase mark-master --config kubeadm-config.yaml

3-3) master 3번

//1) kubeadm-config.yaml 파일 생성
# vi kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.11.3
apiServerCertSANs:
- "xxx.xxx.xxx.xxx"           // LoadBalancer 대표가상IP
api:
    controlPlaneEndpoint: "xxx.xxx.xxx.xxx:16443"
etcd:
  local:
    extraArgs:
      listen-client-urls: "https://127.0.0.1:2379,https://<master3 ip>:2379"
      advertise-client-urls: "https://<master3 ip>:2379"
      listen-peer-urls: "https://<master3 ip>:2380"
      initial-advertise-peer-urls: "https://<master3 ip>:2380"
      initial-cluster: "<master1 hostname>=https://<master1 ip>:2380,<master2 hostname>=https://<master2 ip>:2380,<master3 hostname>=https://<master3 ip>:2380"
      initial-cluster-state: existing
    serverCertSANs:
      - <master3 hostname>
      - <master3 ip>
    peerCertSANs:
      - <master3 hostname>
      - <master3 ip>
networking:
    podSubnet: "<x.x.x.x/x>"     //network add-on 설정한 pod network 지정 가능

// ip_forward 확인
# cat /proc/sys/net/ipv4/ip_forward
// 결과 1이 아니면,
# echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward


//2) copy된 파일을 정확한 경로로 복사
# USER=ubuntu # customizable
# mkdir -p /etc/kubernetes/pki/etcd
# mv /home/${USER}/ca.crt /etc/kubernetes/pki/
# mv /home/${USER}/ca.key /etc/kubernetes/pki/
# mv /home/${USER}/sa.pub /etc/kubernetes/pki/
# mv /home/${USER}/sa.key /etc/kubernetes/pki/
# mv /home/${USER}/front-proxy-ca.crt /etc/kubernetes/pki/
# mv /home/${USER}/front-proxy-ca.key /etc/kubernetes/pki/
# mv /home/${USER}/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt
# mv /home/${USER}/etcd-ca.key /etc/kubernetes/pki/etcd/ca.key
# mv /home/${USER}/admin.conf /etc/kubernetes/admin.conf

//3) kubelet bootstrap을 위한 명령 실행
# kubeadm alpha phase certs all --config kubeadm-config.yaml
# kubeadm alpha phase kubelet config write-to-disk --config kubeadm-config.yaml
# kubeadm alpha phase kubelet write-env-file --config kubeadm-config.yaml
# kubeadm alpha phase kubeconfig kubelet --config kubeadm-config.yaml
# systemctl start kubelet

//4) etcd cluster 에 node 등록
# export CP0_IP=<master1 ip>
# export CP0_HOSTNAME=<master1 hostname>
# export CP2_IP=<master3 ip>
# export CP2_HOSTNAME=<master3 hostname>
# export KUBECONFIG=/etc/kubernetes/admin.conf 

# kubectl exec -n kube-system etcd-${CP0_HOSTNAME} -- etcdctl --ca-file /etc/kubernetes/pki/etcd/ca.crt --cert-file /etc/kubernetes/pki/etcd/peer.crt --key-file /etc/kubernetes/pki/etcd/peer.key --endpoints=https://${CP0_IP}:2379 member add ${CP2_HOSTNAME} https://${CP2_IP}:2380
# kubeadm alpha phase etcd local --config kubeadm-config.yaml

//5) node를 Master로 배포
# kubeadm alpha phase kubeconfig all --config kubeadm-config.yaml
# kubeadm alpha phase controlplane all --config kubeadm-config.yaml
# kubeadm alpha phase mark-master --config kubeadm-config.yaml

 

5. pod network add on 설치

- pod 들간의 communication 을 위한 container networks interface 설치 (NCI) 필수.

- 설치되는 add-on을 통해 pod의 가상 네트워크 ip 대역대를 설정할 수 있다.

- 이 add-on을 통해 CoreDNS 가 활성화 된다.

- 대상 : master 1번 (single구성은 그냥 master)

# cat /proc/sys/net/bridge/bridge-nf-call-iptables  // 1 세팅 확인
# sysctl net.bridge.bridge-nf-call-iptables=1       // 1이 아니면 실행

// add-on install (weave net)
# kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

// master 상태 확인
# kubectl get nodes
NAME          STATUS     ROLES     AGE       VERSION
master1       Ready     master    15h       v1.11.3
master2       Ready     master    15h       v1.11.3
master3       Ready     master    15h       v1.11.3
# kubectl get pods --all-namespaces
kube-system   coredns-78fcdf6894-969pp      1/1       Running   0     15h  //-> core dns 실행 확인

 

6. Worker Node Join

- Kubernetes Master에 노드를 추가하기 위해서는 Master에서 kubeadm init을 했을 때, 출력된 join 명령을 사용 한다.

- 대상 : 모든 worker node

# cat /proc/sys/net/ipv4/ip_forward                // 1 세팅 확인
# echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward  // 1이 아니면 실행

# kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>

// ---------------------
// 아래의 경우 master 서버에서 확인 가능
// token을 잊은 경우
# kubeadm token list
// token이 만료된 경우 (default 24시간)
# kubeadm token create
// --discovery-token-ca-cert-hash 값 확인 방법
# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
  openssl dgst -sha256 -hex | sed 's/^.* //'

※ Master Isolation (Optional)

- 기본적으로 kubernetes는 Master에 pod을 배포하지 않음. 이를 제거하고 Master에도 pod을 배포하고 싶은 경우

# kubectl taint nodes --all node-role.kubernetes.io/master-

- Daemon Set도 마찬가지이나, 이 유형은 배포 yaml에 다음의 옵션을 추가함으로써 Master독립모드에서도 Master에 배포 가능하다.

tolerations:
    - effect: NoSchedule
      operator: Exists

※ 초기화

// 먼저 노드를 해제하고, 노드를 종료하기 전에 노드가 비어 있는지 확인해야 한다.
// master ha 모드에서도 모든 마스터 노드를 drain하고, 모든 master, 및 노드 에서 reset 한다.
# kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
# kubectl delete node <node name>

// 모든 Master,노드에서 kubeadm 설치 상태를 재설정
# kubeadm reset

// kubernetes를 shutdown/reset 후에 Network add-on 삭제 수행
# weave reset
# rm /opt/cni/bin/weave-*

// kubeadm 부터 다시 install 하려고 하면, 다음과 같이 삭제
# yum remove -y kubelet kubeadm kubectl

초기화를 하고 나면, kubelet이 stop상태가 되므로, start 하고 Master 세팅을 해야 한다. 하지만, 그 전에 먼저 kubelet을 설치할때의 설정들을 다시 확인해보고 start 하자.

 마스터가 죽어서 reboot 되었을때, kubelet이 재시작 Fail 나면 (Node Not Ready)

# /var/log/containers 에서 kubelet log 확인
 
//재시작 되면, swapoff 가 리셋됨
# swapoff -a 
# cat /proc/sys/net/ipv4/ip_forward 1 인지 확인 -> # echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
 
//SELinux disable도 확인
# setenforce 0
 
# systemctl daemon-reload
# systemctl restart kubelet

'cloud&platform' 카테고리의 다른 글

Kafka 기본 개념  (0) 2020.11.09
Docker 기본 개념  (0) 2020.10.26
Spring Core - IoC, DI, Context And Bean  (0) 2020.10.22
Spring Overview  (0) 2020.10.20
Kubectl command  (0) 2020.10.16