(ECSに適用)Kubeadmの展開エンタープライズクラスの高可用性Kubernetes
1.準備
入門
さまざまなオプションを装備したkubernetesこのチュートリアル文書は公式チュートリアルと、エンタープライズクラウドの練習で実行されているビジネス・シナリオに基づいて展開され、各ウィジェットは、いくつかのテストの後に選択され、安定性の特性があります。
- 上記のCentOS 7.6
- 1.16.0 Kubernetes
- ドッカー18.09.7
- フランネル3.3
- nginxの-進入1.5.3
- プライマリノードのクラスタ最大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
アリクラウドyumの設定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
最初のマスターノードを初期化3.
ホストレコードを追加します。
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
初期化が成功した内容を以下と、第1ノードマスタ初期化に参加するために、第二の参加ノードワーカーのための初期化を生じます
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
前記第二、第三のマスターノードの初期化
MASTER2、master3上で実行
ホストレコードを追加します。
echo "127.0.0.1 apiserver.k8s" >> /etc/hosts
コマンドのMster実行コマンドkubeadmは--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
PODの動作を確認
[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
マスターのinit設定ファイルをコピーし、実行(またはワーカーノードは、コマンドを実行することはできません)マスター上
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.テストクラスタ・アプリケーション(Tomcatに例えば)
作成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=/
閉じるマスター2ノード、ノード状態の障害、通常のサービス
[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=/