Kubernetes master 는 Http 또는 Https 를 통해서 etcd 로 접속해서 데이터를 저장하고, Flannel 을 통해서 접근하고, Kubernetes nodes 는 Kubernetes maste 로 부터 명령을 받고, 상테를 전송하는 구조 인듯.
etcd
etcd는 간단하게 키체인을 저장하는 저장소와 같은 것으로
여러대의 OS가 클러스터로 구성되어 있는 상황에서
하나의 OS 인스턴스를 리더로 하여,
한곳에서 키 값이 변경될 경우 약 1초에 1000개의 키를 동기화 할 수 있도록 빠른 서비스를 제공합니다.
일반적으로 etcd 는 기본 컨트롤러로 제공되는 etcdctl을 이용해서 기능 사용이 가능하다고 한다.
etcd 웹 페이지 : https://github.com/coreos/etcd
Flannel
Flannel is a simple and easy way to configure a layer 3 network fabric designed for Kubernetes
https://github.com/coreos/flannel
구성은 VirtualBox 를 이용해서 할예정이고, 아래와 같은 아이피는 아래와 같은 설정으로 구성했다.
모두 기본값이고 호스트에 추가한 부분만 수정해주면 된다. KUBE_MASTER=”–master=http://centos-master:8080”
#방화벽 해제 모든 노드에 방화벽을 해제해준다.
Master 설정변경
/etc/etcd/etcd.conf 파일을 수정해준다.
Edit /etc/kubernetes/apiserver to appear as such:
ETCD 시작
ETCD 를시작해준다. Network overy 설정을 해주는것이고, Network overy 는 172.30.0.0 네트워크를 사용한다.
flannel overlay Docker network 설정을 해준다.
/etc/sysconfig/flanneld
Start the appropriate services on master:
Node 설정변경
/etc/kubernetes/kubelet 설정변경
먼져 centos-minion-1 node 에서 설정을 해준다.
KUBELET_HOSTNAME 만 변경하면 되는 사하으로 크게 어려움은 없을듯.
다음은 centos-mast-minion-2 노드에서 설정을 해준다.
두 노드에서 모두 설절을 변경해준다.
flannel to overlay Docker network 설정변경 /etc/sysconfig/flanneld
각노드에서 kube-proxy 설정을 해준다.
kubectl 설정
동작확인.
Component 상태
Node 상태
Node 의 Capacity 확인
jq 가 없을 경우 아래 명령어로 설치가능
Master iptables
Node iptables
첫 삽뜨기
Master 에서 먼저 정상적으로 동작하는지 확인해본다.
# kubectl cluster-info
Kubernetes master is running at http://localhost:8080
만약 정상실행이 되고 있지 않으면 실행해준다.
/etc/init.d/kubernetes-master start.
node 가 정상적으로 실행되고 있는지 확인.
# kubectl get nodes
NAME STATUS AGE
centos-minion-1 Ready 3d
centos-minion-2 Ready 3d
실행되고 있지 않으면 node 에서 아래 명령어들을 실행해준다.
service docker start
service kubernetes-node start
모두 정상적으로 실행되고 있다.
이제 도커 레지트리에서 정상적으로 hub.docker.io 에서 받아보는지 Node 에서 테스트 해보겠다.
# docker pull nginx
Using default tag: latest
Trying to pull repository docker.io/library/nginx ...
latest: Pulling from docker.io/library/nginx
e7bb522d92ff: Pull complete
6edc05228666: Pull complete
cd866a17e81f: Pull complete
Digest: sha256:285b49d42c703fdf257d1e2422765c4ba9d3e37768d6ea83d7fe2043dad6e63d
잘받아진다. private registry 를 이용하려면 아래 경로에 로그인 정보를 설정해준다.
# put the credential of docker registry
$ cat /var/lib/kubelet/.dockercfg
{
"<docker registry endpoint>": {
"auth": "SAMPLEAUTH=",
"email": "noreply@sample.com"
}
}
Nginx 실행
실행은 아래 와 같은 형식으로 해준다.
kubectl run <replication controller name> --image=<image name> --replicas=
<number of replicas> [--port=<exposing port>]
자 이제 실행한다.
my-first-nginx 라는 이름으로 deploryment 를 생성하고 80 port 를 열어준다.
# Pull the nginx image and run with 2 replicas, and expose the container port 80
# kubectl run my-first-nginx --image=nginx --replicas=2 --port=80
deployment "my-first-nginx" created
정상적인 경우 아래와 같이 deployments 와 pods 를 확인 가능하다.
# kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
my-first-nginx 2 2 2 2 7m
# kubectl get pods
NAME READY STATUS RESTARTS AGE
my-first-nginx-3504586902-ht4dx 1/1 Running 0 13m
my-first-nginx-3504586902-nc9wk 1/1 Running 0 13m
오류해결
No resources found.
kubectl get pods 실행시
ServiceAccount Account 를 삭제해준다.
$ cat /etc/kubernetes/apiserver
find the “KUBE_ADMISSION_CONTROL="--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
second: delete "ServiceAccount"
finnaly: restart kube-apiserver service
you try "kubectl get pods"
Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request. details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"