kubeadm 구축kubernetes 집단
1. 환경 준비
우선 환경은 VM 3대이며 VM 주소는 다음과 같습니다.
IP 주소
노드
192.168.1.167
master
192.168.1.189
node1
192.168.1.176
node2
그리고 기계마다docker를 설치하고 rpm 설치 패키지 버전은 아래에 소개합니다
2. 진지한 일을 말하다
2.1 설치 패키지는 어디에서 오나
공식 문서 페이지의 업데이트가 제때에 이루어지지 않는 동시에 그의 yum원 업데이트도 느리다. 게다가... 그럼 엄마는 구글의 서버인데 특별히 연결할 수 있겠는가?예전에는 항상 외국 서버에서 사용
yumdownloader
하고 다운로드한 다음scp
로컬로 가면 문제가 해결되지만 알이 깨지고... 마지막에 원천을 찾았습니다. 아래와 같습니다.Kubernetes가 컴파일한 각종 발행판 설치 패키지는 Github에 있는release라는 또 다른 프로젝트에서 유래한 것입니다. 주소는 여기입니다. 이 프로젝트
clone
를 내려주십시오. 본인은 Centos 사용자이기 때문에 rpm 디렉터리에 들어가서 docker가 설치된 기계에서 그docker-build.sh
스크립트를 실행하면 rpm 패키지를 컴파일할 수 있습니다. 마지막으로 현재 디렉터리output
디렉터리에 생성됩니다. 캡처는 다음과 같습니다.2.2 미러링
그래, 그래, gcr.io는 Google의 도메인 이름이고 서버는 더 말할 필요가 없기 때문에
kubeadm init
작업을 할 때 이 거울들을load에 먼저 넣지 않으면 절대로 끊길 수 없습니다. 아래에 필요한 거울이 나왔지만 버전 번호는 rpm 버전에 따라 약간 다를 수 있습니다.미러 이름
버전 번호
gcr.io/google_containers/kube-discovery-amd64
1.0
gcr.io/google_containers/kubedns-amd64
1.7
gcr.io/google_containers/kube-proxy-amd64
v1.4.1
gcr.io/google_containers/kube-scheduler-amd64
v1.4.1
gcr.io/google_containers/kube-controller-manager-amd64
v1.4.1
gcr.io/google_containers/kube-apiserver-amd64
v1.4.1
gcr.io/google_containers/etcd-amd64
2.2.5
gcr.io/google_containers/kube-dnsmasq-amd64
1.3
gcr.io/google_containers/exechealthz-amd64
1.1
gcr.io/google_containers/pause-amd64
3.0
이 거울들은 두 가지 방법으로 얻을 수 있다. 첫 번째는 외국의 서버를 이용하여 위의pull에서 내려온 다음에save를 tar 파일로 만들고 마지막에 scp를 로컬load로 넣는다.첫 번째 방식에 비해 구덩이를 비교하는 것은 서버의 속도에 달려 있다. 매번 할 때마다 아프다. 두 번째 방식은 Dockerhub를 이용하여 중간을 돌리는 것이다. 간단하게 말하자면 Dockerhub의 자동 구축 기능을 이용하여 Github에서 Dockerfile을 만드는데 그 안에
FROM xxxx
이런 gcr만 있으면 된다.io의 거울로 하면 됩니다. 마지막으로pull을 로컬로 보내고 tag를 합니다.우선github 프로젝트를 만듭니다. 제 것을 직접 포크하면 됩니다.
이 중 각 Dockerfile은 단번에
FROM
마지막으로 Docker Hub에서 자동 구축 프로젝트 만들기마지막으로 수동으로 터치해야 Docker Hub에서 컴파일이 시작됩니다.
완성이 될 때까지 기다리시면 바로 pull이 됩니다.
2.3 미러 버전 조정 방법
위에서 이미 거울 획득 문제를 해결했지만 가장 큰 걱정거리는 바로'내가 어느 버전인지 어떻게 알겠는가'입니다.'꼬치꼬치 캐묻기'정신을 발휘하기 위해 먼저 한 번
kubeadm init
을 진행했는데 이때 절대 끊겼습니다. 이때 /etc/kubernetes/manifests
에 들어가면 많은 json 파일을 볼 수 있습니다. 이 파일에서 어떤 기초 거울이 필요한지 정의했습니다.위의 그림에서 기본적으로
kubeadm init
을 볼 때 어떤 기초 거울을 끌어올렸는지 볼 수 있지만 일부 거울은 여전히 찾을 수 없다. 예를 들어 kubedns
, pause
등 다른 거울 버전은 원본 코드에서 찾을 수 있다. 원본 위치는 kubernetes/cmd/kubeadm/app/images/images.go
이 파일에서 다음과 같다.나머지 일부 거울, 예를 들어
kube-proxy-amd64
, kube-discovery-amd64
두 개의 거울, 그중kube-discovery-amd64
은 현재 1.0 버전으로 원본 코드는 다음과 같다.kube-proxy-amd64
는 기초 구성 요소의 주 버전을 따르고 있다. 즉, manifests
에서 컨트롤러 등 버전이 v.1.4.4
인 것을 보면 kube-proxy-amd64
도 이 버전이다. 원본은 다음과 같다.마지막으로 이 버전에 따라 github에 해당하는 Dockerfile을 준비하고 Docker Hub의 자동 구축build를 이용하여 pull에서 tag를 내려 대응하는 거울 이름으로 하면 됩니다.
3. 집단 구축
3.1, 호스트 이름 처리
직접 측정한 결과 노드 호스트 이름은
xxx.xxx
이라는 도메인 형식이 가장 좋다. 그렇지 않으면 POD에서 뛰는 프로그램이 도메인 이름을 사용하여 해석할 때 문제가 발생할 수 있기 때문에 먼저 호스트 이름을 처리해야 한다# hostname(node .node)
echo "192-168-1-167.master" > /etc/hostname
# hosts
echo "127.0.0.1 192-168-1-167.master" >> /etc/hosts
#
sysctl kernel.hostname=192-168-1-167.master
#
➜ ~ hostname
192-168-1-167.master
3.2,load 미러링
본인은 이미 Docker Hub에서 관련 미러를 처리했기 때문에 pull로 내려와서 tag를 하면 됩니다.
images=(kube-proxy-amd64:v1.4.4 kube-discovery-amd64:1.0 kubedns-amd64:1.7 kube-scheduler-amd64:v1.4.4 kube-controller-manager-amd64:v1.4.4 kube-apiserver-amd64:v1.4.4 etcd-amd64:2.2.5 kube-dnsmasq-amd64:1.3 exechealthz-amd64:1.1 pause-amd64:3.0 kubernetes-dashboard-amd64:v1.4.1)
for imageName in ${images[@]} ; do
docker pull mritd/$imageName
docker tag mritd/$imageName gcr.io/google_containers/$imageName
docker rmi mritd/$imageName
done
3.3, rpm 설치
rpm 획득 방법은 위에서 언급한 바와 같이 스스로 컴파일할 수 있습니다. 여기는 제가 컴파일하고 yum 원본을 유지했습니다. 직접yum install로 하면 됩니다. (게으름)
# yum
tee /etc/yum.repos.d/mritd.repo << EOF
[mritdrepo]
name=Mritd Repository
baseurl=https://rpm.mritd.me/centos/7/x86_64
enabled=1
gpgcheck=1
gpgkey=https://cdn.mritd.me/keys/rpm.public.key
EOF
# cache
yum makecache
#
yum install -y kubelet kubectl kubernetes-cni kubeadm
3.4, 마스터 초기화
잠시 후 구덩이가 있습니다.kubeadm 등 관련 rpm가 설치되면
/etc/kubernetes
디렉터리가 생성되고,kubeadm init에서 이 디렉터리가 존재하는지 검사합니다. 존재하면 초기화를 멈추기 때문에 먼저 정리해야 합니다. 다음 스크립트는 공식 문서인 Teardown 부분에서 유래한 것입니다. 이 스크립트는 초기화 실패에 적용되어 리셋됩니다.systemctl stop kubelet;
# : docker ,
# , ( ),
# kubeadm (gcr.io )
docker rm -f -v $(docker ps -q);
find /var/lib/kubelet | xargs -n 1 findmnt -n -t tmpfs -o TARGET -T | uniq | xargs -r umount -v;
rm -r -f /etc/kubernetes /var/lib/kubelet /var/lib/etcd;
그리고 구덩이가 있어요. 초기화하기 전에 쿠벨렛을 꼭 작동시켜야 해요. 당신
systemctl status kubelet
이 작동 실패를 보고 있지만 작동을 해야 해요. 그렇지 않으면 절벽이 막혀 죽어요.systemctl enable kubelet
systemctl start kubelet
잠깐만, 잠깐만, 그리고 구덩이, 새 버전 직접 init 알림
ebtables not found in system path
오류, 그래서 이 가방을 설치하고 초기화해야 합니다.# ebtables
yum install -y ebtables
마지막으로 기적을 목격할 때
# apiserver
kubeadm init --api-advertise-addresses 192.168.1.167
완벽한 캡처는 다음과 같습니다.
여기에 구덩이를 하나 더 폭로하면 밑에 있는
kubeadm join --token=b17964.5d8a3c14e99cf6aa 192.168.1.167
이 명령은 반드시 보존해야 한다. 왜냐하면 후기에 재현할 수 없기 때문이다. 너희 맏형이 다시 기계를 추가하라고 했을 때 이게 없으면 너는 울 것이다3.5, node 가입
위의 모든 구덩이는 대략 말의 차이가 많지 않으니, 직접 명령을 내렸다
#
echo "192-168-1-189.node" > /etc/hostname
echo "127.0.0.1 192-168-1-189.node" >> /etc/hosts
sysctl kernel.hostname=192-168-1-189.node
#
images=(kube-proxy-amd64:v1.4.4 kube-discovery-amd64:1.0 kubedns-amd64:1.7 kube-scheduler-amd64:v1.4.4 kube-controller-manager-amd64:v1.4.4 kube-apiserver-amd64:v1.4.4 etcd-amd64:2.2.5 kube-dnsmasq-amd64:1.3 exechealthz-amd64:1.1 pause-amd64:3.0 kubernetes-dashboard-amd64:v1.4.1)
for imageName in ${images[@]} ; do
docker pull mritd/$imageName
docker tag mritd/$imageName gcr.io/google_containers/$imageName
docker rmi mritd/$imageName
done
# rpm
tee /etc/yum.repos.d/mritd.repo << EOF
[mritdrepo]
name=Mritd Repository
baseurl=https://rpm.mritd.me/centos/7/x86_64
enabled=1
gpgcheck=1
gpgkey=https://cdn.mritd.me/keys/rpm.public.key
EOF
yum makecache
yum install -y kubelet kubectl kubernetes-cni kubeadm ebtables
# ( )
rm -r -f /etc/kubernetes /var/lib/kubelet /var/lib/etcd;
# kubelet
systemctl enable kubelet
systemctl start kubelet
#
kubeadm join --token=b17964.5d8a3c14e99cf6aa 192.168.1.167
똑같이 완벽하게 캡처.
3.6, weave 네트워크 구축
위브를 더 이상 배치하지 않았을 때 dns는 시작할 수 없습니다. 아래와 같습니다.
정부가 내린 명령은 이렇다
kubectl create -f https://git.io/weave-kube
"꼬치꼬치 캐묻고 조상의 무덤을 파는"정신에 따라 우선 이yaml을
wget https://git.io/weave-kube -O weave-kube.yaml
그리고 같은 방법으로 거울을 열고 Docker Hub를 이용하여 중간을 돌고 내려서 로드해서 들어가면
create -f
됩니다.docker pull mritd/weave-kube:1.7.2
docker tag mritd/weave-kube:1.7.2 weaveworks/weave-kube:1.7.2
docker rmi mritd/weave-kube:1.7.2
kubectl create -f weave-kube.yaml
완벽한 캡처
3.7, 대시보드 배포
dashboard의 명령도 weave와 같지만 큰 구덩이가 있습니다. 기본적인yaml 파일에서 이미지 추출 정책에 대한 정의는 언제든지 이미지를 추출하는 것입니다. 이로 인해 로드가 들어가도 쓸모가 없기 때문에 먼저 yaml을 제거한 다음에 이미지 추출 정책을 고쳐야 합니다. 마지막
create -f
으로 하면 됩니다.wget https://rawgit.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml -O kubernetes-dashboard.yaml
편집yaml을 고쳐
imagePullPolicy
Always
IfNotPresent
(현지에서 다시 뽑지 않음)또는Never
(뽑지 않음)으로 바꾸면 된다마지막으로 Dokcer Hub를 이용해서 돌려서 만듭니다.
kubectl create -f kubernetes-dashboard.yaml
캡처는 다음과 같습니다.
describe 명령을 통해 노출된
NodePoint
을 보고 접근할 수 있습니다4. 기타 구덩이
또 다른 구덩이는 여러분이 탐색하기를 기다리고 있습니다. 그 중 하나는 DNS 해석 오류입니다. 표현 형식은 POD 내의 프로그램이 도메인 이름을 통해 접근해서 해석할 수 없습니다.cat용기의
/etc/resolv.conf
에서 가리키는 dns 서버가 kubectl get svc --namespace=kube-system
의 kube-dsn 주소와 일치하지 않는 것을 발견했습니다.해결 방법은 노드의 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
파일을 편집하고 KUBELET_DNS_ARGS
주소를 get svc
의kube-dns 주소로 변경한 다음kubelet 서비스를 재개하고 POD를 다시 죽여kubernetes를 재건하면 된다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.