kubeadmを使用して単一マシンkubernetes 1.15クラスタを迅速に構築
最近k 8 sを勉強して、学習の第一歩はもちろん手動でそれを構築して、構築の過程の中でとてもでこぼこででこぼこで、だからブログを書いてすべての仕事と出会った問題と解決方法を記録します.
1.構築前の準備
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
ファイル/etc/selinux/configを編集し、SELINUXをdisabledに変更します.
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
#SELINUX=disabled
Kubernetes 1.8はシステムのSwapを閉じることを要求し始め、閉じなければデフォルトの構成ではkubeletは起動できません.方法1は、kubeletの起動パラメータであるfail-swap-on=falseによってこの制限を変更する.方法2、システムのSwapを閉じる.
swapoff -a
/etc/fstabファイルを修正し、SWAPの自動マウントを注記し、free-mを使用してswapが閉じていることを確認します.
# swap
[root@localhost /]# sed -i 's/.*swap.*/#&/' /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0
[root@localhost /]# free -m
total used free shared buff/cache available
Mem: 962 154 446 6 361 612
Swap: 0 0 0
2.yumソースの設定
まず
/etc/yum.repos.d/
ディレクトリに行って、そのディレクトリの下のすべてのrepoファイルを削除します(バックアップを先に行います)rm -f /etc/yum.repos.d/
ダウンロードcentosベースyumソース構成(ここではアリクラウドのミラーリングを使用)
curl -o CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
kubernetesのyumソースの構成
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
次のコマンドを実行してyumソースキャッシュをリフレッシュします.
# yum clean all
# yum makecache
# yum repolist
ソース構成が正しいことを示すこのリストを取得します.
[root@MiWiFi-R1CM-srv yum.repos.d]# yum repolist
:fastestmirror
Loading mirror speeds from cached hostfile
base/7/x86_64 CentOS-7 - Base - 163.com 10,019
docker-ce-stable/x86_64 Docker CE Stable - x86_64 28
extras/7/x86_64 CentOS-7 - Extras - 163.com 321
kubernetes Kubernetes 299
updates/7/x86_64 CentOS-7 - Updates - 163.com 628
repolist: 11,295
3.dockerのインストール
yum install -y docker-ce
バージョンに要求がある場合は、先に実行できます.
# yum list docker-ce --showduplicates | sort -r
:fastestmirror
Loading mirror speeds from cached hostfile
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.1-3.el7 @docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.12.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.09.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.09.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.2.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.3.ce-1.el7 docker-ce-stable
docker-ce.x86_64 17.03.2.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
,
yum install -y docker-ce-
インストール完了後、
# systemctl start docker
# systemctl enable docker
# docker info
Containers: 24
Running: 21
Paused: 0
Stopped: 3
Images: 11
Server Version: 18.09.1
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 9754871865f7fe2f4e74d43e2fc7ccd237edcbce
runc version: 96ec2177ae841256168fcf76954f7177af9446eb
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-957.1.3.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.795GiB
Name: MiWiFi-R1CM-srv
ID: DSTM:KH2I:Y4UV:SUPX:WIP4:ZV4C:WTNO:VMZR:4OKK:HM3G:3YFS:FXMY
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine
WARNING: bridge-nf-call-ip6tables is disabled
このような説明が正しくインストールされています
4.kubeadm取付k 8 s
現在、kubeadmが構築したk 8クラスタmasterは単一ノードであり、高可用性を実現するには自分でetcdクラスタを手動で構築する必要がある.
以前はkubernetesのyumソースが設定されていたので、実行するだけで
yum install -y kubeadm
システムは最新版のkubeadmを自動的にインストールしてくれます(私がインストールした時は1.13.1でした)、全部でkubelet、kubeadm、kubectl、kubernetes-cniの4つのプログラムをインストールします.
インストール後、
kubeadmin init --pod-network-cidr=10.244.0.0/16
マスターノードの初期化作業を開始し、こちらの
--pod-network-cidr=10.244.0.0/16
は、k 8のネットワークプラグインに必要な構成情報であり、nodeにサブセグメントを割り当てるために使用されます.こちらのネットワークプラグインはflannelです.初期化時にkubeadmは一連の検証を行い、あなたのサーバがkubernetesのインストール条件に合致しているかどうかを検出します.検出結果は
[WARNING]
と[ERROR]
の2種類に分けられ、以下のような情報(一般的に最初の実行は失敗します.)I0112 00:30:18.868179 13025 version.go:94] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get https://storage.googleapis.com/kubernetes-release/release/stable-1.txt: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
I0112 00:30:18.868645 13025 version.go:95] falling back to the local client version: v1.15.0
[init] Using Kubernetes version: v1.15.0
[preflight] Running pre-flight checks
[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 18.09.1. Latest validated version: 18.06
[WARNING Hostname]: hostname "miwifi-r1cm-srv" could not be reached
[WARNING Hostname]: hostname "miwifi-r1cm-srv": lookup miwifi-r1cm-srv on 192.168.31.1:53: no such host
[WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[ERROR Swap]: running with swap on is not supported. Please disable swap
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
引き出せないという意味で、kubeadm initコマンドでデフォルトで使用するdockerミラーウェアハウスはk 8 sです.gcr.io、国内は直接訪問できないので、融通が必要です.手動pullミラーリングが必要です.
まず、どのミラーを使用する必要があるかを確認します.
kubeadm config images list
#
k8s.gcr.io/kube-apiserver:v1.12.2
k8s.gcr.io/kube-controller-manager:v1.12.2
k8s.gcr.io/kube-scheduler:v1.12.2
k8s.gcr.io/kube-proxy:v1.12.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.2.24
k8s.gcr.io/coredns:1.2.2
ミラーを再ダウンロードして、あなたのkubeadmに必要なバージョン番号に注意して、ここでも私はコピーしました.
# ,
docker pull mirrorgooglecontainers/kube-apiserver-amd64:v1.14.0
docker pull mirrorgooglecontainers/kube-controller-manager-amd64:v1.14.0
docker pull mirrorgooglecontainers/kube-scheduler-amd64:v1.14.0
docker pull mirrorgooglecontainers/kube-proxy-amd64:v1.14.0
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd-amd64:3.3.10
docker pull coredns/coredns:1.3.1
ラベルを付け直す
docker tag mirrorgooglecontainers/kube-apiserver-amd64:v1.14.0 k8s.gcr.io/kube-apiserver:v1.14.0
docker tag mirrorgooglecontainers/kube-controller-manager-amd64:v1.14.0 k8s.gcr.io/kube-controller-manager:v1.14.0
docker tag mirrorgooglecontainers/kube-scheduler-amd64:v1.14.0 k8s.gcr.io/kube-scheduler:v1.14.0
docker tag mirrorgooglecontainers/kube-proxy-amd64:v1.14.0 k8s.gcr.io/kube-proxy:v1.14.0
docker tag mirrorgooglecontainers/etcd-amd64:3.3.10 k8s.gcr.io/etcd:3.3.10
docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
ミラーリングが完了したら再実行
kubeadm init --kubernetes-version=v1.15.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
こんなたくさんのものが現れた
Your Kubernetes master 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 machines by running the following on each node
as root:
kubeadm join 192.168.31.175:6443 --token wde86i.tmjaf7d18v26zg03 --discovery-token-ca-cert-hash sha256:b05fa53d8f8c10fa4159ca499eb91cf11fbb9b27801b7ea9eb7d5066d86ae366
インストールに成功したことを示します
kudeadmは、kubelet構成、各種証明書構成、kubeconfig構成、プラグインインストールなど、多くの仕事をしてくれました(これらのものは自分でどのくらいかかるか分かりませんが、どうせkubeadmを使ったことがある人はもう手作業でインストールしたくないと思います).最後の行に注意して、kubeadmは、他のノードがクラスタに参加する必要がある場合は、このコマンドを実行するだけでいいことを示します.クラスタに参加するために必要なtokenが含まれています.同時にkubeadmは、すべてのインストールを完了するには、ネットワークプラグイン
kubectl apply -f [podnetwork].yaml
をインストールする必要があります.また、ネットワークプラグインのインストール方法のウェブサイトも提供します(親切ですね.木あり).同時に実行する必要があることを示しますmkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
関連配置情報をコピーする.kubeのディレクトリです.これはkubectlとapi-server間の認証を構成するために使用されます.他のnodeノードでは、この構成情報をnodeノードの対応するディレクトリにコピーする必要があります.ここで実行します
kubectl get node
NAME STATUS ROLES AGE VERSION
miwifi-r1cm-srv NotReady master 4h56m v1.13.1
現在のノードが
notready
の状態であることを示します.焦らないでください.まずkudeadmがインストールしてくれたものを見てみましょう.コアコンポーネント
先に紹介したように,kudeadmの考え方は,k 8の主要なコンポーネントを容器化することで実装過程を簡素化することである.この時、k 8クラスタがまだ起きていないのにpodを配置する方法に疑問があるかもしれません.まさか直接docker runを実行しますか?もちろんそれほどlowはありませんが、実はkubeletの実行ルールには、pod定義のyamlファイルを指定ディレクトリの下に置くだけで、このノードのkubeletが起動するとyamlファイルで定義されたpodが自動的に起動する「静的pod」(static pod)という特殊な起動方法があります.このメカニズムから、static podと呼ばれる理由もわかります.これらのpodはスケジューリングできないので、このノードでしか起動できません.podのipアドレスは直接ホストのアドレスです.k 8では、これらの事前定義yamlファイルを置く場所は
/etc/kubernetes/manifests
です.見てみましょう.[root@MiWiFi-R1CM-srv manifests]# ls -l
16
-rw-------. 1 root root 1999 1 12 01:35 etcd.yaml
-rw-------. 1 root root 2674 1 12 01:35 kube-apiserver.yaml
-rw-------. 1 root root 2547 1 12 01:35 kube-controller-manager.yaml
-rw-------. 1 root root 1051 1 12 01:35 kube-scheduler.yaml
この4つがk 8のコアコンポーネントであり、現在のノード上で静的podで動作する
実行してみましょう
kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-86c58d9df4-gbgzx 0/1 Pending 0 5m28s
coredns-86c58d9df4-kzljk 0/1 Pending 0 5m28s
etcd-miwifi-r1cm-srv 1/1 Running 0 4m40s
kube-apiserver-miwifi-r1cm-srv 1/1 Running 0 4m52s
kube-controller-manager-miwifi-r1cm-srv 1/1 Running 0 5m3s
kube-proxy-9c8cs 1/1 Running 0 5m28s
kube-scheduler-miwifi-r1cm-srv 1/1 Running 0 4m45s
kubeadmがインストールしてくれたのは、私が上述したコンポーネントで、podの形でインストールされていることがわかります.同時にcorednsの2つのpodは
pending
状態であることにも気づくべきです.これは、ネットワークプラグインがまだインストールされていないからです.前述の公式ページの説明に従ってネットワークプラグインをインストールします.こちらはflannelを使っています.インストール方法も簡単です.標準的なk 8式のインストールです.kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml
インストールが終わったらpodの状態を見てみましょう
kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-86c58d9df4-gbgzx 1/1 Running 0 11m
coredns-86c58d9df4-kzljk 1/1 Running 0 11m
etcd-miwifi-r1cm-srv 1/1 Running 0 11m
kube-apiserver-miwifi-r1cm-srv 1/1 Running 0 11m
kube-controller-manager-miwifi-r1cm-srv 1/1 Running 0 11m
kube-flannel-ds-amd64-kwx59 1/1 Running 0 57s
kube-proxy-9c8cs 1/1 Running 0 11m
kube-scheduler-miwifi-r1cm-srv 1/1 Running 0 11m
コアコンポーネントの状態を見てみましょう
kubectl get componentstatus
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health": "true"}
Nodeの状態は
Ready
で、私たちのmasterのインストールが成功したことを説明して、これで大成功しました!デフォルトのmasterノードはpodの適用をスケジュールできないので、masterノードに汚点マークを付ける必要があります.kubectl taint nodes --all node-role.kubernetes.io/master-
5.DashBoardのインストール
k 8プロジェクトは公式のdashboardを提供しています.普段はコマンドラインが多いですが、UIがあるのはいつもいいので、インストール方法を見てみましょう.
ここにdashboardをインストールしたことがあるなら削除してください.
kubectl get pods –all-namespaces
# pod, dashboard ,
kubectl delete pod kubernetes-dashboard-latest-3447225518-f39cr –namespace=kube-system
もしあなたのdashboardがまた起動したことに気づいたら、それから削除して、それはまた起動して、どうせ無限に再起動します.解決方法:そのpodを完全に削除するにはdeploymentsを削除する必要があります.次のコマンドを実行します.
kubectl get deployments --all-namespaces
NAMESPACE NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kube-system kubernetes-dashboard-latest 1 1 1 0 2d
kubectl delete deployments kubernetes-dashboard-latest -n kube-system
そしてdashboardはやっと正常に削除することができます.
再インストール
wgetコマンドを使用してkubernetes-dashboardをダウンロードします.yaml
ヒントwgetコマンドが見つからない場合はwgetをインストールします
yum install wget
実行
wget https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml
# spec:
containers:
- name: kubernetes-dashboard
image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
image
:registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.1
kubectl create -f kubernetes-dashboard.yaml
インストールが完了したらpod情報を表示
kubectl get po -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-86c58d9df4-gbgzx 1/1 Running 0 4h45m
coredns-86c58d9df4-kzljk 1/1 Running 0 4h45m
etcd-miwifi-r1cm-srv 1/1 Running 0 4h44m
kube-apiserver-miwifi-r1cm-srv 1/1 Running 0 4h44m
kube-controller-manager-miwifi-r1cm-srv 1/1 Running 0 4h44m
kube-flannel-ds-amd64-kwx59 1/1 Running 0 4h34m
kube-proxy-9c8cs 1/1 Running 0 4h45m
kube-scheduler-miwifi-r1cm-srv 1/1 Running 0 4h44m
kubernetes-dashboard-57df4db6b-bn5vn 1/1 Running 0 4h8m
kubernetes-dashboard-57df4db6b-bn5vn
が1つ増え、正常に起動していることがわかります.しかし、セキュリティの観点からdashboardは外部アクセスを提供しておらず、proxy、nodeport、ingressは現在nodeport方式を使用しています.kubectl -n kube-system edit service kubernetes-dashboard
以下に設定
apiVersion: v1
kind: Service
metadata:
creationTimestamp: "2019-01-11T18:12:43Z"
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
resourceVersion: "6015"
selfLink: /api/v1/namespaces/kube-system/services/kubernetes-dashboard
uid: 7dd0deb6-15cc-11e9-bb65-08002726d64d
spec:
clusterIP: 10.102.157.202
externalTrafficPolicy: Cluster
ports:
- nodePort: 30443 #
port: 443
protocol: TCP
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
sessionAffinity: None
type: NodePort #
status:
loadBalancer: {}
dashboardアプリケーションのデフォルトポートは8443です.ここでは30443ポートを指定してマッピングし、外部アクセスインタフェースを提供します.このとき私たちは
https://ip:30443
でdashboardにアクセスすることができます.公式のyamlで作成されたservcieaccountにログインすると、何の権限もありません.すべてforbiddenです.公式にminimalのroleを与えたからです..こちらではテストの便宜上、スーパー管理者のアカウントを直接作成しています.nodeノードで作成するには、次の手順に従います.
vim admin-sa.yaml
次のように構成されています.
apiVersion: v1
kind: ServiceAccount
metadata:
name: dashboard
namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: dashboard
subjects:
- kind: ServiceAccount
name: dashboard
namespace: kube-system
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
実行:
kubectl create -f admin-sa.yaml
上記の
admin
ユーザーの作成が完了すると、次のコマンドで対応するtoken
ユーザーを取得できます.kubectl describe secret dashboard -n kube-system
dashboard-token-s9hqc
Namespace: kube-system
Labels:
Annotations: kubernetes.io/service-account.name: dashboard
kubernetes.io/service-account.uid: 63c43e1e-15d6-11e9-bb65-08002726d64d
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZC.......
このtokenをログインインタフェースのtoken位置に記入すると、ログインでき、すべての権限があります.
これで完成!花撒き终わり!以下は参考サイト
kubeadmを使用して単一マシンkubernetes 1.13クラスタを迅速に構築
DashBoard-認証
kubernetes dashboardアクセスの問題
Kubernetesの(16)Dashboard認証アクセス
k 8 sがpodを削除した後に無限にこのpodを再起動する問題を解決します
kubeadmを使用してkubernetes 1.12.0をインストール
kubeadm reset操作手順
Kubeadmを使用してKubernetes(1.12.2)クラスタを構築
kubeadm--init
kubeadmがミラーをダウンロードできない問題
centos 7下kubernetes(5.kubernetes dashboardを配備)