【Kubernets】——搭建k8s多節點集羣

一、前言

       平時測試點小東西我用minikube就弄了,但最近要做EFK的部署,需要多節點,因此記錄一下安裝k8s多節點的過程。

       kubeadm是Kubernetes官方提供的用於快速部署Kubernetes集羣的工具,本次使用kubeadm部署包含1個master節點及2個node節點的k8s集羣。本文是參考https://blog.csdn.net/networken/article/details/84991940 這篇博文部署而成。因爲我的設置過科學上網,所以下邊的安裝很多並沒有用阿里雲的地址而是直接走的官方地址,如果大家未設置科學上網建議按上邊的鏈接部署。

二、集羣環境

主機名 IP 角色 OS 組件 配置
node1 10.53.5.94 master Ubuntu 16.04.1 kube-apiserver
kube-controller-manager
kube-scheduler
kube-proxy
etcd
coredns
calico
8核16G內存
node2 10.53.6.185 node Ubuntu 16.04.1 kube-proxy
calico
8核16G內存
node3 10.53.5.94 node Ubuntu 16.04.1 kube-proxy
calico
8核16G內存

 

三、配置和安裝

  註明:無特別說明,以下步驟需要在各個主機配置

  1、基本設置

#各個節點配置主機名
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3

#配置hosts解析
cat >> /etc/hosts << EOF
10.53.5.94 node1
10.53.6.185 node2
10.53.7.37 node3
EOF


#關閉swap
sed -i '/swap/d' /etc/fstab
swapoff -a

#查看swap分區是否開啓
swapon -a


#確認時間同步
sudo apt install -y chrony
systemctl enable --now chronyd
chronyc sources && timedatectl

2、加載ipvs模塊
kuber-proxy代理支持iptables和ipvs兩種模式,使用ipvs模式需要在初始化集羣前加載要求的ipvs模塊並安裝ipset工具。另外,針對Linux kernel 4.19以上的內核版本使用nf_conntrack 代替nf_conntrack_ipv4。參考

cat > /etc/modules-load.d/ipvs.conf <<EOF
# Load IPVS at boot
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
EOF

sudo systemctl enable --now systemd-modules-load.service

#確認內核模塊加載成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

#安裝ipset、ipvsadm
sudo apt install -y ipset ipvsadm

  3、安裝docker

直接參考官方文檔:https://kubernetes.io/docs/setup/production-environment/container-runtimes/

$ sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common gnupg2

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

$ sudo apt-get update && sudo apt-get install -y containerd.io=1.2.10-3 docker-ce=5:19.03.4~3-0~ubuntu-$(lsb_release -cs) docker-ce-cli=5:19.03.4~3-0~ubuntu-$(lsb_release -cs)

$ sudo touch /etc/docker/daemon.json
$ sudo vi /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}


$ sudo mkdir -p /etc/systemd/system/docker.service.d

$ sudo systemctl daemon-reload

$ sudo systemctl restart docker

  4、安裝kubeadm、kubelet、kubectl
官方文檔:https://kubernetes.io/docs/setup/independent/install-kubeadm/

$ sudo apt-get install -y iptables arptables ebtables

$ sudo apt-get update && sudo apt-get install -y apt-transport-https curl

$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

#編輯文件,添加文件的內容:deb https://apt.kubernetes.io/ kubernetes-xenial main
$ sudo vi /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main

$ sudo apt-get update
$ sudo apt-get install -y kubelet kubeadm kubectl
$ sudo apt-mark hold kubelet kubeadm kubectl

# 配置內核參數
$ sudo vi  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

$ sudo sysctl --system

 

四、部署master節點

1、初始化主節點

官方參考:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
在master節點運行以下命令初始化master節點:

$ sudo kubeadm init --apiserver-advertise-address=10.53.5.94 --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=192.168.0.0/16

初始化命令說明:

  • –apiserver-advertise-address(可選) :kubeadm 會使用默認網關所在的網絡接口廣播其主節點的 IP 地址。若需使用其他網絡接口,請給 kubeadm init 設置 --apiserver-advertise-address= 參數。
  • –pod-network-cidr:選擇一個 Pod 網絡插件,並檢查是否在 kubeadm 初始化過程中需要傳入什麼參數。這個取決於您選擇的網絡插件,您可能需要設置 --Pod-network-cidr 來指定網絡驅動的
  • CIDR。Kubernetes 支持多種網絡方案,而且不同網絡方案對 --pod-network-cidr有自己的要求,flannel設置爲 10.244.0.0/16,calico設置爲192.168.0.0/16
  • –image-repository:Kubenetes默認Registries地址是k8s.gcr.io,國內無法訪問,在1.13版本後可以增加–image-repository參數,將其指定爲可訪問的鏡像地址,這裏使用registry.aliyuncs.com/google_containers。

注意:安裝過程會持續幾分鐘,並且在開始會有兩個⚠,那是因爲 

W0310 10:22:10.392906   23530 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0310 10:22:10.393012   23530 validation.go:28] Cannot validate kubelet config - no validator is available
[init] Using Kubernetes version: v1.17.3
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet

......

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 10.53.5.94:6443 --token 1wtkoi.6pp22vg8wyq1xm7v \
    --discovery-token-ca-cert-hash sha256:e50885161cd99e82c19634b6be816be21e4e4525b8a9b19e923b5038b9291173 

  2、配置 kubectl
kubectl 是管理 Kubernetes Cluster 的命令行工具, Master 初始化完成後需要做一些配置工作才能使用kubectl,參考初始化結果給出的命令進行以下配置:

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

#驗證一下
$ kubectl get pod -A
NAMESPACE     NAME                            READY   STATUS    RESTARTS   AGE
kube-system   coredns-9d85f5447-lmjbg         0/1     Pending   0          5m5s
kube-system   coredns-9d85f5447-xjmhg         0/1     Pending   0          5m5s
kube-system   etcd-node1                      1/1     Running   0          5m21s
kube-system   kube-apiserver-node1            1/1     Running   0          5m21s
kube-system   kube-controller-manager-node1   1/1     Running   0          5m20s
kube-system   kube-proxy-v2jw4                1/1     Running   0          5m5s
kube-system   kube-scheduler-node1            1/1     Running   0          5m20s

3、部署網絡插件
  參考:https://github.com/containernetworking/cni
  必須安裝pod網絡插件,以便pod之間可以相互通信,必須在任何應用程序之前部署網絡,CoreDNS不會在安裝網絡插件之前啓動。

  • 安裝calico網絡插件:

官方文檔參考:
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network
https://docs.projectcalico.org/v3.10/getting-started/kubernetes/
爲使calico正常工作,你需要傳遞–pod-network-cidr=192.168.0.0/16到kubeadm init或更新calico.yml文件,以與您的pod網絡相匹配。

kubectl apply -f https://docs.projectcalico.org/v3.10/manifests/calico.yaml

注:如果安裝flannel網絡插件,必須通過kubeadm init配置–pod-network-cidr=10.244.0.0/16參數。
4、 驗證網絡插件
安裝了pod網絡後,確認coredns以及其他pod全部運行正常,查看master節點狀態爲Ready

$ kubectl get pod -A
NAMESPACE     NAME                            READY   STATUS    RESTARTS   AGE
kube-system   coredns-9d85f5447-lmjbg         1/1     Running   0          5m5s
kube-system   coredns-9d85f5447-xjmhg         1/1     Running   0          5m5s
kube-system   etcd-node1                      1/1     Running   0          5m21s
kube-system   kube-apiserver-node1            1/1     Running   0          5m21s
kube-system   kube-controller-manager-node1   1/1     Running   0          5m20s
kube-system   kube-proxy-v2jw4                1/1     Running   0          5m5s
kube-system   kube-scheduler-node1            1/1     Running   0          5m20s

至此,Kubernetes 的 Master 節點就部署完成了。如果只需要一個單節點的 Kubernetes,現在你就可以使用了。

五、部署node節點

   在兩個node節點上都執行下邊的命令,將其註冊到 Cluster 中:

$ kubeadm join 10.53.5.94:6443 --token 1wtkoi.6pp22vg8wyq1xm7v \
    --discovery-token-ca-cert-hash sha256:e50885161cd99e82c19634b6be816be21e4e4525b8a9b19e923b5038b9291173 


#如果執行kubeadm init時沒有記錄下加入集羣的命令,可以通過以下命令重新創建
$ kubeadm token create --print-join-command

六、kube-proxy開啓ipvs

修改kube-proxy的configmap,在config.conf中找到mode參數,改爲mode: "ipvs"然後保存:

kubectl -n kube-system get cm kube-proxy -o yaml | sed 's/mode: ""/mode: "ipvs"/g' | kubectl replace -f - 

#或者手動修改
kubectl -n kube-system edit cm kube-proxy

kubectl -n kube-system get cm kube-proxy -o yaml | grep mode
    mode: "ipvs"

#重啓kube-proxy pod        
kubectl -n kube-system delete pods -l k8s-app=kube-proxy

#確認ipvs模式開啓成功
[root@kmaster ~]# kubectl -n kube-system logs -f -l k8s-app=kube-proxy | grep ipvs
I1026 04:11:46.474911       1 server_others.go:176] Using ipvs Proxier.
I1026 04:11:42.842141       1 server_others.go:176] Using ipvs Proxier.
I1026 04:11:46.198116       1 server_others.go:176] Using ipvs Proxier.

日誌中打印出Using ipvs Proxier,說明ipvs模式已經開啓。

七、安裝Helm

1、在官網下載指定想要版本的helm並傳入服務器:https://github.com/helm/helm/releases

tar zxvf helm-xxxxx-linux-amd64.tar.gz
mv liniux-amd64/helm /usr/local/bin
helm version #查看helm client版本

2、創建rbac-config.yaml,並輸入以下內容:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system

3、然後執行kubectl create -f rbac-config.yaml

4、以上步驟配置成功後,安裝tiller。(和helm client對應的版本一樣)

# google源
helm init --service-account tiller --upgrade -i gcr.io/kubernetes-helm/tiller:v2.11.0

# 阿里源
helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.11.0 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

參數--stable-repo-url用於拉取charts所在源的位置,如果不設置則默認訪問官方charts

註明:對於 Kubernetes v1.16.0 以上的版本,有可能會碰到 Error: error installing: the server could not find the requested resource 的錯誤。這是由於 extensions/v1beta1 已經被 apps/v1 替代。相信在2.15 或者 3 版本發佈之後, 應該就不會遇到這個問題了。還是生態比較慢的原因。

解決方法是使用如下語句安裝:

helm init -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3 --stable-repo-url http://mirror.azure.cn/kubernetes/charts/ --service-account tiller --override spec.selector.matchLabels.'name'='tiller',spec.selector.matchLabels.'app'='helm' --output yaml | sed 's@apiVersion: extensions/v1beta1@apiVersion: apps/v1@' | kubectl apply -f -

 

八、卸載集羣

    想要撤銷kubeadm執行的操作,首先要排除節點,並確保該節點爲空, 然後再將其關閉。

1、在Master節點上運行:

$ kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
$ kubectl delete node <node name>

2、然後在需要移除的節點上,重置kubeadm的安裝狀態:

$ kubeadm reset -f

 3、在每個節點上都執行清理命令

$ kubeadm reset
$ sudo apt-get purge kubeadm kubectl kubelet kubernetes-cni kube*   
$ sudo apt-get autoremove  
$ sudo rm -rf ~/.kube
$ sudo rm -rf /etc/kubernetes

 

九、卸載後安裝指定版本的集羣

   由於安裝的1.17.3版本太高了,做的es項目依賴的api沒那麼高版本,所以降版本,指定版本1.15.3-00

$ sudo apt-get install -y kubelet=1.15.3-00 kubectl=1.15.3-00 kubeadm=1.15.3-00

下邊的步驟就是把第三、四、五、六、七再走一遍,注意版本,docker版本會報警告但影響不大。

【參考文章】

參考文章1:https://blog.csdn.net/networken/article/details/84991940

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章