接上一篇对k8s-1.17.1集群部署-单主(二),本篇主要讲述k8s集群的高可用。
centos部署k8s集群:(高可用)
1、环境准备:(每台均执行)
系统版本:centos 7.7_1908
Master1:192168.137.132 centos 7.7_1908 hostnamectl set-hostname master1
Master2:192168.137.133 centos 7.7_1908 hostnamectl set-hostname master2
Master3:192168.137.134 centos 7.7_1908 hostnamectl set-hostname master3
Node1:192.168.137.135 centos 7.7_1908 hostnamectl set-hostname test3
Node2:192.168.137.136 centos 7.7_1908 hostnamectl set-hostname test4
echo "127.0.0.1 $(hostname)" >> /etc/hosts
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
关闭SeLinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
关闭swap
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab
内核参数
#如果有配置,则修改
sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g" /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g" /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g" /etc/sysctl.conf
#可能没有,追加
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
sysctl -p #使配置生效
安装nfs,必须先安装 nfs-utils 才能挂载 nfs 网络存储
yum install -y nfs-utils
yum install -y wget
2、安装docker和k8s:(master和node上均安装)
Docker版本:18.09.7
kubernetes版本:1.16.2
参考文档如下
https://docs.docker.com/install/linux/docker-ce/centos/ https://docs.docker.com/install/linux/linux-postinstall/
1)安装 docker
同k8s-1.17.1集群部署-单主(二)中docker安装
2)安装 k8s
同k8s-1.17.1集群部署-单主(二)中k8s安装,唯一不同是将 kubelet,kubeadm,kubectl的版本由1.17.1改为1.16.2
yum install -y kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2
3、初始化apiserver
1)创建Apiserver的load Balancer(私网)
监听端口:6443/TCP
后端资源组:包含demo-master1,demo-master2,demo-master3
后端端口:6443
开启按源地址保持回话
假设完成创建以后,load balance的ip地址为*...*
根据每个人实际的情况不同,实现 LoadBalancer 的方式不一样,本文不详细阐述如何搭建 LoadBalancer,请读者自行解决,可以考虑的选择有:
nginx
haproxy
keepalived
云供应商提供的负载均衡产品
2)初始化第一个master的节点
注意:初始化节点时,如果因为中间的某些步骤配置出错,想要重新初始化master节点时,请先执行kubeadm reset
命令。
关于初始化时用到的环境变量:
- APISERVER_NAME不能为master的hostname
- APISERVER_NAME必须全为小写字母、数字、小数点,不能包括减号
- POD_SUBNET所使用的网段不能与master节点和node节点所有在网点重叠,该字段值选取一个CIDR值,如果您对 CIDR 这个概念还不熟悉,请不要修改这个字段的取值 10.100.0.1/16
export APISERVER_NAME=apiserver.demo #替换apiserver.demo为你想要的dnsName
export POD_SUBNET=10.100.0.1/16 && echo "127.0.0.1 ${APISERVER_NAME}" >> /etc/hosts #Kubernetes 容器组所在的网段,该网段安装完成后,由kubernetes创建,事先并不存在于你的物理网络中
curl -sSL https://kuboard.cn/install-script/v1.16.2/init_master.sh | sh
若执行失败后,请执行:
kubeadm reset
rm -rf /var/lib/etcd
curl -sSL https://kuboard.cn/install-script/v1.16.2/init_master.sh | sh
1> 执行结果
2> 检查master初始化结果
Pod还没有完全起来,起来之后就会变成Ready;直到所有的pod起来之后才可以进行下一步操作
3> 初始化第二个、第三个节点
方法一:和第一个master节点一起初始化
<1> 获取master节点的join命令,执行上面执行结果中“只对master节点有效”的命令
<2> 在master2和master3上执行
kubeadm join apiserver.demo:6443 --token jlg06f.faa69e1fx8h43wax \
--discovery-token-ca-cert-hash sha256:23f55a573ea0a49c4bd369127f6ae0adc37b2d37fb7f6d262049c194e7e01c1d \
--control-plane --certificate-key 80d852ed6ee53b7f76b605255fd92bc691210faeb03dc474b90a5d3e098da244
方法二:第一个master节点初始化2小时之后再初始化
<1> 获取获得 certificate key(在master1上执行)
kubeadm init phase upload-certs --upload-certs
<2> 获取join命令
kubeadm token create --print-join-command
kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
<3> 在master2和master3上执行
export APISERVER_NAME=apiserver.demo
echo "${APISERVER_IP} ${APISERVER_NAME}" >> /etc/hosts
kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
<4> 如果在一直停留在pre-flight状态,请在第二、三个节点上执行命令检查
curl -ik https://apiserver.demo:6443/version
输出结果应该如下:
HTTP/1.1 200 OK
Cache-Control: no-cache, private
Content-Type: application/json
Date: Wed, 30 Oct 2019 08:13:39 GMT
Content-Length: 263
{
"major": "1",
"minor": "16",
"gitVersion": "v1.16.2",
"gitCommit": "2bd9643cee5b3b3a5ecbd3af49d09018f0773c77",
"gitTreeState": "clean",
"buildDate": "2019-09-18T14:27:17Z",
"goVersion": "go1.12.9",
"compiler": "gc",
"platform": "linux/amd64"
}
否则需要检查下Loadbalancer 是否设置正确
<5> 检查master的初始化结果
kubectl get nodes
4、初始化work节点
1)方法一:和第一个master节点一起初始化
<1> 获取join参数命令,执行上面执行结果中“只对work节点有效”的命令
kubeadm join apiserver.k8s:6443 --token 4z3r2v.2p43g28ons3b475v \
--discovery-token-ca-cert-hash sha256:959569cbaaf0cf3fad744f8bd8b798ea9e11eb1e568c15825355879cf4cdc5d6
<2> 在worker上执行
export MASTER_IP=x.x.x.x #x.x.x.x 为 ApiServer LoadBalancer 的 IP 地址
export APISERVER_NAME=apiserver.demo #替换 apiserver.demo 为初始化 master 节点时所使用的 APISERVER_NAME
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
#替换为前面 kubeadm token create --print-join-command
的输出结果
kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
2)方法二:第一个master节点初始化2小时之后再初始化
1> 获取join命令
kubeadm token create --print-join-command #只在第一个master节点demo-master-a-1上执行
kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
2> 执行join命令
export MASTER_IP=x.x.x.x #替换 x.x.x.x 为 ApiServer LoadBalancer 的 IP 地址
export APISERVER_NAME=apiserver.demo # 替换 apiserver.demo 为初始化 master 节点时所使用的 APISERVER_NAME
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303 #替换为前面 kubeadm token create --print-join-command 的输出结果
3)检查worker初始化结果
在第一个master节点上执行
kubectl get nodes
4)移除worker节点
kubeadm reset #在准备移除的 worker 节点上执行
kubectl delete node demo-worker-x-x #在第一个 master 节点上执行
5、安装 calico 网络插件
同k8s-1.17.1集群部署-单主(二)中安装 calico 网络插件
6、k8s安装客户端
由于所有节点上已经安装了kubectl;若未安装,则参考如下:
1)配置K8S的yum源
cat <<EOF > /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 install -y kubectl #安装kubectl
kubectl version #验证安装
2)获取 kubectl config 文件
cat /etc/kubernetes/admin.conf
注意红框内的域名需要在客户端机上配置
3)配置 kubectl 客户端(或者将master上的config文件scp到目标主机即可)
mkdir ~/.kube
scp ~/.kube/config 192.168.171.139:~/.kube/
scp ~/.kube/config 192.168.171.149:~/.kube/
或者将/etc/kubernetes/admin.conf 文件的内容粘贴进该文件并保存
4)配置hosts
echo "x.x.x.x apiserver.demo" >> /etc/hosts # x.x.x.x为master的ip
5)验证
kubectl get nodes
kubectl get pods -n kube-system
7、k8s安装dashboard
1)下载官方yaml文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml #最新的配置文件v2.0.0-beta8版本recommended.yaml
2)修改yaml文件
官方的kubernetes-dashboard.yaml文件中service的type类型为clusterIp(service默认类型),这种方式要访问dashboard需要通过代理,所以我们改为NodePort方式,这样部署完后,就可以直接通过nodeIP:port的方式访问
3)下载镜像和启动
docker pull kubernetesui/dashboard:v2.0.0-beta8 #可跳过
kubectl apply -f recommended.yaml
查看pod和状态
4)浏览器访问
1> 选择用默认用户kubernetes-dashboard的token登陆,查看serviceaccount和secrets
kubectl get sa,secrets -n kubernetes-dashboard
2> 查看token
kubectl describe secrets kubernetes-dashboard-token-vb8r8 -n kubernetes-dashboard
或者一行命令直接获取token
kubectl describe secrets $(kubectl get secrets -n kubernetes-dashboard | awk '/kubernetes-dashboard-token/{print $1}' ) -n kubernetes-dashboard |sed -n '/token:.*/p'
3> 浏览器上输入master节点https://192.168.171.129:30001
用上面得到的token登陆之后,界面上数据显示不出来
并提示权限不足
解决办法如下:参考链接
4> 新增管理员用户
方法一:通过yaml文件
cat create-admin.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
kubectl apply -f create-admin.yaml
kubectl get sa,secrets -n kubernetes-dashboard
kubectl describe secret admin-user-token-t79xh -n kubernetes-dashboard
方法二:命令行创建
kubectl create serviceaccount admin-myuser -n kubernetes-dashboard #创建serviceaccount
kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:admin-myuser #sa绑定集群管理员
kubectl describe secret admin-myuser-token-x5n7r -n kubernetes-dashboard #查看token
5)再次登陆验证