Kubeadm의 배포 엔터프라이즈 급 고 가용성는 Kubernetes (ECS에 적용)

Kubeadm의 배포 엔터프라이즈 급 고 가용성는 Kubernetes (ECS에 적용)

1. 준비

소개

다양한 옵션을 갖추고는 Kubernetes는,이 튜토리얼 문서가 공식 튜토리얼 및 엔터프라이즈 클라우드 연습에서 실행되는 비즈니스 시나리오에 따라 배포 된 각 위젯은 안정성 특성을 가지고, 몇 가지 테스트 후 선택 :

  1. 상기에 CentOS 7.6
  2. 1.16.0는 Kubernetes
  • 도커 18.09.7
  • 플란넬 3.3
  • nginx를-유입 1.5.3
  1. 기본 노드 클러스터에 최대 세 개의 마스터 메이크업은 부하가 SLB에 의해 네트워크 내에서 균형
  2. 클러스터의 작업을 여러 작업자 노드를 결성, 외부 네트워크 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=/
출시 두 원저 · 원 찬양 한 · 전망 (42)

추천

출처blog.csdn.net/maicos/article/details/104296261