溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

CentOS上安裝Kubernetes集群(三)安裝配置Kubernetes主節(jié)點master

發(fā)布時間:2020-07-17 18:52:08 來源:網(wǎng)絡(luò) 閱讀:621 作者:t_huanghai 欄目:云計算

安裝配置運(yùn)行Kubernetes的主節(jié)點master,其中包括了etcd的數(shù)據(jù)庫,即etcd沒有和主節(jié)點分開,使用于奇數(shù)個主節(jié)點安裝。

1.生成kubernets的倉庫配置文件

# cat <<EOF > /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

2.安裝kubeadm、kubelet、kubectl

# yum install kubeadm kubelet kubectl

設(shè)置kubectl自啟動

# systemctl enable kubelet

3.始化master節(jié)點

初始化命令‘kubeadm’可以使用參數(shù)傳遞和yaml配置文件。

1)準(zhǔn)備初始化所需組件(可選)

初始化的過程會首先拉取需要的容器鏡像,而鏡像又存儲在k8s.gcr.io上,需要科學(xué)上網(wǎng),因此可先準(zhǔn)備好鏡像再執(zhí)行初始化命令。

獲取所需組件列表

#kubeadm config images list

拉取命令直接獲取組件

# kubeadm config images pull

如果沒有改倉庫則默認(rèn)從k8s.gcr.io去獲取,建議能夠科學(xué)訪問的環(huán)境下直接使用,也可以采用鏡像站點來拉取。

# vim k8s-pull-images.sh

#!/bin/bash
REGISTRY=gcr.azk8s.cn/google-containers

images=(
  kube-apiserver:v1.16.3
  kube-controller-manager:v1.16.3
  kube-scheduler:v1.16.3
  kube-proxy:v1.16.3
  pause:3.1
  etcd:3.3.15-0
  coredns:1.6.2
)

for imageName in ${images[@]} ; do
  docker pull ${REGISTRY}/$imageName  
  docker tag ${REGISTRY}/$imageName k8s.gcr.io/$imageName  
  docker rmi ${REGISTRY}/$imageName
done

說明: REGISTRY還可以使用dockerhub中的鏡像,具體修改:REGISTRY=mirrorgooglecontainers(注意:只有amd64的鏡像)。

其中組件包列表可以通過命令"kubeadm config images list"獲取。

# chmod +x k8s-pull-images.sh
# ./k8s-pull-images.sh

上述腳本保存執(zhí)行后可以通過"docker image list"查看結(jié)果。

拉取非x86_64架構(gòu)的鏡像文件

從Docker registry v2.3和Docker 1.10開始,Docker通過支持新的image Media 類型 manifest list 實現(xiàn)了Multi architecture Docker鏡像功能,即一個image manifest list包含已經(jīng)存在鏡像的manifest對象的平臺特性(CPU arch和OS類型)特征,在具體來講就是拉取鏡像的時候會根據(jù)現(xiàn)有的主機(jī)架構(gòu)拉取相應(yīng)的平臺架構(gòu)的鏡像,因此強(qiáng)烈建議采用模擬器運(yùn)行虛擬機(jī)的方式拉取該平臺的鏡像,如kvm+qemu+qemu-system-aarch74來運(yùn)行arm64架構(gòu)的虛擬機(jī)。
如果沒有采用虛擬機(jī)的方式拉取鏡像,比如在amd64平臺下拉取arm64的鏡像,則需要查看倉庫中的具體標(biāo)簽,因為倉庫有多個比如docker.io、quey.io,所以沒有統(tǒng)一的規(guī)則,下面總結(jié)了本人需要用到的標(biāo)簽

  • k8s.gcr.io/kube-apiserver-arm64:v1.16.3
  • k8s.gcr.io/kube-controller-manager-arm64:v1.16.3
  • k8s.gcr.io/kube-scheduler-arm64:v1.16.3
  • k8s.gcr.io/kube-proxy-arm64:v1.16.3
  • k8s.gcr.io/pause:3.1
  • k8s.gcr.io/etcd-arm:3.3.15-0
  • quey.io/coreos/flannel:0.11.0-arm64
    dockerhub倉庫簡單的使用鏡像存儲庫的前綴來區(qū)分相同應(yīng)用的不同平臺,如下:
  • ARMv8 64-bit (arm64v8): https://hub.docker.com/u/arm64v8/
  • Linux x86-64 (amd64): https://hub.docker.com/u/amd64/
  • Windows x86-64 (windows-amd64): https://hub.docker.com/u/winamd64/
    但dockerhub還是建議構(gòu)建Multi architecture Docker鏡像,另外碰到一個例外的coredns:
    docker.io/coredns/coredns:coredns-arm64(對應(yīng)最新版的coredns)
    quey.io的標(biāo)簽tag的寫法就又不一樣了,比如:
  • quey.io/coreos/flannel:0.11.0-arm64
  • quey.io/coreos/etcd:3.3.15-0-arm64

離線環(huán)境鏡像的導(dǎo)出和導(dǎo)入

離線環(huán)境中部署k8s需要先在在線環(huán)境中下載導(dǎo)出,然后在傳入離線環(huán)境中導(dǎo)入

鏡像的導(dǎo)出

命令和格式

docker save -o <path for generated tar file> <image name> [<image2 name>, ...]

舉例(單個打包)

docker save -o kube-apiserver-1.16.3.tar k8s.gcr.io/kube-apiserver:v1.16.3

舉例(批量打包)

docker save -o k8s-master-1.16.3.tar\
 k8s.gcr.io/kube-apiserver:v1.16.3\
 k8s.gcr.io/kube-controller-manager:v1.16.3\
 k8s.gcr.io/kube-scheduler:v1.16.3\
 k8s.gcr.io/kube-proxy:v1.16.3\
 k8s.gcr.io/pause:3.1\
 k8s.gcr.io/etcd:3.3.15-0\
 k8s.gcr.io/coredns:1.6.2

單個打包可以應(yīng)對多種架構(gòu)的部署(主要時etcd從master分離)

鏡像的導(dǎo)入

命令和格式

docker -load -i <path for generated tar file>

舉例
加載初始化所需要的鏡像

docker load -i k8s-master-1.16.3.tar
或
docker load -i kube-apiserver-1.16.3.tar
docker load -i kube-controller-1.16.3.tar
docker load -i kube-scheduler-1.16.3.tar
docker load -i kube-proxy-1.16.3.tar
docker load -i pause-3.3.tar
docker load -i etcd-3.3.15-0.tar
docker load -i coredns-1.6.2.tar

2) 命令行參數(shù)進(jìn)行初始化

# kubeadm init --kubernetes-version="1.16.3" --pod-network-cidr="10.244.0.0/16"  --service-cidr="10.96.0.0/12" --ignore-preflight-errors=Swap --ignore-preflight-errors=NumCPU --image-reporitory "gcr.azk8s.cn" --dry-run

其中

  • --kubernete-version="1.16.3"指定了kubernete的具體版本,默認(rèn)的“stable-1”,這里是1.16.0,不符合規(guī)定需要修改成當(dāng)前的版本,此處時1.16.3(查詢命令"rpm -qa|grep kubeadm")。
  • --pod-network-cidr="10.244.0.0/16"是自定義的Pod的網(wǎng)絡(luò),通常與要部署的網(wǎng)絡(luò)插件(如:flannel和calico)保持一致,此處使用的時flannel,flannel的默認(rèn)地址為:10.244.0.0/16,calico的默認(rèn)地址為:192.168.0.0/16。
  • --ignore-preflight-errors=,這里有兩項一個是Swap,一個是NumCPU,他們分別忽略了swap不為0的報錯和CPU沒有大于2的報錯。因為這里我用的是虛擬機(jī),只有1G的內(nèi)存,因此沒有關(guān)閉swap;同時虛擬機(jī)之分配了一個vCPU。若未禁用swap,則需要編輯kubelet的配置文件/etc/sysconfig/kubelet,忽略swap啟用狀態(tài)錯誤。
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
  • --server-cidr指定service分配的網(wǎng)絡(luò)地址,由kubernete管理,默認(rèn)地址為10.96.0.0/12。
  • --image-reporitory指定組件倉庫地址代替默認(rèn)的"k8s.gcr.io",比如此處國內(nèi)的gcr.azk8s.cn。
  • --dry-run 只是試運(yùn)行看有沒有什么錯誤,并沒有實際初始化。

該命令執(zhí)行時,會自動去k8s.gcr.io拉取需要的鏡像文件,執(zhí)行成功執(zhí)行后會顯示初始化結(jié)果

...
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/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.122.10:6443 --token kt9uzn.793zkkepgvup3jg8 \
    --discovery-token-ca-cert-hash sha256:1b00c8c653c5573ff89c134bd1e62a54f3640813b0e26b79f387fddb402b0b48

3) 使用配置文件進(jìn)行初始化

獲取配置文件

kubeadm config print init-defaults  > kubeadm-init-config.yaml

修改配置文件(檢查以下部分)

...
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
...
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
...
kind: ClusterConfiguration
kubernetesVersion: v1.16.2
networking:
  dnsDomain: cluster.test
  serviceSubnet: 10.96.0.0/16
  podSubnet: 10.244.0.0/16
...

使用命令進(jìn)行初始化

kubeadm init -f kubeadm-init-config.yaml

離線環(huán)境的配置文件初始化根在線環(huán)境一樣,但需要先導(dǎo)入鏡像文件。

4) 初始化后續(xù)操作

接下來按照上述初始化結(jié)果的提示后續(xù)還需要為當(dāng)前master節(jié)點的用戶準(zhǔn)備kubectl環(huán)境和安裝網(wǎng)絡(luò)

創(chuàng)建文件夾

$ mkdir -p ~/.kube
$ cp /etc/kubernetes/admin.conf ~/.kube/config

安裝網(wǎng)絡(luò)插件

語法:"kubectl apply -f [podnetwork].yaml"

此處我們使用的flannel(由coreos研發(fā))。在github的頁面上有具體的安裝說明,地址https://github.com/coreos/flannel。

# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

如果是離線安裝可以先下載打包flannel鏡像及kube-flannel.yml文件,然后使用kubectl安裝。具體如下:

下載flannel

docker pull query.io/coreos/flannel

打包flannel并保存到本地

docker save query.io/coreos/flannel -o <your_save_path>/flannel-0.11.0.tar

裝載flannel鏡像

docker load -i <your_save_path>/flannel-0.11.0.tar

下載kube-flannel.yml文件

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

安裝flannel

kubectl apply -f kube-flannel.yml

而后可以使用命令"kubectl get pods -n kube-system"進(jìn)行查看。

參考:

  • kubeadm-config.yaml配置語法參考: https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2
  • kubeadm-config.yaml配置主節(jié)點:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/control-plane-flags/
  • kube-proxy開啟ipvs: https://github.com/kubernetes/kubernetes/blob/master/pkg/proxy/ipvs/README.md
  • kubelet的配置示例參考: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/kubelet-integration/#configure-kubelets-using-kubeadm

5) 補(bǔ)充說明:

kubeadm-config.yaml組成部署說明:

  • InitConfiguration: 用于定義一些初始化配置,如初始化使用的token以及apiserver地址等
  • ClusterConfiguration:用于定義apiserver、etcd、network、scheduler、controller-manager等master組件相關(guān)配置項
  • KubeletConfiguration:用于定義kubelet組件相關(guān)的配置項
  • KubeProxyConfiguration:用于定義kube-proxy組件相關(guān)的配置項

可以看到,在默認(rèn)的kubeadm-config.yaml文件中只有InitConfiguration、ClusterConfiguration 兩部分。我們可以通過如下操作生成另外兩部分的示例文件:

# 生成KubeletConfiguration示例文件 
kubeadm config print init-defaults --component-configs KubeletConfiguration
# 生成KubeProxyConfiguration示例文件 
kubeadm config print init-defaults --component-configs KubeProxyConfiguration

kubeadm初始化時kubernete認(rèn)可的docker版本問題

[WARNING SystemVerification]: this docker version is not on the list of validated version: 19.01.1. Latest validated version: 18.06

以上版本根據(jù)自身環(huán)境的報告版本有所不同,可以參看kubernetes在git倉庫中的changelog文件來確定支持的docker本版,然后根據(jù)命令

# yum list docker-ce.x86_64 --showduplicates | sort -r

獲取版本列表,然后選取特定的版本進(jìn)行安裝

sudo yum -y install docker-ce-[VERSION]

kubeadm初始化時kubelet沒有設(shè)置自啟動

[WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'

解決:執(zhí)行自啟動命令'systemctl enable kubelet.service'

kubeadm初始化時沒有禁用swap:

[ERROR Swap]: running with swap on is not enabled, please disable swap
[preflight] If you know what you are doing, you can make a check non-fatal with '--ignore-preflight-errors=...'

解決:可以在kubeadm的命令末尾加上參數(shù)'--ignore-preflight-errors=Swap'。

查看初始化后的kubeadm的配置

kubeadm config view

master node參與工作負(fù)載

使用kubeadm初始化的集群,出于安全考慮Pod不會被調(diào)度到Master Node上,也就是說Master Node不參與工作負(fù)載。這是因為當(dāng)前的master節(jié)點(比如名字叫master0)被打上了node-role.kubernetes.io/master:NoSchedule的污點:

$ sudo kubectl describe node master0 | grep Taint
Taints:             node-role.kubernetes.io/master:NoSchedule

因為這里搭建的是測試環(huán)境,或者其它原因需要去掉這個污點使master0參與工作負(fù)載:

$ sudo kubectl taint nodes master0 node-role.kubernetes.io/master-
node "master0" untainted
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI