준비물
- 8 hours
- 4 server for kubernetes
===총 4개의 쿠퍼네티스 노드
$ sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/sysconfig/selinux
$ setenforce 0
$ cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
$ sysctl --system
$ swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab
$ reboot
$ yum install -y kubelet-1.9.3-0.x86_64 kubeadm-1.9.3-0.x86_64 kubectl-1.9.3-0.x86_64 git
$ systemctl enable kubelet && systemctl start kubelet
##kublet, kubeadmin, kubectl 설치를 위한 명령어
$ sed -i 's/systemd/cgroupfs/g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
##도커와 cgroup을 동일하게 맞추기 위해서 변경
$ systemctl daemon-reload && systemctl restart kubelet
$ yum install -y keepalived
$ systemctl enable keepalived && systemctl restart keepalived
======= 3개의 마스터노드
$ cd kubeadm-ha
##github로 부터 설치 config파일을 가져와서 설치. yml이 생성됨
$ ./setting.sh
#!/bin/bash # local machine ip address export K8SHA_IPLOCAL=10.10.12.## # local machine etcd name, options: etcd1, etcd2, etcd3 export K8SHA_ETCDNAME=etcd1 # local machine keepalived state config, options: MASTER, BACKUP. One keepalived cluster only one MASTER, other's are BACKUP export K8SHA_KA_STATE=MASTER # local machine keepalived priority config, options: 102, 101, 100. MASTER must 102 export K8SHA_KA_PRIO=102 # local machine keepalived network interface name config, for example: eth0 export K8SHA_KA_INTF=ens192 ####################################### # all masters settings below must be same ####################################### # master keepalived virtual ip address export K8SHA_IPVIRTUAL=10.10.12.#6 # master01 ip address export K8SHA_IP1=10.10.12.#1 # master02 ip address export K8SHA_IP2=10.10.12.#2 # master03 ip address export K8SHA_IP3=10.10.12.#3 # master01 hostname export K8SHA_HOSTNAME1=host##-1.cloud.com # master02 hostname export K8SHA_HOSTNAME2=host##-2.cloud.com # master03 hostname export K8SHA_HOSTNAME3=host##-3.cloud.com # keepalived auth_pass config, all masters must be same export K8SHA_KA_AUTH=4cdf7dc3b4c90194d1600c483e10ad1d # kubernetes cluster token, you can use 'kubeadm token generate' to get a new one export K8SHA_TOKEN=7f276c.0741d82a5337f526 # kubernetes CIDR pod subnet, if CIDR pod subnet is "10.244.0.0/16" please set to "10.244.0.0\\/16" export K8SHA_CIDR=10.244.0.0\\/16 # kubernetes CIDR service subnet, if CIDR service subnet is "10.96.0.0/12" please set to "10.96.0.0\\/12" export K8SHA_SVC_CIDR=10.96.0.0\\/12 # calico network settings, set a reachable ip address for the cluster network interface, for example you can use the gateway ip address export K8SHA_CALICO_REACHABLE_IP=10.10.12.1 ############################## # please do not modify anything below ############################## # set etcd cluster docker-compose.yaml file sed \ -e "s/K8SHA_ETCDNAME/$K8SHA_ETCDNAME/g" \ -e "s/K8SHA_IPLOCAL/$K8SHA_IPLOCAL/g" \ -e "s/K8SHA_IP1/$K8SHA_IP1/g" \ -e "s/K8SHA_IP2/$K8SHA_IP2/g" \ -e "s/K8SHA_IP3/$K8SHA_IP3/g" \ etcd/docker-compose.yaml.tpl > etcd/docker-compose.yaml echo 'set etcd cluster docker-compose.yaml file success: etcd/docker-compose.yaml' # set keepalived config file mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak cp keepalived/check_apiserver.sh /etc/keepalived/ sed \ -e "s/K8SHA_KA_STATE/$K8SHA_KA_STATE/g" \ -e "s/K8SHA_KA_INTF/$K8SHA_KA_INTF/g" \ -e "s/K8SHA_IPLOCAL/$K8SHA_IPLOCAL/g" \ -e "s/K8SHA_KA_PRIO/$K8SHA_KA_PRIO/g" \ -e "s/K8SHA_IPVIRTUAL/$K8SHA_IPVIRTUAL/g" \ -e "s/K8SHA_KA_AUTH/$K8SHA_KA_AUTH/g" \ keepalived/keepalived.conf.tpl > /etc/keepalived/keepalived.conf echo 'set keepalived config file success: /etc/keepalived/keepalived.conf' # set nginx load balancer config file sed \ -e "s/K8SHA_IP1/$K8SHA_IP1/g" \ -e "s/K8SHA_IP2/$K8SHA_IP2/g" \ -e "s/K8SHA_IP3/$K8SHA_IP3/g" \ nginx-lb/nginx-lb.conf.tpl > nginx-lb/nginx-lb.conf echo 'set nginx load balancer config file success: nginx-lb/nginx-lb.conf' # set kubeadm init config file sed \ -e "s/K8SHA_HOSTNAME1/$K8SHA_HOSTNAME1/g" \ -e "s/K8SHA_HOSTNAME2/$K8SHA_HOSTNAME2/g" \ -e "s/K8SHA_HOSTNAME3/$K8SHA_HOSTNAME3/g" \ -e "s/K8SHA_IP1/$K8SHA_IP1/g" \ -e "s/K8SHA_IP2/$K8SHA_IP2/g" \ -e "s/K8SHA_IP3/$K8SHA_IP3/g" \ -e "s/K8SHA_IPVIRTUAL/$K8SHA_IPVIRTUAL/g" \ -e "s/K8SHA_TOKEN/$K8SHA_TOKEN/g" \ -e "s/K8SHA_CIDR/$K8SHA_CIDR/g" \ -e "s/K8SHA_SVC_CIDR/$K8SHA_SVC_CIDR/g" \ kubeadm-init.yaml.tpl > kubeadm-init.yaml echo 'set kubeadm init config file success: kubeadm-init.yaml' # set canal deployment config file sed \ -e "s/K8SHA_CIDR/$K8SHA_CIDR/g" \ -e "s/K8SHA_CALICO_REACHABLE_IP/$K8SHA_CALICO_REACHABLE_IP/g" \ kube-canal/canal.yaml.tpl > kube-canal/canal.yaml echo 'set canal deployment config file success: kube-canal/canal.yaml'
$ docker-compose --file etcd/docker-compose.yaml up -d
## etcd설치
$ docker exec -ti etcd etcdctl cluster-health
## etcd 3개 health check. etcd는 3개 이상 잘 도착해야한다.
$ docker exec -ti etcd etcdctl member list
## etcd 멤버 확인, etcd 설치 완료
# master 01 에서 다음 작업 수행
$ kubeadm init --config=kubeadm-init.yaml
## 셀프 인증서 설치, config파일 생성, 컨테이너 올리는중. -> master 1 server 설치 완료
$ kubeadm join --token 7f276c.0741d82a5337f526 10.10.12.141:6443 --discovery-token-ca-cert-hash sha256:1ad322228910b27a60c0998f7b20d0a67de7aa96177a8a5fa2dd7bc075768067
## 나중을 위해서 잠깐 master 1 토큰 저장
$ scp -r /etc/kubernetes/pki host##-2.cloud.com:/etc/kubernetes/
## 인증서를 2번으로 복사
$ scp -r /etc/kubernetes/pki host##-3.cloud.com:/etc/kubernetes/
## 인증서를 3번으로 복사
# master 02, master 03에서 다음 작업 수행
$ kubeadm init --config=kubeadm-init.yaml
##인증서 복사 후 master1과 같은 인증서로 2번, 3번도 설치 완료
$ kubeadm join --token 7f276c.0741d82a5337f526 10.10.12.142:6443 --discovery-token-ca-cert-hash sha256:1ad322228910b27a60c0998f7b20d0a67de7aa96177a8a5fa2dd7bc075768067
##master 2 token(master 1 과 같은지 확인!!)
$ kubeadm join --token 7f276c.0741d82a5337f526 10.10.12.143:6443 --discovery-token-ca-cert-hash sha256:1ad322228910b27a60c0998f7b20d0a67de7aa96177a8a5fa2dd7bc075768067
##master 3 token(master 1 과 같은지 확인!!)
##master1, 2, 3 token이 같으면 etcd가 묶인것
# all master nodes: set kubectl client environment variable
$ echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bashrc
## 환경변수 설정
$ source ~/.bashrc
## 모든것이 정상적으로 되면 아래와 같이 명령어가 먹힘
# master 01 에서 다음 작업 수행
$ kubectl apply -f kube-canal/
##다음 명령으로 설치가 완료되기를 기다린다. network중에 canal을 사용할 것임. ACI NSX 같은 유료 엔터프라이즈 네트워크 시스템 사용해도 무관함.
$ watch kubectl get pods --all-namespaces
## 잘 깔렸는지 확인 0이 있으면 안됨!
$ kubectl get no
##아까와 다르게 이제 네트워크가 설정되면서 READY로 변했다.
$ kubectl taint nodes --all node-role.kubernetes.io/master-
##master에도 pod를 배포할수 있게끔 설정
$ kubectl apply -f kube-dashboard/
##gui 대시보드를 깔아보자
$ kubectl get pods --all-namespaces
##대시보드 깔렸는지 확인
kubectl apply -f kube-heapster/influxdb/
kubectl apply -f kube-heapster/rbac/
kubectl get pods --all-namespaces
##heapster
##대시보드, heapster깔리면 아래와 같이 보임
# all master nodes
$ systemctl restart keepalived
##keepalived service 확인
ping <VIP:10.10.12.#6>
$ docker-compose -f nginx-lb/docker-compose.yaml up -d
$ curl -k https://<VIP>:16443
##install nginx load balancer 로드밸런서 구성
##nignx가 설치잘되면 아래와 같이 보인다.
# any master nodes
$ kube-proxy configuration
$ set kube-proxy server settings
## 모든 kubectl이 연결되었기때문에 아무 마스터 node에서 실행하면됨.
$ kubectl edit -n kube-system configmap/kube-proxy
## 다음 값을 수정: server: https://10.10.12.#4:16443
## delete all kube-proxy pod to restart it
$ kubectl get pods --all-namespaces -o wide | grep proxy
$ kubectl delete pod -n kube-system kube-proxy-XXX
##pod을 지우더라도 다시 생성됨을 볼 수 있음
# All Worker node
$ kubeadm join --token 7f276c.0741d82a5337f526 10.10.12.141:6443 --discovery-token-ca-cert-hash sha256:1ad322228910b27a60c0998f7b20d0a67de7aa96177a8a5fa2dd7bc075768067
## 아까 1번 토큰으로 멤버 추가됨.
## 아래와 같이 간단하게 worker node를 추가 가능하다.
$ systemctl status kubelet.service
## kubelet은 데몬으로 돌고 있는 모습을 볼 수 있다. 다른 서비스들은 모두 도커로 돌림.
##kubectl을 사용하지 않고 k라는 약자로 사용하고 자동완성 기능 사용하려면 아래와 같이 설정하면 됨. - 나갔다 와도 잘됨
$ echo "alias k=kubectl" >> ~/.bashrc
$ echo "source <(kubectl completion bash | sed s/kubectl/k/g)" >> ~/.bashrc
$ k cordon <host>
$ k get no
## 특정 host가 이상증상이 있어서 신규에서 제외하고자 한다면 cordon하면 스케쥴링에서 제외되게 된다.(반대는 uncordon)
$ k drain <host> --ignore-daemonsets
$ k get no
## node를 제거 또는 재부팅 등을 위해서 pod들을 쫙 빼주는 역할
$ k delete no <host>
## drain 이후에 제거가능
$ kubeadm reset
## 빼진 member에는 반드시 위와 같이 reset을 해줘야함.. not master node
$ kubeadm token list
$ kubeadm token create
##member join할 일이 있을 때는 토큰을 사용한다.(expire time은 보통 23시간)
$ kubeadm join --token bdbe75.fc8510448b496a36 10.10.12.146:16443 --discovery-token-unsafe-skip-ca-verification
## member node에서 마스터의 토큰을 사용해서 join을 건다.(조인이 된 이후에는 token을 지우는게 보안에 좋다.)
## 다음 파일 편집-vip:16443
$ vi /etc/kubernetes/bootstrap-kubelet.conf
$ vi /etc/kubernetes/kubelet.conf
$ grep 10.10.12 /etc/kubernetes/*.conf
$ systemctl restart docker && systemctl restart kubelet
'DevOps > 쿠버네티스' 카테고리의 다른 글
쿠버네티스 배포를 하기 위한 준비 readinessProbe, livenessProbe (957) | 2018.05.03 |
---|---|
INGRESS를 사용한 쿠버네티스 네트워크 심화(sticky session, ssl connection) (942) | 2018.05.03 |
INGRESS를 사용한 쿠버네티스 네트워크 설치 및 연결 (1412) | 2018.05.03 |
쿠버네티스 service를 사용한 네트워크 설정 (1416) | 2018.05.02 |
쿠버네티스 service를 통한 네트워크 설정 개념정리 (2023) | 2018.05.02 |
쿠버네티스 RC를 통한 POD생성 및 Probe를 통한 health check (955) | 2018.05.02 |