kubeadm 구축kubernetes 집단

16288 단어

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을 고쳐imagePullPolicyAlwaysIfNotPresent(현지에서 다시 뽑지 않음)또는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를 재건하면 된다

좋은 웹페이지 즐겨찾기