一、前言
平時測試點小東西我用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