Kubeadm의 배포 엔터프라이즈 급 고 가용성는 Kubernetes (ECS에 적용)
1. 준비
소개
다양한 옵션을 갖추고는 Kubernetes는,이 튜토리얼 문서가 공식 튜토리얼 및 엔터프라이즈 클라우드 연습에서 실행되는 비즈니스 시나리오에 따라 배포 된 각 위젯은 안정성 특성을 가지고, 몇 가지 테스트 후 선택 :
- 상기에 CentOS 7.6
- 1.16.0는 Kubernetes
- 도커 18.09.7
- 플란넬 3.3
- nginx를-유입 1.5.3
- 기본 노드 클러스터에 최대 세 개의 마스터 메이크업은 부하가 SLB에 의해 네트워크 내에서 균형
- 클러스터의 작업을 여러 작업자 노드를 결성, 외부 네트워크 SLB를로드 밸런싱
토폴로지
호스트 구성
인스턴스 이름 | IP의 예 | 말 |
---|---|---|
K8S 마스터-1 | 10.23.0.69 | 4vCPU 8G 메모리 100G 하드 드라이브 |
K8S 마스터 -2- | 10.23.0.79 | 4vCPU 8G 메모리 100G 하드 드라이브 |
K8S 마스터 -2- | 10.23.0.79 | 4vCPU 8G 메모리 100G 하드 드라이브 |
SLB 네트워크 | 10.23.0.87 | 무작위로 할당 |
시스템 환경 구성
닫기 스왑 파티션은 firewalld은에 시간 동기화는
호스트 이름을 수정
hostnamectl set-hostname k8s-master-1
닫기 SELinux를
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config && setenforce 0
수정 / etc / hosts 파일
10.23.0.69 k8s-master-1
10.23.0.79 k8s-master-2
10.23.0.81 k8s-master-3
10.23.0.63 k8s-worker-1
로드 IPVS
cat > /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
스크립트를 실행
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
SLB ApiServer의 창조
수신 포트 : 6443, 백엔드 서비스를 모든 마스터 노드 (SOURCE_ADDRESS 세션이 열린 상태로 유지)
2. 설치 서비스
설치 고정 표시기
알리 구름 docker1.18를 설치하고 시작하는 스크립트를 사용하여
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
systemctl enable docker && systemctl start docker
구성 daemon.json
cat /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"registry-mirrors": ["https://uyah70su.mirror.aliyuncs.com"]
}
로드 및 재시작
systemctl daemon-reload && systemctl restart docker
安装 kubeadm, 오믈렛, kubectl
알리 구름 냠 구성는 Kubernetes 소스
cat /etc/yum.repos.d/kubenetes.repo
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
소프트웨어의 해당 버전을 설치
yum install -y kubelet-1.16.0-0 kubeadm-1.16.0-0 kubectl-1.16.0-0 --disableexcludes=kubernetes
설정 부팅 (DO 자동으로 서비스 초기화 시작 후, 그렇지 않으면 오류가 시작되지 않음)
systemctl enable kubelet.service
첫 번째 마스터 노드를 초기화합니다
호스트 레코드 추가
echo "127.0.0.1 apiserver.k8s" >> /etc/hosts
초기화 파일을 만듭니다
cat > kubeadm-config.yaml <<EOF
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: "apiserver.k8s:6443"
networking:
serviceSubnet: "179.10.0.0/16”
podSubnet: "179.20.0.0/16"
dnsDomain: “cluster.local”
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
거울 초기화 다운로드
kubeadm config images pull --config kubeadm-config.yaml
초기화 수행
kubeadm init --config=kubeadm-config.yaml --upload-certs
초기화가 처음에 가입 노드 마스터 초기화, 성공적인 컨텐츠를 다음과 발생, 두 번째에 대한 초기화는 노드 노동자를 가입
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of the control-plane node running the following command on each as root:
kubeadm join apiserver.k8s:6443 --token jjo28g.q573caofz5i9ef02 \
--discovery-token-ca-cert-hash sha256:7b5a619a9270ec7c5843679c4bf1021ac4da5e61a3118a298c7c04e66d26e66a \
--control-plane --certificate-key 81e3f41062e3a039c31339f25d7dac4a4f7b8bc8adbc278014919ed4615bede3
Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join apiserver.k8s:6443 --token jjo28g.q573caofz5i9ef02 \
--discovery-token-ca-cert-hash sha256:7b5a619a9270ec7c5843679c4bf1021ac4da5e61a3118a298c7c04e66d26e66a
지시에 따라
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
보기 포드 동작은 (어떤 네트워크 플러그, 일시적으로 보류 상태 coredns 없음)
[root@k8s-master-1 ~]# kubectl get pod -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-58cc8c89f4-45br7 0/1 Pending 0 7m12s <none> <none> <none> <none>
coredns-58cc8c89f4-8b7fv 0/1 Pending 0 7m12s <none> <none> <none> <none>
etcd-k8s-master-1 1/1 Running 0 6m11s 10.23.0.69 k8s-master-1 <none> <none>
kube-apiserver-k8s-master-1 1/1 Running 0 6m24s 10.23.0.69 k8s-master-1 <none> <none>
kube-controller-manager-k8s-master-1 1/1 Running 0 6m25s 10.23.0.69 k8s-master-1 <none> <none>
kube-proxy-rw96m 1/1 Running 0 7m12s 10.23.0.69 k8s-master-1 <none> <none>
kube-scheduler-k8s-master-1 1/1 Running 0 6m17s 10.23.0.69 k8s-master-1 <none> <none>
CNI 네트워크 플러그 - 인 설치, 지원 coredns은 (여기 플란넬을 사용하여) 시작
다운로드 파일 YML
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml`
네트워크의 구성을 수정
"Network": "179.20.0.0/16",
플란넬 네트워크 만들기
kubectl apply -f kube-flannel.yml
4 번째의 초기화, THIRD 마스터 노드
MASTER2, master3에 수행
호스트 레코드 추가
echo "127.0.0.1 apiserver.k8s" >> /etc/hosts
가입 명령 kubeadm을 사용할 수있는 명령의 Mster 실행은 --print-조인 명령을 생성 토큰을 검색 할 수 있습니다.
kubeadm join apiserver.k8s:6443 --token jjo28g.q573caofz5i9ef02 \
--discovery-token-ca-cert-hash sha256:7b5a619a9270ec7c5843679c4bf1021ac4da5e61a3118a298c7c04e66d26e66a \
--control-plane --certificate-key 81e3f41062e3a039c31339f25d7dac4a4f7b8bc8adbc278014919ed4615bede3
This node has joined the cluster and a new control plane instance was created:
* Certificate signing request was sent to apiserver and approval was received.
* The Kubelet was informed of the new secure connection details.
* Control plane (master) label and taint were applied to the new node.
* The Kubernetes control plane instances scaled up.
* A new etcd member was added to the local/stacked etcd cluster.
To start administering your cluster from this node, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Run 'kubectl get nodes' to see this node join the cluster.
위의 지침에 따르면,
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
클러스터의 작동을 확인
[root@k8s-master-2 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master-1 Ready master 64m v1.16.0
k8s-master-2 Ready master 54m v1.16.0
k8s-master-3 Ready master 50m v1.16.0
포드의 작동을 확인
[root@k8s-master-2 ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-67c766df46-qzgt2 1/1 Running 0 72m
kube-system coredns-67c766df46-zq76c 1/1 Running 0 72m
kube-system etcd-k8s-master-1 1/1 Running 0 71m
kube-system etcd-k8s-master-2 1/1 Running 0 62m
kube-system etcd-k8s-master-3 1/1 Running 0 58m
kube-system kube-apiserver-k8s-master-1 1/1 Running 0 71m
kube-system kube-apiserver-k8s-master-2 1/1 Running 0 62m
kube-system kube-apiserver-k8s-master-3 1/1 Running 0 58m
kube-system kube-controller-manager-k8s-master-1 1/1 Running 1 71m
kube-system kube-controller-manager-k8s-master-2 1/1 Running 0 62m
kube-system kube-controller-manager-k8s-master-3 1/1 Running 0 58m
kube-system kube-flannel-ds-amd64-754lv 1/1 Running 2 62m
kube-system kube-flannel-ds-amd64-9x5bk 1/1 Running 0 58m
kube-system kube-flannel-ds-amd64-cscmt 1/1 Running 0 69m
kube-system kube-proxy-8j4sk 1/1 Running 0 58m
kube-system kube-proxy-ct46p 1/1 Running 0 62m
kube-system kube-proxy-rdjrg 1/1 Running 0 72m
kube-system kube-scheduler-k8s-master-1 1/1 Running 1 71m
kube-system kube-scheduler-k8s-master-2 1/1 Running 0 62m
kube-system kube-scheduler-k8s-master-3 1/1 Running 0 58m
보기 etcd 클러스터 상태
[root@k8s-master-2 ~]# kubectl -n kube-system exec etcd-k8s-master-1 -- etcdctl --endpoints=https://10.23.0.69:2379 --ca-file=/etc/kubernetes/pki/etcd/ca.crt --cert-file=/etc/kubernetes/pki/etcd/server.crt --key-file=/etc/kubernetes/pki/etcd/server.key cluster-health
member 87decc97a1526c9 is healthy: got healthy result from https://10.23.0.81:2379
member 689b586b03109caa is healthy: got healthy result from https://10.23.0.79:2379
member 74607e593fdaa944 is healthy: got healthy result from https://10.23.0.69:2379
확인 IPVS (INTI 경우 사용하지 않을 때는 효과, 수동으로 수정해야합니다)
KUBE-프록시 로그, Proxier IPVS 사용하여 출력의 첫 번째 줄을 참조하십시오
[root@k8s-master-1 ~]# kubectl -n kube-system logs -f kube-proxy-h782c
I0210 02:43:15.059064 1 node.go:135] Successfully retrieved node IP: 10.23.0.79
I0210 02:43:15.059101 1 server_others.go:176] Using ipvs Proxier.
W0210 02:43:15.059254 1 proxier.go:420] IPVS scheduler not specified, use rr by default
I0210 02:43:15.059447 1 server.go:529] Version: v1.16.0
작업자 노드 초기화
호스트 레코드 추가
echo "10.23.0.87 apiserver.k8s" >> /etc/hosts
작업자 노드의 구현은, join 명령을 명령 kubeadm이 --print-조인 명령을 생성 토큰을 검색 할 수 있습니다.
kubeadm join apiserver.k8s:6443 --token uxafy2.8ri0m2jibivycllh --discovery-token-ca-cert-hash sha256:7b5a619a9270ec7c5843679c4bf1021ac4da5e61a3118a298c7c04e66d26e66a
마스터에 마스터 초기화하기 설정 파일을 복사 실행 (또는 작업자 노드는 명령을 실행할 수 없습니다)
ssh k8s-worker-1 mkdir -p $HOME/.kube
scp -r $HOME/.kube/config k8s-worker-1:/root/.kube/
ssh k8s-worker-1 sudo chown $(id -u):$(id -g) $HOME/.kube/config
보기 노드 상태
[root@k8s-worker-1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master-1 Ready master 42h v1.16.0
k8s-master-2 Ready master 42h v1.16.0
k8s-master-3 Ready master 42h v1.16.0
k8s-worker-1 Ready <none> 6m11s v1.16.0
6. 그레스 컨트롤러
마스터 노드에서
kubectl apply -f https://kuboard.cn/install-script/v1.16.2/nginx-ingress.yaml
듣기, 공공 SLB 진입 만들기 포트 : 80, 443, 백엔드 서비스 : 모든 작업자 노드 (SOURCE_ADDRESS 세션이 열린 상태로 유지)
구성 DNS : test.myk8s.com는 공용 네트워크 주소 SLB에 도메인 이름을 확인합니다
7. 테스트 클러스터 응용 프로그램 (바람둥이에, 예를 들어)
만들기 dedeployment
kubectl apply -f deployment/deployment-tomcat.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-tomcat
spec:
selector:
matchLabels:
app: tomcat
replicas: 2
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: rightctrl/tomcat
imagePullPolicy: Always
ports:
- containerPort: 8080
---
kind: Service
apiVersion: v1
metadata:
name: service-tomcat
spec:
selector:
app: tomcat
ports:
- protocol: TCP
port: 8080
targetPort: 8080
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-tomcat
spec:
backend:
serviceName: service-tomcat
servicePort: 8080
만들기 진입
kubectl apply -f ingress/ingress-tomcat.yaml
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: ingress-tomcat
spec:
rules:
- host: test.myk8s.com
http:
paths:
- path:
backend:
serviceName: service-tomcat
servicePort: 8080
봐 유입이 성공적으로 생성
[root@k8s-master-1 ~]# kubectl describe ingresses.
Name: ingress-tomcat
Namespace: default
Address:
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
test.myk8s.com
service-tomcat:8080 (179.20.3.7:8080,179.20.3.8:8080)
Annotations:
kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{},"name":"ingress-tomcat","namespace":"default"},"spec":{"rules":[{"host":"test.myk8s.com","http":{"paths":[{"backend":{"serviceName":"service-tomcat","servicePort":8080},"path":null}]}}]}}
Events: <none>
액세스 도메인
가용성 클러스터를 확인 (8)
닫기 MASTER1 노드, 노드 상태가 정상입니다, 정상적인 서비스
[root@k8s-master-3 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master-1 NotReady master 3d15h v1.16.0
k8s-master-2 Ready master 3d15h v1.16.0
k8s-master-3 Ready master 3d15h v1.16.0
k8s-worker-1 Ready <none> 44h v1.16.0
[root@k8s-master-3 ~]# curl -I test.myk8s.com
HTTP/1.1 200 OK
Date: Wed, 12 Feb 2020 03:17:31 GMT
Content-Type: text/html;charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
Set-Cookie: SERVERID=668f1fc010a1560f1a6962e4c40b0c6a|1581477451|1581477451;Path=/
닫기 MASTER2 노드, 노드 상태 장애, 정상적인 서비스
[root@k8s-master-3 ~]# kubectl get node
Error from server: etcdserver: request timed out
[root@k8s-master-3 ~]# curl -I test.myk8s.com
HTTP/1.1 200 OK
Date: Wed, 12 Feb 2020 03:18:59 GMT
Content-Type: text/html;charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
Set-Cookie: SERVERID=668f1fc010a1560f1a6962e4c40b0c6a|1581477539|1581477539;Path=/