centos7.5 k 8 s 1を構築する.11.2マルチマスターマルチノードの高可用性クラスタ
20926 ワード
実験環境の説明
じっけんアーキテクチャ図
実験で使用した
インストール構成docker
v1.11.0バージョンではdocker v 17の使用を推奨する.03, v1.11,v1.12,v1.13、使用することもできますが、いくらバージョンのdockerでも正常に使用できない可能性があります.テストでは17.09が正常に使用できず、リソース制限(メモリCPU)が使用できないことが判明しました.
すべてのノードで次の操作を行います.
dockerのインストール
dockerの起動
クbeadm、クbelet、クbectlのインストール
すべてのノードで次の操作を行います.
アリミラーを使用したインストール
システム関連パラメータの設定
ホスト解析の構成
すべてのノードで次の操作を行います.
haproxyエージェントとkeepalivedの構成
ノード
起動クbeletの設定
すべてのノードで次の操作を行います.
マスターの設定
最初のmasterノードの構成
2番目のmasterノードの構成
3番目のmasterノードの構成
構成kubectlの使用
任意の
ネットワークプラグインの使用の構成
任意の
ノードのクラスタへの参加を構成する
すべての
基礎テスト
コンテナ間の通信とDNSのテスト
ネットワークを構成すると、kubeadmはcorednsを自動的に配置します.
次のテストはkubectlを構成するノードで操作できます.
開始
ステータスの表示
DNS解析
アクセステスト
削除のクリーンアップ
高可用性テスト
いずれかの
テクニック
初期マスターノードを忘れたときのnodeノードにクラスタコマンドを追加するにはどうすればいいですか?
Kubernetes Dashboard
Kubernetes Dashboardは、Kubernetesクラスタを管理する全機能Webインタフェースであり、コマンドラインツール(kubectlなど)をUIで完全に代替することを目的としています.
配置
Dashboardは
上で使用したyamlはhttps://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yamlのk 8 s.gcr.ioをregに置き換える.qiniu.com/k8s.
次に、
dashboardにローカルでアクセスするには、次のコマンドを実行するために安全なチャネルを作成する必要があります.
今すぐhttp://localhost:8001/api/v1/namespaces/kube-system/services/http:kubernetes-dashboard:/proxy/Dashborad UIにアクセスしました.
ユーザーの作成
ログインページに移動すると、まずユーザーを作成します.
1.サービスアカウントの作成
まず、
2.ロールのバインド
デフォルトでは、
3.Tokenの取得
dashboardにログインするには、新しく作成されたユーザーのTokenを見つける必要があります.
そしてTokenをログイン画面のToken入力ボックスにコピーし、ログインしてページを表示します.
統合Heapster
Heapsterはコンテナクラスタモニタリングと性能分析ツールであり、KubernetesとCoreOSを天然にサポートしています.
Heapsterは様々なストレージ方式をサポートしています.この例では
上のコマンドで使用したyamlはhttps://github.com/kubernetes/heapster/tree/master/deploy/kube-config/influxdbコピーし、
そして、Podの状態を確認します.
アクセス
Kubernetesは、次の4つのアクセスサービスを提供します.
kubectl proxy
上記の例では、マシンとKubernetes APIの間にエージェントを作成する
エージェントを起動するには、次のコマンドを実行します.
また、
その後、Dashboardは
NodePort
NodePortはノードを直接外部ネットワークに露出させる方式であり,開発環境,単一ノードの実装方式でのみ使用することを推奨する.
NodePortを有効にするのは簡単で、
次に、上記の
以上のように、Dashboardは
しかし、最後にページにアクセスできませんでした.
残念ながら、証明書の問題でアクセスできません.Dashboardの導入時に有効な証明書を指定する必要があります.正式な環境では、NodePortを使用してDashboardにアクセスすることは推奨されていないため、Dashboardの証明書の構成方法については、Certificate Managementを参照してください.
API Server
Kubernetes APIサーバが公開されており、外部からアクセスできる場合は、APIサーバを直接使用してアクセスすることも推奨されます.
Dashboardのアクセスアドレスは
これは、最新版のk 8 sのデフォルトがRBACを有効にし、認証されていないユーザーにデフォルトのアイデンティティを与えたためです:
APIサーバでは、証明書を使用して認証されます.証明書を作成する必要があります.
1.まず、
2.次に、
3.最後にブラウザの証明書欄に上記で生成したp 12ファイルをインポートし、再度ブラウザを開くとselect a certificateのポップアップボックスが表示されます
[OK]をクリックすると、おなじみのログイン画面が表示されます.
最初に作成した
じっけんアーキテクチャ図
lab1: etcd master haproxy keepalived 11.11.11.111
lab2: etcd master haproxy keepalived 11.11.11.112
lab3: etcd master haproxy keepalived 11.11.11.113
lab4: node 11.11.11.114
lab5: node 11.11.11.115
lab6: node 11.11.11.116
vip(loadblancer ip): 11.11.11.110
実験で使用した
Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
ENV["LC_ALL"] = "en_US.UTF-8"
Vagrant.configure("2") do |config|
(1..6).each do |i|
config.vm.define "lab#{i}" do |node|
node.vm.box = "centos-7.4-docker-17"
node.ssh.insert_key = false
node.vm.hostname = "lab#{i}"
node.vm.network "private_network", ip: "11.11.11.11#{i}"
node.vm.provision "shell",
inline: "echo hello from node #{i}"
node.vm.provider "virtualbox" do |v|
v.cpus = 2
v.customize ["modifyvm", :id, "--name", "lab#{i}", "--memory", "2048"]
end
end
end
end
インストール構成docker
v1.11.0バージョンではdocker v 17の使用を推奨する.03, v1.11,v1.12,v1.13、使用することもできますが、いくらバージョンのdockerでも正常に使用できない可能性があります.テストでは17.09が正常に使用できず、リソース制限(メモリCPU)が使用できないことが判明しました.
すべてのノードで次の操作を行います.
dockerのインストール
# docker-ce
yum remove -y docker-ce docker-ce-selinux container-selinux
yum install -y --setopt=obsoletes=0 \
docker-ce-17.03.1.ce-1.el7.centos \
docker-ce-selinux-17.03.1.ce-1.el7.centos
dockerの起動
systemctl enable docker && systemctl restart docker
クbeadm、クbelet、クbectlのインストール
すべてのノードで次の操作を行います.
アリミラーを使用したインストール
#
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
#
yum install -y kubelet kubeadm kubectl ipvsadm
システム関連パラメータの設定
# selinux
# /etc/sysconfig/selinux
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
setenforce 0
# swap
# /etc/fstab swap
swapoff -a
# forward
# Docker 1.13
# iptables filter FOWARD
# Kubernetes Node Pod
iptables -P FORWARD ACCEPT
# ,
cat < /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0
EOF
sysctl --system
# ipvs
# ,
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack_ipv4
lsmod | grep ip_vs
ホスト解析の構成
すべてのノードで次の操作を行います.
cat >>/etc/hosts<
haproxyエージェントとkeepalivedの構成
ノード
lab1,lab2,lab3
で次のように動作する# haproxy
docker pull haproxy:1.7.8-alpine
mkdir /etc/haproxy
cat >/etc/haproxy/haproxy.cfg<
#
docker logs my-haproxy
#
http://11.11.11.111:1080/haproxy-status
http://11.11.11.112:1080/haproxy-status
# keepalived
docker pull osixia/keepalived:1.4.4
#
#
lsmod | grep ip_vs
modprobe ip_vs
# keepalived
# eth1 11.11.11.0/24
docker run --net=host --cap-add=NET_ADMIN \
-e KEEPALIVED_INTERFACE=eth1 \
-e KEEPALIVED_VIRTUAL_IPS="#PYTHON2BASH:['11.11.11.110']" \
-e KEEPALIVED_UNICAST_PEERS="#PYTHON2BASH:['11.11.11.111','11.11.11.112','11.11.11.113']" \
-e KEEPALIVED_PASSWORD=hello \
--name k8s-keepalived \
--restart always \
-d osixia/keepalived:1.4.4
#
# backup master
docker logs k8s-keepalived
# 11.11.11.110
# ping
ping -c4 11.11.11.110
# ,
docker rm -f k8s-keepalived
ip a del 11.11.11.110/32 dev eth1
起動クbeletの設定
すべてのノードで次の操作を行います.
# kubelet pause
# kubelet cgroups
# docker cgroups
DOCKER_CGROUPS=$(docker info | grep 'Cgroup' | cut -d' ' -f3)
echo $DOCKER_CGROUPS
cat >/etc/sysconfig/kubelet<
#
systemctl daemon-reload
systemctl enable kubelet && systemctl restart kubelet
マスターの設定
最初のmasterノードの構成
lab1
ノードで次の操作を行います.# 1.11 centos ipvs
# https://github.com/kubernetes/kubernetes/issues/65461
#
CP0_IP="11.11.11.111"
CP0_HOSTNAME="lab1"
cat >kubeadm-master.config<
2番目のmasterノードの構成
lab2
ノードで次の操作を行います.# 1.11 centos ipvs
# https://github.com/kubernetes/kubernetes/issues/65461
#
CP0_IP="11.11.11.111"
CP0_HOSTNAME="lab1"
CP1_IP="11.11.11.112"
CP1_HOSTNAME="lab2"
cat >kubeadm-master.config<
3番目のmasterノードの構成
lab3
ノードで次の操作を行います.# 1.11 centos ipvs
# https://github.com/kubernetes/kubernetes/issues/65461
#
CP0_IP="11.11.11.111"
CP0_HOSTNAME="lab1"
CP1_IP="11.11.11.112"
CP1_HOSTNAME="lab2"
CP2_IP="11.11.11.113"
CP2_HOSTNAME="lab3"
cat >kubeadm-master.config<
構成kubectlの使用
任意の
master
ノードで以下のように動作するrm -rf $HOME/.kube
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# node
kubectl get nodes
# , ready
# master pod, ,
# dashboard, heapster, efk
kubectl taint nodes --all node-role.kubernetes.io/master-
ネットワークプラグインの使用の構成
任意の
master
ノードで以下のように動作する#
mkdir flannel && cd flannel
wget https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml
#
# ip kubeadm pod-network
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
#
image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64
# Node , flannel issues 39701,
# https://github.com/kubernetes/kubernetes/issues/39701
# kube-flannel.yml --iface ,
# dns 。 , kube-flannel.yml ,
# flanneld --iface=
containers:
- name: kube-flannel
image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64
command:
- /opt/bin/flanneld
args:
- --ip-masq
- --kube-subnet-mgr
- --iface=eth1
#
kubectl apply -f kube-flannel.yml
#
kubectl get pods --namespace kube-system
kubectl get svc --namespace kube-system
ノードのクラスタへの参加を構成する
すべての
node
ノードで次のように動作します.# master
kubeadm join 11.11.11.110:8443 --token yzb7v7.dy40mhlljt1d48i9 --discovery-token-ca-cert-hash sha256:61ec309e6f942305006e6622dcadedcc64420e361231eff23cb535a183c0e77a
基礎テスト
コンテナ間の通信とDNSのテスト
ネットワークを構成すると、kubeadmはcorednsを自動的に配置します.
次のテストはkubectlを構成するノードで操作できます.
開始
kubectl run nginx --replicas=2 --image=nginx:alpine --port=80
kubectl expose deployment nginx --type=NodePort --name=example-service-nodeport
kubectl expose deployment nginx --name=example-service
ステータスの表示
kubectl get deploy
kubectl get pods
kubectl get svc
kubectl describe svc example-service
DNS解析
kubectl run curl --image=radial/busyboxplus:curl -i --tty
nslookup kubernetes
nslookup example-service
curl example-service
アクセステスト
# 10.96.59.56 svc clusterip
curl "10.96.59.56:80"
# 32223 svc nodeport
http://11.11.11.112:32223/
http://11.11.11.113:32223/
削除のクリーンアップ
kubectl delete svc example-service example-service-nodeport
kubectl delete deploy nginx curl
高可用性テスト
いずれかの
master
ノードを閉じてクラスタが正常に実行されるかどうかをテストする
は、関連情報を表示します.2つのノードを同時に閉じることはできません.3つのノードからなるetcd
クラスタは、最大1つのタイミングしかありません.#
kubectl get pod --all-namespaces -o wide
kubectl get pod --all-namespaces -o wide | grep lab1
kubectl get pod --all-namespaces -o wide | grep lab2
kubectl get pod --all-namespaces -o wide | grep lab3
kubectl get nodes -o wide
kubectl get deploy
kubectl get pods
kubectl get svc
#
CURL_POD=$(kubectl get pods | grep curl | grep Running | cut -d ' ' -f1)
kubectl exec -ti $CURL_POD -- sh --tty
nslookup kubernetes
nslookup example-service
curl example-service
テクニック
初期マスターノードを忘れたときのnodeノードにクラスタコマンドを追加するにはどうすればいいですか?
#
kubeadm token create --print-join-command
#
token=$(kubeadm token generate)
kubeadm token create $token --print-join-command --ttl=0
Kubernetes Dashboard
Kubernetes Dashboardは、Kubernetesクラスタを管理する全機能Webインタフェースであり、コマンドラインツール(kubectlなど)をUIで完全に代替することを目的としています.
配置
Dashboardは
k8s.gcr.io/kubernetes-dashboard
のミラーを使用する必要があります.ネットワークの理由で、Tagを事前に引き出して打つか、yamlファイルのミラーアドレスを変更することができます.本稿では後者を使用します.kubectl apply -f http://mirror.faasx.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
上で使用したyamlはhttps://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yamlのk 8 s.gcr.ioをregに置き換える.qiniu.com/k8s.
次に、
kubectl get pods
コマンドを使用して配置ステータスを表示できます.kubectl get pods --all-namespaces
dashboardにローカルでアクセスするには、次のコマンドを実行するために安全なチャネルを作成する必要があります.
kubectl proxy
今すぐhttp://localhost:8001/api/v1/namespaces/kube-system/services/http:kubernetes-dashboard:/proxy/Dashborad UIにアクセスしました.
ユーザーの作成
ログインページに移動すると、まずユーザーを作成します.
1.サービスアカウントの作成
まず、
admin-user
というサービスアカウントを作成し、kube-system
の名前空間の下に置きます.# admin-user.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
kubectl create
コマンドを実行します.kubectl create -f admin-user.yaml
2.ロールのバインド
デフォルトでは、
kubeadm
がクラスタを作成するときにadmin
ロールが作成されています.直接バインドすればいいです.# admin-user-role-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
kubectl create
コマンドを実行します.kubectl create -f admin-user-role-binding.yaml
3.Tokenの取得
dashboardにログインするには、新しく作成されたユーザーのTokenを見つける必要があります.
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
そしてTokenをログイン画面のToken入力ボックスにコピーし、ログインしてページを表示します.
統合Heapster
Heapsterはコンテナクラスタモニタリングと性能分析ツールであり、KubernetesとCoreOSを天然にサポートしています.
Heapsterは様々なストレージ方式をサポートしています.この例では
influxdb
を使用して、以下のコマンドを直接実行すればいいです.kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/influxdb.yaml
kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/grafana.yaml
kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/heapster.yaml
kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/rbac/heapster-rbac.yaml
上のコマンドで使用したyamlはhttps://github.com/kubernetes/heapster/tree/master/deploy/kube-config/influxdbコピーし、
k8s.gcr.io
を国内ミラーに変更します.# yaml
# heapster.yaml
#### #####
# kubelet https https
- --source=kubernetes:https://kubernetes.default
#
- --source=kubernetes:https://kubernetes.default?kubeletHttps=true&kubeletPort=10250&insecure=true
# heapster-rbac.yaml
#### #####
# serviceAccount kube-system:heapster ClusterRole system:kubelet-api-admin , # kubelet API ;
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: heapster
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:heapster
subjects:
- kind: ServiceAccount
name: heapster
namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: heapster-kubelet-api
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:kubelet-api-admin
subjects:
- kind: ServiceAccount
name: heapster
namespace: kube-system
そして、Podの状態を確認します.
kubectl get pods --namespace=kube-system
アクセス
Kubernetesは、次の4つのアクセスサービスを提供します.
kubectl proxy
上記の例では、マシンとKubernetes APIの間にエージェントを作成する
kubectl proxy
を使用しています.デフォルトでは、ローカルからのみアクセスできます(マシンを起動します).kubectl cluster-info
コマンドを使用して、構成が正しいかどうか、クラスタがアクセスできるかどうかなどを確認できます.kubectl cluster-info
エージェントを起動するには、次のコマンドを実行します.
kubectl proxy
また、
--address
パラメータと--accept-hosts
パラメータを使用して、外部アクセスを許可することもできます.kubectl proxy --address='0.0.0.0' --accept-hosts='^*$'
その後、Dashboardは
http://:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
とlocalhost
にHTTP接続を使用してアクセスすることを許可し、他のアドレスはHTTPSのみを使用することを許可するため、127.0.0.1
にアクセスできますが、ログインできません.したがって、Dashboardへの非ネイティブアクセスが必要な場合は、他のアクセス方法しか選択できません.NodePort
NodePortはノードを直接外部ネットワークに露出させる方式であり,開発環境,単一ノードの実装方式でのみ使用することを推奨する.
NodePortを有効にするのは簡単で、
kubectl edit
コマンドを実行して編集するだけです.kubectl -n kube-system edit service kubernetes-dashboard
次に、上記の
type: ClusterIP
をtype: NodePort
に変更し、保存後、kubectl get service
コマンドを使用して自動生産ポートを表示します.kubectl -n kube-system get service kubernetes-dashboard
以上のように、Dashboardは
31795
ポートに公開されており、https://:31795
を外部で使用してアクセスできるようになりました.マルチノードのクラスタでは、MasterノードのIPではなくDashboardノードを実行するIPを見つけてアクセスする必要があることに注意してください.しかし、最後にページにアクセスできませんでした.
残念ながら、証明書の問題でアクセスできません.Dashboardの導入時に有効な証明書を指定する必要があります.正式な環境では、NodePortを使用してDashboardにアクセスすることは推奨されていないため、Dashboardの証明書の構成方法については、Certificate Managementを参照してください.
API Server
Kubernetes APIサーバが公開されており、外部からアクセスできる場合は、APIサーバを直接使用してアクセスすることも推奨されます.
Dashboardのアクセスアドレスは
https://:/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
ですが、返される結果は次のようになります.{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "services \"https:kubernetes-dashboard:\" is forbidden: User \"system:anonymous\" cannot get services/proxy in the namespace \"kube-system\"",
"reason": "Forbidden",
"details": {
"name": "https:kubernetes-dashboard:",
"kind": "services"
},
"code": 403
}
これは、最新版のk 8 sのデフォルトがRBACを有効にし、認証されていないユーザーにデフォルトのアイデンティティを与えたためです:
anonymous
.APIサーバでは、証明書を使用して認証されます.証明書を作成する必要があります.
1.まず、
kubectl
コマンドのプロファイルを見つけます.デフォルトは/etc/kubernetes/admin.conf
です.前編では、$HOME/.kube/config
にコピーしました.2.次に、
client-certificate-data
およびclient-key-data
を使用してp 12ファイルを生成し、次のコマンドを使用します.# client-certificate-data
grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt
# client-key-data
grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key
# p12
openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"
3.最後にブラウザの証明書欄に上記で生成したp 12ファイルをインポートし、再度ブラウザを開くとselect a certificateのポップアップボックスが表示されます
[OK]をクリックすると、おなじみのログイン画面が表示されます.
最初に作成した
admin-user
ユーザーのtokenを使用してログインすることができ、ログイン後にページが表示されます.